# 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` 不动。`decideFromDossier` 与 `parseRectificationCandidateResult` 把 `clusterStart` / `clusterEnd` 传进确认门,避免刷新路径只按代表分钟少算。 - **BUG-640**:推断代表分钟 ≠ 引擎代表分钟时,公开 `house_table` / `natal_recast` 跟推断分钟;引擎原值改名 `*_pre_inference`。Agent 可见投影剥掉这三个字段。不改引擎。 - 记录:BUG-389/593/637~640、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 未升版。 ## 验收结论(Claude,2026-09-10,基线 `origin/staging` @ `8f9eb587`,staging 已部署同 SHA) | 项 | 结论 | | --- | --- | | BUG-637 账本 `domain.year` 键只拦存在性探针,三处判定点(`inspectDiscriminatorProbes` / `renderableEventProbe` / `remainingReverseVerifyProbes`)均经 `askedKeysForSameYearDedup`;已答质量键仍丢;BUG-389 记「复发自 BUG-592」 | 通过(`rectification-probe-year-dedupe-20260906.test.ts` 两条新用例) | | BUG-638 Python `dasha_agreement(clusters=)` 按簇比较、`decision_policy` 传 `candidate_decisions`;TS `dashaAgreementAmongActive(..., clusters)`;`dasha_agreement_pre_inference` 真实存在;BUG-593 记录补正;确认门不因 agree 打开 | 通过(Python 4 条新用例 + `test_same_cluster_dasha_peaks_agree_without_opening_confirmation`;既有冲突用例改成跨簇并写明原值/新值/原因) | | BUG-639 宽度 = `max(cluster_end)-min(cluster_start)+1`,Python 与 TS 同改;`clusterStart/End` 进确认门解析与 `decideFromDossier` | 通过(`test_indistinguishable_width_uses_cluster_span_not_representatives` + 3 条 TS 用例) | | BUG-640 公开 `house_table` / `natal_recast` 跟推断代表分钟;引擎原值 `*_pre_inference`;Agent 可见投影剥掉 | 通过(`public house table follows the inference representative minute`) | | Python 定向 | `test_rectification_refinement_packet.py` + `test_rectification_confirmation_and.py` 23/23 | | `run_quality_gate.py --profile quick` | 729 过 / 1 失败:`test_shadbala_endpoint_returns_ranked_planet_strength`「timezone inference dependency unavailable」,基线 `d96b24c2` 同环境同样失败,环境缺口,与本轮无关 | | 前端门禁 | 与 BUG-635/636 单同一次运行:tsc 0 错、lint 0 error、全套失败 27 条均为环境项(见那份进度记录) | | 部署 | `/api/health` `deployment.gitCommit` = `8f9eb587` | 环境缺口:未跑 `next build`;无登录态未做真人走查。观察项 §5 未立单,维持原状。