7.4 KiB
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 904;fail 0 |
npx tsc --noEmit |
0 错 |
改动文件 eslint --quiet |
0 error |
npm run lint |
0 error;73 条既有 warning,不在本单文件 |
page.tsx |
未改 |
开工对照 BUG-549 进度记录为 898 项。本单新增决策层与端到端用例后为 904。
未做浏览器真人走查。清单:docs/testing/rectification-collect-vs-offer-consistency-20260905.md。旧会话在部署前仍可能先出卡再被采集题挤掉。
验收(Claude,2026-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 error(73 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-adoptincident 1a、range-offer-deadend「open provisional adopt」的用例名与新断言相反,下次触碰这些文件时顺手改名。 - 真人清单
docs/testing/rectification-collect-vs-offer-consistency-20260905.md待部署后执行;部署前提是先跑通Migrate Staging Database。