fix(rectification): anchor candidate windows to civil dates across midnight
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:
@@ -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 候选日期 helper;984 `readV9EngineScoringIdentity` 完整 pair 与写入前 `assertV9ResultWritable`;985 同机 native/legacy 严格字节比较。098 枚举兼容未覆盖日期锚点/后续宽度,故不能代替本轮回归。
|
||||
- 主会话预检:remote verified,fragment/adapters ok,focused 23 pass / 1 fail;失败为既有 `.workbuddy` 镜像路径断言,不伪造路径、不修改测试。
|
||||
- 主会话公开 health:web/API 均 `8d0359fc62d525e2b7c1e5c7fe6df37f57833ad4`,migration `20260920010000`,status ok。仅证明前置部署,不代表本轮已部署或真人通过。
|
||||
- 实际 python 3.11.7,python3 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 pass,exit 0 | `final-python-targeted-68.txt` |
|
||||
| TS 日期15、transition、engine contract、range delivery、adopted date 五文件 + tsc | 61 pass / 0 fail / 0 skip;tsc exit 0 | `final-frontend-targeted-61-tsc.txt` |
|
||||
| 最终 D4 与窗口迁移(含widen/pending guard)标准真实 PostgreSQL | 56 pass / 0 fail / 0 skip,exit 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 基线 | quick0,Python891/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/3fail(legacy 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 golden,10仅模拟滚动身份 | 本轮日期契约可靠升级;不能把历史 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 RPC,stub返回日期区间且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与全量仍待验。新文案已对照 VOICE,DESIGN 同批记录 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/54(archive副本无.git导致git check-ignore环境红),隔离快照git init后前版55/55、exit0。最终限定复核又补pending guard:显式NULL拒绝;pending=true只能原区间不变,缩窄/选侧必须false。新负例真实红12pass/2fail(1业务+父汇总),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/longform:effective 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个新增metadata(dated-v1、原fixture同日12:00–12: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 failed,exit1
|
||||
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.04s,exit0
|
||||
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 diff,SHA256仍为 `6266e448d7dad204b264cbe8f9bcf4c36e02286794764a94edb9e2ce4d0e3015`。本次没有运行全量、quick、DB或build,没有占用runner、改生产/历史golden/共享依赖、commit/push或新建worktree。主会话报告final-1同机Linux AA为21/21(3×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 SHA256;BUG-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.35s,exit0
|
||||
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.73s,exit0
|
||||
```
|
||||
|
||||
日志分别为 `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.84s,EXIT_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 4856,sourceTar `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 fail:4 既存 + 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:07–05: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、文档与本进度。生产评分常数与确认门未改。停止。
|
||||
@@ -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:00–03:59`、`unknown` `00:00–23: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-621:open 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:00–03:59) 跨日;`unknown`(00:00–23: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 版)。A=started/failed 不再写版本(应用层,必做);A 的漏洞(同 turn 多个 completed 行版本不同)**必须实测取证,不得以「应该不会」结案**;B=聚合改取成功结果那一行(只改函数体,向后兼容);C=拆列本单不做。**四项全部可开工。**硬红线:不重标/不删历史结果,不 bump Skill,不改 V4 input contract,不引入按 `engineVersion` 拒绝打开历史会话。串行:BUG-985 合入 → 本单。BUG-984 | **本地完成:diagnostics追加修复后全量3575→3588全绿,标准DB40/40,Static/完整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:00–03: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:00–03:59] ∪ [D 23:00–23: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:00–03: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:00–03:59] ∪ [D 23:00–23: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/deploy,BUG-982/983 仍 investigating | `codex/rectification-midnight-date-anchor-20260920`,未commit/push/部署 |
|
||||
|
||||
## 命名与归档
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# TASK · 跨午夜的日期锚点与簇跨度(BUG-982 / BUG-983,2026-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/常量spec5,legacy请求spec4及固定输入hash保留。
|
||||
- `tests/test_rectification_relative_support.py`:只更新算法9,policy/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`。
|
||||
|
||||
接手SHA:memo `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_segment(actual04:16单分钟,expected05:07–05:08)。
|
||||
2. active_rectification_selector legacy/v5 score bytes固定hash。
|
||||
3. minute_rectification_development v3 improved(actual1 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必读规则。
|
||||
Reference in New Issue
Block a user