Files
Jyotisha/docs/tasks/PROGRESS-rectification-collect-vs-offer-consistency-20260905.md
T

82 lines
7.4 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-05)
工作树:`.worktrees/rectification-collect-vs-offer-consistency-20260905`
分支:`codex/rectification-collect-vs-offer-consistency-20260905`
基线:`origin/staging` @ `3edb628c`(任务书写的是 `1052a027`;开工时 staging 已含后续提交,以当时 `origin/staging` 为准)。未改 `.gitea/workflows/**`、未动迁移、未升级依赖、未 bump Skill(仍 10.0.14)、未改 `page.tsx`、未改引擎、未改 BUG-544 隐藏规则。
| 任务 | 状态 | BUG |
| --- | --- | --- |
| 剩余带年份采集未完不判可采用;出牌轮才出卡写报告 | 完成 | BUG-550 |
## 编号
开工时最大号 BUG-549。本单 **BUG-550**。未占用预留的 BUG-542。
## 产品取舍
任务书决策 1:**采集优先**。学业 / 财务 / 搬家 / 健康 / 职业口述没问完(也没拒答)之前,决策保持 `collect_evidence`:页面只有只读区间、没有可点的卡、Agent 不写验证报告。问完之后一轮内报告 + 卡片一起出,下面不再跟问题。用户说「没有更多」、已采用、已耗尽出口不变。
未走决策记录 3 的否决项(卡先给、问题照问)。那条路要动 BUG-544 藏卡规则、不动决策层;本单按默认走决策层一处改。
未过滤流事件 JSON`{"type":"skill.bound"}`),见任务书 §7。
## 实现要点
- `decideFromDossier` / `decideAfterInferenceChange``datedMethodCollectOpen(collecting.methods) || isRemainingEvidenceCollect(collecting.next_followup)``collecting` 仍用 `sessionOutcome: "collect_evidence"`、不带区分卡目录,所以下一问是账本上还没问的带年份采集。
- `decideRectification`:分离度够、`accepted` 之后、确认门之前,若采集仍开且用户未停止 → `collect()``exhausted` 已在上一分支返回,条件里不再写 `stopClass?.kind !== "exhausted"`tsc 会判无重叠)。
- 四个消费者不改各自规则:`next_user_action` 变成 `ask_fact_collection`offer 因 kind 不在 `offerSessionKinds``offer_not_allowed`;客户端走只读区间;`shouldSkipFollowupPersist` 行为不变。
- 既有「可采用 / 出卡 / 采用旁白」夹具把剩余带年份域补覆盖或拒答,避免训练门未开或剩余采集把主题测成采集。
## 测试
| 命令 | 结果 |
| --- | --- |
| `npx tsx --test tests/rectification-*.test.ts tests/agent-voice-copy-contract.test.ts` | 904 项;pass 904fail 0 |
| `npx tsc --noEmit` | 0 错 |
| 改动文件 eslint `--quiet` | 0 error |
| `npm run lint` | 0 error73 条既有 warning,不在本单文件 |
| `page.tsx` | 未改 |
开工对照 BUG-549 进度记录为 898 项。本单新增决策层与端到端用例后为 904。
未做浏览器真人走查。清单:`docs/testing/rectification-collect-vs-offer-consistency-20260905.md`。旧会话在部署前仍可能先出卡再被采集题挤掉。
## 验收(Claude2026-09-05,基于 `origin/staging` @ `3b410c14`
| 项 | 结论 |
| --- | --- |
| 5.1 决策层(两处 `datedMethodCollectOpen` 叠加 + sufficient 分支 `accepted` 之后、确认门之前的 collect 出口) | 通过;`exhausted` 在上一分支已返回,省略该条件成立 |
| 5.1 单测(分离 + 采集开 → collect;`userStopped` → 原停止出口;`accepted` → adopt | 通过 |
| 5.2 端到端(家人拒、财务未问 → 采集 + 持久化财务;补齐 → adopt 且无追问;offer 工具 `offer_not_allowed` | 通过 |
| 5.3 记录(BUG-550、CHANGELOG、进度、真人清单) | 通过 |
| 红线:BUG-544 / 546 / 547 / 549、accepted、userStopped / exhausted 出口 | 通过(对应用例原样通过,未改客户端 / offer 描述 / Skill / 引擎) |
| 测试 `tests/rectification-*.test.ts` + `agent-voice-copy-contract` | 904 项 / fail 0(基线 `1052a027` 898 项) |
| `tsc --noEmit` / `npm run lint` | 0 错 / 0 error73 warning 与基线同) |
| staging 部署 | **未部署**`/api/health` 仍为 `afd14948``deploy-staging` #1109 / #1112 / #1114 / #1115 全部失败,`migrate-staging-database` #1110 也失败——`bab07187` 带迁移 `5010000_personal_report_longform_appendices.sql``run-staging-deploy.sh` 检出待迁移即拒绝。日志需登录 Gitea 查看(环境缺口) |
### 既有断言变更(原值 / 新值 / 原因)
执行方在测试里用「旧 / 新」注释说明了大部分改动,此表补齐要求的三栏;原因统一为决策记录 1「剩余带年份采集(学业 / 财务 / 搬家 / 健康 / 职业口述)未问完不判可采用」,夹具未补齐这些域时决策从出牌改为采集。
| 文件 · 用例 | 原值 | 新值 |
| --- | --- | --- |
| `rectification-adopt-narration-20260904` · fourteen-probe case | `offer_provisional_range` / `adopt_representative` / `ready_to_adopt` | `ask_fact_collection` / `collect_evidence` / `collect_events` |
| 同文件 · adoptDeliveryFacts、three adopt entry points、diagnostics、times out | `caseDossier()` | `caseDossier({ declinedTopics: EXHAUSTED_COLLECT_TOPICS })`(夹具补拒答,断言不变) |
| `rectification-adopt-flow-fix-20260903` · collect-phase nonterminal exit | 仅家人拒答 | 家人 + 学业 / 财务 / 搬家 / 健康 / 职业拒答(夹具补齐,断言不变) |
| `rectification-answer-choice` · adoptionDossier / nonterminal exit satisfied / persistNextInterviewIfIdle once | 仅家人 skipped | 补学业 / 财务 / 搬家 / 健康(/ 职业)拒答(夹具补齐,断言不变) |
| `rectification-collect-stall` · separated scores with uncovered relatives | `notEqual ask_fact_collection` | `equal ask_fact_collection` + `collect_evidence` |
| 同文件 · covering / declining family and occupation still opens adopt | `notEqual ask_fact_collection` 且 ∈ {holdout, ready_to_adopt, offer_provisional_range} | `equal ask_fact_collection` + `collect_evidence`(用例名已与内容相反,见 P3 |
| `rectification-coverage-collect` · offers a range with adopt when training is complete | `canOfferRange true` / `canAdopt true` | `canOfferRange false` / `collect_evidence` / `ask_fact_collection` |
| `rectification-provisional-adopt` · incident 1a | `can_adopt true` / `selection_allowed true` / 区间与代表时间 | `can_adopt false` / `session_outcome collect_evidence` |
| 同文件 · incident 1b | `can_adopt true` / `selection_allowed true` | `can_adopt false` / `collect_evidence` |
| 同文件 · incident 1c | `canRender… true` | `false` |
| 同文件 · incident 4 | `adopt_representative` / `offer_provisional_range` | `collect_evidence` / `ask_fact_collection` |
| 同文件 · delivery B1 | `canRenderRectificationSelectionCards true` | `false` |
| 同文件 · delivery B2 | `plan.session_outcome adopt_representative``action.id adopt_representative` | `collect_evidence``ask_method_followup` |
| `rectification-range-offer-deadend` · live remaining probes with zero active split | `offer_provisional_range` | `ask_fact_collection` + `collect_evidence` |
### 遗留(不阻塞验收)
- P3`collect-stall`「still opens adopt」两条、`coverage-collect`「offers a range with adopt」、`provisional-adopt` incident 1a、`range-offer-deadend`「open provisional adopt」的用例名与新断言相反,下次触碰这些文件时顺手改名。
- 真人清单 `docs/testing/rectification-collect-vs-offer-consistency-20260905.md` 待部署后执行;部署前提是先跑通 `Migrate Staging Database`