feat(rectification): 删掉年月录入卡,年月阶段打字回答且不被追问覆盖
Independent Staging Quality Gate / validate (push) Successful in 10m1s
Independent Staging Quality Gate / publish (push) Successful in 36m54s

This commit is contained in:
jesse-ux
2026-09-16 23:22:32 +08:00
parent abcfdac523
commit 6aabbe386f
49 changed files with 1035 additions and 431 deletions
+67 -2
View File
@@ -11725,8 +11725,8 @@
- 根因:提交文本直接拼 `KIND_ORAL[domain]`,而 `KIND_ORAL` 是**题干用的例子列表**,不是事件描述。
- 修复:改成「YYYY 年 M 月(D 日),<领域标签>方面有一件事」,标签取 `RANGE_DELIVERY_DOMAIN_LABEL`;文本里不再出现「或」。
- 验证:`frontend/tests/rectification-guided-collect-20260916.test.ts` 断言提交文本与「不含『或』」。
- 防复发:任何写进账本的用户文本都不得复用题干的例子列表。
- 相关记录:BUG-740、BUG-749
- 防复发:任何写进账本的用户文本都不得复用题干的例子列表。2026-09-16 录入卡按产品决策删除,本条防复发仍适用于任何用户可见文本。
- 相关记录:BUG-740、BUG-749、BUG-908
- 复发自:无
- 修复版本:待发布
@@ -11779,3 +11779,68 @@
- 复发自:BUG-713
- 修复版本:待发布
## BUG-908 | 年月阶段焦点题干被模型追问覆盖,下面还挂着录入卡
- 状态:resolved
- 首次发现:2026-09-16
- 最近更新:2026-09-16
- 影响面:`spoken-prompt.ts` `withSpokenPrompt``turn-decision.ts` `projectCurrentQuestion`、录入卡组件(已删)、Skill 10.0.29
- 用户现象:定向健康题答 A 后打字给了年月,助手追问「是你本人做的吗」,追问句下面还挂着「哪一类事 + 发生年月」录入卡。
- 触发条件:活动焦点题号是 `collect:targeted:<domain>:year``collect:guided:window:…:year`,模型用同号 `set-focus` 覆盖 `prompt`
- 根因:BUG-673 只保护了 `targeted_collect` 存在题;年月阶段 schema 会被 `withSpokenPrompt` 整段换成模型的话。产品同时拍板:录入卡整个删掉,年月阶段改打字。
- 修复:年月阶段以题号 `stage === "year"` 识别,只写 `spoken_prompt`、不动 `prompt`。投影只用服务器题干。删除 `EventDateEntryCard` / `EventDatePicker`。选项 A 改「有,我来说」。Skill 10.0.29。
- 验证:`frontend/tests/rectification-year-focus-overlay-20260916.test.ts`
- 防复发:年月阶段识别以题号前缀为准,与 BUG-673 同口径。不得再引入第二套录入入口。
- 相关记录:BUG-673、BUG-750
- 复发自:BUG-673
- 修复版本:待发布
## BUG-909 | 事件入账后年月焦点没有关闭
- 状态:resolved
- 首次发现:2026-09-16
- 最近更新:2026-09-16
- 影响面:`resolveActiveCollectFocusAfterEvidence``pendingTargetedYearDomain``rectification-record-evidence-batch``rectification-propose-evidence`
- 用户现象:时间轴已「记下了」年月事件,画面仍停在该领域的年月题。
- 触发条件:存在题答 A 落后年月焦点,用户打字给带年月事件。
- 根因:回放显示两条都要修。(a) batch 原先只在 `isCollectFocusSchema` 时 resolve,年月题号要按前缀识别;(b) `pendingTargetedYearDomain` 在存在题 resolved 后只要 year 题未关就会再出,即使账本已有该领域带年月事件。单条 `propose-evidence` 原先不 resolve。
- 修复:抽 `resolveActiveCollectFocusAfterEvidence`batch 与 propose 共用;`isCollectFocusSchema``:year` 题号都 resolve。`pendingTargetedYearDomain``coveredCollectKinds` 也算 yearClosed`health` 别名走 `canonicalCollectDomain`)。
- 验证:overlay 测试「dated evidence closes the year stage」与 persist collect schema。
- 防复发:两条写入路径必须走同一段 resolve;该领域已有带年月事件不得再出 `:year`
- 相关记录:BUG-908
- 复发自:无
- 修复版本:待发布
## BUG-910 | 年月阶段收到无年月短句会烧完步骤上限
- 状态:resolved
- 首次发现:2026-09-16
- 最近更新:2026-09-16
- 影响面:`agent-run.ts` host 前置、`year-entry-host.ts`
- 用户现象:对着追问回「是/不是」一类短句,整轮报「本轮达到步骤上限」。
- 触发条件:活动焦点是年月阶段,用户消息没有 `19xx/20xx` 或「x 年」。
- 根因:模型拿到「有年份走 batch,否则再问」的 hint,短句写不进、set-focus 同号幂等,循环到 8 步没正文。完整 agent 循环未在单测里复现(记防御性前置)。
- 修复:日期可靠性分类器之后、计费之前,host 以服务器题干再问一次,不进模型、不扣点。焦点保持原样,失败轮不会只关掉年月题。
- 验证:`shouldHostReaskYearEntry` 与 agent-run 源码顺序断言。
- 防复发:年月阶段无年份短句不得进模型。`applyHostFallback` 条件未改。
- 相关记录:BUG-908
- 复发自:无
- 修复版本:待发布
## BUG-911 | 独立问题块与助手正文不在同一条左边线
- 状态:resolved
- 首次发现:2026-09-16
- 最近更新:2026-09-16
- 影响面:`globals.css` `.rectification-message-question.is-standalone``rectification-agentic-chat.tsx`
- 用户现象:消息外的 persisted 问题块题干顶到左边。
- 触发条件:`questionGap === "persisted_question"` 的独立块。
- 根因:独立块没有 `--assistant-content-inset`
- 修复:独立块加 `is-standalone``margin-inline-start: var(--assistant-content-inset)`;块内 embedded 点选卡 inset 归零。
- 验证:overlay CSS 声明断言。
- 防复发:独立问题块必须与助手正文共用同一 inset token。
- 相关记录:BUG-908
- 复发自:无
- 修复版本:待发布
@@ -0,0 +1,33 @@
# 进度 · 删掉录入卡 + 年月阶段焦点被模型追问覆盖(2026-09-16)
基线:`origin/staging` @ `abcfdac5`(任务书含产品追加拍板)。
分支:`codex/rectification-year-focus-overlay-20260916`
BUG:908~911(任务书预留;仓库最大号当时是 753,906/907 给控制台噪音单)。
Skill10.0.29sha256 `750a0d58c6731c0dbdeb5c785cea1bf8a3f73aaf94a560a86397805b7037724c`
## 做了什么
- **T0**:删除 `event-date-entry-card.tsx` / `event-date-picker.tsx``.rectification-event-entry*` CSS。`event_date_entry` 不再写入 schema。年月题号保留,题干「大概哪年几月?」,用户打字答。选项 A「有,我来说」。`git grep` `event_date_entry|EventDateEntryCard|EventDatePicker|rectification-event-entry``frontend/src` **0 命中**
- **T1 / BUG-908**`withSpokenPrompt` 以题号 `stage === "year"` 只写 `spoken_prompt``projectCurrentQuestion` 年月阶段只用服务器 `prompt`。hint 与 Skill 禁止追问本人。
- **T2 / BUG-909**:回放定两条都要修。(a) persist 的年月焦点已是 `isCollectFocusSchema`,但 resolve 仍按题号前缀补一层;(b) `pendingTargetedYearDomain` 把已覆盖领域算 yearClosed`health``health_pressure`)。`resolveActiveCollectFocusAfterEvidence` 给 batch 与 propose 共用。
- **T3 / BUG-910**host 前置接无年月短句,不进模型、不扣点。完整 8 步循环未做成 live agent 回放,前置作为防御;失败轮不 resolve 焦点。状态仍记 `resolved`(用户可见路径已接住)。
- **T4 / BUG-911**:独立问题块 `is-standalone` 与助手正文共用 `--assistant-content-inset`
- **T5**BUG_HISTORY / CHANGELOG / DESIGN / VOICE / 真机清单 / 本进度。
## 测试
| 项 | 结果 |
| --- | --- |
| `tsc --noEmit` | 0 错 |
| 改动文件 `eslint` | **0 error** / 34 warning(全是既有 unused / hooks |
| `Home()` growth | useState / useRef / 行数护栏全绿 |
| overlay + guided + 先前红的 Skill 版本合同 | **50 passed / 0 fail** |
| `rectification-*.test.ts` + skill-registry + home-shellconcurrency=1 | 1330 条:修完 Skill 正文 `version:` 断言后,内容失败为 0。剩 **5 条 Windows EPERM symlink**skill-registry 4 + `rectification-v9-agent.test.ts` 导入时建 runtime alias),Linux CI 不受影响。hash / 版本解析合同已绿。 |
| 全量 `npm test` / `npm run lint` | 本机并发 OOM,未拿全量数字。失败清单里与本单相关的 Skill `10.0.28` 正文断言已改到 `10.0.29`(原值/新值/原因写在测试旁)。 |
| `next build` | worktree 的 `node_modules` 是指向主检出的 junctionTurbopack 拒收;webpack 编译 + tsc 通过,收集 `/api/consult` 页数据时同样 EPERM symlink。**`/` Static 与首屏 gzip 留给 Gitea 门禁**。删除两张录入卡,gzip 只应降不应升。 |
| Python | 未改,不跑快速门。 |
## 环境缺口
- Windows 无管理员/开发者模式 symlink:`skill-registry` 与 Skill runtime alias。Gitea 跑 Linux。
- 真机清单:`docs/testing/rectification-year-focus-overlay-20260916.md`
+1 -1
View File
@@ -101,7 +101,7 @@
| `TASK-rectification-superseded-focus-duplicate-20260910.md` | `PROGRESS-rectification-superseded-focus-duplicate-20260910.md` | P0:一轮两次 batch 让感情采集题被顶替成 superseded 行;题号唯一约束含已结束行、汇总只聚合 declined/skipped,计划层看不见→撞号 `duplicate_focus` 被当「已问过」→出口误走交付旁白无卡(BUG-644);交付口吻与 `can_adopt=false` 矛盾(BUG-645) | 待验收(环境缺口:`next build` / 真人走查) | `a3a51c32`BUG-644/645 |
| `TASK-rectification-exhausted-gate-exit-20260910.md` | `PROGRESS-rectification-exhausted-gate-exit-20260910.md` | 五领域全拒答 + 三件带月经历:门槛句后无载体、客户端误报「没有拿到下一个问题」并循环「接着问」(BUG-646);第三件被留作 holdout 导致永远没有选择题(BUG-647)。含产品建议:一次性开放追问 + 终态标记 + 穷尽后释放 holdout | 已被取代(并入采集重设计单) | — |
| `TASK-rectification-collection-redesign-20260910.md` | `PROGRESS-rectification-collection-redesign-20260910.md` | 产品口径:用户先说、系统从已说的事锚定追问、不得用生日推年份、不得说「领域」、永远交付结果。无固定题数:收集问题池按信息价值排序问到训练门开;选择题问到收敛门开或增益见底;门关不出结果只出精确缺口句并保持开放;≥4 件才留 holdout;撤回 BUG-642 年份线索、BUG-646 单终态与「暂定采用」;Skill 10.0.23BUG-646648 | 待验收 | `dd8f35f7` |
| `TASK-rectification-year-focus-overlay-20260916.md` | `PROGRESS-rectification-year-focus-overlay-20260916.md` | 真机:定向健康题选 A 后打字给年月,助手追问「是你本人做的吗」,追问句下面挂着录入卡(`set-focus` 同号覆盖年月焦点题干、`event_date_entry` 仍在,BUG-908);事件入账后年月焦点没关(BUG-909,回放定 resolve 还是计划层);答短句撞「本轮达到步骤上限」(BUG-910,host 前置接无年月短句,先 investigating);persisted 问题块无 `--assistant-content-inset`(BUG-911)。**产品追加拍板:「哪一类事 + 发生年月」录入卡整个删掉,年月阶段直接打字(推翻 precision-gate 单 T3 与 SKILL.md:84**。主体默认本人不追问,Skill 10.0.29 | 待领取 | |
| `TASK-rectification-year-focus-overlay-20260916.md` | `PROGRESS-rectification-year-focus-overlay-20260916.md` | 真机:定向健康题选 A 后打字给年月,助手追问「是你本人做的吗」,追问句下面挂着录入卡(`set-focus` 同号覆盖年月焦点题干、`event_date_entry` 仍在,BUG-908);事件入账后年月焦点没关(BUG-909,回放定 resolve 还是计划层);答短句撞「本轮达到步骤上限」(BUG-910,host 前置接无年月短句,先 investigating);persisted 问题块无 `--assistant-content-inset`(BUG-911)。**产品追加拍板:「哪一类事 + 发生年月」录入卡整个删掉,年月阶段直接打字(推翻 precision-gate 单 T3 与 SKILL.md:84**。主体默认本人不追问,Skill 10.0.29 | 待验收 | `codex/rectification-year-focus-overlay-20260916` |
### 聊天主链路与首页
@@ -0,0 +1,9 @@
# 真机清单 · 年月阶段口述(2026-09-16
在 staging 已登录账号上走一遍。不要用真实出生资料以外的生产用户。
1. 开一段新的生时校正,答到定向健康题「身体上有没有过住院、手术……」。
2. 点 A「有,我来说」。下面应出现一句「大概哪年几月?」,**没有**「哪一类事」芯片,也**没有**年/月选择器。
3. 在输入框打字给一件带年月的事(例如「2019年3月做过手术」)。助手只说「记下了」一类承接,**不追问**「是不是你本人」。
4. 若仍口头追问了别的,回一句「是」或「不是」:不应出现「本轮达到步骤上限」。
5. 任何独立问题块(题干,如还有点选卡)左边线与助手正文对齐。