docs(tasks): Claude acceptance of the home first-load round
Independent Staging Quality Gate / validate (push) Successful in 17m54s
Independent Staging Quality Gate / publish (push) Successful in 4m6s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
This commit is contained in:
Jesse_Chen
2026-10-01 01:02:56 +08:00
co-authored by Claude Opus 5.5
parent 856f611fcf
commit e600cff55f
2 changed files with 16 additions and 1 deletions
@@ -103,3 +103,18 @@
- 没有 Docker:DB / 部署套件 24 条失败,与基线逐条一致。
- worktree 里没有 `.venv`:`pre_work_check.py` 退出码 0,但外部引擎诊断那一项报「找不到 `.venv/bin/python`」;快速门借用本机 `.worktrees/rectification-holdout-expansion-20260929/.venv`(临时软链接,已删)。
- 「staging 连续两次部署宋体地址不变」「staging 上的揭幕时间」要部署后由 Claude 复核。
## Claude 独立验收(2026-10-01)
| 项 | 结果 |
| --- | --- |
| `tsc --noEmit` / `npm run lint` | 0 错 / 0 error(126 warning,与基线相同) |
| `npm test` | 4513 条,失败 24 条,与 Claude 在 `d87ec44a` 上跑的失败清单逐条一致(均为需要 Docker 的套件);按测试名比对没有消失的,新增 24 条 |
| `next build` | 通过,`/` 仍是 `○ Static` |
| Python | `tests/test_serif_font_slices.py`、`tests/test_repo_privacy_markers.py` 通过 |
| 字体 | 本地生产服务:CSS 里的宋体地址为 `/fonts/serif-sc/<名>.<哈希>.woff2`,不带 `?dpl`;响应头 `Cache-Control: public, max-age=31536000, immutable`、`Content-Type: font/woff2` |
| T8 早发 | Claude 自己的 CDP 脚本(接口统一 600 ms):account、chart-profiles、models、sessions 在导航后约 50 ms 同时发出,早于首屏 JS;揭幕前只剩 2 轮(第二轮是 entry-summary / consult status) |
| 未登录 | 所有接口返回 401 时,约 0.44 s 跳到 `/login` |
| 代码审阅 | 早发脚本只在 `/` 生效,每个结果只用一次、30 s 后作废、网络失败回退到正常请求;猜错的人物、换账号时丢弃预取的会话列表;确认门槛把研究 JSON 换成用到的 6 个值,并有测试与原 JSON 比对。Caddy 原样转发 Next 的缓存头,镜像会复制 `public/`,线上能生效 |
遗留:T2 侧栏品牌字「Jyotisha」在 `load` 前仍会下载宋体切片 00(38 KB,不在决策 1 的范围内);T7 校正界面与 markdown 仍在首屏;T4 已记入 BLOCKED;T5 未做。部署后要核对:连续两次部署,字体地址不变;在 staging 线上复测。
+1 -1
View File
@@ -384,7 +384,7 @@
| `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,不新开号 | **已验收通过并合入 staging**(2026-09-21,`b85c4a68`);已部署 staging(run 2831);真人验收待完成 | Claude 独立复核(用当初复现两条 Bug 的同一探针重跑):**BUG-983** 新契约下申报 `00:10`/`00:02` 的申报分钟落在**申报日**(+0 天),`late_night` 300 个候选**全在同一日**、两段;**BUG-982** 跨午夜 3 分钟簇 → **3 分钟**(原 1440),同日两段 → **300 分钟**(未糊成 1440)。三处(`decision_policy.py`/`credible-range.ts`/`candidate-plateau.ts`)均已改。**非跨午夜分数同机 A/B 6/6 逐位相同**;新测试在基线 6 条红、修复后全绿;Python `test_rectification_*` 基线 216 → **272 passed / 0 failed**;`tsc --noEmit` 退出 0。红线全清:打分常数零改动、`status=not_ready`、coverage 0、`holdout_passed()` False、Skill 未动、`official_eval_trial_count` 仍 0。D1 追问 4 选项含「不知道」「跳过」,均退同日两段、从不去 `D+1`,明写不计分可跳过;D2 交付层显示「(前一天)」;D3 用 `window_index`/`segment_index`,`interval_union_width` 按段求和(注释 “never fill a declared segment gap”)。超出要求的设计:`candidate_intervals` 拒绝重复钟点;engine-client 对 dated 路径 fail-closed 抛 `engine_invalid_candidate_decisions`。环境缺口:3 条前端测试在 Claude 机器红,但**同样的 `@/` 别名错误在既有测试上一模一样复现**(`ephemeris-route`、`api-service-unavailable`),非回归;无 Docker 故 `test:db` 未跑。**遗留待确认**:无 `cluster_intervals` 的行仍走旧按钟点算法(宽度仍 1440),应确认除修复前旧缓存外没有别的生产路径会产生无日期行 |
| (直接执行,无任务书) | `PROGRESS-notice-loading-polish-20260930.md` | 性别只在档案(1119)、星盘气泡频闪与表格圆角(1120)、全站顶部浮层提示(1121/1122)、我的报告提速与分页(1123/1124)、宫位点亮等待与今日一句不跳(1125) | **已验收,推 staging**;真机清单 `docs/testing/notice-loading-polish-20260930.md` 待产品 | 合并分支 `codex/polish-integrate-20260930` |
| `TASK-report-language-switch-stale-20260930.md` | `PROGRESS-report-language-switch-stale-20260930.md` | 报告阅读页切换中文 / English 后正文不换:正文与核对表同级重复 key(`key={shown}`),旧语言节点残留(BUG-1126);改 key + 整页切换回归测试 | **已验收,推 staging**(Claude 直接执行);真机第 10、11 步待产品 | 分支 `codex/report-language-switch-stale-20260930` |
| `TASK-home-first-load-20260930.md` | `PROGRESS-home-first-load-20260930.md` | 进站等待太久:冷启动接口串行 4 轮且要等 JS 跑完才发(BUG-1127,T1+T8 早发)、每次部署全部 JS 与宋体缓存失效(BUG-1128)、加载屏宋体抢带宽(BUG-1129)、首屏 JS 带城市表 / 校正代码 / 研究数据(BUG-1130,T7 瘦身);产品定加载屏用黑体、宋体只下一次;`supportsImmutableAssets` 先验证后上线;「新开页面先显示上次内容」待产品拍板,不在本单 | **待验收**(Claude 派 fork 子代理直接执行,未推送):T2/T1/T8/T3-b/T7(城市表·研究 JSON·引导页) 完成;T4 blocked(自托管不支持 immutable assets);T5、T7 校正界面与 markdown 未做 | 分支 `codex/home-first-load-20260930` |
| `TASK-home-first-load-20260930.md` | `PROGRESS-home-first-load-20260930.md` | 进站等待太久:冷启动接口串行 4 轮且要等 JS 跑完才发(BUG-1127,T1+T8 早发)、每次部署全部 JS 与宋体缓存失效(BUG-1128)、加载屏宋体抢带宽(BUG-1129)、首屏 JS 带城市表 / 校正代码 / 研究数据(BUG-1130,T7 瘦身);产品定加载屏用黑体、宋体只下一次;`supportsImmutableAssets` 先验证后上线;「新开页面先显示上次内容」待产品拍板,不在本单 | **已验收,推 staging**(Claude 派子代理执行、独立复验);T4 blocked、T5 未做;真机清单 `docs/testing/home-first-load-20260930.md` 待产品 | 分支 `codex/home-first-load-20260930` |
## 命名与归档