Files
Jyotisha/docs/tasks/PROGRESS-secondary-new-chat-intent-20260923.md
T
jesse-uxandClaude Code 8902e48468
Independent Staging Quality Gate / validate (push) Successful in 13m41s
Independent Staging Quality Gate / publish (push) Successful in 3m30s
fix(chat): honor new-chat intent from secondary pages
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>
2026-09-24 00:25:28 +08:00

104 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 时不改变恢复行为。
## 决策、勘误与偏离
1. **追加授权而非擅自破红线**:独立验收首次发现 `restoreConsultationRecovery()` 无条件激活旧会话,导致新建路径被覆盖。主会话向产品说明超出“一行”范围,产品明确选择“一并修复”。已在 TASK D7 记录:仅首页额外四行保护,首页总计 +5 行,无新增 state/ref,不改恢复 hook 或后台任务,不取消请求。
2. T2“激活前清理”与“放在 replace-clear 邻行”原描述冲突;以明确时序为准,清理放在 setActiveSessionId 前。
3. 当前品牌行无任务书所说的 AppLink,只是 div/span/strong,不补造入口。默认会话也可能受收藏及返回存根影响,不扩大修改无参数首页规则。
4. 空历史启动已有兜底会创建一个本地空咨询,再执行新建分支会产生另一个本地空对象;两者均不落库、不显示于历史。本单按“new 恒新建”要求保留,不另改会话状态流。
5. 任务书预写 resolved 与事实证据冲突:完整构建/真人/部署未完成,按 AGENTS 诚实边界暂记 blocked。
6. 测试数量按 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;恢复测试执行真实函数与首页区块,不仅做正则存在性断言。
## 环境缺口与后续验收
1. 复用本机 node_modules junction;根工作树 lock 与基线 lock 文件不同,但逐项核对顶层已安装非可选包版本与本单 lock 相符,没有安装/升级依赖。默认 Turbopack 报依赖链接超出 filesystem root;没有为此改 next.config。
2. 固定基线与最终均补跑官方 `npm run build -- --webpack`。编译及构建内类型检查成功,页面数据收集创建 Skill SKILL.md 符号链接报 EPERM。有效基线日志 `baseline-isolated-build.log`、最终 `final2-build.log`。不修改 Skill 权限或禁用检查,Static/gzip 缺口保留。
3. Docker daemon 有响应但默认网络地址池耗尽;数据库 fixture 无法创建网络,未真正运行SQL。本单无数据库变更,不运行单独 test:db、不清理共享网络。
4. 没有本轮受控登录浏览器证据,移动抽屉/首问网络/真实恢复按真人清单补验。存在本机浏览器与否不等于已有受控登录态,不冒称“无Chrome”或“浏览器通过”。
5. 2026-09-23 实现完成时未 commit/push;2026-09-24 产品明确授权推送供远程 review,已重新 fetch,远端仍为 `1c95eb397`,BUG-1015 未被其他单占用,符合快进交付前置条件。此次只提交本单代码/测试/记录,不包含 artifacts 或依赖链接;Gitea 门禁及部署仍须独立核验。
6. 推送前按 §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`,同步追加错误台账。