82 lines
7.4 KiB
Markdown
82 lines
7.4 KiB
Markdown
# 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-adopt` incident 1a、`range-offer-deadend`「open provisional adopt」的用例名与新断言相反,下次触碰这些文件时顺手改名。
|
||
- 真人清单 `docs/testing/rectification-collect-vs-offer-consistency-20260905.md` 待部署后执行;部署前提是先跑通 `Migrate Staging Database`。
|