diff --git a/docs/tasks/README.md b/docs/tasks/README.md index 9388f13e..bd2facc8 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -47,7 +47,8 @@ | `TASK-rectification-adopt-narration-20260904.md` | `PROGRESS-rectification-adopt-narration-20260904.md` | 探针池耗尽时采用卡旁白改 Agent 生成 + 已丢弃探针绕过 BUG-472 早退 + 区分题答否关线 | 已验收(4.1.4 点选入口未通过,见修复单) | `0aaa0d70`(BUG-519/520) | | `TASK-rectification-adopt-narration-fix-20260904.md` | `PROGRESS-rectification-adopt-narration-fix-20260904.md` | 采用旁白 Agent 在点选入口从不运行(早退分支重算过期决策)+ 校验器/可观测/超时 | 已验收(5.1/5.2 实现通过;超时测试挂死事件循环,见修复单 2) | `13dded9f`(BUG-521/522) | | `TASK-rectification-adopt-narration-fix2-20260904.md` | `PROGRESS-rectification-adopt-narration-fix2-20260904.md` | 采用旁白超时用了 unref 的 `AbortSignal.timeout`,测试挂死取消同文件后三条用例,门禁 `npm test` 退出码 1 | 已验收(门禁通过,staging 已部署) | `45bdb63e`(BUG-523) | -| `TASK-rectification-collect-direction-20260904.md` | `PROGRESS-rectification-collect-direction-20260904.md` | 可评分事件 2 条时盘外核对抢跑到刚拒答的家人领域,Agent 只能改写成不指向任何领域的泛问;缺第三件带年份的事却先问职业 | 待验收 | `codex/rectification-collect-direction-20260904`(BUG-527~530) | +| `TASK-rectification-collect-direction-20260904.md` | `PROGRESS-rectification-collect-direction-20260904.md` | 可评分事件 2 条时盘外核对抢跑到刚拒答的家人领域,Agent 只能改写成不指向任何领域的泛问;缺第三件带年份的事却先问职业 | 已验收:5.1/5.3/5.4 通过;5.2 顺序错位(任务书责任)见修复单 | `codex/rectification-collect-direction-20260904`(BUG-527~530) | +| `TASK-rectification-collect-direction-fix-20260904.md` | `PROGRESS-rectification-collect-direction-fix-20260904.md` | dated 补采集分支插在方法轮转之前,新案例第二问被家人抢占感情/事业;`7ee7f825` CSS 与合同测试脱节挡住门禁 | 待执行 | `codex/rectification-collect-direction-fix-20260904`(BUG-531~532) | | `TASK-rectification-ux-20260902.md` | `PROGRESS-rectification-ux-20260903.md` | 会话面空白假死与交互摩擦 | 已验收 | `d159f08e`(09-03 在新基线重做后合入,BUG-505~509) | ### 聊天主链路与首页 diff --git a/docs/tasks/TASK-rectification-collect-direction-fix-20260904.md b/docs/tasks/TASK-rectification-collect-direction-fix-20260904.md new file mode 100644 index 00000000..04cb541f --- /dev/null +++ b/docs/tasks/TASK-rectification-collect-direction-fix-20260904.md @@ -0,0 +1,109 @@ +# TASK · 采集方向修复单:带年份补采集不得抢在感情 / 事业前面(2026-09-04) + +上游任务书:`docs/tasks/TASK-rectification-collect-direction-20260904.md`(实现 `3847e9c9`,已合入 `origin/staging`)。 +本单是验收后的修复单,只处理验收未通过项与一条门禁阻塞;5.1 / 5.3 / 5.4 已验收通过,不重做。 + +## 0. 基线 + +- 基线 commit:`origin/staging` **`3847e9c9`**(`fix(rectification): collect a dated third event before OOS and occupation`)。 +- 分支:`codex/rectification-collect-direction-fix-20260904`,工作树 `.worktrees/rectification-collect-direction-fix-20260904`。 +- 验收环境:无 Docker(25 条 `docker ENOENT` 基线失败)、无登录态、无模型凭据。 + +## 1. 事故实证 + +### 1a. 新案例第二问从「感情」变成了「家人」(验收发现,P1) + +任务书 §3 决策 3 写的顺序是「家人→学业→财务→搬家→健康→事业→感情」,并要求进入计划主流程。执行方按字面把 `nextDatedCollectFollowup` 插在 `buildMethodFollowupPlan` 的方法覆盖轮转**之前**(`method-followup.ts` 中 `if (!next && !meetsAcceptanceEventQuality(input.evidence))` 一段,位于 `!dashaCovered` 之后、`sameDomainYearlessCard` / `d9_relationship` 轮转之前)。 + +结果:训练门未开(前 3 件事几乎总是如此)时,任何新案例的路径变成: + +| 已有证据 | `45bdb63e`(原) | `3847e9c9`(现) | +| --- | --- | --- | +| 1 件事业 | `d9_relationship` / relationship | `relatives` / family | +| 1 件感情 | `d10_career` / career | `relatives` / family | +| 1 件学业 | `d9_relationship` / relationship | `relatives` / family | +| 事业 + 感情 | `relatives` / family | `relatives` / family(一致) | + +本地重放(`buildMethodFollowupPlan` 带 `holdoutValidation: "not_started"`)与 `3847e9c9` 改写的 17 条断言一致:`rectification-eight-method`(7 条 `d9_relationship → relatives`)、`rectification-walkthrough-polish`、`rectification-question-ownership`、`rectification-choice-card`、`rectification-v10-conversation-focus`(`relationship / collect_retry: true → family`,同时丢掉了「已关闭的感情采集 → retry 文案」这条路径)。 + +这不是执行方偏离,是任务书 §3 决策 3 给的顺序没有区分「新案例的前两问」与「缺第三件事时的补采集」。**这条由任务书作者承担。** + +### 1b. 为什么感情 / 事业必须在前 + +- `BLOCKING_COVERAGE_IDS = { dasha_events, d9_relationship, d10_career, relatives }`:D9 / D10 / 六亲三层是采用门的前置(BUG-463),家人在第三位是既定顺序。 +- `sameDomainYearlessCard(domain)` 只在轮转里生效:感情 / 事业若已有无年份的区分卡,轮转会直接出卡;提前的 dated 分支绕过了它。 +- `closedCollectFocuses` 的 retry 路径(`USER_COLLECT_QUESTION_RETRY.relationship`)也只在轮转里;提前分支让它永远不会被触发。 + +### 1c. 门禁阻塞(非本单引入,但挡住本单上线) + +`https://staging.jyotisha.chat/api/health` 的 `deployment.gitCommit` 停在 `7b1354a7`。其后 `7ee7f825`(`fix(ui): collapse product weights and radii onto the shared Button`)把 `globals.css` 里原生 input 的 `padding: 0 12px` 改成 `padding: 0 var(--space-3)`,但 `frontend/tests/admin-model-management-ui-contract.test.ts` 的 `global native input sizing excludes Ant Design picker internals` 仍锁 `padding: 0 12px;`。`backend-quality-gate` 跑 `npm test --prefix frontend`,所以 `7ee7f825`、`5c5f25a3`、`3847e9c9` 全部没有部署。本地全量:2655 tests / 26 fail,其中 25 条是无 Docker 基线,唯一新增就是这条。 + +## 2. 根因 + +1. 任务书顺序定义错位:把「补第三件带年份的事」的顺序当成了整个训练门未开阶段的顺序,覆盖了新案例的前两问。 +2. 插入点错位:dated 分支应当是轮转里「家人」之后、「职业」之前的一个环节,而不是轮转前的总闸。 +3. `7ee7f825` 改 CSS 未同步合同测试。 + +## 3. 决策记录 + +1. **`DATED_COLLECT_ORDER` 的定义不动**(家人→学业→财务→搬家→健康→事业→感情),仍是唯一定义;`exhaustionSpokenCollectFollowup`(Agent 穷尽路径)继续用它,`rectification-range-offer-deadend` 那条「搬家在职业前」的改写保留。 +2. **计划主流程只改插入位置**:删掉轮转前的 `if (!next && !meetsAcceptanceEventQuality(...))` 分支;在轮转里 `!familyCovered` 分支之后、`!occupationCovered` 分支之前加一段:训练门未开且 `nextDatedCollectFollowup(input.evidence, declined)` 有结果时取它。此时感情 / 事业 / 家人已 covered 或 declined,`nextDatedCollectFollowup` 只会给出学业→财务→搬家→健康。 +3. 本单顺带解堵 §1c:改测试不改 CSS(CSS 改动是设计意图,不为测试改业务代码)。若开工时 `origin/staging` 上这条测试已被 Button 会话修好,跳过并在进度记录写明。 +4. 1a 表里被改写的 17 条断言全部**回退到原值**,每条保留三栏说明(原值 = `3847e9c9` 的值,新值 = `45bdb63e` 的值,原因 = 「dated 分支移到家人之后,前两问恢复感情 / 事业」)。 + +## 4. 硬红线 + +1. 不改 `holdoutValidationStatus` 语义;不动采用 / 确认门(BUG-463);不改 `declinedDomains`(BUG-520);不改 `holdoutFollowupFor`、`validateSpokenPrompt`、`collectionProgressFromReceipt`(已验收)。 +2. 顺序只保留 `DATED_COLLECT_ORDER` 一处定义,不得再抄一份。 +3. 事故案例的三种形状(上游任务书 §1:after-no / after-occupation / no-decline)改完后必须仍然得到学业采集题,不得回到 occupation 或 `other`。 +4. 不写任何案例数据;不动 Python;不 bump Skill。 +5. 进度记录必须贴六行汇总 + 退出码(`# tests / # pass / # fail / # cancelled / # skipped / exit`);`# cancelled` 非 0 视为未通过(BUG-523)。 + +## 5. 任务分解 + +### 5.1 dated 分支移到轮转内(BUG-531) + +- 改 `frontend/src/lib/rectification-agentic/v9/method-followup.ts`:删轮转前分支;轮转内新增 `else if (!meetsAcceptanceEventQuality(input.evidence) && (dated = nextDatedCollectFollowup(input.evidence, declined)))` 形式的环节(写法自定,位置必须在家人之后、职业之前)。 +- 验收: + - `buildMethodFollowupPlan` 一件事业 → `d9_relationship`;一件感情 → `d10_career`;事业 + 感情 → `relatives`;事业 + 感情 + 家人拒答 → `d5_education`(不是 occupation);事业 + 感情 + 家人拒答 + 学业拒答 → `d2_finance`;四件跨两域(训练门已开)→ 不进 dated 分支(沿用 `3847e9c9` 新测试)。 + - `persistNextInterviewAfterChoice` 家人答「没有」后焦点 `collect:education:collect_method_evidence`(`rectification-collect-direction-20260904.test.ts` 既有用例不动)。 + - 上述新增断言放进 `rectification-collect-direction-20260904.test.ts`。 + +### 5.2 回退 17 条断言(随 5.1 同一提交) + +- 文件:`rectification-eight-method`、`rectification-walkthrough-polish`、`rectification-question-ownership`、`rectification-choice-card`、`rectification-v10-conversation-focus`。`rectification-range-offer-deadend`、`rectification-agentic-entry`、`rectification-spoken-prompt`、`rectification-v9-agent` 不动。 +- `rectification-v10-conversation-focus` 必须恢复 `collect_retry: true` 与 `USER_COLLECT_QUESTION_RETRY.relationship` 两条断言。 +- 验收:`git diff 3847e9c9 -- frontend/tests` 中每处改动都有三栏说明;测试总数 ≥ 2655。 + +### 5.3 门禁解堵(BUG-532,可能已被别的会话处理) + +- 改 `frontend/tests/admin-model-management-ui-contract.test.ts`:正则接受 `padding: 0 var\(--space-3\);`(或与 `7ee7f825` 的实际值一致),三栏说明写明「`7ee7f825` 把间距收敛到 token」。 +- 验收:`npx tsx --test tests/admin-model-management-ui-contract.test.ts` 全过;全量失败清单只剩无 Docker 基线。 +- 进度记录同时写:这条阻塞是谁引入的(commit)、是否已在别处修。 + +### 5.4 记录 + +- `docs/BUG_HISTORY.md`:BUG-531(新案例第二问被家人抢占,关联 BUG-528,写明任务书顺序错位是根因)、BUG-532(`7ee7f825` CSS 与合同测试脱节;若别处已修则改为关联记录)。 +- `docs/tasks/PROGRESS-rectification-collect-direction-fix-20260904.md`;`docs/tasks/README.md` 加一行;`CHANGELOG.md` 一句话。 + +## 6. 让步顺序 + +1. 5.1 + 5.2 是核心,不能让。 +2. 5.3 若 Button 会话已修:跳过;若冲突:以先合入 staging 的为准,本单 rebase。 +3. 三栏说明可以合并写在测试文件顶部一段(列明所有回退行),但每条断言旁至少留「见文件头」。 + +## 7. 开工前置命令 + +```bash +git fetch origin --prune +git worktree add -b codex/rectification-collect-direction-fix-20260904 .worktrees/rectification-collect-direction-fix-20260904 origin/staging +ln -s /workspace/Jyotisha/frontend/node_modules .worktrees/rectification-collect-direction-fix-20260904/frontend/node_modules +grep -o "BUG-5[0-9][0-9]" docs/BUG_HISTORY.md | sort -u | tail -1 # 核对起点 +cd frontend && ./node_modules/.bin/tsc --noEmit && npm run lint +npx tsx --test tests/rectification-*.test.ts tests/admin-model-management-ui-contract.test.ts +npm test +``` + +## 8. BUG 编号起点 + +`origin/staging` 上最大号 BUG-530,本单从 **BUG-531** 起;开工时再核对一次,若被别的会话占用则顺延并在进度记录写明。