Repository navigation
Plan mode: the plan never lands in the conversation, so multi-turn revision can't re-read it #3770
ouhaochuan
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Discussion: Plan mode — the plan never lands in the conversation, so multi-turn revision can't re-read it
Repo: deepseek-ai/deepseek-harness
Area:
/planmode (dsh-plan-mode) + Web approval UI (dsh-client-ui-user-questions)Type: UX / design feedback
Summary
In
/planmode, the complete plan is only ever shown inside a temporary approvalcard that takes over the composer. It is not written into the conversation as a
normal assistant message. Because plans are revised over several turns, the plan
text is effectively lost as soon as the card is dismissed — the user cannot scroll
back and re-read the plan while negotiating changes.
What happens today
exit_plan_modewith the full plan as itsplanargument.presentCallreturns acard: 'generic'view with the plan ascontent, but theWeb generic tool card derives its body from the call arguments (
toolRowModelin
dsh-client-ui-tool), so thiscontentis never rendered. The plan text doesnot appear in the conversation.
executesends the plan as thedetailof a user-questions request with theplan-reviewpresentation intent.PlanReviewPanelindsh-client-ui-user-questions) takes over thecomposer seat and renders the plan as a scrolling markdown body inside the card,
with
max-height: min(60vh, 520px).So the plan lives only in a transient takeover card. The model's own message text
may or may not contain the full plan — it is not guaranteed, and nothing in the flow
requires it.
The problem
turns over the same plan. Once the approval card is dismissed (or a new turn
starts), the plan is no longer visible anywhere in the conversation.
max-height(e.g. tomin(85vh, 960px)) makes the card bigger, but it is still a transient surface —it scrolls away with the composer and is gone after the decision.
Expected behavior
(persistent, full-width, scrollable with the page, re-readable on later turns).
per plan?" — with Approve / Keep planning actions, and no plan body inside the
card (or at most a collapsed summary linking back to the message).
Suggested directions (open to maintainer preference)
exit_plan_mode's description (and the defaultplan:policysection) require the model to write the complete plan as itsassistant message text before calling the tool. Cheap, but relies on model
compliance.
tool.call.toolviewforexit_plan_mode(following the existingask-question-rowpattern) that rendersthe plan argument as a full-width markdown message in the conversation. This
guarantees the plan is always visible regardless of what the model writes.
PlanReviewPanel;keep only the strip, the fixed question, and the action row. The plan lives in
the conversation above.
Environment
141eb6fef83422698aef7a981029e843e8161534(Chinese original below / 中文原文如下)
Discussion: plan 模式下计划不进入对话流,多轮协商无法反复查看计划
仓库: deepseek-ai/deepseek-harness
领域:
/plan模式(dsh-plan-mode)+ Web 审批界面(dsh-client-ui-user-questions)类型: UX / 设计反馈
摘要
/plan模式下,完整计划只显示在一个临时审批卡片里,没有作为普通助手消息写进对话流。计划需要多轮协商,卡片一旦关闭,计划正文就无法再查看 —— 用户在反复修改计划时没法回看原文。现状
exit_plan_mode,完整计划放在plan参数里。presentCall返回card: 'generic'并把计划放进content,但 Web 通用工具卡是从调用参数推导正文的(dsh-client-ui-tool的toolRowModel),所以这段content根本不渲染 —— 计划正文不进入对话流。execute把计划作为detail放进带plan-review呈现意图的 user-questions 请求。dsh-client-ui-user-questions的PlanReviewPanel)接管 composer 座位,把计划作为可滚动 markdown 正文渲染在卡片里,高度上限max-height: min(60vh, 520px)。于是计划只存在于一个瞬态接管卡片里。模型的普通消息文本是否包含完整计划并不保证,流程里也没有任何机制要求它。
问题
max-height调大(例如min(85vh, 960px))只是卡片更大,它仍是瞬态表面 —— 会随 composer 滚走,决策完就没了。期望行为
建议方向(以官方意见为准)
exit_plan_mode的描述(以及默认plan:policy段落)要求模型在调用工具前先把完整计划写成助手消息文本。改动便宜,但依赖模型遵守。ask-question-row模式,为exit_plan_mode注册一个 keyedtool.call.toolview,把 plan 参数渲染成对话流里的全宽 markdown 消息。这样无论模型怎么写,计划都保证可见。PlanReviewPanel不再渲染计划正文,只保留条带、固定问题和操作行;计划存在于上方对话中。环境
141eb6fef83422698aef7a981029e843e8161534All reactions