Skip to content

[REQ-086] Draft 在正式路由中可恢复地晋升为 Session #201

Description

@jinjunnn

简明目的

新建会话页要真正保存和恢复草稿:切换环境或首次发送失败时不丢内容,也不能假装已经创建成功。

Outcome(专业定义)

Alpha Draft leaf surface 在正式路由下以 draft-scoped client 和持久化状态驱动完整生命周期:加载、retarget、首次提交、幂等重试、promotion 与重启恢复均以同一权威 draft record 为准。叶页面接管已基本完成,剩余工作是修复 client 作用域、promotion 真相和持久化/失败行为。

Complexity

M — 涉及 Draft 状态机、server/directory 作用域、持久化和路由行为,需跨组件与 runtime adapter 验证。

Context

New Session 叶页面已经接入,但当前仍可能使用 global client,promotion 在失败时提前发生,草稿状态也不能完整跨 reload/restart 恢复。原需求中的 legacy 页面回退与 Alpha/legacy 共享兼容状态已无用户价值。

Scope

  • 由 draft-scoped server client 执行创建与首条消息提交。
  • 持久化未发送 prompt、模型/agent/permission 选择和必要 retarget 状态。
  • 只有服务端确认 admission 成功后才 promotion 为 Session。
  • 明确无效/已删除 draft、断网、server/directory retarget、重试和应用重启状态。
  • 使用 [REQ-089] Alpha route manifest 成为唯一的路由组合真相 #204 canonical route contract 完成 promotion 后导航。

Non-goals

Acceptance criteria

AC1. 有效 draft 只挂载一个 Alpha Draft surface,并使用该 draft 当前 server/directory 作用域的 client。
AC2. 缺失、未知、已删除或损坏的 draft 显示确定错误/恢复动作,不出现空白页、无限 loading 或静默新建。
AC3. 未发送输入及模型、agent、variant、permission 等选择在 reload 和应用重启后仍与同一 draft 关联。 —— 2026-09-17 删除(owner 裁决):移出本需求,由独立小 bug alpha-code#266(P3)承载;其余条目已交付。
AC4. 切换工作目录时草稿内容不丢失,且旧目录的状态不会出现在新目录下。 (2026-09-17 按 owner 裁决改写,原文见编辑历史)
AC5. 首次提交失败不会 false-promote;重试符合幂等边界且不会生成重复 Session/prompt。
AC6. promotion 成功后由 canonical route helper 导航,back/forward、reload、deep link 与 IME/autocomplete 行为稳定。
AC7. Draft surface 不依赖 global client、隐藏 upstream 页面、Portal 或旧页面兼容状态。

Evidence map

AC Evidence surface
AC1 #925 / PR #930 alpha-new-session.tsx:62 + test-component/new-session-workspace.cases.ts:378
AC2 #903 / PR #1065 packages/app/src/pages/draft-route-gate.tsx:55/:82 + test-component/draft-route-gate.cases.ts
AC3 已删除 —— 移至 alpha-code#266
AC4 #657 / PR #667 test-component/new-session-workspace.cases.ts:486-546
AC5 #259 / PR #1063 test-component/alpha-composer-model.cases.ts:981(新对话页 alpha-new-session.tsx:131 复用同一 composer)
AC6 上游 packages/app/src/app.tsx:276 promoteDraft + alpha-composer.tsx:697、#477(无路由器驱动的前进/后退/重载测试,owner 2026-09-17 裁决按现有证据接受)
AC7 PR #638 + packages/ui-mac/src/shared/route-authority-ratchet.test.ts:136

Acceptance owner

@jinjunnn — 按 AC 逐条验收并手工关闭;PR 不得关闭父需求。

设计要点

  • promotion 是服务端已接受事实的投影,不能由 UI 点击先行决定。
  • draft 状态必须有稳定持久化 owner,不能只放在进程级全局 client。
  • retarget 明确区分 server client 切换与 directory scope remount。
  • 重启恢复和幂等重试是正确性要求,不是旧用户兼容。

潜在问题与风险

  • global client 会将请求发往错误 server。
  • optimistic promotion 会把失败提交显示成已创建 Session。
  • 仅内存 draft 会在 reload/crash 后丢失未发送工作。
  • 双 route composition 可能重复消费 prompt query。

过时性与兼容性结论

需求有效,叶页面已部分完成;legacy Draft、旧 route state、双页面 fallback 与数据回滚脚本均不需要。保留当前 draft 的持久化、崩溃恢复和重复提交幂等。

关联与职责边界

Delivery plan / 建议子票

Dependencies

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:contractsContracts, schemas, or compatibilityarea:productUser-facing product behaviortype:requirementA product or cross-repository outcome

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions