research(rectification): add reported-offset evaluation and frozen rerun integrity
Independent Staging Quality Gate / validate (push) Successful in 12m7s
Independent Staging Quality Gate / publish (push) Successful in 3m46s

Preserve closed confirmation gates and previously-exposed dataset boundaries. Add auditable 900-trial sensitivity results, current scorer freshness checks, and the v5 collection protocol.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
jesse-ux
2026-09-20 12:03:52 +08:00
co-authored by Claude Code
parent 5049e7847b
commit 932f2fffba
22 changed files with 14134 additions and 7 deletions
@@ -0,0 +1,73 @@
# PROGRESS · 生时校正验证体系补缺(2026-09-20)
## 基线与边界
- 执行基线:远端 `origin/staging = 5049e7847`,任务书基线 `fcad0637` 的后代。主检出保留原分支与未跟踪文件。
- 工作树:`.worktrees/rectification-validation-20260920`;分支:`codex/rectification-validation-20260920`。
- 一次性测试基线:`.worktrees/rectification-validation-baseline-20260920`(detached `5049e7847`)。
- 仅离线评测、契约元数据与记录,不修改打分实现、生产行为、确认门,不提升 main、不改 workflow、不改 DNS。
- 编号核对:开工 Bug 历史最大号 975;另一任务预留 976/977,本单使用 978–980。
## 决策与任务书偏离
完整核查 `BUG-098`、`BUG-318`、`BUG-427`、`BUG-428`。后两条明确规定已曝光案例不得重新算作独立盲测;任务书 T2 的“首次口径干净的官方盲测”没有在决策记录里授权推翻该红线。因此本轮只做**冻结当前实现的固定口径重跑**,不伪称新独立盲测,不提升官方盲测次数,不改发布六键和确认门。真正的独立验证仍需 T3 所定义的未来 v5;这一部分保持 blocked。
契约刷新需要相应更新旧测试中“当前实现必须等于历史 sidecar”的元数据断言;所有行为断言保留,原值/新值/原因在完成后逐项记录。
## 环境与基线实测
本机无项目 `.venv`;使用 `python`(Python 3.11.7,已有 pytest/swisseph)。`python3` launcher 退出 49。mcp / hypothesis 未安装;不顺带升级依赖。前端复用已安装 node_modules,工作树仅新增未跟踪依赖 junction,不纳入交付。
| 检查 | 基线结果 | 说明 |
| --- | --- | --- |
| `pre_work_check.py --remote-timeout 8 --command-timeout 45` | fail | 远端 verified;碎片扫描、适配器检查成功;focused tests 23 pass / 1 fail,镜像路径断言,已见于既有错误台账 |
| Python 定向 3 文件 | 21 pass / 1 fail | `test_minute_rectification_holdout_validator.py::test_frozen_implementation_hash_matches_manifest` 针对历史 v2 封存哈希失败,不改历史封存值 |
| 前端 `rectification-confirmation-gate.test.ts` | 7 pass / 0 fail | 后续按相同测试逐项比对 |
| Python quick | fail | 两侧均在 `interpretation_source_inventory_gate.py` 因缺 mcp 退出 1;46 条缺引用消息逐项相同 |
| 前端 tsc | 0 error | 基线与修改版均退出 0 |
| 前端 lint | 0 error / 120 warning | 基线与修改版相同,不顺带改 warning |
| 前端 npm test(默认并发) | 基线 3470 / 3387 pass / 83 fail | 修改版 3486 / 3409 pass / 77 fail;修改版失败标题为基线子集,0 新增失败;存在文件级环境/资源失败,另做串行补验 |
| 前端 build | fail | 两侧均为 Turbopack 拒绝指向工作树外的 node_modules junction;Static/gzip 环境缺口,未宣称通过 |
基线/当前前端确认门定向均为 7/7,通过项逐条相同。默认并发全量的通过数量差异不是新增业务测试,只是部分文件级中断减少;不能宣称全部前端测试通过。两侧串行补验在数据库容器等待等长时阶段未产出最终汇总,主动停止,标记未完成而不是通过。完整失败标题对照已保存 `docs/testing/rectification-validation-20260920-results.json`(83 对 77,新增失败 0)。
额外 Python 安全定向:`test_rectification_confirmation_and.py`、`test_rectification_v5_vedastro_validation.py`、`test_repo_privacy_markers.py` 共 **85 passed**。补验清单见 `docs/testing/rectification-validation-20260920.md`。
## 独立验收与复核发现
- 字节级核对:12 个 `frozen_scoring.files` 全部与基线相同;确认门六个 runtime 键值及类型相同;生产 `decision_policy.py` / `sealed_holdout.py`、历史 `_candidate_moments()` 所在文件、`request_from_case()` 所在文件、主 API 与全部 `frontend/src` 均未改。
- 任务书引用的 `frontend/src/app/page.tsx` 在执行基线已不存在(首页已迁移),因此用整个 `frontend/src` 字节对照证明无新增,不虚报旧路径行数。
- 独立审查发现首版 T1 只在候选枚举保留跨日日期,矩阵下游的 transition proximity 仍使用统一日期,跨日候选得分有偏差。修复限定在离线组装层:按候选日期分组计算矩阵并回并;不改生产打分文件。首版统计不能作最终证据,须修复后重跑并补真实引擎回归。
- 中途代理 API 余额错误导致执行和审查中断,用户要求继续后恢复;不把中断当任务完成。一次报告重定向被分类器按覆盖操作拒绝,经确认目标不存在后改为不覆盖的新建获准;另有子代理角色限制要求返回文档文本,由主会话汇总,不修改权限配置。
## 执行状态
- T1:修正版完整 900 组合已完成(20 例 × 15 偏移 × 3 半径,排除 0),JSON 与汇总表落盘。默认半径 ±15 在绝对偏移第 16 个整数分钟开始出窗;±30/60/120 对已测偏移几何包含率可恢复 100%,其中 ±120 仅几何推论、未评分。实际交付覆盖与唯一头名命中另列,不混称准确率。口径 v3、raman/mean、1 分钟、历史打分哈希 `b15d9ea15227cd58`;原生评分扩展哈希 `115c3fbcffdaff49`、研究适配哈希 `8d0c613dc0900adb`。
- T2:当前实现冻结、20 例固定口径重跑、契约刷新与防复发测试完成;实现代理和独立审查均复算逐例/汇总一致。top-1/top-3(含并列)0.45/0.50、MAE 6.45 分钟,三项未达门槛;误确认率 0、稀疏证据拒绝率 1,确认覆盖 0。独立盲测资格仍 blocked,官方有效试次仍 0;不是新的发布成绩。哈希前缀 `b15d9ea15227cd58`、v3、raman/mean、±10、1 分钟。
- T3:协议已完成。26 名公开 AA 来源候选,与 v3/v4 的 20 人交集为 0;未采事件、未完成人审、未建成 v5。来源直接访问有校验页限制,只算候选筛查,正式准入须复核 Source Notes。工时估算 86–172 人时。
- T4:Bug 历史、BLOCKED、研究索引、任务索引、失败对照和补验清单已更新;2026-09-20 产品明确授权 push staging,本批进入交付。远端推送与部署分别核验,不把授权当完成。
## 最终验收结果
| 条目 | 结论 | 证据 |
| --- | --- | --- |
| T1 全量偏差评测、四项逐例输出、跨日修正、隐私字段 | 通过 | 900 组合、45 格,参数及评分/研究哈希齐全;汇总从逐例重算一致 |
| T2 当前实现冻结、重跑归属、契约新鲜度 | 通过 | 独立复算完整报告一致;新鲜度与拒绝漂移测试通过 |
| T2 新的独立官方盲测 | 未通过 / 资料条件缺口 | 已曝光样本不恢复独立性,官方试次保持 0;任务书措辞不覆盖 BUG-427/428 红线 |
| T2 指定相关 Python 总集 | 49 passed / 1 failed | 唯一失败是基线同现的历史 v2 哈希断言,错误哈希两侧逐字一致;未削弱断言 |
| 新增 T1 / T2 与 quick 桥接 | 28 passed | 含桥接重复收集的 14 项,不能算 28 项独立用例 |
| 确认门与隐私补充 | 通过 | Python 85 passed;前端确认门 7/7 与基线逐项相同;runtime 六键未变 |
| tsc / lint | 通过 | 两侧 0 error,lint 120 warning 相同 |
| quick / 全量前端 / 构建 | 环境及既有失败缺口 | 见上述基线对照;不可写全绿、Static 或 gzip 通过 |
| T3 v5 协议 | 通过(仅协议) | 26 人来源筛查、旧集交集 0、无出生分钟/坐标;v5 未建成,BUG-980 investigating |
## 既有断言调整三栏
| 原值 | 新值 | 原因 |
| --- | --- | --- |
| Python 与前端 `current_tree_scorer.implementation_sha256` 绑定历史 post-audit sidecar | 绑定当前冻结重跑的 `frozen_record.implementation_sha256` | 元数据含义是当前树;继续绑旧报告强制过期。新增 freshness 同时验证当前源码,未削弱身份校验 |
| 官方 flag=false / trial_count=0、六 runtime 键、确认行为 | 原值不变 | 已曝光重跑不获得独立性;新增断言固定此边界 |
## 交付说明
2026-09-20 产品明确要求「push 到 staging」。交付前 fetch 确认远端仍为 `5049e784`,本轮无上游冲突,BUG-978~980 无新增占用;本批实现与记录同次提交交付。推送后另以远端 SHA 核对结果为准;状态板“已合入”仅在远端核对后生效,不代表门禁或部署成功。本批含门禁路径,将触发自动质量门;本机完整 quick/构建缺口仍保留。没有动 main、workflow、DNS、生产资料、依赖和打分参数。
+1 -1
View File
@@ -290,7 +290,7 @@
| — (产品口头拍板,无任务书) | `PROGRESS-settings-ui-20260919.md` | **设置面板布局与资料入口整理**:基线 `4f4cd684`;四分区继续共用固定 `.settings-modal`,桌面导航 176px→200px 并加分隔,内容区增加内边距,表单 cap 440px→560px,导航移除误导性右箭头;账户头像 48px→56px;“添加其他人”移到分组标题操作区。已同步 `frontend/DESIGN.md` 与合同测试;tsc 0、lint 0 error、定向测试 21/21;build 被 Windows Skill runtime symlink 权限阻塞,浏览器走查待受控环境;BUG-970 保持 `investigating` | 待验收 | `codex/settings-ui-20260919` |
| `TASK-owner-case-purge-20260919.md` | `PROGRESS-owner-case-purge-20260919.md` | **上游库主案例与本机路径残留清除(只含本仓)**:镜像同步带进库主本人案例(敏感案例标识与本机路径)并被 `origin/staging` 命中,涉及无引用的 `versions/` 三快照、前端 fixture、Python 测试、整机扫描台账、会话转录及上游 SKILL 快照。运行时无特判不用动。产品拍板整体删除不留匿名版;fixture 统一虚构常量;`import_yinduzhanxing.py` 加隐私排除项 + 新增仓库级隐私守卫测试;上游 SKILL 快照等库主清完再重导入(BLOCKED 记录)。上游仓的清理指令另见 `UPSTREAM-INSTRUCTION-owner-case-purge-20260919.md`(交给库主,不在本仓执行)。BUG-972/973 | **已验收通过(2026-09-20,`497798ac`);未合入 staging,等产品放行** | 两轮:首轮未通过(1 个隐私守卫冲突:新增路径规则与答案键守卫冲突,该守卫在快速门 glob 内,合入会让门禁红)→ 修复单 `TASK-owner-case-purge-fix2-20260919.md` → `497798ac` 通过。Claude 在 Linux 全依赖环境独立复验:快速门 Python 步 859 passed / 0 failed(上一轮就是这步红),Python 全量 63 红与基线逐条相同、0 新红,收集数与删除清单已记录;tsc 0 / lint 0 error、120 warning 同基线 / `npm test` 失败清单为基线子集(少 1 条工作流 YAML,非回归)/ `○ /` Static、首屏 gzip 与基线字节相同(前端自首轮提交起零改动)。上游指令文件已逐字节还原为基线原文;12 个已删测试名与计数已落进度记录;BLOCKED 两条已划掉。校正 Skill 哈希包、注册表、上游快照、`frontend/src`、主 API 全程 0 改动;库主本机用户名 0 命中。遗留 P3:进度记录和 BUG 状态文字待后续对账修正 |
| `TASK-consult-smalltalk-fastpath-20260920.md` | — | **普通对话寒暄轮快速通道**:真机一句「你好」触发完整窗口排盘(活动面板「已完成 4 步」)+ `## 先回答你的问题` + 400 字判词 + 扣 1 点。三层叠加:`index.ts` 两处「every turn 必调排盘」(BUG-922)与 `contractReady()` 的 `requireTool` 把排盘变成硬合同;`product-voice.ts` OPENER SHAPE 标「三种模式共用」;唯一的 chit-chat 豁免句只在 `natalSpokenReportContract` 里、只拼进本命 Agent(BUG-977)。计费侧「写回复」与「扣点」绑在 `complete_consultation_response` 同一次调用,`cancel` 只退款不写消息,所以今天没有「不扣点但保留对话」的通道。**产品拍板 a:不扣点、不排盘、回一句白话**;**分流不得用正则/关键词/长度阈值**,改为进 Agent 之前一次极短的结构化模型调用(复用本轮已选模型),fail-open 一律落回完整路径;BUG-922/923 的三处合同一个字不改;新增 `complete_consultation_free` 迁移。BUG-976/977 | 待领取 | — |
| `TASK-rectification-validation-integrity-20260920.md` | — | **生时校正验证体系补缺(纯离线评测,不改打分不改产品)**:会议要求把「推断真实出生时间」与「用户认可的参考盘」分开证明。核对结论——**产品口径侧四条已落地**(`accepted`≠`confirmed` 两条写入路径、确认门 fail-closed 且 `holdout` 为 `not_ready` 使 `confirmation_allowed` 不可能为真、采用不写 `reported_birth_time`、无任何把采用率当准确率的指标;运行时也无按生日走捷径的分支);**缺口全在评测本身**。三条:① 封存契约 `rectification_sealed_holdout.v1.json` 的三个打分哈希互不相同(封存 `f41c298d` / 契约记录 `99730c84` / 基线实测 `b15d9ea1`),`official_eval_trial_count: 0`——当前实现**从未产出过一次有效官方盲测**,唯一跑过那次已被资料审计作废(top-1 `0.15`,发布门要 `0.60`),可见的 `0.45` 自带「不得当发布指标」标记(BUG-978);② 全部离线评测的候选窗**以真值为圆心**(`_candidate_moments()`、`request_from_case()` 的 `true_time`),生产以申报时间为圆心(`ENGINE_SEARCH_RADIUS_MINUTES = 15`)——「真值掉出窗外」这一失败模式从不可见(BUG-979);③ v3 封存但每例仅 3 事件、v4 有 7+ 事件却已被看过并用于调参,**无口径干净又贴近真实会话的封存集**;六题回放的 `0.80/0.55/0.35` 是「真值方向最优答」的上帝视角上界,±30/±60 仍低于发布门(BUG-980)。T1 申报偏差敏感性 sweep、T2 有效重跑 + 契约对齐 + **防复发新测试**、T3 只出 v5 采集协议、T4 记录。**硬红线:不得改 12 个打分文件、不得用封存集调参、不得把 `status` 改 `ready`。** 家庭信息(父母职业/兄弟姐妹)在拿到基线数字前不开工——现有七领域全是带日期事件,静态属性没有输入口。前置:owner-case-purge 三提交仍未合入 staging。BUG-978~980 | 待领取 | — |
| `TASK-rectification-validation-integrity-20260920.md` | `PROGRESS-rectification-validation-20260920.md` | **生时校正验证体系补缺(纯离线评测,不改打分不改产品)**:会议要求把「推断真实出生时间」与「用户认可的参考盘」分开证明。核对结论——**产品口径侧四条已落地**(`accepted`≠`confirmed` 两条写入路径、确认门 fail-closed 且 `holdout` 为 `not_ready` 使 `confirmation_allowed` 不可能为真、采用不写 `reported_birth_time`、无任何把采用率当准确率的指标;运行时也无按生日走捷径的分支);**缺口全在评测本身**。三条:① 封存契约 `rectification_sealed_holdout.v1.json` 的三个打分哈希互不相同(封存 `f41c298d` / 契约记录 `99730c84` / 基线实测 `b15d9ea1`),`official_eval_trial_count: 0`——当前实现**从未产出过一次有效官方盲测**,唯一跑过那次已被资料审计作废(top-1 `0.15`,发布门要 `0.60`),可见的 `0.45` 自带「不得当发布指标」标记(BUG-978);② 全部离线评测的候选窗**以真值为圆心**(`_candidate_moments()`、`request_from_case()` 的 `true_time`),生产以申报时间为圆心(`ENGINE_SEARCH_RADIUS_MINUTES = 15`)——「真值掉出窗外」这一失败模式从不可见(BUG-979);③ v3 封存但每例仅 3 事件、v4 有 7+ 事件却已被看过并用于调参,**无口径干净又贴近真实会话的封存集**;六题回放的 `0.80/0.55/0.35` 是「真值方向最优答」的上帝视角上界,±30/±60 仍低于发布门(BUG-980)。T1 申报偏差敏感性 sweep、T2 有效重跑 + 契约对齐 + **防复发新测试**、T3 只出 v5 采集协议、T4 记录。**硬红线:不得改 12 个打分文件、不得用封存集调参、不得把 `status` 改 `ready`。** 家庭信息(父母职业/兄弟姐妹)在拿到基线数字前不开工——现有七领域全是带日期事件,静态属性没有输入口。前置:owner-case-purge 三提交仍未合入 staging。BUG-978~980 | 已合入(本批远端 SHA 核对后生效);独立盲测仍 blocked,门禁/部署待核验 | `codex/rectification-validation-20260920`;900 组合、当前冻结重跑、v5 协议完成;新增/桥接 28 pass,相关总集49 pass/1基线失败,确认门不变;2026-09-20 产品授权 push staging,同批交付,详见进度 |
## 命名与归档