# PROGRESS · 窗口簇上限(2026-09-09) 工作树:`.worktrees/rectification-window-cluster-cap-20260909` 分支:`codex/rectification-window-cluster-cap-20260909` 任务书:`docs/tasks/TASK-rectification-window-cluster-cap-20260909.md` 基线:开工时 `15cede97`;推 staging 前接到 `origin/staging` @ `a31a5e24`(BUG-621) ## 开工回执 - 目标:BUG-623 去掉按时间截断;BUG-624 簇覆盖进可信区间;BUG-625 中途说出时段固定回复、不改窗口、不进模型。 - 顺序:4.1 → 4.2 → 4.3 → 4.4 → 4.6。4.5 intake 自定义范围等产品,本单不做。 - 最大风险:一小时窗 17 簇依赖签名而不是分数;前端若不把 `cluster_times` 写进快照,区间仍会缩成代表分钟。 ## 实测簇数(虚构盘 1997-08-08,`minute_step=1`,与任务书 §1 同盘) | 窗口 | 分钟数 | 签名簇 | 公开候选 | 覆盖 | | --- | --- | --- | --- | --- | | 14:00–15:00 | 61 | **17** | 17 | 14:00 … 15:00 | | 14:30–15:00 | 31 | 9 | 9 | 14:30 … 15:00 | | 12:00–16:00(14:00 ±120) | 241 | 64 | 64 | 12:00 … 16:00 | | 12:47–16:47(14:47 ±120) | 241 | **66** | **64**(相邻低分合并) | 12:47 … 16:47 | `MAX_PUBLIC_CLUSTERS = 64` 对 ±120 够用:66 簇会合并相邻低分,窗口两端仍在。没有按时间 `break`。 ## 已完成 - **4.1 / BUG-623**:`select_signature_representatives` 不再按时间截断;超 64 走 `cap_clusters_by_adjacent_merge`。夹具:17 簇含 14:46–14:51;65 簇合并后仍覆盖 `01:04`。 - **4.2 / BUG-624**:每个公开候选带 `cluster_times` / `cluster_start` / `cluster_end`,经引擎 → 快照 JSONB → 推断层;`engineClusterRange` 优先于换升聚类。簇 14:40–14:45、代表 14:40 → 区间右端 14:45。无新迁移。 - **4.3 / BUG-625**:`parseDeclaredBirthWindow` 在选模型之前拦截自由文本。命中则 `persistV9DeterministicTurn` 固定回复,不调模型、不改窗口、不换焦点。不含钟点的句子不命中。 - **4.4**:Skill **10.0.20**(live + `versions/10.0.20`,sha256 `9c09867591cc9e8726f3577346230339b5a6dd4b4f3d634a9cda3e66170d6ac6`)。§4 禁止「以你说的为准」。词表删除该短语;只剩标点时回落到固定回复。 - **4.5**:不做。 - **4.6**:BUG-623 / 624 / 625 已写入 `docs/BUG_HISTORY.md`;`CHANGELOG.md`;走查 `docs/testing/rectification-window-cluster-cap-20260909.md`(固定回复,不是确认卡)。 固定回复原文:「搜索范围是开始时按你的资料定的,校正过程中不改。想按别的时间段重来,请先到资料里改出生时间,再新建一次校正。」 ## 验收命令 - `.venv/bin/python -m pytest tests/test_rectification_v5_services.py -q` → 全过 - `frontend`:`tsc --noEmit` 过;`npm run lint` 0 error(既有 warning 未动) - `tsx --test` 任务书所列 `rectification-*.test.ts` + `birth-time-intake*.test.ts`(排除 database)→ **1073 pass / 0 fail** 本单状态:**待验收**。推 `origin HEAD:staging`。