fix(rectification): stop unwritten-evidence claims and same-cluster dasha false conflicts (BUG-635–640)
Independent Staging Quality Gate / validate (push) Has been cancelled
Independent Staging Quality Gate / publish (push) Has been cancelled

Host only says 记下了 after a real write; Mastra schema rejections fail closed. Ledger year keys no longer drop quality probes, dual-dasha agreement is per cluster, width uses cluster span, and public house tables follow the inference minute.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-10 17:38:37 +08:00
co-authored by Cursor
parent 301827ad59
commit a998b6ec53
38 changed files with 1437 additions and 124 deletions
+106 -9
View File
@@ -5679,16 +5679,16 @@
- 状态:resolved
- 首次发现:2026-08-26
- 最近更新:2026-08-26
- 影响面:`method_followup_plan``persistServerOwnedFocus``known_event_quality`
- 最近更新:2026-09-10
- 影响面:`method_followup_plan``persistServerOwnedFocus``known_event_quality``askedKeysForSameYearDedup`
- 用户现象:记下带年份的学业经历后,口语会问那次考试有没有发挥失常,界面却没有 A/B/C/D 点选卡,只能打字。dasha 冲突反推卡仍按采用门等待,不在此列。
- 触发条件:账本已有该年学业等可评分事件;decision receipt 含 `known_event_quality`;采用门 3 件/2 领域未齐,下一方法层仍是感情收集。
- 根因:`remainingReverseVerifyProbes` 跳过 `known_event_quality`。采用前只有 dasha 冲突探针能变成 `event_probe` 点选卡,且还要等 3 件/2 领域。发挥质量探针留在 receipt 里,模型用自然语言问,服务器不盖 `choice_frame`。即便盖了,`information_gain` 为 0 也会被 `shouldSkipDiscriminatorFollowup` 丢掉。
- 修复:已记下对应年份后,`known_event_quality` 在方法轮换之前出 `event_quality` 点选卡,不要求采用门。摘要已编码发挥质量则不再出卡。零信息增益不再挡住发挥质量卡。dasha 冲突探针仍等 3 件/2 领域。不改 Skill `10.0.11`
- 验证:`frontend/tests/rectification-eight-method.test.ts``frontend/tests/rectification-server-focus.test.ts``tests/test_rectification_event_probes.py`
- 防复发:已记下年份的发挥质量探针必须挂 `choice_frame` 并持久化。不得把 dasha 冲突探针的采用门门槛套到发挥质量卡上。不得把 `confirmation_allowed` 改成 true。
- 相关记录:BUG-348、BUG-384、BUG-386、BUG-388
- 复发自:BUG-384(口语问发挥质量,点选卡却被冲突探针占住;采用门修好后变成完全没有卡)
- 修复:已记下对应年份后,`known_event_quality` 在方法轮换之前出 `event_quality` 点选卡,不要求采用门。摘要已编码发挥质量则不再出卡。零信息增益不再挡住发挥质量卡。dasha 冲突探针仍等 3 件/2 领域。不改 Skill `10.0.11`2026-09-10:账本派生的 `domain.year` 键不得再把发挥质量题判成 `same_year_asked`(见 BUG-637)。
- 验证:`frontend/tests/rectification-eight-method.test.ts``frontend/tests/rectification-server-focus.test.ts``tests/test_rectification_event_probes.py`2026-09-10 补 `rectification-probe-year-dedupe-20260906.test.ts``rectification-engine-convergence.test.ts`
- 防复发:已记下年份的发挥质量探针必须挂 `choice_frame` 并持久化。不得把 dasha 冲突探针的采用门门槛套到发挥质量卡上。不得把 `confirmation_allowed` 改成 true。账本 `domain.year` 键只拦存在性探针。
- 相关记录:BUG-348、BUG-384、BUG-386、BUG-388、BUG-592、BUG-637
- 复发自:BUG-384(口语问发挥质量,点选卡却被冲突探针占住;采用门修好后变成完全没有卡)2026-09-10 再次复发自 BUG-592(见 BUG-637
- 修复版本:待发布
## BUG-390 | 事业经历未过采用门就出高考发挥点选卡
@@ -9194,15 +9194,16 @@
- 状态:resolved
- 首次发现:2026-09-08
- 最近更新:2026-09-08
- 最近更新:2026-09-10
- 影响面:`latestResultToolProjection``buildSkillVerificationPacket``jyotish-birth-time-rectification@10.0.16`
- 用户现象:区间卡已是约 3 分钟可信窗,交付轮正文却写宽度约半小时、双轨偏向已淘汰分钟、某候选 D10 升成下一座。
- 触发条件:推断层已把候选收到短区间并出交付卡;引擎 `tied_minute_count` / `dasha_agreement` 仍按全部候选计算;`window_scan` 换升在代表分钟之后。
- 根因:结果投影把 `candidates` 换成推断层,但报告仍喂引擎 `indistinguishable_width_minutes``dasha_agreement`。分盘上升没有按候选分钟给出星座,模型按换升时刻自己算。
- 修复:有推断层时报告宽度用 `credible_range` 含两端分钟数;双轨在 active 候选内重算,引擎原值只留 `dasha_agreement_pre_inference` 供审计。顶层宽度改名 `engine_indistinguishable_width_minutes`。报告给出 `sign_by_candidate`,与分歧面板共用换升函数。确认门不改。Skill 10.0.16 要求只抄该表。
补正(2026-09-10):代码里**已有** `dasha_agreement_pre_inference`。BUG-638 修的是引擎原值仍按网格分钟判冲突、与报告口径不一致,不是这个字段缺失。
- 验证:`frontend/tests/rectification-delivery-report-facts.test.ts`:推断窗 04:5104:53、引擎宽 29、双轨 top 为已淘汰分钟时,报告 `width_minutes === 3` 且正文不含 29 / 已淘汰分钟;D10 05:00 换升时 `sign_by_candidate["04:53"].d10 === "巨蟹座"``agent-voice-copy-contract` / `skill-registry` 锁 10.0.16 新句。
- 防复发:交付轮宽度、双轨、分盘星座必须来自推断层报告字段,不得再把引擎原跨度或换升时刻交给模型自算。
- 相关记录:BUG-545、BUG-568、BUG-290
- 相关记录:BUG-545、BUG-568、BUG-290、BUG-638
- 复发自:BUG-290(宽度字段进投影后未随推断层更新);BUG-568(区间读盘,交付正文仍用开工跨度)
- 修复版本:`06e44104`
@@ -9859,3 +9860,99 @@
- 相关记录:BUG-593、BUG-606、BUG-629
- 复发自:无
- 修复版本:待发布
## BUG-635 | 证据轮只说「记下了」却没写入,财务经历静默丢失、流程停在原题
- 状态:resolved
- 首次发现:2026-09-10
- 最近更新:2026-09-10
- 影响面:`runV9AgentTurn` `expectedWrite``streamAttempt` 收尾、`RECTIFICATION_USER_COPY.evidenceNotRecorded``liveQuestionOnMessages`
- 用户现象:财务采集题下回一句带年月的欠债/收入变化后,助手只回「记下了:…。」下面没有下一问也没有卡;时间线仍是原范围;证据数不变;该轮照常扣点。
- 触发条件:collect 焦点下用户提供带年月经历,模型只调 `rectification-read-case` 后按格式写「记下了」,不调 `rectification-record-evidence-batch` / `rectification-set-focus`
- 根因:路由分类结果没传给运行器,收尾只要正文非空就 `completeAttempt`,不看有没有公开写工具。客户端把旧消息上的同 `focus_id` 当成问题仍在显示,缺口不补主持人问题行。
- 修复:路由把 `expectedWrite` 设为 `"evidence" | "none" | "unknown"` 传进运行器;`provide_new_evidence``answer_current_focus` + `has_new_dated_event``"evidence"`。分类器 null/出错重试一次,仍失败则 `"unknown"` 且守卫 fail-open,**不用年份正则或关键词兜底**。无焦点的 `message` 路径也跑同一分类器。无写入的「记下了」第一次 `evidence_not_written` 可重试(零写工具,不进 `RETRYABLE_ERROR_CODES`);第二次主持人正文「这件我还没记上。请再说一次大概年月和发生的事。」,`answer.host_fallback`,不结算计费。`liveQuestionOnMessages` 只认最后一条 settled 助手消息。
- 验证:`frontend/tests/rectification-unwritten-evidence.test.ts`,以及 host-fallback / spoken-collect / agentic-entry / turn-intent-classifier / agent-voice-copy-contract。
- 防复发:有公开写工具 completed 不得重试(BUG-186);兜底正文不得由宿主复述用户原话冒充「记下了」;旧消息同 `focus_id` 不得挡住主持人问题行。
- 相关记录:BUG-186、BUG-278、BUG-359、BUG-449、BUG-633
- 复发自:BUG-633(只补了 batch 已完成且无正文,没补正文声称记下了但 batch 没跑)
- 修复版本:待发布
## BUG-636 | 校正流把 Mastra inputSchema 拒绝信封报成 tool completed
- 状态:resolved
- 首次发现:2026-09-10
- 最近更新:2026-09-10
- 影响面:`mapStreamChunkToActivity` / `mapStreamChunkToPhase` / `batchResultFromToolChunk`
- 用户现象:本事故未触发。若模型给 batch 传了不在 `EVIDENCE_KINDS` 的 kind,回执会显示 `evidence.proposed` completed,写工具守卫会被假 completed 绕过。
- 触发条件:`createTool``inputSchema` 校验失败时 resolve `{ error: true, message, validationErrors }`,流层当普通 `tool-result`
- 根因:咨询流 BUG-278 已按信封改发 `tool.failed`;校正流 `tool-result` 没有同样判定。
- 修复:信封结构 `error === true``validationErrors` 为对象时发 `tool.activity failed code=tool_call_rejected`,不发 completed phase`batchResultFromToolChunk``composeHostFallbackNarration` 对信封返回 null。公开回执不含 `validationErrors`
- 验证:`frontend/tests/rectification-unwritten-evidence.test.ts``rectification-host-fallback.test.ts`
- 防复发:不得把 Mastra 拒绝信封当 batch 返回值;不得把 `validationErrors` 写进公开事件。
- 相关记录:BUG-278、BUG-635
- 复发自:BUG-278(咨询流已修,校正流未跟)
- 修复版本:待发布
## BUG-637 | 账本同年键把已记学业的发挥质量题一并丢掉
- 状态:resolved
- 首次发现:2026-09-10
- 最近更新:2026-09-10
- 影响面:`askedKeysForSameYearDedup``inspectDiscriminatorProbes``renderableEventProbe``remainingReverseVerifyProbes`
- 用户现象:账本已有某年学业经历,`dropped_probes``education.YYYY.known_event_quality` 被标 `same_year_asked`,界面再也问不到「那次发挥怎么样」。
- 触发条件:账本派生 `domain.year` 键进入 `askedDiscriminatorKeys`;发挥质量语义键必然同域同年。
- 根因:BUG-592 的同年硬排除对账本键和已答键一视同仁。发挥质量题存在的前提就是账本已有那年事件,于是被误杀。BUG-389 的测试没覆盖「账本已有同年事件」。
- 修复:账本派生的精确 `domain.year` 键只拦存在性探针。`known_event_quality` / `event_quality` 仍受回执已答键约束,同一道不问两遍。不改 `SCORE_DELTA`、四选项、确认门。
- 验证:`frontend/tests/rectification-probe-year-dedupe-20260906.test.ts``rectification-engine-convergence.test.ts`
- 防复发:账本 `domain.year` 不得单独让发挥质量题变成 `same_year_asked`。已答过该质量键后仍须丢掉。
- 相关记录:BUG-389、BUG-592
- 复发自:BUG-389(被 BUG-592 覆盖)
- 修复版本:待发布
## BUG-638 | 双轨一致性按网格分钟判冲突,同簇两个峰值被降置信度
- 状态:resolved
- 首次发现:2026-09-10
- 最近更新:2026-09-10
- 影响面:`dasha_agreement``dashaAgreementAmongActive``decision_policy`
- 用户现象:主限和分盘大运峰值落在同一段候选里,回执仍写冲突并降低把握;报告另算一套说只作观察。
- 触发条件:两轨 argmax 分钟不同,但同属一个 `cluster_startcluster_end`
- 根因:Python 对整窗网格分钟逐分取峰值,分钟不等即 `conflict`。决策把该冲突写进 reasons 并降置信度。TS 报告只在推断层 active 候选上重算。
- 修复:按簇比较:两轨 argmax 映射到所在簇,同簇即 `agree`。没有簇时仍按分钟比较。推断层 active 簇一致也视为 agree,即使某一轨峰值不是代表分钟。引擎原值保留为 `dasha_agreement_pre_inference`。确认门不因本次 `agree` 从关到开。
- 验证:`tests/test_rectification_refinement_packet.py``frontend/tests/rectification-delivery-report-facts.test.ts`
- 防复发:同簇不同分钟不得再写 `vimshottari_narayana_conflict`。跨簇仍须 `conflict`。不得把 `confirmation_allowed` 因本次 agree 打开。
- 相关记录:BUG-593
- 复发自:无
- 修复版本:待发布
## BUG-639 | 不可分宽度按簇代表分钟少算两端延伸
- 状态:resolved
- 首次发现:2026-09-10
- 最近更新:2026-09-10
- 影响面:`indistinguishable_width_minutes``indistinguishableWidthMinutes`、确认门 `adjacent_passed`
- 用户现象:报告宽度跟区间两端对得上,引擎「不可分宽度」却按各簇代表分钟算,少算两端延伸;极端时可把 ≤5 分钟的确认门误开。
- 触发条件:各簇 `cluster_start` / `cluster_end` 超出代表分钟。
- 根因:宽度公式用代表分钟的 `max-min+1`,不是簇覆盖。
- 修复:改为 `max(cluster_end)-min(cluster_start)+1`;缺簇字段时回退到 `time``tied_minute_count` 不动。
- 验证:`tests/test_rectification_confirmation_and.py``frontend/tests/rectification-delivery-report-facts.test.ts``rectification-confirmation-gate.test.ts`
- 防复发:两簇 04:5004:55 与 04:5605:02 必须得到 13,不得算成 7。确认门不得因代表分钟看起来相邻而打开。
- 相关记录:BUG-593
- 复发自:无
- 修复版本:待发布
## BUG-640 | 宫位表和本命重算跟的不是卡片上的代表分钟
- 状态:resolved
- 首次发现:2026-09-10
- 最近更新:2026-09-10
- 影响面:`latestResultToolProjection``publicChartForMinute``natalRecastMeaning`
- 用户现象:卡片代表分钟是推断层的一分钟,回执宫位表和「已按该分钟重算」写的是引擎另一分钟;两者若跨分盘换升,正文会写错盘。
- 触发条件:推断代表分钟 ≠ 引擎代表分钟,且 `house_tables_by_time` 两分钟都有表。
- 根因:投影已能按推断分钟取表,但引擎原表没有改名留下;Agent 看见的事实仍可能混用。
- 修复:有推断层且两分钟不同时,公开 `house_table` / `natal_recast` 跟推断代表分钟;引擎原值改名 `representative_time_pre_inference` / `house_table_pre_inference` / `natal_recast_pre_inference`。Agent 可见投影剥掉这三个字段。不改引擎。
- 验证:`frontend/tests/rectification-delivery-report-facts.test.ts`
- 防复发:公开 `house_table.time` 必须等于投影 `representative_time`。Agent 可见 JSON 不得含 `*_pre_inference`
- 相关记录:BUG-593
- 复发自:无
- 修复版本:待发布
@@ -0,0 +1,51 @@
# PROGRESS · 生时校正顺带审计:同年去重、双轨按簇、簇宽、代表分钟(2026-09-10)
工作树:`.worktrees/rectification-unwritten-evidence-claim-20260910`
分支:`codex/rectification-unwritten-evidence-claim-20260910`
任务书:`docs/tasks/TASK-rectification-latent-audit-20260910.md`
基线:任务书写 `origin/staging` @ `a15fc3ef`;本工作树同时交付 BUG-635/636。BUG 编号从 **637** 起,与任务书一致。
## 开工回执
- 编号 **BUG-637**P2/ **BUG-638**P2/ **BUG-639**P3/ **BUG-640**P3)。
- 观察项 §5 未立单。
- 与 BUG-635/636 不改同一代码文件;文档与本单一起验收。
## 决策(BUG-638
Python 按 **argmax 映射到所在簇** 比较,不改成代表分钟列表。两轨峰值同簇即 `agree`;没有簇时仍按分钟比较。确认门不因本次 `agree` 从关到开。
## 已完成
- **BUG-637**:账本派生的精确 `domain.year` 键只拦存在性探针。`known_event_quality` / `event_quality``askedKeysForSameYearDedup` 去掉这些键后再做同年去重;已答质量键仍丢。`remainingConflictProbes` 本来就跳过质量题,未改。不改 `SCORE_DELTA`、四选项、确认门。
- **BUG-638**`dasha_agreement(..., clusters=)` 与 TS `dashaAgreementAmongActive(..., clusters)` 按簇比较。`decision_policy``candidate_decisions` 传入 `build_refinement_packet`。引擎原值仍是 `dasha_agreement_pre_inference`。BUG-593 记录已补正。
- **BUG-639**`indistinguishable_width_minutes` / `indistinguishableWidthMinutes``max(cluster_end)-min(cluster_start)+1`;缺字段回退到 `time``tied_minute_count` 不动。
- **BUG-640**:推断代表分钟 ≠ 引擎代表分钟时,公开 `house_table` / `natal_recast` 跟推断分钟;引擎原值改名 `*_pre_inference`。Agent 可见投影剥掉这三个字段。不改引擎。
- 记录:BUG-389/593/637640、CHANGELOG、本文件。Skill 版本不变(`10.0.21`)。
## 验收命令(实测)
工作树 `codex/rectification-unwritten-evidence-claim-20260910`
| 命令 | 结果 |
| --- | --- |
| `.venv` `pytest` `tests/test_rectification_refinement_packet.py` `tests/test_rectification_confirmation_and.py` | **23/23 pass** |
| `frontend` `tsx --test` 探针去重 / 收敛 / 确认门 / 交付报告 / ingest-p0 | **38/38 pass** |
| `frontend` `./node_modules/.bin/tsc --noEmit` | **0 error** |
| `frontend` `npm run lint` | **0 error** / 111 warning(既有债) |
| `git diff --check` | 干净 |
### 既有断言改动
- `tests/test_rectification_refinement_packet.py` `test_decision_receipt_downgrades_confidence_on_dasha_conflict`:原值 05:13 vs 05:14、两分钟同 d1;新值 05:13 vs 05:20、d1=1 vs d1=2。原因:BUG-638 同簇改为 `agree`,相邻 1 分钟会被并成一簇,必须改成跨簇才能继续锁 conflict。
## 环境缺口
- 无登录态:未做真人走查。
- 未跑 `next build`,未核 `/` 是否仍 `○ Static`、首屏 gzip ±2%。
- 未跑 `run_quality_gate.py --profile quick`
## 未做
- 观察项 §5 未立产品单。
- 未提升 `main`。Skill 未升版。
@@ -0,0 +1,75 @@
# PROGRESS · 证据轮只说「记下了」却没写入(2026-09-10)
工作树:`.worktrees/rectification-unwritten-evidence-claim-20260910`
分支:`codex/rectification-unwritten-evidence-claim-20260910`
任务书:`docs/tasks/TASK-rectification-unwritten-evidence-claim-20260910.md`
基线:任务书写 `origin/staging` @ `d96b24c2`;开工接到 `84572c07`;合入前再接到 `origin/staging` @ `301827ad`collect-semantics 任务书 + BUG-635 决策 4 去掉年份正则)。
## 开工回执
- 编号 **BUG-635**P1/ **BUG-636**P2)。`docs/BUG_HISTORY.md` 当时最大已发布号是 634。
- 顺序:分类器 `expectedWrite` → 无写入的「记下了」收回并重试一次 → 第二次主持人正文且不结算 → 客户端只认最后一条 settled 助手消息 → schema 拒绝信封失败映射 → 记录。
- 未实现 BUG-641643。同一工作树交付 BUG-637640,见 `PROGRESS-rectification-latent-audit-20260910.md`
## 决策 3
**turn `status=completed` + `answer_origin=host_fallback` + 不结算计费**
实现:`completeAttempt(false)``settleBilling === false``billing.release()`,不写 `billing.settled`。客户端仍走完成轮刷新;未答焦点靠 T4 的主持人问题行。
## 决策 4`301827ad` 修订)
`expectedWrite: "evidence" | "none" | "unknown"`。分类器 null/出错重试一次,仍失败则 `"unknown"`,守卫 fail-open。**没有年份正则 / 关键词兜底。** 无焦点的 `message` 路径也跑同一分类器。正文里的「记下了」仍触发守卫(决策 1)。
## 已完成
- **T1**`expectedWrite` 声明在 `immediateResponse` IIFE **之外**`POST` 作用域),否则 `runV9AgentTurn({ expectedWrite })` 编译失败(TS18004)。collect / choice / 无焦点 message 都走 `classifyTurnIntentWithRetry``provide_new_evidence``answer_current_focus` + `has_new_dated_event``"evidence"``opening` / `read_only` 不触发。
- **T2**`streamAttempt``empty_stream` 之后、`loadV9CaseDossier` 之前:`needsWrite && !publicWriteToolCompleted && !hostFallbackUsed` → 第一次 `evidence_not_written` + `retractSpoken()`(不进 `RETRYABLE_ERROR_CODES`);第二次主持人正文 `RECTIFICATION_USER_COPY.evidenceNotRecorded``needsWrite` = `expectedWrite === "evidence"` 或正文含「记下了」。batch 已完成且无正文仍走 BUG-633 `applyHostFallback`
- **T3**`buildAgentMessages``attempt > 1` 时用 `retryConstraintForAttempt(lastAttemptError)`
- **T4**`liveQuestionOnMessages` 只认 `latestSettledAssistant`。未答焦点落到既有 `persisted_question` 主持人问题行。`frontend/DESIGN.md` 表已补完成轮未答焦点。
- **T5**schema 拒绝信封 `{ error: true, validationErrors: object }``tool.activity failed code=tool_call_rejected`phase 映射与 batch recap 返回 null;公开事件不含 `validationErrors`
- **T6**BUG-635/636、CHANGELOG、走查第 15 条、任务表待验收、本文件。Skill 版本不变(`10.0.21`)。
## 验收命令(实测)
工作树 `codex/rectification-unwritten-evidence-claim-20260910`,相对 `origin/staging` @ `301827ad`
| 命令 | 结果 |
| --- | --- |
| `frontend` `tsx --test` 任务书相关文件(unwritten / host-fallback / spoken-collect / turn-intent / agentic-entry / agent-voice / v9-stream | **141/141 pass** |
| `frontend` `./node_modules/.bin/tsc --noEmit` | **0 error** |
| `frontend` `npm run lint` | **0 error** / 111 warning(既有债) |
| `git diff --check` | 干净 |
| `next build` | 未跑;记环境缺口 |
### 本单测试名
- `collect intent maps provide_new_evidence and dated current-focus to expectedWrite`
- `runner does not use a year-utterance fallback`
- `retry bootstrap uses the unwritten-evidence constraint only for that error`
- `route passes classifier expectedWrite into the agent runner`
- `classifyTurnIntentWithRetry fails open as unknown after two misses`
- `unwritten 记下了 retries once then host-falls-back without billing`
- `read-case then batch then set-focus then 记下了 stays on the baseline path`
- `empty body after a completed batch still uses BUG-633 host fallback`
- `read_only action with a dated utterance does not trigger the write guard`
- `schema rejection envelopes fail the tool and never count as a batch recap`
- `rejected batch tool-result is failed in the runner terminal status`
- `chat live question only reads the last settled assistant message`
- host-fallback`schema rejection envelopes are not treated as batch recaps or write completion`
- host-fallback`year fallback is gone; only explicit evidence expectedWrite triggers the guard`
### 既有断言改动
- `rectification-v9-stream.test.ts` empty_stream 二次成功正文:原值「记下了这件事。」/ 新值「先继续核对。」;原因:BUG-635 把无写入的「记下了」收口成 `evidence_not_written`,该用例只锁 empty_stream 重试。
## 环境缺口
- 无登录态:`docs/testing/rectification-scenarios-20260907.md` 第 15 节真人走查未做,不得写通过。
- 未跑 `next build`,未核 `/` 是否仍 `○ Static`、首屏 gzip ±2%。
- 推 staging 后才核 `/api/health``deployment.gitCommit`;未部署则记缺口。
## 未做
- 未提升 `main`。Skill 未升版。
- 观察项与 BUG-641643 未做。
+2 -2
View File
@@ -95,8 +95,8 @@
| `TASK-rectification-yearless-probe-downgrade-20260909.md` | `PROGRESS-rectification-yearless-probe-downgrade-20260909.md` | 产品拍板:无年月性格题(D9/D10 风格、月宿边界)降级为平局裁决——带年月题问完且候选仍分不开才问,分值减半(±1)、不计淘汰,报告标「参考」;三列卡性格描述不动;新增离线命中率测量脚本 + 导出 SQL(有出生证用户,聚合);Skill 10.0.21 | 已验收通过 | `fef54b6e`BUG-629Skill 10.0.21 |
| `TASK-rectification-followups-20260909.md` | `PROGRESS-rectification-followups-20260909.md` | 验收补漏:申报时段拦截只看钟点样式,带钟点的经历(『20:00 左右分手』『3 点到 5 点被车撞』)会被吞(BUG-631);by_time 只算引擎前 9 个候选,一小时窗 17 个候选时卡片列写『还没对照』(BUG-632) | 待验收 | `codex/rectification-followups-20260909`BUG-631632 |
| `TASK-rectification-evidence-turn-empty-answer-20260910.md` | `PROGRESS-rectification-evidence-turn-empty-answer-20260910.md` | 证据轮模型无正文被判整轮失败:证据、评分、下一问都已落库却只剩『没有拿到下一个问题』(BUG-633);答题旁白只说『范围没变』、时间线写死『还在收窄』(BUG-634) | 待验收 |
| `TASK-rectification-unwritten-evidence-claim-20260910.md` | `PROGRESS-rectification-unwritten-evidence-claim-20260910.md` | 证据轮模型只说『记下了』却没调 batch、没设下一问,财务一件静默丢失、流程停在原题且照常扣点(BUG-635);校正流不识别 Mastra schema 拒绝信封,会把被拒的 batch 报成 completedBUG-636 | 待执行 | `codex/rectification-unwritten-evidence-claim-20260910` |
| `TASK-rectification-latent-audit-20260910.md` | `PROGRESS-rectification-latent-audit-20260910.md` | 顺带审计:账本派生同年键误杀 `known_event_quality`BUG-637BUG-389 复发);双轨一致性按 31 分钟逐分判冲突并降置信度、与报告两套口径(BUG-638);不可分宽度按簇代表分钟少算(BUG-639);引擎与推断层两套代表分钟、回执宫位表不是卡片那一分钟(BUG-640);另 8 条观察项 | 待执行 | `codex/rectification-latent-audit-20260910` |
| `TASK-rectification-unwritten-evidence-claim-20260910.md` | `PROGRESS-rectification-unwritten-evidence-claim-20260910.md` | 证据轮模型只说『记下了』却没调 batch、没设下一问,财务一件静默丢失、流程停在原题且照常扣点(BUG-635);校正流不识别 Mastra schema 拒绝信封,会把被拒的 batch 报成 completedBUG-636 | 待验收 | `codex/rectification-unwritten-evidence-claim-20260910` |
| `TASK-rectification-latent-audit-20260910.md` | `PROGRESS-rectification-latent-audit-20260910.md` | 顺带审计:账本派生同年键误杀 `known_event_quality`BUG-637BUG-389 复发);双轨一致性按 31 分钟逐分判冲突并降置信度、与报告两套口径(BUG-638);不可分宽度按簇代表分钟少算(BUG-639);引擎与推断层两套代表分钟、回执宫位表不是卡片那一分钟(BUG-640);另 8 条观察项 | 待验收 | `codex/rectification-unwritten-evidence-claim-20260910` |
| `TASK-rectification-collect-semantics-20260910.md` | `PROGRESS-rectification-collect-semantics-20260910.md` | 产品决策三改:Skill 去掉「财务/健康只有主动说才问」并清空 Python `VOLUNTEER_ONLY`,升 10.0.22(BUG-641);带年份线索的采集题优先、题干带线索不矛盾,推翻 BUG-539 的整句去前缀(BUG-642);删掉「没有/记不清」原字匹配,分类器分 no/unsure 两类(BUG-643 | 待执行 | `codex/rectification-collect-semantics-20260910` |
### 聊天主链路与首页
@@ -71,8 +71,8 @@ BUG-278 已实测:`createTool` 的 `inputSchema` 校验失败时**不抛**
### T1 · 路由把「本轮应有写入」传给运行器(BUG-635)
- `route.ts` collect 焦点分支:分类结果落到 Agent 的两种情形计算 `expectedWrite`其他路径传 `null`,由运行器按年份正则兜底
- `V9AgentRunOptions` 新增 `expectedWrite?: "evidence" | null`
- `route.ts` collect 焦点分支:分类结果落到 Agent 的两种情形计算 `expectedWrite`非 collect 的 `message` 路径也对原话跑同一分类器。分类失败两次则 `"unknown"`,守卫 fail-open,不用年份正则。
- `V9AgentRunOptions` 新增 `expectedWrite?: "evidence" | "none" | "unknown"`
- 验收:单测覆盖 `provide_new_evidence``"evidence"``answer_current_focus` + `has_new_dated_event``"evidence"``answer_current_focus` + `no` 不进 Agent(既有);分类器两次都抛错 → `"unknown"` 且守卫不触发、诊断里有记录;源码合同断言 `agent-run.ts` / `route.ts` 不含年份正则。
### T2 · 收尾守卫:无写入的「记下了」不得交付,可重试一次(BUG-635)
@@ -211,3 +211,13 @@
- 缺口按钮若出现,文案是「接着问」,点了会向服务端修复,不是只重取快照
- 连续两次仍无载体才显示「暂时接不上,请新建一次校正。」
## 15. 财务采集题回带年月欠债后必须写入或明说没记下
资料与开场同第 0 条。虚构经历。走到财务采集题(「钱的方面,还记得哪一年…」)时,回一句带年月的欠债或收入变化,例如「2018 年 3 月开始欠债」。
期望:
- 要么证据数 +1 且下一问出现
- 要么助手说「这件我还没记上。请再说一次大概年月和发生的事。」并再显示财务题
- **不得出现**:助手只说「记下了:…」而证据数不变、下面没有问题