fix(rectification): anchor candidate windows to civil dates across midnight
Independent Staging Quality Gate / validate (push) Successful in 13m27s
Independent Staging Quality Gate / publish (push) Failing after 1h0m1s

Carry explicit local date intervals instead of inferring the day from clock
order. Cluster width, delivery, adoption, and reports keep the actual civil
date; adopted date is stored separately from the reported birth_date.

Algorithm identity is scoring-9 / spec-v5. Scoring weights, confirmation
thresholds, and Skill version are unchanged. Isolated Linux final-3 gates
passed; four pre-existing Python failures remain. This is not a production
release.
This commit is contained in:
jesse-ux
2026-09-21 02:55:00 +08:00
parent 3be740f84d
commit b85c4a686a
115 changed files with 106484 additions and 315 deletions
@@ -0,0 +1,241 @@
# PROGRESS · 跨午夜日期锚点与分段跨度(2026-09-20)
## 基线与边界
- 实际基线 `3be740f84d12b098b27b88105a88b5e2d8dd0ead`,指定工作树开工干净;任务书基线的后代。
- 核心代理整合日期窗口/D1/D2/报告与记录;D4 代理独占采用迁移及外围同源读取;transition 代理独占 transition 构建/符号查找/相关专用测试,交回后核心整合消费端。均在指定工作树执行,不 commit/push;主会话负责预检、基线全量/build、独立验收。
- D1/D2/D3 已批准,后续真实用户 D4 明确授权跨日采用及向后兼容新迁移(20000/30000);覆盖原本轮不改 DB 的限制,仅限任务所需。旧迁移不改,历史不猜补。不改分数/权重/阈值、Skill、workflow。历史结果不重标、不删除。
- 请求 `candidate_intervals[{start_at,end_at}]` 明确本地日历日期。候选 `window_index` 是稠密采样序号,`window_offset_minutes` 是相对首段起点的真实分钟,`segment_index` 区分声明的不连续段;`candidate_date` 保留实际日期。粗采样不以序号差冒充分钟,分段不以 min/max 填平。
## T1 修前红测(实现前实跑)
| 套件 | pass | fail | 事实 |
| --- | ---: | ---: | --- |
| Python `test_rectification_midnight_date_anchor.py` | 3 | 3 | 申报中心落次日、late_night 含次日、跨午夜簇倒序 |
| TS `rectification-midnight-date-anchor.test.ts` | 0 | 3 | 请求无日期字段、credible union 钟点 min/max、plateau 1≠3 |
原始日志位于本工作树 `artifacts/midnight-date-anchor/red-python.txt``red-frontend.txt`。核心失败输出:
```text
assert datetime(2000, 6, 15, 0, 10) in moments # 实际从申报日23:55开始
Extra items in the left set: '2000-06-16'
At index 0 diff: ['00:00', '23:58', '23:59'] != ['23:58', '23:59', '00:00']
request candidate_intervals: actual undefined
credible union: actual ['00:00','23:59'], expected ['23:58','00:00']
plateau: 1 !== 3
```
前端首次仅是依赖缺失(zod),不计为业务红测;在本树建立 node_modules junction 只读复用主仓依赖后,重跑得上述真实断言失败。未安装或修改共享依赖。Windows symlink 缺权限,使用目录 junction;不用于 build。
## 开工核对
- 已完整读 AGENTS/CLAUDE、前端 AGENTS/DESIGN/VOICE、日期任务、研究定论§6、错误台账;按模块/接口/午夜词检索并完整读 BUG-098/981/982/983/984/985。
- 旧防复发仍存在:981 候选日期 helper984 `readV9EngineScoringIdentity` 完整 pair 与写入前 `assertV9ResultWritable`985 同机 native/legacy 严格字节比较。098 枚举兼容未覆盖日期锚点/后续宽度,故不能代替本轮回归。
- 主会话预检:remote verifiedfragment/adapters okfocused 23 pass / 1 fail;失败为既有 `.workbuddy` 镜像路径断言,不伪造路径、不修改测试。
- 主会话公开 healthweb/API 均 `8d0359fc62d525e2b7c1e5c7fe6df37f57833ad4`migration `20260920010000`,status ok。仅证明前置部署,不代表本轮已部署或真人通过。
- 实际 python 3.11.7python3 launcher 不可用;Docker 29.8 可用。Linux完整基线由独立验收代理负责。
## 执行状态
| 项目 | 状态 |
| --- | --- |
| T1 红测 | 已完成首批,边界用例随实现补充 |
| T2 日期契约与 D1 | 本地实现,真实schema/动作/DB与首次HTTP opening测试已过;受控浏览器pending |
| T3 三处跨度与分段投影 | 本地实现及定向通过;最终全量待独立快照 |
| T4 交付说明及异日采用安全 | D4 迁移真实 DB43/43,实际日期/前一天/后一天交付与 native SSR 贯穿通过 |
| 同机公开 AA A/B、真实 golden | 独立子进程三 AA × 七投影逐位相等;原生 golden 已重新生成 |
| T5 最终记录及真人清单 | 已更新本地记录;真人/部署及最终门禁 pending |
所有未实跑项均不计通过,不提前标 resolved。
## 定向收口证据(2026-09-20
| 证据 | 实跑结果 | 日志(本树 artifacts/midnight-date-anchor 下) |
| --- | --- | --- |
| Python 核心日期、transition、VedAstro、growth 四文件 | 68 passexit 0 | `final-python-targeted-68.txt` |
| TS 日期15、transition、engine contract、range delivery、adopted date 五文件 + tsc | 61 pass / 0 fail / 0 skiptsc exit 0 | `final-frontend-targeted-61-tsc.txt` |
| 最终 D4 与窗口迁移(含widen/pending guard)标准真实 PostgreSQL | 56 pass / 0 fail / 0 skipexit 0 | `core-widen-db-final/database-tests-final-3.log`;早期43/43仍留 `dated-window-adoption-db-final.txt` |
| 三公开 AA 同机独立子进程 A/B | 3×7 相等,numeric tolerance=0 | `delivery-native/independent-process-aa-ab.json``delivery-native-generation.txt` |
| 主会话独立 VedAstro + growth | 21/21 | 主会话原始日志 |
| 固定 VedAstro1.23.26 基线 | quick0Python891/1skip、前端3588、lint0error/119warning、首页Static;宽glob296pass/4既有fail | 主会话 fixed126 原始证据,不替代实现门禁 |
精确收口命令(cwd 为本树或 frontend):
- `python -m pytest tests/test_rectification_midnight_date_anchor.py tests/test_rectification_dated_transitions.py tests/test_rectification_v5_vedastro_validation.py tests/test_api_server_growth_contract.py -q`exit0。
- `node node_modules/tsx/dist/cli.mjs --test tests/rectification-midnight-date-anchor.test.ts tests/rectification-dated-transitions.test.ts tests/rectification-v9-engine-contract.test.ts tests/rectification-range-delivery-20260907.test.ts tests/adopted-birth-date.test.ts`exit0;随后 `node node_modules/typescript/bin/tsc --noEmit --incremental false`exit0。
- `python scripts/research/midnight_date_anchor_regression.py --baseline <独立基线树> --output artifacts/midnight-date-anchor/delivery-native --golden --golden-path frontend/tests/fixtures/rectification-midnight-date-anchor.delivery.native.json`exit0。旧 native/final.native 保留过程证据并纳入源码快照(无当前测试消费者;native仍是生成器默认目标,open(x)防覆盖),不删除或伪作最终响应;最终贯穿测试读取delivery.native。所有fixture原生生成,未手改响应。生成器 open(x) 不覆盖旧证据。
身份为 scoring-9;显式区间 calculation-spec-v5,缺字段 legacy 保留 v4 硬 hash。首次 `green-python-targeted.txt` 实为 81pass/3faillegacy spec误变),不得当作绿日志;修复 explicit-only v5 后重跑已过,旧日志保留。首版 same-process A/B 有裸模块缓存风险,只引用 independent-process 证据。VedAstro 曾1.23.25→1.23.26漂移已记 ERR-107,不声称全程 pin。
### D1 四层证据与限制
1. 真实 `expectedAnswerSchemaFor` 首跑5绿4红,原因是新选项含 HH:MM 被原 `serverOwnedChoiceCopy` 禁止;只改中文钟点,未放宽过滤,原断言保留,随后9/9。
2. `applyRectificationChoice` 的 A/B/C/skip 真实服务动作进 dated RPC,一次写入;fakeAccounting不是浏览器/真实DB。
3. 标准 PostgreSQL 独立A/B/C/skip选择与reload pending=false;服务测试reload后不重问。首次HTTP opening→persisted focus独立1/1通过,真实300分钟窗、`probe:block_scan.midnight_side` ID,四选项消费真实persisted schema,不含次日;HTTP依赖隔离测试不等于受控真人。
4. 真人浏览器缺受控登录态,BLOCKED;不能由前三层冒充通过。
### 红线与既有断言变更
| 文件 | 原值 | 新值 | 原因 |
| --- | --- | --- | --- |
| `account-api.test.ts` | `birthTime: resolveAppliedAccountBirthTime(...)` 源码断言 | spread 同源返回,新增 activeDate/activeTimezoneOffset 断言 | D4 同源 hydration,未删旧行为测试 |
| `consultation-route-service.test.ts` | select 仅 birth_date 与 time | select 增 active_birth_date/active_birth_timezone_offset/active_birth_provenance | D4 咨询 date/time/offset 读取 |
| `server-owned-birth-profile.test.ts` | ACCOUNT_BIRTH_SELECT 原字面量 | 增同三字段,其他保持 | daily/synastry 共用服务端同源资料 |
| `test_rectification_v5_vedastro_validation.py` | 单一 happy-path | dated false/true 参数化,新增真实候选日期断言 | 不增 handler/__new__ 点,不变通过和 can_confirm=false 断言 |
| `rectification-engine-version-cross-midnight.test.ts` | live default/Python 源码也用历史 CURRENT=8;混合身份将旧无日期响应标为9/10 | 独立 LIVE_CURRENT=9,历史 CURRENT=8/PREVIOUS=7 与 golden 不改;新增8失效/9命中;9/10混合测试改用真实 dated delivery golden10仅模拟滚动身份 | 本轮日期契约可靠升级;不能把历史 fixture 重标或将无日期响应冒充9 |
| `rectification-v9-case-service.test.ts` | deepEqual仅 start/end clocks | 原clock与stage断言保留,expected显式增加实际日期;late_night同日两段与pending=true | 新开案日期契约,不用被测helper生成expected,不放宽成subset断言 |
| `rectification-window-widen-20260907.test.ts` | stub/调用名为旧case_window RPC;返回仅clock | dated_window RPCstub返回日期区间且reload parser额外断言日期 | 对齐已批准RPC;原半径30、source、snapshotCurrent=false、不重写probe/inference断言全部保留;不代表生产跨日widen语义已过 |
三文件定向重跑55/55、tsc exit0,原日志 `three-legacy-contract-tests-tsc-green.txt`。前次54/55红日志 `three-legacy-contract-tests-tsc.txt` 保留:旧混合身份测试把算法8无日期响应标成9,触发日期覆盖校验;改用真实算法9 golden后通过。精确命令为 frontend 下 `node node_modules/tsx/dist/cli.mjs --test tests/rectification-engine-version-cross-midnight.test.ts tests/rectification-v9-case-service.test.ts tests/rectification-window-widen-20260907.test.ts`,随后 `node node_modules/typescript/bin/tsc --noEmit --incremental false`
主会话阶段红线审计及最后限定复核 `independent-redline-late-prefreeze-review.json`:真实Home `(app)/page` states34/refs37/lines1826、API lines10931/methods218/__new__ hits31均不变;无Skill/workflow/deploy/依赖声明/旧迁移diff;评分/权重/确认门未改,仅algorithm/spec日期身份升级。最终AA与全量仍待验。新文案已对照 VOICEDESIGN 同批记录 chart-library 与 range-delivery 行为,无新状态/入口/动画。
## 限定收口与最终待验边界
- 实现快照最终 quick、前端全量、lint、build与首屏gzip,由独立验收负责,不争抢 .next。
- widen复核发现真实缺陷:旧30000只依baseline+新clock重算,丢持久绝对日期/已选side。新增真实DB红测后仅改本单30000:普通分钟基于持久日期扩窗;D1首次A/B/C/skip建立服务端 `midnight_allowed_intervals`,后续narrow保留允许集合,不把C缩单段误认选侧;请求无法满足side/containment/strict-width/max-width时整事务回滚,case/result全行(含时间戳与invalidation)不变。普通advance不物化pending=false。旧无allowed provenance不猜扩宽,保留原段。
- DB→reload→request builder覆盖普通前日、A/B、C/skip与双段;另有真实SQL dossier/compute→scoreAndPersistCurrentEvidence→minute `/score` fetch捕获,断言stage=minute与同日两段;网络在捕获后故意400终止,仅证明请求链,不虚报真实engine执行或结果写入。首次HTTP opening链主会话独立1/1,真人仍pending。
- widen定向DB已绿;标准套件首跑53/54archive副本无.git导致git check-ignore环境红),隔离快照git init后前版55/55、exit0。最终限定复核又补pending guard:显式NULL拒绝;pending=true只能原区间不变,缩窄/选侧必须false。新负例真实红12pass/2fail1业务+父汇总),guard后14/14;全case/result事务不变及不变true兼容都通过。最终SQL SHA256 `a18e59ad1a9ca960eab0497e47f8a6107f6e171a4f0175928a21689835dce895`,最后标准 `npm run test:db` 56/56、0fail/0skip、exit0,原日志 `core-widen-db-final/database-tests-final-3.log``.exit`;这是最终guard源码的标准DB绿,前版日志保留不替代。阶段快照从固定3be740f8 git archive保真实symlink,复制清单 `core-widen-db-1-copy-manifest.txt`,依赖在容器独立npm ci,无共享依赖修改。红日志 `core-widen-db-1-attempt-1/red-widen-2.log` 中7项业务失败+1项terminal fixture字段错误+父测试汇总失败,不把fixture错误冒充业务红;首修SQL列名歧义与fixture错误在 `green-widen-1.log` 实为红,修后 `green-widen-2.log` exit0。后续service捕获独立 `green-widen-service.log` exit0。
- saved civil 独立模块/accept route/负例测试已收口,主会话独立4/4;legacy缺字段兼容。首次相对TSX配置路径导致子进程失败,绝对配置路径重跑绿,属于命令配置,不冒充业务红绿。
- transition 代理限定三项已冻:clusterEquivalent日期等价与build-state metadata、collection active subset存活候选真实sign、Python lagna文案/TS parser/board绝对日期。Python20/20、TS81/81、tsc0、lint0,日志 `subsets-*`;新增真实native lagna fixture,旧golden与旧断言未改。DESIGN已记录完整civil日期与legacy HH:MM,无入口/颜色/状态增加。
- 上游 dossier/compute 显式畸形 interval 已 fail closed。报告链限定只读复核涵盖consult/reports/worker/longformeffective date + 实际采用offset + dated intervals未发现可达缺陷;主会话sampler41/41含闰日5点与双段31点。此为源码链+定向证据,不是受控真人或最终全量。
- 受控真人、生产迁移/部署/health 全部 pending;见 BLOCKED 与既有真人清单日期锚点补充。SQL boolean权限fixture不证明真实候选可确认。固定offset不等于IANA/DST修复。
## 统一冻结交接
核心、transition、D4及opening限定实现全部停写;本次交接包含文档冻结,HEAD仍为 `3be740f84d12b098b27b88105a88b5e2d8dd0ead`。最终核心定向70/70`core-final-targeted-70.txt`),最后guard tsc/lint各exit0`pending-guard-final-tsc-lint.txt`),标准DB56/56。独立runner内 `docker ps -a` 空,临时fixture已清理,DB runner释放给主会话统一快照验收。尚未完成的统一全量/build/gzip/最终AA以及受控真人/部署不因冻结变成通过。
新增交付清单23项(22代码/测试/native fixture + 本PROGRESS),原生native/final.native过程证据纳入快照且保持原样;artifacts日志、node_modules junction、.next不属于源码新增清单。未commit/push、未新建worktree、未改共享依赖。
## final-1 后三项 Python 合同测试限定解冻(2026-09-21
主会话 final-1 发现 Python 三个 glob 为338pass/11fail,其中原4、本轮新增7。本代理仅获准解冻下列3测试文件与本PROGRESS;其余生产、SQL、历史golden继续冻结,另4项validation integrity由其他代理处理,本代理未动。以下修正不是全量验收通过,完成定向后再次停写交回。
| 原值 | 新值 | 原因 |
| --- | --- | --- |
| `tests/test_dasha_transition_proximity_cross_midnight.py` 固定algorithm8、全局spec常量v4 | current algorithm9、常量v5;无interval请求仍逐项验证legacy spec v4及基线固定SHA256 `bfdee46405a38f2508a2071929b60d79d15a78ca0e1e81f6c7ffd1652e301a08`;显式interval验证完整v5 spec与不同hash | 日期契约合法升级不能误改legacy语义;固定hash由只读基线3be740f8实算,未用被测helper动态生成expected |
| `tests/test_rectification_relative_support.py` current algorithm8 | 仅current algorithm9及对应注释;policy3、proportional与全部数值断言原样 | 缓存身份升级,不是policy、prior或评分变更 |
| `tests/test_rectification_engine_memoization.py` live receipt与历史8 golden直接同key集合比较 | 专用跨版本helper先精确校验4个新增metadatadated-v1、原fixture同日12:0012:02绝对interval、offset8、空timezone ID),旧UUID硬值保留,新UUID独立用hashlib/json/uuid5与固定algorithm9/policy3公式校验;仅这4字段与代表UUID作比较投影,其余receipt key集合及所有candidate score仍用原严格比较器;snapshot身份分别断言8/9,余字段也严格比较 | 历史golden不重标、不重生成;未知额外key不得被泛化metadata删除吞掉;新增7项真实引擎响应变异反向断言涵盖4 metadata、UUID、未知key与confirmation_allowed。原score+1e-2/time变异测试保留,浮点容差abs2e-3/rel5e-4不变 |
定向命令(cwd为本任务工作树,实际使用可用的 `python`,非Windows不可用的python3):
```text
# 修改前原红:3 failedexit1
python -m pytest tests/test_rectification_cross_midnight_gate.py::test_fixed_scoring_identity_is_exposed_without_changing_input_contract tests/test_rectification_engine_memoization.py::test_score_candidates_matches_baseline_golden tests/test_rectification_relative_support.py::RelativeSupportScaleTest::test_holdout_gate_keeps_proportional_default -q
# 最终绿:34 passed in 11.04sexit0
python -m pytest -o addopts= tests/test_rectification_cross_midnight_gate.py tests/test_rectification_engine_memoization.py tests/test_rectification_relative_support.py -q
```
原红保留 `artifacts/midnight-date-anchor/final1-python-contract-red.txt`;最终绿为 `artifacts/midnight-date-anchor/final1-python-contract-green-final.txt`(含命令与exit)。较早的 `final1-python-contract-green.txt` 也是exit0,但未包含最后新增snapshot余字段比较,以final日志为准。34项为bridge9 + memoization21 + relative_support4;只选bridge,不同时collect源文件,未重复计算9项。`-o addopts=`仅移除仓库默认quiet参数以显示准确汇总,不改测试断言或选择范围。
最终测试SHA256
| 文件 | SHA256 |
| --- | --- |
| `tests/test_dasha_transition_proximity_cross_midnight.py` | `8e38acb8fbc747906d89eadb4a429a8fbc085e34f638c342d1f9cad8e9a1f5b4` |
| `tests/test_rectification_engine_memoization.py` | `d4f3fd4716d1c514ce443db979cd007c5a45ac0a38a7d65edb1170340c96ef97` |
| `tests/test_rectification_relative_support.py` | `068d20e52a9908e58012a261dd5bf9bc54c42d5fa7fa393f80fcbf7954181ade` |
历史 `tests/golden/rectification_engine_memoization_v1.json` 无git diffSHA256仍为 `6266e448d7dad204b264cbe8f9bcf4c36e02286794764a94edb9e2ce4d0e3015`。本次没有运行全量、quick、DB或build,没有占用runner、改生产/历史golden/共享依赖、commit/push或新建worktree。主会话报告final-1同机Linux AA为21/213×7投影)逐位相同,排除新增metadata及identity IDs;此不等于整个response无变化,也不代替最终统一门禁或真人/部署验收。
### 独立复验拦截误加 snapshot 断言与限定纠正
上述 `green-final` 34pass仅为当时默认环境实测,不是跨环境闭环。主会话独立同范围 `PYTHONUTF8=1 python` 实测26pass/8fail,真实日志 `artifacts/midnight-date-anchor/independent-python-contract-repair.txt` 原样保留。8项均在本轮误加的整snapshot比较处、进入变异前失败,首差异为 `candidate_feature_snapshot.feature_hash`:历史 `36190982db75d3c9fe7c584607f25342531049c3d751060075519dbbd68033db`,独立环境实际 `ebb4aeae08a4e643012de59d65882c01e8d8e501ba18c9fdcc0c2998b3a5e23e`。这是验收测试误加跨进程绝对hash断言被独立复验拦截,不是生产回归。
只读复核两次均为同一Anaconda Python3.11.7、swisseph2.10.03,测试及scoring模块均从本工作树导入;改变UTF8模式可复现,但随后UTF8=0子进程也产生第三个hash,因此不能把UTF8本身断言为根因。两进程payload差异定位到 `features[*].fingerprints.shadbala``static` → 外层 `feature_hash`,该次score/receipt相同。生产 `_feature_hash` 对未量化结果做JSON SHA256BUG-733/985已明确禁止跨进程固定浮点hash。原memo helper刻意仅比较candidate_scores/decision_receipt,原同进程缓存差分与反向测试均仍在。额外只读派生探针在未处理static payload后续变更时失败,不作为派生链已验证证据,也未据此修改生产或golden。
| 原值 | 新值 | 原因 |
| --- | --- | --- |
| 本轮额外新增 `_assert_tiered_equal` 整个snapshot(只桥接algorithm8/9 | 限定撤回这一个新增调用,加BUG-733/985注释;原helper、原score/time反向、原容差不动;算法8/9、4metadata、独立UUID公式及7新增反向仍全部保留 | 恢复原合同边界,避免对包含未量化浮点派生指纹的历史golden重引绝对hash不变量;不是删除既有断言、放宽评分门或修生产 |
获准仅再写memo测试与本PROGRESS,实际定向双跑:
```text
python -m pytest -o addopts= tests/test_rectification_cross_midnight_gate.py tests/test_rectification_engine_memoization.py tests/test_rectification_relative_support.py -q
# 34 passed in 11.35sexit0
PYTHONUTF8=1 python -m pytest -o addopts= tests/test_rectification_cross_midnight_gate.py tests/test_rectification_engine_memoization.py tests/test_rectification_relative_support.py -q
# 34 passed in 10.73sexit0
```
日志分别为 `artifacts/midnight-date-anchor/final1-python-contract-corrected-default.txt``final1-python-contract-corrected-utf8.txt`,均含原命令与exit;以这两份为最终定向证据,先前红绿日志不覆盖。memo测试最终SHA256更新为 `98808b8535f05f81d35a71de067928f762a6aae9fe9e8a2d9c44528f04c6b508`,上表d4f3为被独立复验拦截的中间版;另外两个测试SHA不变,历史golden SHA仍为 `6266e448d7dad204b264cbe8f9bcf4c36e02286794764a94edb9e2ce4d0e3015`。再次停写交回,未写其他文件,统一全量/quick仍由主会话负责。
## Grok 接续(2026-09-21
唯一写入执行者按 `TASK-rectification-midnight-final-grok-20260921.md` 串行完成 T1–T5。不重做已闭合功能。HEAD 仍为 `3be740f84d12b098b27b88105a88b5e2d8dd0ead`。未 commit/push/deploy,未改分数/权重/确认阈值、Skill、workflow、依赖或权限。旧 freeze/report/golden/archive 原字节保留。final-1 失败日志与过程红日志不覆盖。
### T1 三合同测试独立复验
接手 SHA 与交接一致:memo `98808b8535f05f81d35a71de067928f762a6aae9fe9e8a2d9c44528f04c6b508`PROGRESS 当时 `1c0d81d7e78da93e2b060d4095112245ea3123508fe64b693c0c3691afc485ab`;历史 golden `6266e448d7dad204b264cbe8f9bcf4c36e02286794764a94edb9e2ce4d0e3015`
```text
PYTHONUTF8=1 python -m pytest -o addopts= tests/test_rectification_cross_midnight_gate.py tests/test_rectification_engine_memoization.py tests/test_rectification_relative_support.py -q
# 34 passed in 10.84sEXIT_CODE=0
```
独占新日志 `artifacts/midnight-date-anchor/independent-python-contract-reverify-grok-20260921.txt`。原 `independent-python-contract-repair.txt` 与两份 corrected 日志保留。
### T2 扩展身份最小补齐与派生脚本审核
`PRODUCTION_FILES` 增补本轮 `candidate_window.py``decision_policy.py``refinement_packet.py``api_service.py`。legacy12 算法与旧 freeze 未改。`reported_offset_sweep` 复用 `implementation_identity()`,未改其源码。current contract / 新报告 / 归档 / 派生脚本不进入 identity。
新增 `test_midnight_date_anchor_modules_remain_in_extended_identity`(不依赖 freeze 文件),1 passed。派生脚本独立审源码:校验 report.frozen_record==freeze、freeze_record 身份、freeze≤start≤finish、20/900 完整计数、非独立/禁调参、六 runtime 键值类型、historical metrics 与 unfrozen diagnostic、previous 链、原子替换与非自引用。脚本 SHA 仍为 `c4d06bc82c7e64cf4c9a53401f126b24caa3e11225f8d8d0be9e7399a31e4dbc`,未改脚本。旧五份归档 hash 与交接清单逐字节一致。
| 文件 | 原值 | 新值 | 原因 |
| --- | --- | --- | --- |
| `tests/test_sealed_holdout_contract_freshness.py` PRODUCTION_FILES 最小集 | `scoring_service.py` + `dasha_transition_proximity.py` ⊆ PRODUCTION_FILES | 原断言保留;新增四模块必含、与 legacy12 不相交、禁止 contract/新报告/history/artifacts 进入 identity | 防本轮日期/回执模块再次遗漏扩展身份;不是放宽 freeze 校验 |
身份名单停写后再 freeze。evaluator `scripts/research/sealed_holdout_rerun.py` SHA `5d26d782648bbef42b5dcfe603ef2cbe697b317df6000f7c9c3fa0272504b027`
### T3 生成快照真实 freeze 与 20/900
生成包 `scratch/.../generate-bundle-1`:30 个当时已存在的新增路径(含 6 份 history 与本任务单),不含未生成报告。sourceTar `e3507fc4b903646f9bdeb16f1490d8d7119da90fb516177b57a1bb4476cffd6f`sourceIndexModified=false。restore `/work/implementation-final-2` 保真 0 差,未改 `implementation-final-1`。派生脚本单独复制到 `/work/tools`SHA 仍为 `c4d06bc8…`
首次 sealed `--freeze` 相对路径 `print(relative_to(ROOT))` 失败,但 exclusive-create 已写出完整 freeze;失败日志保留于 `/work/artifacts/generate-freeze-1`。该 freeze 通过 `verify_frozen_record`,未覆盖。续跑 generate-freeze-2 使用绝对 freeze-path。
| 步骤 | exit | 秒 | SHA256 |
| --- | ---: | ---: | --- |
| sealed freeze(保留) | 写成功 / print 1 | 0.112 | `9b9bb4b9093a9987e84f04f50b3291ceca23691f89b1d5800c81652aec13824e` |
| sealed json | 0 | 2.878 | `05458f29215d9784623f1b05f09ef590915caf46a87947f0af31dcae85808620` |
| offset freeze | 0 | 0.101 | `73848f421b133f53578dd0e0713f24fbb38a2bcf3b27609398b1ba98dbfc224c` |
| offset json | 0 | 325.993 | `093d50953d7772f037401b99517b8dcaf2a1b20aa3e8ae2e692d83c6510dd02f` |
sealed 20/20、excluded=[]、freeze≤start≤finish、`official_valid_independent_blind=false``status=blocked_independent_blind_evidence`。offset 20 cases / 900 cells / 完整网格。环境前后不变,`productionPinEquivalent=false`,history 归档字节不变。派生脚本 validate 后 `--apply`current contract SHA `731628a411b91761af4c3df8198de94b9d78edd9e25d5ae618eec23e11d8b9e0`。六 runtime 键与 `metrics_produced_by` / `current_tree_unfrozen_diagnostic` 相对旧 contract 同类型同值:`status=not_ready``confirmation_coverage_rate=0.0``top_1_rate=0.15`。四证据与获批 contract 经 scratch `generate-delivery-1` 独占回写工作树,输入输出 SHA 一致;旧归档 contract 仍 `ac81307dd3581db1e687a31100babe71cd5122781d6e5208789b5f68fb02a520`
### T4 新最终快照全门
最终包 `scratch/.../final-bundle-3`:34 新增(30+4 证据),92 既有 artifact 白名单,baselineRetained 4856sourceTar `cb7ad822d2d2a16282b121d2a02964a14912d1bdb81e6b2f2c52f84511359e3a`sourceIndexModified=false。restore `/work/implementation-final-3` 保真 0 差;身份文件与生成快照逐字节相同。独立 `npm ci`,无复用 `.next`
| 项目 | 结果 | 日志 |
| --- | --- | --- |
| tsc | 0 错误 | 容器 `implementation-final-3/frontend-tsc.log` |
| lint | 0 error / 119 既有 warning | `frontend-lint.log` |
| 前端 | 3649 pass / 0 fail / 0 skip | `frontend-tests.log` |
| 真实 DB | 56 pass / 0 fail / 0 skip | `database-tests.log` |
| build 首页 | Static `○ /` | gzip 日志 `staticHome=true` |
| JS gzip | 630727 vs 基线 626849+0.619% | `independent-final-3-gzip.json` |
| CSS gzip | 39496,不变 | 同上 |
| Python 广域 | 352 pass / 4 fail4 既存 + 0 新增 | `python-glob.log`;对照 `independent-final-3-python-failure-comparison.json` |
| quick | Quality gate passed | `python-quick.log` |
| 三公开 AA | 3×7=21/21 同机独立进程,tolerance=0 | `independent-final-3-aa-ab.json`;排除新增日期 metadata 与身份 ID,不声称整响应字节相等 |
| 环境 | 与 fixed126 基线一致;`productionPinEquivalent=false` | `independent-final-3-integrity.json` |
四既存失败逐断言对照基线 glob XML:
1. `test_long_real_conversation_reaches_vedastro_after_local_range_is_narrow`actual `04:16` 单分钟,expected `05:0705:08`,与基线同类。
2. `test_selector_changes_do_not_change_legacy_or_v5_score_bytes`actual `e20199f79f42…8edf8` vs expected `23171c47b974…e9d8f`,与基线哈希相同。
3. `test_v3_development_result_stays_shadow_only``assert 1 == 0`,与基线相同。
4. `test_frozen_implementation_hash_matches_manifest`:类别既存,expected 仍 `153fea0f69d4…528aa`actual 由基线 `f642651ef4de…cb477` 变为 `6c655b8073de…d2220`。不能称该失败字节一致。
final-1 的 338/11 与过程红日志保留,不改写成通过。容器完整产物在宿主 scratch `implementation-final-3/`
### 结论(不发布)
| 项 | 判定 |
| --- | --- |
| 隔离 Linux 最终门(tsc/lint/前端/DB/build/gzip/quick/AA/0 新增 Python 失败) | 通过 |
| 四既存 Python 失败 | 未通过(基线同类;第 4 项 actual hash 已变) |
| 受控真人 / 登录浏览器 | 环境缺口,见 BLOCKED 与既有 testing 清单 |
| 部署 / staging health | 未做;BUG-982/983 仍 investigating |
| commit / push | 未做 |
改动范围:扩展身份四模块入 `PRODUCTION_FILES`、最小身份回归、真实新 freeze/20/900/派生 contract、文档与本进度。生产评分常数与确认门未改。停止。
+2 -1
View File
@@ -294,7 +294,8 @@
| `TASK-rectification-cross-midnight-dasha-20260920.md` | — | **跨午夜候选的 Dasha 边界错一天(生产打分)**:`scoring_service.py` 调 `merge_transition_proximity()` 只传**一个** `birth_date`,该函数用它算全部候选的 Vimshottari / Narayana 起始日期,候选之间只靠 `_context_time()` 的 `HH:MM` 区分、**日期被丢掉**。窗口跨午夜时午夜后候选的 dasha 边界整体错一天。Claude 验收时在生产调用链独立复现:窗口 `23:50→00:10`、21 个候选,**恰好那 11 个跨日候选分数错、10 个同日候选逐位相同**(幅度 +0.0267 / −0.0133,本例头名未变)。算术上界 = `cap/kernel_width`day 精度 0.067 分/件,18 件可累计约 1.2 分,而随分钟变化项总量仅约 2.1 分 —— **上界是推的不是实测,真实幅度本单必须实测**。踩中路径:`late_night` 时段 `23:0003:59`、`unknown` `00:0023:59`、23:45 后或 00:15 前申报的 ±15 窗。连带发现:`calculation_spec()` 不含打分实现身份,修复后同一 spec hash 对应不同分数,历史 Case 静默失去可复现性(同 BUG-427 类型)。**产品 2026-09-20 已就三点拍板:A 修、B 修完重新冻结并重跑 T1/T2、C 让新旧结果可区分。** C 的做法经查证已修正:`calculation_spec_hash` 全在 **V4** 链路、**V9 零引用**,原提案 bump `INPUT_CONTRACT_VERSION` 对真实历史无效已作废;改为随修复 bump `engine_version``v9EngineVersion()` 缺省串用于 started/failed;成功回执及 minute 缓存身份来自后端,旧「只写不比」假设作废),**不得动 `skill_version`**BUG-621open RPC 要求绑定 Skill 等于当前版本,bump 会让历史校正打不开)。硬红线:只改「按候选日期取 dasha 起始」,不得动 kernel/cap/share 任一常数;确认门不变。BUG-981 | **核心修复与 BUG-985 已 review 通过,本地合并 b27d4de9;推 staging 认证失败,端到端仍受 BUG-984 阻塞** | 实现 `aa46da10`(分支 `codex/rectification-cross-midnight-20260920`,未合入 staging)。Claude 独立 review:修复后整窗打分与**逐候选独立重算 21/21 一致**;非跨午夜分数基线 vs 修复**逐位不变**(我测半径 10 六例 + 半径 60 三例,执行方证据覆盖 19 例 / 2299 候选全部 `bytes_equal`);kernel/cap/share/`PRECISION_WEIGHTS` 一个未动;`status=not_ready`、coverage 0、`holdout_passed()` False、官方试次 0;决策 C 执行正确(`ALGORITHM_VERSION` 7→8`INPUT_CONTRACT_VERSION` 与 `skill_version` 未动,golden 里 `calculation_spec_hash` 不变可证);既有断言改动均带三栏说明且为加强。**P1 阻塞**:新增的 `test_same_day_public_aa_scores_keep_pre_fix_bytes` 写死 121 个浮点分数的 SHA-256,在 Claude 机器上 ordinal 2/3 红、**基线与修复分支同样红**(非修复所致),且经 `test_rectification_cross_midnight_gate.py` re-export 落入快速门 glob —— 同 glob 基线 214 passed/0 failed、`aa46da10` 4 failed,推 staging 会让门禁红。执行方自报未通过的 BUG-984 经独立确认成立且更重:`block_scan` 只比 evidence 指纹不读打分身份,而 `late_night`(299 min)/`unknown`(1439 min) 均 >120 走该分支、又恰是最易跨午夜的窗口 |
| `TASK-rectification-cross-midnight-gate-fix-20260920.md` | `PROGRESS-rectification-cross-midnight-gate-fix-20260920.md` | **review 修复单:门禁级浮点哈希断言(`aa46da10` 的合入阻塞项)**:新增回归把 121 个分数的 SHA-256 写死成字面量,于是断言范围把跨机 libm/pyswisseph 差异也圈了进去。实测该组 121 个分数**全无浮点尾噪**(`repr(s)==repr(round(s,4))` 121/121),所以差异是第 4 位真的不同,靠改序列化消不掉。同一提交刚改过的 `test_rectification_engine_memoization.py` docstring 正好写着「跨机舍入已漂 1.1e-3,不得整体 `==` 比较」——教训被引用了又被踩。执行方自己的证据 JSON 用的却是正确做法(`scores_bytes_equal` = 同机基线 vs 当前)。**根因**:要证的是相对不变量(同机基线 vs 当前),却实现成绝对不变量(当前 vs 某台机器的历史哈希)。F1 改用生产代码已有的 legacy 回退路径做同机 A/B 对照(去掉 `candidate_at` 即修复前行为),验收要求**两台浮点环境不同的机器各跑一次**、且回退核心修复后该测试仍绿(证明它守的是同日不变性而非跨午夜回归的替身);F2 bridge 重复收集(4 failed = 2×2);F3 查证 `block_scan` 重算是否经过被修 helper —— 会则 BUG-981 在 late_night/unknown 路径等于没上线、BUG-984 升为阻塞项;F4 记录。**硬红线:不得删测试/skip/把哈希改成本机当前值消红,不得改已验收的打分代码。** 串行:本单 → `aa46da10` 合入 → BUG-984 补单。BUG-985 | **已 review 通过;BUG-985 resolved;合入推送被 Gitea 认证阻塞,远端仍 a3577ce2** | 实现 `25232ce4`(分支 `codex/rectification-cross-midnight-gate-fix-20260920`)。F1 改为同进程 A/B:在 `scoring_service.merge_transition_proximity` 调用边界剥掉 `candidate_at` 走生产既有 legacy 回退,对比 121 个分数与整份贡献矩阵的 canonical 字节;另加 `legacy_calls == [121]` 与 `static_contexts is contexts` 两道防空转保险。Claude 复核:写死哈希字面量 **0 残留**;**第三套环境(Linux + Python 3.13,与执行方 Windows 3.11.7 不同)定向 18 条全绿** → 两机验收闭环;**回退日期修复探针:同日 3 条全绿、跨午夜相关 4 条转红**,证明同日不变性与跨午夜正确性已真正分开;快速门 glob staging `1b646659` 200 passed/0 failed → `25232ce4` 216 passed/0 failed+16,零新增失败,总数未降);相对合并点仅动 2 个测试文件 + 文档,`scripts/`、前端、golden、打分常数零改动。BUG-985 记录含我要求的防复发条,并正确认定为 BUG-733 同形复发。**建议 BUG-985 由 `blocked` 改 `resolved`**(证据即第三环境复跑)。环境缺口:完整快速门在 Claude 机器 120 秒超时被杀,6→4 那组数以执行方记录为准 |
| `TASK-rectification-cross-midnight-dasha-fix-20260920.md` | `PROGRESS-rectification-cross-midnight-fix-20260920.md` | **BUG-984 缓存与结果身份补单(BUG-981 的端到端阻塞项)**:`scoreAndPersistCurrentEvidence()` 的 `block_scan` 分支只比 `evidenceLedgerFingerprint` 即返回 `cached:true` 与旧 `algorithmVersion`,该返回发生在 `readV9EngineScoringIdentity()` **之前**`minute` 分支则有身份门。F3 已查证完整调用链到 `merge_transition_proximity()`,故核心修复合入后,**证据未变的历史跨午夜时段缓存命中仍返回修复前分数**——在本单闭环前不得声称跨午夜问题已修。边界已按源码收窄:`late_night`(23:0003:59) 跨日;`unknown`(00:0023:59) 虽 >120 分钟但**本身同日**,选中跨午夜子时段后才触发(此处修正了 Claude 先前把两者并列的说法)。产品 2026-09-20 放行且**同日拍板 F3 策略选 b**:版本接口取不到可信身份时,旧缓存**只读展示 + 显著标注「按旧算法产出」**,否决 a(重算,会把接口抖动放大成长等待,时段扫描受 `JYOTISH_HEAVY_COMPUTE_CONCURRENCY=2` 限流)与 c(照常复用,与已定原则冲突)。b 的三条边界:只读结果**服务端拒绝采用/确认**(靠删不靠藏,须有定向用例)、标注必须用户可见并对照 `VOICE.md`(涉界面同提交更新 `DESIGN.md`)、回执来源身份仍是产出它的版本。**F2 的 SQL 问题已查清并定序(A 先上 / B 兜底 / 第 10 版前必须解决)**:`engine_version` 一个字段被「部署声称的版本」(started/failed 行,取前端常量)与「实际产出结果的版本」(completed 行,命中旧缓存即旧版本)共用,聚合却用与版本先后无关的字符串 `max`。**该缺陷此前一直撞对,`aa46da10` 之后才变真错**:它把 `v9EngineVersion()` 缺省由 `rectification-v5` 改为 `…scoring-8`,started 行遂在字符串序上反超 completed 行 → 回执显示第 8 版而分数来自第 7 版缓存;已核 `deploy/`、`.gitea/` 未设 `RECTIFICATION_ENGINE_VERSION`,走缺省,**是真实行为**。第二个缺陷:实跑 `max("…-10","…-9") = "…-9"`,**该聚合在第 10 版静默反向**(现为第 8 版)。Astarted/failed 不再写版本(应用层,必做);A 的漏洞(同 turn 多个 completed 行版本不同)**必须实测取证,不得以「应该不会」结案**;B=聚合改取成功结果那一行(只改函数体,向后兼容);C=拆列本单不做。**四项全部可开工。**硬红线:不重标/不删历史结果,不 bump Skill,不改 V4 input contract,不引入按 `engineVersion` 拒绝打开历史会话。串行:BUG-985 合入 → 本单。BUG-984 | **本地完成:diagnostics追加修复后全量3575→3588全绿,标准DB40/40Static/完整28资源gzip+0.040085%tsc/lint通过;主会话独立DB40与最终定向40全绿。未推送,真人/部署待主会话** | `codex/rectification-cross-midnight-fix-20260920`;前置认证已解除,代码基线 `3f39bafc`、文档基线 `f09f3d80`;本轮未推送 |
| `TASK-rectification-midnight-date-anchor-20260920.md` | — | **跨午夜的日期锚点与簇跨度(BUG-982 + BUG-983 合并一单)**:两条同根——线上契约只传钟点、日期不在契约里,后端按钟点大小**猜**哪端跨日。**BUG-983 是静默算错盘**`_candidate_datetimes()` 把起始钟点无条件绑在申报日期上,前端零补偿。Claude 实测(申报日 2000-06-15):申报 `00:10` → 候选 `06-15 23:55`…`06-16 00:25`**申报分钟本身落在 `06-16 00:10`+1 天**`00:02` 同样 +1 天;`12:00` 对照正确。受影响:申报落在午夜后半径内者(±15≈1.0%、±30≈2.1%、±60≈4.2%、±120≈8.3%);`late_night`(23:0003:59) 更重,其 `00:00``03:59` 共 240 分钟**全部落在用户没申报过的日期上**。**BUG-982 影响面比原记录大**:同缺陷在链路上出现三处(`_cluster_span` / `unionStillValidRange` / `indistinguishableWidthMinutes`),原记录只写了 Python 两处。实测跨午夜簇 `23:58/23:59/00:00` 报告宽度 **1440 分钟**(真实 3)、`23:50/23:55/00:05` 报 **1431**(真实 16);该链经 `reportWidth` 直达 **交付卡「范围 X 分钟」**,深夜用户会看到候选其实差几分钟却被告知范围一千多分钟。**与 BUG-981 的关系**:981 让每个候选按自己日期算 Dasha 是对的,但 983 给的日期本身就错,**983 不修则 981 在申报近午夜的场景等于没上线**。**产品 2026-09-20 三点全部拍板**D1 `late_night` **先问用户「午夜前还是午夜后」,答不上退「同日两段」`[D 00:0003:59] [D 23:0023:59]`,一律不得跨到 `D+1`**(连锁范围:退路产生**不连续候选集**,枚举/聚类/簇跨度/交付区间/宽度/交付卡都要支持两段,**不得用「取两段最小到最大」糊成一段**——那正是 982 的同型错误);D2 **允许窗口跨到前一天**,但交付层必须说明「若落在 23:5x 则出生日期是前一天」,不得静默改用户的出生日期(依据 Part B B4 真值覆盖率优先);D3 **加窗口相对序号**,排序/取首尾/算跨度一律用序号、钟点只作展示 —— 序号入契约会改候选身份与缓存指纹,**必须核对 BUG-984 的 `scoringIdentityMatches` 并确认历史结果只读不被重标**。硬红线:不调打分常数/确认门阈值;不得以排除真值换窄宽度;不得只修 `_cluster_span` 就宣称 982 已修;非跨午夜必须逐位不变且用同机 A/B(不得写死跨机浮点哈希,见 BUG-985)。沿用 BUG-982/983,不新开号 | **待领取**(三点已拍板) | — |
| `TASK-rectification-midnight-final-grok-20260921.md` | `PROGRESS-rectification-midnight-date-anchor-20260920.md` | **日期锚点最终验收接续(Grok)**:测试契约复验、扩展身份四模块、真实新 freeze 与 20/900、final-3 全门。不 commit/push/deploy。 | **待验收**:隔离 Linux 门通过(tsc/lint0、前端3649、DB56、quick、AA 21/21、0 新增 Python 失败);四既存失败仍在;真人/部署缺口见 BLOCKED | `codex/rectification-midnight-date-anchor-20260920`,未commit/push |
| `TASK-rectification-midnight-date-anchor-20260920.md` | `PROGRESS-rectification-midnight-date-anchor-20260920.md` | **跨午夜的日期锚点与簇跨度(BUG-982 + BUG-983 合并一单)**:两条同根——线上契约只传钟点、日期不在契约里,后端按钟点大小**猜**哪端跨日。**BUG-983 是静默算错盘**`_candidate_datetimes()` 把起始钟点无条件绑在申报日期上,前端零补偿。Claude 实测(申报日 2000-06-15):申报 `00:10` → 候选 `06-15 23:55`…`06-16 00:25`**申报分钟本身落在 `06-16 00:10`+1 天**`00:02` 同样 +1 天;`12:00` 对照正确。受影响:申报落在午夜后半径内者(±15≈1.0%、±30≈2.1%、±60≈4.2%、±120≈8.3%);`late_night`(23:0003:59) 更重,其 `00:00``03:59` 共 240 分钟**全部落在用户没申报过的日期上**。**BUG-982 影响面比原记录大**:同缺陷在链路上出现三处(`_cluster_span` / `unionStillValidRange` / `indistinguishableWidthMinutes`),原记录只写了 Python 两处。实测跨午夜簇 `23:58/23:59/00:00` 报告宽度 **1440 分钟**(真实 3)、`23:50/23:55/00:05` 报 **1431**(真实 16);该链经 `reportWidth` 直达 **交付卡「范围 X 分钟」**,深夜用户会看到候选其实差几分钟却被告知范围一千多分钟。**与 BUG-981 的关系**:981 让每个候选按自己日期算 Dasha 是对的,但 983 给的日期本身就错,**983 不修则 981 在申报近午夜的场景等于没上线**。**产品 2026-09-20 三点全部拍板**D1 `late_night` **先问用户「午夜前还是午夜后」,答不上退「同日两段」`[D 00:0003:59] [D 23:0023:59]`,一律不得跨到 `D+1`**(连锁范围:退路产生**不连续候选集**,枚举/聚类/簇跨度/交付区间/宽度/交付卡都要支持两段,**不得用「取两段最小到最大」糊成一段**——那正是 982 的同型错误);D2 **允许窗口跨到前一天**,但交付层必须说明「若落在 23:5x 则出生日期是前一天」,不得静默改用户的出生日期(依据 Part B B4 真值覆盖率优先);D3 **加窗口相对序号**,排序/取首尾/算跨度一律用序号、钟点只作展示 —— 序号入契约会改候选身份与缓存指纹,**必须核对 BUG-984 的 `scoringIdentityMatches` 并确认历史结果只读不被重标**。硬红线:不调打分常数/确认门阈值;不得以排除真值换窄宽度;不得只修 `_cluster_span` 就宣称 982 已修;非跨午夜必须逐位不变且用同机 A/B(不得写死跨机浮点哈希,见 BUG-985)。沿用 BUG-982/983,不新开号 | **待验收(Grok 接续全门已跑)**:隔离 Linux final-3 tsc/lint0、前端3649、DB56、quick、AA 21/21、Python 广域 0 新增失败;未commit/push/deployBUG-982/983 仍 investigating | `codex/rectification-midnight-date-anchor-20260920`,未commit/push/部署 |
## 命名与归档
@@ -1,6 +1,6 @@
# TASK · 跨午夜的日期锚点与簇跨度(BUG-982 / BUG-9832026-09-20
> 状态:**待领取**2026-09-20 产品对 D1 / D2 / D3 全部拍板,见 §3)。
> 状态:**执行中**2026-09-20,实际基线 `3be740f84`;T1 首批红测已留证,见同主题 PROGRESS。产品对 D1 / D2 / D3 全部拍板,见 §3)。
> 两条 Bug 合并成一单,因为它们**根因相同**:线上契约只传钟点字符串,没有任何一侧拥有「这一分钟属于哪一天」。分开修会产生两套互相冲突的日期表示。
## 0. 基线与交付
@@ -109,6 +109,23 @@ if end < start: end += timedelta(days=1)
**注意(红线 3 的具体化)**:序号入契约会改变候选身份与缓存指纹。**必须核对是否触发 BUG-984 刚建立的 `scoringIdentityMatches` 校验**,并确认历史结果按既有规则**只读**、不被重标。这一条写进 T2 / T3 的验收。
### D4 · 执行中补充授权:本轮打通跨日采用(2026-09-20)
独立审计发现,既有 adopt/confirm 只写 `active_birth_time`,新对话和星盘将其与原 `birth_date` 组合。仅修候选日期和展示,会把正确的前一日候选在采用后重新排成错误日期。
主会话向产品明确提供「只计算展示、暂禁异日采用」与「本轮打通跨日采用」两项;产品选择 **本轮打通跨日采用**。据此扩大本单范围,授权:
- 新增独立的已采用出生日期与来源持久化,服务端从已保存的候选事实原子写入日期及钟点;浏览器仍只提交 candidate/result/case 标识,不得自行指定采用日期。
- **保留原申报 `birth_date` 不变**,不得通过覆盖原始资料补救;历史结果不回填猜测日期、不重标。
- 同步新对话、账户星盘、报告等有效出生资料读取链,使用统一的已采用日期/钟点真相源;资料更改、改选与清理后的生命周期必须安全。
- 实施约束(代码核验后明确):既有候选引擎使用请求固定 UTC offset,并未按 IANA 逐候选重新解析。采用结果须同时保存并复用其实际计算 offset 与来源,不能采用后换用另一偏移造成不同星盘;本单不改变引擎 DST 算法,不把固定 offset 边界宣称已修。分段窗口在时段转分钟与刷新时须完整持久化日期,可在新增兼容迁移中扩展窗口 RPC,不得缩窗后再按钟点猜日期。
- 允许新增向后兼容的数据库迁移(新增字段、函数体或相应约束,不改已应用迁移、不删改原字段语义);部署前后兼容旧代码,必须真跑 `npm run test:db`
- 增补 T4 验收:前一日与后一日候选采用后,新对话和星盘使用相同的正确日期;同日行为不变;未授权/伪造候选/过期基线不能写入;历史缺日期结果不被伪装为新日期契约。
此项扩大 §0 的改动落点至兼容迁移、profile/咨询/星盘等共享日期读取模块及相关测试。并行分工仅限文件互斥:主实现负责引擎、`rectification-agentic/**`、候选交付;采用实现负责新迁移及外围有效出生资料读取。共同文件由原负责人串行整合,不并行编辑。该授权不包括提升 main、生产发布、workflow/DNS 改动或打分阈值变化。
执行文件互斥补充:transition 实现独占 `scripts/rectification/refinement_packet.py`、前端 `refinement-packet.ts` / `sign-from-transitions.ts` / `candidate-contrast-packet.ts` / `varga-observations.ts` 与专用回归;交还冻结后由核心代理串行整合 segment-start marker 消费端和 lagna 段边界。核心代理负责新窗口迁移30000;采用代理负责新采用迁移20000及外围资料模块。无并行编辑 Home 或共享组件;主会话独立验收,不写在途实现。
## 4. 硬红线
1. **不得调打分常数、权重、确认门阈值**。本单只改日期归属与跨度计算。
@@ -0,0 +1,164 @@
# TASK · 日期锚点最终验收接续(Grok / 2026-09-21
> 状态:Grok 已串行执行 T1–T5,待产品验收。未 commit/push/deploy。既有 Claude 实现/审计/验收代理均已暂停;本单接管现有工作树,不重做已闭合功能。
## 1. 基线、位置与决策
- 唯一实现目录:`G:/Ferti/Jyotisha/.worktrees/rectification-midnight-date-anchor-20260920`
- 分支:`codex/rectification-midnight-date-anchor-20260920`
- 固定比较基线:`3be740f84d12b098b27b88105a88b5e2d8dd0ead`。现有大量未提交修改都是本轮交接成果,不清理、不重置、不切分支;远端后来前进不改变本轮固定基线。
- 原任务:`docs/tasks/TASK-rectification-midnight-date-anchor-20260920.md`
- 继续使用原进度:`docs/tasks/PROGRESS-rectification-midnight-date-anchor-20260920.md`
- 用户此前已批准隔离 Linux/Docker 验收、跨日候选采用持久化及兼容迁移;此次仅换执行方,不新增产品范围。不 commit/push/deploy,不提升 main,不改 workflow/DNS/依赖/权限。
- 当前剩余工作是测试契约收口、新冻结验证证据、最终全门与记录。生产功能原则上继续冻结;发现新的实质缺陷先留证并报告,不顺手扩改。
## 2. 事故实证与根因
final-1 完整不可变快照结果(原日志见第6节):
| 项目 | 已有结果 |
|---|---:|
| tsc / lint | 0错误 / 0错误、119既有warning |
| 前端 | 3649通过、0失败 |
| 真实DB | 56通过、0失败 |
| build首页 | Static |
| JS gzip | 629588 vs基线626849+0.437% |
| CSS gzip | 39496,不变 |
| Python广域 | 338通过、11失败:4既存 + 7新增 |
| quick | 尚未跑 |
| 诊断性AA同机独立进程 | 3案例×7投影=21/21相等,零容差 |
**整体验收尚未通过**,不能以部分通过替代最终门。
7个新增失败分两类:
1. 三个算法/回执测试仍指向算法8,当前是9。已最小修改,历史golden不动;实现者报告最终34/34,接手方尚须独立复验。
2. 四个validation integrity测试正确拒绝历史freeze。旧freeze生成于BUG-981的2026-09-20 04:56:54/55 UTC,早于本任务。不是final-1停写之后生产源码又漂移。需当前源码新freeze + 真实20-case/900-cell重跑,不能改旧hash消红。
最后只读审计另发现:`scripts/research/sealed_holdout_rerun.py::PRODUCTION_FILES` 为显式集合,遗漏本轮 `candidate_window.py``decision_policy.py``refinement_packet.py``api_service.py`。前两类实际日期/静态上下文路径及生产receipt/窗口语义应进入新扩展身份;`reported_offset_sweep`复用此名单。须在新freeze前补齐,旧legacy12身份算法不重写。该补项尚未落盘,先核符号再最小实施。
## 3. 硬红线
- 读本树AGENTS.md/CLAUDE.md;每次git操作先`git status -sb`。禁止stash/reset/rebase/切脏分支;不动主检出或其它会话。
- 不调分数常量/权重/确认阈值,不bump Skill,不重标/删除历史结果,不覆盖原申报birth_date。
- 旧freeze/report/golden/archive/manifest原字节保留。当前contract可更新,但只能由新真实报告确定性派生,不手填hash或指标。
- 六个runtime contract键值和类型不变;`not_ready`、coverage=0、非独立盲测、禁止调参/发布指标/唯一分钟声明等边界不变。
- 不削弱mismatch断言或校验顺序,不删extended identity,不把当前源码追认进旧报告。
- 不新增跨机/跨进程浮点固定hash断言,遵守BUG-733/985。分数同机A/B零容差;历史golden原容差/离散断言保留。
- 不读凭据、不借账号、不接生产数据,不暴露端口、密钥或用户资料。无登录/真人环境写BLOCKED与测试清单。
- 不碰别的容器、不global prune;仅复用本单隔离资源。失败原日志保留,blocked不写通过。
- 一位Grok串行执行,避免多代理泛审;只读必要文件,不重开已闭合功能。
## 4. 执行任务(严格顺序)
### T1 · 核实接手断点,复验3测试
最终修正涉及:
- `tests/test_dasha_transition_proximity_cross_midnight.py`:算法9/常量spec5legacy请求spec4及固定输入hash保留。
- `tests/test_rectification_relative_support.py`:只更新算法9policy/proportional/数值不改。
- `tests/test_rectification_engine_memoization.py`:旧golden8不变;四个dated metadata精确验证、独立UUID公式、剩余scores/receipt原比较器、7变异负例。
过程误加整snapshot固定golden比较,被Claude独立26pass/8fail拦截;已撤回这项新加断言,未削弱原比较器。默认与PYTHONUTF8=1最终各34pass是实现者报告,尚非独立结果。原失败日志保留:`artifacts/midnight-date-anchor/independent-python-contract-repair.txt`
接手SHAmemo `98808b8535f05f81d35a71de067928f762a6aae9fe9e8a2d9c44528f04c6b508`PROGRESS `1c0d81d7e78da93e2b060d4095112245ea3123508fe64b693c0c3691afc485ab`;历史golden `6266e448d7dad204b264cbe8f9bcf4c36e02286794764a94edb9e2ce4d0e3015`
复验:
```bash
PYTHONUTF8=1 python -m pytest -o addopts= tests/test_rectification_cross_midnight_gate.py tests/test_rectification_engine_memoization.py tests/test_rectification_relative_support.py -q
```
保存新的独占日志,不覆盖过程记录。
### T2 · 完成新冻结准备(尚未运行评测)
已落盘:
- 两研究脚本FREEZE/REPORT指向`*_midnight_anchor_2026_09_21`新唯一路径。
- `frontend/tests/rectification-confirmation-gate.test.ts`两处当前report指针同步,其他断言不变;Python消费者导入常量无需改逻辑。
- `docs/research/history/rectification_pre_midnight_anchor_2026_09_21/`:旧current contract + 两套旧freeze/report共5份原字节及manifest,已经独占归档。
- 一次性确定性派生步骤:`artifacts/midnight-date-anchor/scratch/derive_current_holdout_contract.py`
- 精确路径/hash交接:`artifacts/midnight-date-anchor/evidence-pointer-migration-hashes.json`
待做:
1. 核实PRODUCTION_FILES遗漏,将上述4个本轮生产模块纳入新扩展身份;不改旧freeze/legacy12;加最小回归防新模块再次遗漏,记录既有断言若有变化的三栏。
2. **独立审查派生脚本后才运行**。Claude主会话尚未审这份脚本。必须验证新report.frozen_record==freeze、当前freeze_record身份一致、freeze≤start≤finish、完整20/900计数、非独立/禁调参、旧contract在替换前未被别人修改、六runtime键值类型不变、历史metrics与unfrozen diagnostic不变、旧previous链保留、原子替换;不只相信脚本注释。
3. current contract/新报告/归档/派生步骤不应进入被其自身签名的identity,防自引用。
4. 所有身份文件停写后再freeze;改路径常量或身份名单都会改变evaluator/research hash,绝不能先freeze后改。
验收:最小diff、所有旧归档hash一致;新4份报告仍无伪造占位文件;评分生产文件不因验收改动。
### T3 · 固定Linux环境真实生成新证据
先建立全新生成快照,保真源码,不能修改`implementation-final-1`。现有pack工具和白名单见第6节。生成快照只列当时存在的明确新增文件,不把未生成报告伪列进去。
在快照根同受控fixed126 Python环境执行:
```bash
python scripts/research/sealed_holdout_rerun.py --freeze --freeze-path docs/research/sealed_holdout_rerun_midnight_anchor_2026_09_21.freeze.json
python scripts/research/sealed_holdout_rerun.py --json --freeze-path docs/research/sealed_holdout_rerun_midnight_anchor_2026_09_21.freeze.json
python scripts/research/reported_offset_sweep.py --freeze --freeze-path docs/research/reported_offset_midnight_anchor_2026_09_21.freeze.json
python scripts/research/reported_offset_sweep.py --json --freeze-path docs/research/reported_offset_midnight_anchor_2026_09_21.freeze.json
```
两正常运行的stdout分别独占创建对应不含`.freeze``.json`文件,stderr另存。使用`open('x')`或noclobber,禁止普通覆盖重定向。freeze内部已exclusive-create。失败产物保留,重试用新的唯一名称并在freeze前统一指针,不能覆盖旧尝试。
sealed规模20cases、offset900cells,上次约3秒/400秒,仅本地公开数据与CPU,无网络/模型/用户凭据。记录argv/exit/time、完整计数、前后identity与环境,验证历史字节不变。
派生脚本原SHA `c4d06bc82c7e64cf4c9a53401f126b24caa3e11225f8d8d0be9e7399a31e4dbc`,若审计修正须记录新SHA。优先单独复制到`/work/tools`运行并记SHA,不为它放开整个artifacts/scratch打包规则:
```bash
python /work/tools/derive_current_holdout_contract.py --root /work/<新的生成快照>
# 验证成功后,同命令加 --apply,原子更新该快照current contract
```
核实实际脚本接口,以已读源码为准。current contract只从真实新报告派生。将4新证据及获批contract原字节回取新scratch delivery目录,再精确落实现树,校验输入输出SHA。
### T4 · 新最终快照与全门
重新统一冻结并打新包;原23新增清单已不够:需要实际新增全集、6份history、4新证据、本任务单/测试等,每项精确路径SHA,不通配放行、不stage源码、不复用旧manifest。92既有artifact必须来自原baseline archive原字节;未改旧hash。
新最终快照的全部身份文件必须与生成快照逐字节相同,新报告SHA等于真实输出。重新独立npm ci,不复用.next。运行:
- tsc、lint、完整frontend test、build Static、首页gzip±2%。
- 标准真实`npm run test:db`0fail/0skip。
- 同final-1三个Python glob,新增失败必须0,四既存失败逐断言与基线对照。
- 完整`python scripts/run_quality_gate.py --profile quick`,不可跳过。
- 原生golden/3公开AA同机独立进程比较;7投影21/21零容差,不声称含算法ID/新增metadata的全响应字节相等。
- frozen integrity/confirmation门与旧archive保护测试。
- 环境freeze与SDK前后不漂移,与fixed126基线一致。仍标`productionPinEquivalent=false`
四既存失败:
1. active_rectification_api long_real_conversation winning_segmentactual04:16单分钟,expected05:0705:08)。
2. active_rectification_selector legacy/v5 score bytes固定hash。
3. minute_rectification_development v3 improvedactual1 expected0)。
4. minute_rectification_holdout_validator historical implementation manifest mismatch:类别既存,但实际当前hash会变,不能称字节一致。
### T5 · 记录与交回
更新原PROGRESS、BUG-982/983记录及必要BLOCKED/testing清单、tasks索引。原final-1失败和各过程红日志保留,不抹成通过。BUG无部署证据仍investigating,不宣称resolved。
结论只需简短表格:通过/未通过/环境缺口、日志路径、改动范围、未commit/push/deploy。停止而不是自动发布。无需反复向Claude汇报每个命令;遇真正阻塞才提示用户。
## 5. 让步顺序
1. 保身份/历史字节/确认门安全,不能靠改hash或断言换绿。
2. 复用既有隔离资源与脚本,避免泛审、重新跑已闭合功能的手工探针。
3. 不够条件时写blocked;quick和真实DB不可省略为已通过。
4. 生产功能新缺陷、权限拒绝、需改依赖等超出接续范围时留证停下;不借别的代理绕权限。
## 6. 环境与证据定位
宿主scratch(不是主仓工作目录):
`G:/Ferti/Jyotisha/scratch/rectification-midnight-date-anchor-baseline-20260920/`
- 容器`midnight-anchor-runner``midnight-anchor-docker`;当前空闲。
- runner镜像`rectification-midnight-baseline-runner:20260920`
- /work/baseline固定基线,/work/implementation-final-1旧最终失败快照不可覆盖。
- /work/tools/run-python-fixed-environment.py/work/tools/vedastro-runtime-constraint.txt`vedastro==1.23.26`
- PIP_CONSTRAINT、PIP_NO_INDEX=1、PIP_DISABLE_PIP_VERSION_CHECK=1、JYOTISH_SKIP_LOCAL_ENV=1、NEXT_TELEMETRY_DISABLED=1,沿既有脚本传,不改项目依赖。
- Node22.23.2、Python3.13.15;固定126是隔离控制,不能冒称生产pin一致。
- 私有DinD DOCKER_HOST tcp://127.0.0.1:2375在runner网络内;无host socket/公开端口,不改资源边界。
- scratch `prepare-final-snapshot.py``baseline-artifact-whitelist.json``final-bundle-2/source-manifest.json``final-bundle-2/bundle-integrity.json`
- scratch `implementation-final-1/{results.json,python-glob.log,python-glob.xml,integrity-result.json}`
- scratch `diagnostic-aa-final-1/comparison/independent-process-aa-ab.json`
- worktree `artifacts/midnight-date-anchor/independent-final-1-result.json``independent-review-checklist.json``independent-production-freeze-continuity.json``evidence-pointer-migration-hashes.json`
主会话曾核1218份生产文件相对final-1零变化;研究pointer/测试/文档不在该比较内。接续identity清单变化不能伪作评分逻辑变化。
## 7. 开工前置与BUG编号
`git status -sb`核指定分支,读AGENTS与原PROGRESS最后相关段落;本轮首次fetch/pre_work已完成,证据在原进度。不要为了重走初始化重建/重置脏worktree。若执行额外git命令仍每次先status;若需复跑预检使用已核可用Python并记录,不修既存.workbuddy环境失败。
按符号检索BUG-733/981/982/983/985及frozen identity历史,不通读巨大BUG_HISTORY。BUG-982/983沿用;本单不预分配新号,确需新增先核当前最大编号。前端测试变更遵守frontend/AGENTS.md、DESIGN/VOICE必读规则。