fix(web): 校正会话上不再出现可用的普通输入框
Independent Staging Quality Gate / validate (push) Canceled after 5m37s
Independent Staging Quality Gate / publish (push) Canceled after 0s

send() 对校正会话不发 /api/consult,草稿保留并打开校正面。
普通输入框只有禁用态。咨询接口把类型不对改成 409 session_not_consultation。
删除和回退不再直接切到校正会话。
This commit is contained in:
jesse-ux
2026-09-17 20:06:25 +08:00
parent f6db3c7709
commit 6d81062be9
17 changed files with 417 additions and 38 deletions
+32
View File
@@ -12034,3 +12034,35 @@
- 相关记录:BUG-214、BUG-286、BUG-922
- 复发自:无
- 修复版本:待发布
## BUG-924 | 校正会话上普通输入框可用,问题发到 `/api/consult`
- 状态:resolved
- 首次发现:2026-09-17
- 最近更新:2026-09-17
- 影响面:`use-consultation-run.ts` `send()``page.tsx` 普通 `ChatComposer``use-session-management.ts` 回退路径
- 用户现象:在生时校正会话里打了一个普通问题,请求打到咨询接口,提示「咨询会话不存在」。
- 触发条件:校正会话已激活但校正面未开(刷新揭幕超时、打开失败不重试、删除或回退落到列表第一条校正会话)。
- 根因:发送链路以「校正面没开」推断「当前是普通会话」;`send()` 不看 `sessionType`。BUG-505 只覆盖了 `selectSession`
- 修复:`send()` 对校正会话不发 `/api/consult`,保留草稿并打开校正面。普通输入框在校正会话上只有禁用态。删除 / popstate / `sessions[0]` 回退不再直接 `setActiveSessionId` 到校正会话。
- 验证:`rectification-session-composer-guard.test.ts``rectification-surface-contract.test.ts`
- 防复发:校正会话不得发出 `/api/consult`;普通输入框在校正会话上不得可用。
- 相关记录:BUG-505、BUG-925
- 复发自:无
- 修复版本:待发布
## BUG-925 | 咨询接口把校正会话和「会话不存在」都回 404
- 状态:resolved
- 首次发现:2026-09-17
- 最近更新:2026-09-17
- 影响面:`api/consult/route.ts``use-consultation-run.ts` 错误映射
- 用户现象:校正会话误发咨询时只看到「咨询会话不存在」。
- 触发条件:`POST /api/consult``sessionId` 指向 `session_type !== consultation`
- 根因:查不到与类型不对共用一个 404。
- 修复:查不到仍 404「咨询会话不存在」;类型不对 409 `session_not_consultation`。前端收到该码不显示错误、不扣点,改走打开校正面。
- 验证:`chat-session-authority.test.ts``rectification-session-composer-guard.test.ts`
- 防复发:不得把两种失败再合成一个 404。
- 相关记录:BUG-924
- 复发自:无
- 修复版本:待发布
@@ -0,0 +1,33 @@
# PROGRESS · 校正会话输入框守卫(2026-09-17)
工作树:`.worktrees/rectification-session-composer-guard-20260917`
分支:`codex/rectification-session-composer-guard-20260917`
基线:`origin/staging` @ `8eb1de1f`
本机 Windows。
Skill **未 bump**。未改 Python、迁移、Skill、校正面组件、校正 Agent。
## 任务状态
| 任务 | 状态 | 说明 |
| --- | --- | --- |
| T1 send() 会话类型守卫 BUG-924 | 完成 | 校正会话不发 `/api/consult`,保留草稿,打开校正面;pending 指向校正会话则丢弃 |
| T4 错误码 BUG-925 | 完成 | 查不到 404;类型不对 409 `session_not_consultation`;前端不显示错误、走 T1 |
| T2 普通输入框禁用态 | 完成 | placeholder「正在打开生时校正…」;失败时「重新打开生时校正」 |
| T3 回退走 selectSession | 完成 | `activateFallbackSession`popstate 用 `fallbackSessionId``sessions[0]` 改为第一条非校正 |
| T5 记录 | 完成 | BUG-924/925、CHANGELOG、DESIGN、VOICE、真人清单 |
## 让步
`/api/consult/cancel``status` 按 requestId 工作,没有 session_type 判断,未改。
## 测试
| 项 | 结果 |
| --- | --- |
| `tsc --noEmit` | 0 错 |
| `npm run lint` | 0 error / 116 warning(与基线同;本轮文件 0 条) |
| 定向 | composer-guard / surface-contract / chat-session-authority / bootstrap-reveal / home-shell-growth **34 passed / 0 failed** |
| `page.tsx` 行数 | 开工 1835 → 现在 ≤ 1835 |
无登录态、无 Chrome:走查见 `docs/testing/rectification-session-composer-guard-20260917.md`
+1 -1
View File
@@ -106,7 +106,7 @@
| `TASK-rectification-dead-d9-choice-fix-20260916.md` | `PROGRESS-rectification-dead-d9-choice-fix-20260916.md` | **验收修复单**:自建分盘探针照 `withNakshatraBoundaryProbe` 模式在每个读 state 的地方(盖戳 / 答题 / `previousInferenceFromReceipt` / GET 投影 / idle 过期判定 / 计划承接)从 receipt 确定性重建(BUG-915);测试改走生产路径、删手工塞探针的 fixture;顺带 host 前置挪到会话校验之后、登记 phase(BUG-916);死卡不得配 `collect_waiting` 占位(BUG-917);**产品决策 1c**:风格题默认不作全额计分(沿用 09-09 ±1 拍板),无事件探针就走下一条线。**staging 现状:风格题答不了,先跳过**。§1d 已记 **产品决策 (b)** | 已验收 | `5113d457`BUG-915~917,产品拍板 (b) 风格题不计分)。Claude 独立验收:生产路径测试(receipt 不含自建探针)答题 applied / GET 出卡 / idle 不误伤;合并候选门禁 tsc 0 / lint 0 error / npm test 3427 条 31 红与基线逐条相同 / `/` Static / 首屏 gzip 620,107→620,193+0.01%/ pytest 63 绿 / 快速门 Python 798 绿。真机清单 `docs/testing/rectification-dead-d9-choice-fix-20260916.md` |
| `TASK-rectification-mobile-timeline-readout-20260917.md` | `PROGRESS-rectification-mobile-timeline-readout-20260917.md` | 手机截图:时间轴读数第四项被裁成「已…」(nowrap + inset 内边距,BUG-918);「跳到最新」浮层压住选项 C(BUG-919)。灰卡与「再说一件」矛盾归修复单 BUG-915/917 | 已验收 | `e8e98bbd`(合入时重放为本分支提交,BUG-918/919)。时间轴相关 71 条 + 全量同上;手机上隐藏「已对照 N 件」符合 DESIGN §10;桌面是否也移除待产品拍板。真机清单 `docs/testing/rectification-mobile-timeline-readout-20260917.md` |
| `TASK-mobile-viewport-scroll-lock-20260917.md` | `PROGRESS-mobile-viewport-scroll-lock-20260917.md` | iPhone 上键盘收起 / 刷新后整页上移、顶栏点不到(BUG-920):iOS 不支持 `interactive-widget`,键盘弹出时 Safari 滚动 window`html/body overflow: hidden` 让用户拉不回来,reload 又还原 `scrollY`;代码里无任何 window 级复位。补 `ViewportScrollLock``scrollRestoration=manual` + `visualViewport` 复位)。与今天两单无关,既有缺陷。**T3 顶栏积分块「有点扁」(BUG-921)**:两枚芯片 44px 塞在 46px 顶栏里、字号/内边距/圆角各一套、积分块强制 64px 最小宽度;统一尺寸并把手机顶栏放到 52px | 待验收 | `codex/mobile-viewport-scroll-lock-20260917` |
| `TASK-rectification-session-composer-guard-20260917.md` | | 校正会话激活但校正面未开(刷新揭幕超时 / 打开失败不重试 / 删除与 popstate 回退落到列表第一条)时露出可用的普通输入框,问题发到 `/api/consult` 回 404「咨询会话不存在」;`send()` 无会话类型守卫;服务端无独立错误码。关联 BUG-505。BUG 段 924 起 | 待领取 | |
| `TASK-rectification-session-composer-guard-20260917.md` | `PROGRESS-rectification-session-composer-guard-20260917.md` | 校正会话激活但校正面未开(刷新揭幕超时 / 打开失败不重试 / 删除与 popstate 回退落到列表第一条)时露出可用的普通输入框,问题发到 `/api/consult` 回 404「咨询会话不存在」;`send()` 无会话类型守卫;服务端无独立错误码。关联 BUG-505。BUG 段 924 起 | 待验收 | `codex/rectification-session-composer-guard-20260917` |
### 聊天主链路与首页
@@ -0,0 +1,24 @@
# 真机清单 · 校正会话普通输入框守卫(2026-09-17)
执行环境无登录态、无 Chrome。下列条目留给有真实账号的人在 staging 走查。截图不要带姓名、出生资料或会话正文。
## 刷新后立刻打字
1. 打开一条进行中的生时校正会话。
2. 刷新页面。揭幕后立刻在底部输入框打字。
3. **看:** 输入框是禁用的,占位「正在打开生时校正…」。没有转圈。
4. 几秒后校正面出现。刚才打的字还在草稿里(不要发到普通咨询)。
## 打开失败后重新打开
1. 断网(或开发者工具离线)。
2. 点侧栏一条校正会话。
3. **看:** 错误文案 + 「重新打开生时校正」按钮。普通输入框仍禁用。
4. 恢复网络,点按钮。
5. **看:** 校正面打开。
## 删除后落到校正会话
1. 当前是一条普通对话,侧栏下一条(或第一条剩下的)是校正会话。
2. 删除当前普通对话。
3. **看:** 不会出现可用的普通输入框。要么打开校正面,要么输入框保持禁用。