Outcome
主干壳层回到可用:从任何入口开新对话都干净落地、全页覆盖层在导航时让位、新对话页能选项目并默认落在默认对话目录、侧栏搜索可用;产物入口收敛到会话内(时间线 + 右边栏);alpha 界面上不再存在"点了什么都不会发生"的入口 。
Complexity
M —— 改动集中在 packages/ui-mac/src/renderer,但方案必须影射上游 opencode 前端(路由树、tabs/draft 生命周期、命令注册)的真实行为,故先落方案基线、经跨模型对抗审计后才切票。
Context
owner 2026-07-28 报告首页一组回归(原始编号保留便于对账):① 点「新对话」闪烁,面板最左侧闪出不该出现的内容;② 打开自动化后点 session/新对话不关闭自动化;③ 产物页面应下线,产物应在 session timeline 展示、右边栏打开;④ 新对话页丢了选择/新增项目的能力,默认对话目录也不再是 ~/Alpha(截图显示「新会话 — alpha-code」);⑥ 搜索点了完全没反应。
方案基线(rev3,经两轮 Codex 对抗审计订正):
docs/design/2026-07-28-req126-shell-navigation-baseline.md (commit-pinned;随 checkout 即达,子票只引小节号)
核心判断 :这不是五个独立 bug,而是同一类 —— REQ-085/086/125 把上游 home / new-session / session 三个叶页面换成 alpha 自有 surface 之后,原来挂在这三个叶上的 shell 级职责 (命令注册、新对话路由入口、覆盖层协调)没有被 alpha 重新承接。
审计把这一类的真实规模挖了出来:owner 报的「搜索坏了」只是这一类里唯一被点到的那个 。同一机制下已经静默失效的还有侧栏账户菜单「设置」、新对话页右上角「终端/审查」、空项目态「打开项目」、composer 权限档位、桌面菜单「新建会话」(基线 §1.6 有逐条证据)。因此本需求的产物不是"修五个 bug",而是把这一类处置完并留下不会再漏的判据。
Scope
新对话入口(侧栏 + 冷启动落地)不再借上游 legacy admission 路由。
全页覆盖层统一「导航即关闭」。
侧栏「产物」入口与全页挂载下线(模块保留,会话右栏依赖其 core/renderers)。
新对话页工作区选择器(切换 + 打开项目)、默认对话目录、切目录不吞内容。
alpha 自有会话搜索,并由 alpha 壳注册 command.palette。
基线 §1.6 壳命令处置表逐项落地(继承 / 退休 / 恢复)。
Non-goals
不改上游 packages/app(触 UPSTREAM_PATHS)。
不重画首页/新对话页 IA;工作区选择器复用首页已批形态。
不补齐产物右栏的跨 run 浏览 / 云端 run 下载(能力差额另开跟进票)。
不复刻上游命令表;只处置 alpha 当前可见入口与本需求 AC 要求的能力。
不做文件搜索 / 命令执行 / 跨服务器检索(alpha 搜索只承诺按标题搜会话并跳转)。
Acceptance criteria
AC1. 从任一入口开新对话(侧栏「新对话」、冷启动落地),过程中不出现其它页面的界面残影,落地页始终是 alpha 新对话页。
AC2. 任一全页覆盖层打开时,点击侧栏中的具体会话(包括当前正在看的那个会话 )、「新对话」或首页,覆盖层关闭并落到目标页面。
AC3. 侧栏不再有「产物」入口、全页产物页面不可达;会话右边栏的产物面板与时间线产物行为不退化(右栏现状即 mount/tick 刷新;「新 run 落盘即刷新」是新能力,属 #660 )。
AC4. 新对话页可以切换到其它项目、也可以打开新目录作为项目,选择后当前新对话立即对该目录生效,且已输入内容不被无声丢弃。
AC5. 未显式选择目录时,新对话默认落在默认对话目录 ~/Alpha;目录不存在时先供给,供给失败有明确提示而非静默;且 server 与目录同源 —— 宿主机默认目录不会被配到 WSL/remote server 上。
AC6. 点击侧栏「搜索」(及其快捷键)打开搜索面板,可按标题搜到既有会话并跳转过去。
AC7. alpha 界面上不存在指向未注册命令的可点入口:基线 §1.6 每一项要么可用、要么连入口一起移除。
Evidence map
AC
Evidence surface
AC1
挂真实 AppInterface + AlphaSidebar 的行为测试:点新对话后,出现 data-alpha-new-session 之前从未出现 legacy sidebar / session workspace DOM;L2 真机逐帧确认视觉归因
AC2
「每个已登记覆盖层 × 每类导航点击(含点当前会话)」参数化关闭测试(挂真实宿主,断言 DOM 消失)
AC3
frontend-surface-manifest / dev inspector 模型测试 + PAGE-MAP 一致性;右栏 artifacts 既有测试保持绿(不退化)
AC4
组件测试:切目录后 draft 目录改变且 composer 内容仍在(或非空时明确拦截)
AC5
单测:ensure 返回 {ok:false} 时不建 draft 且有提示;成功路径断言 ensure 先于 newDraft 且目录为默认对话目录;跨 server 组合 fail-closed
AC6
注册 ratchet(挂真实壳,断言命令可触发)+ 搜索到会话并跳转的行为测试(断言 href 带来源 server 身份);L2 真机
AC7
逐入口真触发断言可观察结果(不断言源码含命令 ID);已退休项断言入口不存在
闸门纪律 :仓内既有的 settings-surface-ratchet.test.ts、route-composition.test.ts、surface-seam-contract.test.ts 属源码文本锚定式断言,证明不了生产路由/注册生效,不得 充当本需求任何 AC 的证据(基线 §3.6)。
Acceptance owner
@jinjunnn —— 逐条对证据勾 AC 后手工关闭本票。任何 PR 不得用关键字关闭本票。
Delivery plan
按依赖排序(颠倒必然返工,理由见基线 §4):
能力差额(不阻塞本需求,已明确 out-of-scope):#660 —— 右栏产物面板补齐跨 run 浏览与云端取回
Dependencies and decisions
owner 2026-07-28 拍板:新对话默认目录 = ~/Alpha 默认对话目录 → 需窄修订 ADR-025 §3(现文字为「既有用户有项目照旧」)。
owner 2026-07-28 拍板:产物页面先只注释入口,能力差额记跟进票。
Codex 跨模型对抗审计 2026-07-28 两轮 (预算已用尽,第 3 轮预期只会再挖同类新成员而不改变结构):
第 1 轮 BLOCK:3 Blocker(上游 palette 组件不可导入 / 壳注册盘点不完整 / 切目录丢 composer 内容)+ 6 Major;
第 2 轮 BLOCK:又开三条 —— settings.open 实为按路由分裂 (会话页活、首页死)、composer「全自动」档位在提交层是空承诺(composer-state.ts:192 只认 readonly)、覆盖层只监听路由变化则点当前会话不会关 ;另加 server/目录同源与搜索跳转 server 身份两条。均经我方独立复核后在 rev3 落字。
残留风险 R5:§1.6 处置表不保证穷尽 —— 故 AC7 判据按入口 枚举,CODE-E([REQ-126][CODE] 处置随上游叶退役的壳命令 —— 界面不再有点了没反应的入口 #658 )以运行时逐入口触发为准。
Outcome
主干壳层回到可用:从任何入口开新对话都干净落地、全页覆盖层在导航时让位、新对话页能选项目并默认落在默认对话目录、侧栏搜索可用;产物入口收敛到会话内(时间线 + 右边栏);alpha 界面上不再存在"点了什么都不会发生"的入口。
Complexity
M —— 改动集中在
packages/ui-mac/src/renderer,但方案必须影射上游 opencode 前端(路由树、tabs/draft 生命周期、命令注册)的真实行为,故先落方案基线、经跨模型对抗审计后才切票。Context
owner 2026-07-28 报告首页一组回归(原始编号保留便于对账):① 点「新对话」闪烁,面板最左侧闪出不该出现的内容;② 打开自动化后点 session/新对话不关闭自动化;③ 产物页面应下线,产物应在 session timeline 展示、右边栏打开;④ 新对话页丢了选择/新增项目的能力,默认对话目录也不再是
~/Alpha(截图显示「新会话 — alpha-code」);⑥ 搜索点了完全没反应。方案基线(rev3,经两轮 Codex 对抗审计订正):
docs/design/2026-07-28-req126-shell-navigation-baseline.md(commit-pinned;随 checkout 即达,子票只引小节号)核心判断:这不是五个独立 bug,而是同一类 —— REQ-085/086/125 把上游
home/new-session/session三个叶页面换成 alpha 自有 surface 之后,原来挂在这三个叶上的 shell 级职责(命令注册、新对话路由入口、覆盖层协调)没有被 alpha 重新承接。审计把这一类的真实规模挖了出来:owner 报的「搜索坏了」只是这一类里唯一被点到的那个。同一机制下已经静默失效的还有侧栏账户菜单「设置」、新对话页右上角「终端/审查」、空项目态「打开项目」、composer 权限档位、桌面菜单「新建会话」(基线 §1.6 有逐条证据)。因此本需求的产物不是"修五个 bug",而是把这一类处置完并留下不会再漏的判据。
Scope
command.palette。Non-goals
packages/app(触UPSTREAM_PATHS)。Acceptance criteria
AC1. 从任一入口开新对话(侧栏「新对话」、冷启动落地),过程中不出现其它页面的界面残影,落地页始终是 alpha 新对话页。
AC2. 任一全页覆盖层打开时,点击侧栏中的具体会话(包括当前正在看的那个会话)、「新对话」或首页,覆盖层关闭并落到目标页面。
AC3. 侧栏不再有「产物」入口、全页产物页面不可达;会话右边栏的产物面板与时间线产物行为不退化(右栏现状即 mount/tick 刷新;「新 run 落盘即刷新」是新能力,属 #660)。
AC4. 新对话页可以切换到其它项目、也可以打开新目录作为项目,选择后当前新对话立即对该目录生效,且已输入内容不被无声丢弃。
AC5. 未显式选择目录时,新对话默认落在默认对话目录
~/Alpha;目录不存在时先供给,供给失败有明确提示而非静默;且 server 与目录同源 —— 宿主机默认目录不会被配到 WSL/remote server 上。AC6. 点击侧栏「搜索」(及其快捷键)打开搜索面板,可按标题搜到既有会话并跳转过去。
AC7. alpha 界面上不存在指向未注册命令的可点入口:基线 §1.6 每一项要么可用、要么连入口一起移除。
Evidence map
AppInterface + AlphaSidebar的行为测试:点新对话后,出现data-alpha-new-session之前从未出现 legacy sidebar / session workspace DOM;L2 真机逐帧确认视觉归因frontend-surface-manifest/ dev inspector 模型测试 + PAGE-MAP 一致性;右栏 artifacts 既有测试保持绿(不退化){ok:false}时不建 draft 且有提示;成功路径断言 ensure 先于 newDraft 且目录为默认对话目录;跨 server 组合 fail-closed闸门纪律:仓内既有的
settings-surface-ratchet.test.ts、route-composition.test.ts、surface-seam-contract.test.ts属源码文本锚定式断言,证明不了生产路由/注册生效,不得充当本需求任何 AC 的证据(基线 §3.6)。Acceptance owner
@jinjunnn —— 逐条对证据勾 AC 后手工关闭本票。任何 PR 不得用关键字关闭本票。
Delivery plan
按依赖排序(颠倒必然返工,理由见基线 §4):
command.palette能力差额(不阻塞本需求,已明确 out-of-scope):#660 —— 右栏产物面板补齐跨 run 浏览与云端取回
Dependencies and decisions
~/Alpha默认对话目录 → 需窄修订ADR-025§3(现文字为「既有用户有项目照旧」)。settings.open实为按路由分裂(会话页活、首页死)、composer「全自动」档位在提交层是空承诺(composer-state.ts:192只认readonly)、覆盖层只监听路由变化则点当前会话不会关;另加 server/目录同源与搜索跳转 server 身份两条。均经我方独立复核后在 rev3 落字。