Create a fresh local consultation for explicit new-chat navigation and keep reserved recovery from taking over its landing. Add regression tests and record validation gaps for remote review. Co-Authored-By: Claude Code <noreply@anthropic.com>
9.7 KiB
PROGRESS · 次级页「新建对话」意图(2026-09-23)
结论与交付边界
实现与定向独立复核完成;完整验收尚未完成。2026-09-24 产品明确要求先 push 供远程 review,本次提交交付 staging;推送成功与远端 SHA 以实际核对回报为准,不以提交本身冒充部署成功。不提升 main、不改 workflow/DNS。BUG-1015 暂记 blocked(已本地修复,构建/受控真人证据未闭环),不按任务书预先指定的 resolved 提前结案。
| 项目 | 值 |
|---|---|
| 任务书 | docs/tasks/TASK-secondary-new-chat-intent-20260923.md |
| 实测基线 | origin/staging = 1c95eb397(已 fetch;任务书原基线之后仅任务文档) |
| 执行分支 | codex/secondary-new-chat-intent-20260923 |
| 工作树 | .worktrees/secondary-new-chat-intent-20260923 |
| BUG 编号 | 开工最大 BUG-1014,本单 BUG-1015 |
| 固定构建基线 | 本工作树下 .worktrees/secondary-new-chat-baseline-20260923,detached 1c95eb397 |
| 原始日志 | 本地 artifacts/secondary-new-chat/,不纳入提交 |
| 真人清单 | docs/testing/secondary-new-chat-20260923.md |
已实现
- T1:
chat-session-url.ts唯一生成/解析新建意图;参数按存在性识别(?new=1、?new=、?new均有效),优先于合法/非法/未加载的 c 及登录存根,missing=false。所有 sessionHref 都消费 new,保留无关参数。 - T2:首页复用原 starter 创建分支,不重复拼装会话,不新增状态/ref;激活前清 URL,按既有 clearStoredReturn 清存根。
- T3:只改只读侧栏既有新建链接,仍经 SidebarMenuLink → AppLink,仍关闭抽屉;首页按钮、账户页脚、品牌标记不变。
- T4:更新 BUG_HISTORY、CHANGELOG、DESIGN、任务状态板、BLOCKED、本进度与真机清单。没有新增产品文案,VOICE 无需修改;Skill 不 bump。
- 补修 D7:旧 reserved 咨询仍执行真实恢复逻辑并保留 pending/recovering,之后新建意图重新取得活动落点并清启动恢复提示。无 new 时不改变恢复行为。
决策、勘误与偏离
- 追加授权而非擅自破红线:独立验收首次发现
restoreConsultationRecovery()无条件激活旧会话,导致新建路径被覆盖。主会话向产品说明超出“一行”范围,产品明确选择“一并修复”。已在 TASK D7 记录:仅首页额外四行保护,首页总计 +5 行,无新增 state/ref,不改恢复 hook 或后台任务,不取消请求。 - T2“激活前清理”与“放在 replace-clear 邻行”原描述冲突;以明确时序为准,清理放在 setActiveSessionId 前。
- 当前品牌行无任务书所说的 AppLink,只是 div/span/strong,不补造入口。默认会话也可能受收藏及返回存根影响,不扩大修改无参数首页规则。
- 空历史启动已有兜底会创建一个本地空咨询,再执行新建分支会产生另一个本地空对象;两者均不落库、不显示于历史。本单按“new 恒新建”要求保留,不另改会话状态流。
- 任务书预写 resolved 与事实证据冲突:完整构建/真人/部署未完成,按 AGENTS 诚实边界暂记 blocked。
- 测试数量按 BUG-995 / frontend AGENTS 比较名称多重集合,不仅看汇总尾行。没有把既有失败当通过。
历史检索与保护
开工只读代理按现象、入口、模块及 /api/sessions 检索并完整读取相关记录:BUG-744、745、927、928、987、989、705、967、995 等。
- BUG-744 单一侧栏与只读同构仍由 sidebar-contract 守护。
- BUG-745 的旧 sidebar-data-cache 已被 BUG-927 共享
(app)/ SessionListProvider 替代,不恢复旧缓存;客户端导航、provider 生命周期合同仍在。 - BUG-989 本地新建、首问 persistSession(create)、创建成功才写 c、列表无 draft 与咨询专用过滤均仍在。
- BUG-705 未列出合法深链仍 lookup,不受 new 分支之外的行为影响。
- 本次原测试没拦住:只锁住了“导航方式”和“无参数默认落点”,没有验证跨页新建意图;补上组合与真实恢复冲突验证。
验证数字
| 检查 | 改动前基线 | 最终补修后 | 结论 |
|---|---|---|---|
| tsc --noEmit | 0 错 | 0 错 | 通过 |
| npm run lint | 0 error / 119 warning | 0 error / 119 warning | 通过;不顺手修 warning |
| 全量测试总数 | 3708 | 3717 | +9 |
| 全量 pass | 3619 | 3628 | +9 |
| 全量 fail | 89 | 89 | 失败名单无增减,不是全绿 |
| cancelled / skipped | 0 / 0 | 0 / 0 | 不变 |
| 顶层 TAP 名称 | 3690 | 3699 | 删除0、新增9 |
| 全部含子测试名称 | 3708 | 3717 | 多重集合删除0、新增9,新增全通过 |
| 本轮定向(8文件) | — | 95 pass / 0 fail | 通过 |
| 独立新增恢复测试 | — | 2 pass / 0 fail | 通过 |
| 独立内存变异(3种) | — | 每种1 pass / 1预期fail | 删除保护/只删落点/只删提示清理均被捕获 |
| 首页增长 | 基线 | +5行 / state+0 / ref+0 | D7已授权,增长合同通过 |
| next build Static | 未完成 | 未完成 | 环境缺口 |
| 首屏 gzip ±2% | 未测得 | 未测得 | 环境缺口,不报推测数字 |
命令及日志:
./node_modules/.bin/tsc --noEmit→baseline-tsc.log/final2-tsc.log。npm run lint→baseline-lint.log/final2-lint.log。npm test→baseline-test.log/final2-test.log;compare-tests.cjs final2→test-comparison.json(名称、失败名、基础诊断字段)。- 定向:chat-session-url、home-bootstrap-reveal、sidebar-contract、new-chat-recovery、session-lookup-unlisted、session-list-filter、chat-session-authority、home-shell-growth-contract →
final2-focused.log。 - 最初先加测试验证红灯:未实现新导出导致URL测试无法载入,落点/只读链接断言失败;随后实现转绿。未将该次红灯当作“全部9条都单独复现”。
- 第一次备用基线构建与新增测试编辑重叠,在类型阶段读到尚未实现的新导出,该次日志无效,不充当基线;已另建固定提交隔离工作树重新构建作为有效对照。
最终 baseline-test.log 与 final2-test.log 已独立逐项复核:89/89 完整 TAP 失败诊断(多行 error、expected/actual/operator、code、failureType、完整栈)在只归一化耗时、PID/时间戳、随机临时目录及经 SHA-256 验证的路径派生哈希后相同,未抹栈或行号。既有测试状态变化0。code分布两侧均 ERR_TEST_FAILURE49 / ERR_ASSERTION32 / ENOENT4 / EPERM4。41/41 Docker 项目均对应各自 daemon 地址池耗尽输出;4个文件加载前置stderr归一化后也一致。原始完整诊断有51项随机值变化;Compose附带进度/包装有6/41项差异,但失败原因不变,不宣称原文逐字一致。
| 最终既有失败类别 | 数量 |
|---|---|
| Docker默认网络地址池耗尽 | 41 |
| symlink EPERM(含子进程/文件加载) | 13 |
| Windows重复盘符路径ENOENT | 4 |
| methodology解析断言 | 9 |
| 迁移读取到链接目标字符串而非SQL | 5 |
| 其他既有脚本/环境断言 | 17 |
| 合计 | 89 |
其余17项涉及备份边界6、数据库环境校验3、部署环境校验3、缺rsync2、install权限1、YAML子进程9009共1、docs-only-range子进程49共1;日志不足以进一步确定所有退出码底因,不擅自修复或笼统归因。
既有断言变更表
| 原值 | 新值 | 原因 |
|---|---|---|
只读侧栏测试仅守同构、无菜单、页脚 /、无写请求 |
保留全部原断言,追加 .new-chat 必须调用 newChatHref 且关闭抽屉、不得字面量 / |
锁定新建语义,不弱化旧合同 |
| 其余既有断言 | 不变 | 新增9个测试,无删改或重命名既有用例;sibling 参数原断言也未改 |
新增测试:URL 5、落点2、reserved恢复2;恢复测试执行真实函数与首页区块,不仅做正则存在性断言。
环境缺口与后续验收
- 复用本机 node_modules junction;根工作树 lock 与基线 lock 文件不同,但逐项核对顶层已安装非可选包版本与本单 lock 相符,没有安装/升级依赖。默认 Turbopack 报依赖链接超出 filesystem root;没有为此改 next.config。
- 固定基线与最终均补跑官方
npm run build -- --webpack。编译及构建内类型检查成功,页面数据收集创建 Skill SKILL.md 符号链接报 EPERM。有效基线日志baseline-isolated-build.log、最终final2-build.log。不修改 Skill 权限或禁用检查,Static/gzip 缺口保留。 - Docker daemon 有响应但默认网络地址池耗尽;数据库 fixture 无法创建网络,未真正运行SQL。本单无数据库变更,不运行单独 test:db、不清理共享网络。
- 没有本轮受控登录浏览器证据,移动抽屉/首问网络/真实恢复按真人清单补验。存在本机浏览器与否不等于已有受控登录态,不冒称“无Chrome”或“浏览器通过”。
- 2026-09-23 实现完成时未 commit/push;2026-09-24 产品明确授权推送供远程 review,已重新 fetch,远端仍为
1c95eb397,BUG-1015 未被其他单占用,符合快进交付前置条件。此次只提交本单代码/测试/记录,不包含 artifacts 或依赖链接;Gitea 门禁及部署仍须独立核验。 - 推送前按 §9 运行 pre_work_check:本机 python3 launcher 退出49;改用已有 Python 3.11.7 执行,远端 verified、适配器与碎片扫描步骤成功,但 focused 22通过/2失败:既有
.workbuddy镜像路径断言,以及 candidate_count=4 不满足 workspace_residue_count=29 的数量断言。未伪造镜像或改治理测试以消红;不把整体预检写成通过。日志在本地push-pre-work-python.log,同步追加错误台账。