docs(tasks): rectification round briefs (fewer probes/card, telemetry, research, split, reconcile)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
This commit is contained in:
Jesse_Chen
2026-09-26 13:46:21 +08:00
co-authored by Claude Opus 5.5
parent 3ce11ee04d
commit abb05b675c
6 changed files with 168 additions and 0 deletions
+5
View File
@@ -35,6 +35,10 @@
| 任务书 | 进度 | 主题 | 状态 | 落点 |
| --- | --- | --- | --- | --- |
| `TASK-rectification-fewer-probes-card-20260926.md` | — | **减少无效追问 + 卡片区间为主**:引导补件离线新增达标 0 → 上限 6→2、定向题问完门槛未达直接出卡;卡片区间为主标题、代表分钟副标题,第一二名差距 ≥5 个百分点才显示百分比,否则写「目前区分不开」。不放宽任何置信度。先做 | 待领取 | — |
| `TASK-rectification-telemetry-20260926.md` | — | **匿名聚合统计**:每会话一行只存数字 / 枚举(题数分类、宽度、差距、停止原因、门槛达标、耗时、版本),管理后台只看汇总、保留 180 天;动表须 test:db。排在 fewer-probes 后 | 待领取 | — |
| `TASK-rectification-offline-research-20260926.md` | — | **三项离线研究**:答错 1–2 题的容错、V1/V2 分盘配权正确重跑、改正「1 分钟≈1.1 天」(实测中位 3.8 天)并核实 `_representative_pairs` 推断。不改线上 | 待领取 | — |
| `TASK-rectification-code-split-20260926.md` | — | **代码拆分(只搬不改)**:聊天组件 2043 行 / 35 useState、`POST` 926 行、`runV9AgentTurn` 1047 行,269 处切源码测试;拆分 + 增长合同 + 切片测试改调用函数。排在 fewer-probes、telemetry 之后 | 待领取 | — |
| `TASK-rectification-dup-question-20260926.md` | `PROGRESS-rectification-dup-question-20260926.md` | **同一轮问题出现两次(BUG-1045,复发自 BUG-585,BUG-969 拼回题干、去重只在刷新路径)+ 同一道选择题连画两张(BUG-1046:提交失败不回滚本地已答 + 兜底问题块条件过宽;H2 漏收回合)**。先于 latency 单 | 已验收(Claude 09-26 直接执行:子代理复现 A 与 B-H1(选择题提交 409 / 网络错误不回滚本地已答);Claude 变基到含 BUG-1043/1044 的 staging 后独立复验 tsc/lint 0、全量 3981 条失败名单与基线逐条一致、四路由 ○、gzip 不变) | `e4c1c7a3`(已部署 `f1d16405`,health 一致) |
| `TASK-rectification-latency-20260926.md` | `PROGRESS-rectification-latency-20260926.md` | **每轮等待过长(BUG-1047)**:一轮打字回答串行 5 次开思考的模型调用,分类在开流前且无超时。产品定:收尾两步不动、分类保持思考只加 10 秒超时、发出后立即出确定性进度句并按阶段更新;补埋点;服务端无口吻优化须 A/B 逐位一致。排在 dup-question 之后 | 已验收(Claude 09-26 直接执行:子代理实现 D1–D4 与 D5 两项;Claude 用 Node 22 独立复验 tsc/lint 0、全量 4002 条失败名单与 Node 22 基线逐条一致(24 条均为 Docker/DB)、四路由 ○、gzip 不变。D5 第 1 项(探针复用)输出逐字节一致但触发冻结打分身份,Claude 建议暂不做) | `86ff9a40`(已部署 `8a409434`,health 一致) |
| `TASK-rectification-session-title-result-20260922.md` | `PROGRESS-rectification-session-title-result-20260922.md` | **校正会话标题改写结果(BUG-1001)**:BUG-988 把副标题改成最后活动时间后,标题里的日期成了重复;而 BUG-929 删掉 `uniquifySessionTitle` 之后,`resolveSessionTitle` 对校正入口只返回 `生时校正 · M月D日`,**同一天多条标题完全相同**(真机截图:9/17 三条同名、9/16 两条同名、9/14 一天 5 条);旧标题的钟点后缀是创建时间、副标题是最后活动时间,同一行两个对不上的时间。**产品 09-22 拍板**:D1 标题改为承载结果——有 `accepted_time`/`confirmed_time` 写 `生时校正 · HH:MM`,否则写 `candidate_range` 的 `生时校正 · HH:MM–HH:MM`(推翻 BUG-929 的日期口径,但「不得再加墙钟去重后缀」保留);D2 存量批量重算(推翻 BUG-929「旧标题不批量改」,先例 `20260916020000_rectification_session_title_repair.sql`);D3 今日节奏保留日期(我判定的例外);D4 只在结果变化时改 title,`open` 路径不动(对 BUG-699 边界的有限扩展)。**红线**:任何写标题的路径都不得 bump `updated_at`(否则 13 条历史会话集体跳顶、毁掉 BUG-988);标题算式必须只有一处实现(一个 SQL 函数,触发器与回填共用)——BUG-987/992 都栽在「两层规则各写一份」。T4 跨层对断不得让步。已 grep 出真正受影响的只有 7 个文件,Python 侧只查裸字符串、无需改。BUG 段 1001 起 | 已验收(Claude 09-25:单一 SQL 函数、不动 updated_at、手改名不覆盖、回填幂等) | `88fe67df`/`a94a1d67`(已部署) |
@@ -214,6 +218,7 @@
| 任务书 | 进度 | 主题 | 状态 | 落点 |
| --- | --- | --- | --- | --- |
| `TASK-docs-reconcile-20260926.md` | — | **状态板 / BUG / BLOCKED 过期对账**(纯文档):约 35 行校正任务状态过期、BUG-085/086/743/981/984 记录过期、BLOCKED latency 条目过期;逐条附证据改,不把欠真机写成通过 | 待领取 | — |
| `TASK-people-ephemeris-ui-20260926.md` | `PROGRESS-people-ephemeris-ui-20260926.md` | **星盘档案页补样式 + 星历可读性改版**(原型 https://claude.ai/artifact/FmPy9xZ7dQw9u7yrW4WzTw ,产品 09-26 确认):/people 样式 0 条(BUG-1039)→ 手机列表→详情、桌面两栏;星历五要素先中文后梵文(附唯一对照表)、吉凶彩色标签、固定规则当日总评(不调模型)、标题栏大按钮移到底部提示卡。必须真实浏览器截图验收。与 BUG-1038 单并行、文件不交叉 | 已验收(Claude 09-26 直接执行模式:子代理实现,Claude 独立复验 tsc/lint 0、全量 3916 条失败名单与基线逐条一致、四路由 ○、gzip +0.00%、36 张浏览器截图核对与原型一致) | `0ab061b9`(已部署,run 2910,health 一致) |
| `TASK-round-0925-followup-20260925.md` | `PROGRESS-round-0925-followup-20260925.md` | **0925 收尾单**:西洋盘标签偏移 ≤30° + 第三圈;删除后只在当前人物里回退;人物接口故障降级为本人;P3 删旧面板、点击按最近行星、删除年运死调用 | 已验收(Claude 09-26:偏移 ≤30° 达成;删后回退按人、人物接口降级、账户单次请求、面板与死代码删除均通过;残留 0.73% 盘标签重叠为 P3) | `d08ffdc0` + 合同修复 `e84d6eb8`(d08ffdc0 的门禁 run 2901 红于一条引用已删面板文案的 Python 合同,Claude 经产品授权直接修复);已部署 run 2906,health 一致 |
| `TASK-chart-western-fix-20260925.md` | `PROGRESS-chart-western-fix-20260925.md` | **西洋盘 ASC/MC 重叠**:固定锚点避让、真实引擎64盘与固定种子512盘扫描、343px盘宽命中≥44px;raw golden;文档陈旧行更正 | 已验收(重叠 0%);新 P1 标签偏移最大 115° → 收尾单 D1(产品定 ≤30° + 第三圈) | `4d801e53`(已部署,health 核对一致) |
@@ -0,0 +1,23 @@
# TASK · 状态板 / BUG 历史 / BLOCKED 过期条目对账(2026-09-26)
## 基线
- `origin/staging` 当前 head。**纯文档**,用跟踪 staging 的文档 worktree 或独立分支;不改代码。
## 背景(09-26 盘点)
- `docs/tasks/README.md` 约 35 行校正任务仍标「待验收 / 验收未通过」,但对应 BUG 已 resolved、提交已在 staging(例:post-adopt-verify 536–539、probe-answer-covers-domain 549、range-delivery-fix 583、skipped-health 626/627、domain-alias 672、followups 631/632、evidence-turn 633/634、collect-semantics 641–643、superseded-focus 644/645、collection-redesign 646–648、dead-d9-choice、rectification-p0 699/704–709、09-11~09-15 一批 659 / 666–692、report-candidate-range 526/535、title-repair-migration);「已验收」但落点写「未部署 / 待迁移」的 09-04~09-07 行;跨午夜一组(L338–342)写「未推送 / 未 commit」但提交已在 staging;L133 people-archive 行名拼错日期。
- `docs/BUG_HISTORY.md`:BUG-085 / 086 描述 V5 已过期;BUG-743 可能因 BUG-915 (b) 风格题不计分而失效;BUG-981 / 984 记录写"未合入 / 未推送"但代码已在 staging 并部署。
- `BLOCKED.md`:latency 条目写"未部署、1047 investigating"(已部署 resolved)等过期条目。
## 规则
1. **逐条核实再改**:以 `git merge-base --is-ancestor <sha> origin/staging`、BUG 记录状态、`/api/health` 部署历史(Gitea runs)为证据;每条改动在 PROGRESS 里列"原状态 → 新状态 → 证据"。
2. 状态板:已在 staging 且 BUG resolved 的改为「已合入」(无独立验收记录的)或「已验收」(有验收记录的);未部署备注按部署历史改写;**不得把欠真机验收写成已通过**——真机欠账保留在落点列。
3. BUG 历史:只改状态行与"修复版本"行;过期的(085/086)改 `closed_obsolete` 并写一句理由;743 如确认失效改 `closed_by_design` 并引用 BUG-915;981/984 补"已部署(提交 / run)、欠真人验收",状态保持 investigating。
4. BLOCKED:解除的划掉(不删),写解除证据。
5. 不改任何产品决策;不关闭仍缺真人验收的项目;隐私红线照旧。
## 交付
`docs/tasks/PROGRESS-docs-reconcile-20260926.md`(对账表)+ 三个文档的修改;推 staging(纯文档不触发门禁)。
@@ -0,0 +1,41 @@
# TASK · 生时校正代码拆分(只搬不改)+ 增长上限(2026-09-26)
## 基线
- 排在 `TASK-rectification-fewer-probes-card-20260926` 与 `TASK-rectification-telemetry-20260926` **都合入之后**的 `origin/staging`。分支 `codex/rectification-code-split-20260926`。
## 事故实证(09-26 盘点,`origin/staging` 3ce11ee0)
| 文件 | 行数 | 说明 |
| --- | --- | --- |
| `frontend/src/components/rectification-agentic-chat.tsx` | 2043 | 组件本体约 1620 行;useState 35、useRef 16、useEffect 7、useLayoutEffect 2、useCallback 12 |
| `frontend/src/app/api/rectification/agent/route.ts` | 1077 | `POST` 约 926 行 |
| `frontend/src/lib/rectification-agentic/v9/agent-run.ts` | 1400 | `runV9AgentTurn` 约 1047 行 |
- 无任何行数 / hook 数增长上限(对比首页 `home-shell-growth-contract.test.ts`)。
- 79 个测试文件把这些文件当源码文本读,其中 42 个用 `indexOf` / `sourceBetween` 共 269 处切片;这类测试多次让门禁翻红(BUG-308、342、736、933、940、975、1014、692、748)。
## 决策记录(产品 2026-09-26)
- D1 **只搬代码不改行为**(同首页拆分 `TASK-home-page-split-20260925` 的做法):
- 聊天组件:按职责拆出 hook(快照同步、提交与流、选择题、时间轴 / 范围)与展示组件;参数式 lib 函数内部不调用 React hook。
- `POST`:按分支拆成独立处理函数(打字回答、选择题、开场、只读、交付),`route.ts` 只做装配。
- `runV9AgentTurn`:按阶段拆(准备、单次尝试、收尾、重跑),行为逐行一致。
- D2 目标:聊天组件本体 ≤ 900 行、useState ≤ 20;`POST` ≤ 250 行;`runV9AgentTurn` ≤ 300 行(达不到按让步写明)。
- D3 加增长合同测试(与首页同型:行数基线 + 150 余量、hook 数上限),锁住成果。
- D4 **切源码字符串的测试改为调用被抽出的函数**(行为断言等价或更强);不得删除测试来"解决"断言;每条改写三栏。
## 硬红线
1. 行为零变化:全量前端测试(Node 22)失败名单与开工基线逐条一致、新增 0;Python 快速门通过;首页 / 各页 `○ Static`、gzip ±2%。
2. 不改接口、数据库、Skill、文案、打分。
3. 不得用挤行 / 删注释凑行数(AGENTS §6)。
4. 分阶段提交(组件、路由、agent-run 各自可单独回滚),每阶段都跑全量。
## 任务分解
- T1 聊天组件拆分 + 增长合同。
- T2 路由拆分 + 增长合同。
- T3 agent-run 拆分 + 增长合同。
- T4 切片测试改调用函数(随各阶段进行)。
- T5 记录:CHANGELOG(无用户可见变化)、PROGRESS(每阶段行数 / hook 数 / 测试对比);不开 BUG 号。
@@ -0,0 +1,41 @@
# TASK · 生时校正:减少无效追问 + 交付卡以区间为主(2026-09-26)
## 基线
- `origin/staging` 当前 head(线上 `8a409434`)。分支 `codex/rectification-fewer-probes-card-20260926`。
- **串行**:本单先做;`TASK-rectification-telemetry-20260926` 与 `TASK-rectification-code-split-20260926` 排在本单之后(改同一批交付 / 决策代码)。与离线研究单、账目对账单不交叉。
## 事故实证(Claude 09-26 盘点,`origin/staging` 3ce11ee0)
- **引导补经历没有收益**:`docs/research/guided_collect_holdout_2026_09_16.json`——20 例 v4 开放集、理想作答,六题后精度门槛(宽 ≤10 分钟且第一名领先 >3 个百分点)达标 3/20(±10 窗)、1/20(±30)、0/20(±60);引导补件后**新增达标 0 例**,只增加提问数。引导窗口题上限 `GUIDED_COLLECT_LIMIT = 6`;`frontend/src/lib/rectification-agentic/core/rectification-decision.ts` `mayDeliverOnPrecision` 在"还有题可问"时用门槛挡住交付卡。
- **卡上百分比无区分力**:卡片"相对可能性"为 `proportional` 模式(`scripts/rectification/decision_policy.py`),各候选分数占总分比例;每件事约 11.5 分为窗口内恒定项、约 2.1 分随分钟变化(约 5:1,见 `docs/research/rectification_minute_resolution_closure_2026_09_14.md`),所以常见 26% / 26% / 20% 这种数字。
- **引导邀请语依据有算术错误**(离线研究单另行改正数据,本单只改 UI 与出题上限)。
## 决策记录(产品 2026-09-26)
- **D1 引导补经历最多 2 条**:`GUIDED_COLLECT_LIMIT` 由 6 改为 2。
- **D2 定向题(七条线及其一次重问)问完、门槛仍未达标 → 直接出交付卡**,不再为门槛继续追问引导题 / 未覆盖领域开放题。交付卡内容规则不变(区间仍按 `unionStillValidRange`,不放宽任何淘汰 / 置信度 / 采用门 / 确认门)。用户主动补经历的入口保留。
- **D3 交付卡以区间为主**:区间(如「05:00–05:15」)为主标题,代表分钟为副标题(「最可能 05:07」)。
- **D4 百分比只在差距明显时显示**:第一名比第二名高 **≥ 5 个百分点**时,才显示各列百分比;否则不显示数字,改写一句「这几个时刻目前区分不开,补一件带年月的经历能帮助分开。」(进 VOICE)。排序与三列内容(性格、经历、未来窗口)不变。
- **D5 不做**:不改打分、不改淘汰阈值、不打开确认门、不改 45 天闸门。
## 硬红线
1. 离线回放证明 D1/D2 不改变最终交付区间:用 `docs/research/guided_collect_holdout_2026_09_16.json` 同口径脚本(20 例 v4 开放集,公开名人数据,允许使用),改前改后真值在区间内的比例、区间宽度中位均不变,平均提问数下降;数字写进 PROGRESS。
2. 不放宽任何置信度边界(AGENTS §8.4、Part B4)。
3. 卡片改版在同一提交更新 `frontend/DESIGN.md`(交付卡一节)与 `frontend/docs/VOICE.md`;真实浏览器(CDP 假数据)截图:差距 ≥5 与 <5 两种卡。
4. 全量前端测试(**Node 22**:`/exec-daemon/node`)与基线逐条一致、新增 0;Python 快速门 pytest 集通过;改动断言写三栏(写在测试文件里);若 Skill 文本需改,按 CHANGELOG 规则 bump 并说明。
## 任务分解
- T1 D1/D2(出题上限与出卡条件)+ 单测 + 离线回放。
- T2 D3/D4 交付卡 UI + 组件测试 + 截图。
- T3 记录:CHANGELOG、DESIGN、VOICE、PROGRESS(回放数字)、`docs/testing/` 真机清单;本单为产品调整,不开 BUG 号。
## 开工前置命令
```bash
git fetch origin --prune
export PATH=/exec-daemon:$PATH && node -v # 22.x
git worktree add -b codex/rectification-fewer-probes-card-20260926 .worktrees/rectification-fewer-probes-card-20260926 origin/staging
```
@@ -0,0 +1,28 @@
# TASK · 生时校正三项离线研究(2026-09-26)
## 基线
- `origin/staging` 当前 head。分支 `codex/rectification-offline-research-20260926`。**不改线上代码**(只加研究脚本、结果 JSON、报告文档;若研究脚本需要读引擎内部函数,只读不改)。
- 数据:只用仓库已有的公开 AA 名人开放集(v4,`docs/research/holdout_v4_build_2026_09_14.md`)与明确虚构数据。
## 背景(09-26 盘点)
1. 所有回放都按"每题理想作答",数字全是上限;**是 / 否答错的容错从未测过**。
2. 分盘敏感度配权 V1/V2 的结论在 09-15 勘误为"未测"(权重没真正生效,BUG-692),**一直没重跑**,是打分侧唯一没真正测过的方向。
3. 文档写"1 分钟 ≈ 1.1 天大运边界位移"(`TASK-rectification-precision-adaptive-boundary-research-20260914.md` 及 BUG-689 邀请语依据)有误:Vimshottari 120 年覆盖 9 个星宿(120°),平均 1° ≈ 1 年;09-26 用 swisseph 在 2000 个虚构时刻实测每分钟位移中位 **3.8 天**(p10 1.6、p90 5.0、范围 1.3–5.9),仓库 `_vim_start_dates` 复核两例 2.3 / 4.9 天。45 天闸门对应约 9–34 分钟而非 40 分钟。推断"出不来题"的真实原因更可能是 `event_probes.py` `_representative_pairs` 只比相邻代表分钟 + 首尾一对。
## 任务
- R1 **答错容错**:在 v4 开放集上,六题回放里随机把 1 题、2 题的是 / 否答反(固定种子,多次重复),统计真值仍在交付区间的比例、头名簇命中、区间宽度;分 ±10 / ±30 / ±60 窗。
- R2 **V1/V2 分盘敏感度配权重跑**:先证明权重确实生效(打分差异非零),再按 closure 文档口径报告头名命中、宽度、真值在区间比例;与基线对照。
- R3 **改正算术**:复现 3.8 天 / 分钟的测量(脚本 + 分布表),重新推导"不同精度的证据能区分多近的候选",核实 `_representative_pairs` 推断;改正相关任务书 / 研究文档中的错误数字(加勘误段,不删原文),并给出引导邀请语的修改建议(不直接改线上文案)。
## 硬红线
1. 不改线上代码、打分、阈值、Skill;研究脚本放 `scripts/research/`,结果放 `docs/research/`,每个结论附可复跑命令。
2. 不把开放集结果写成盲测或"准确率";不得出现真实用户数据。
3. Python 同机 A/B,不写死跨机浮点哈希(BUG-985)。
## 交付
`docs/research/rectification_offline_research_2026_09_26.md`(三节 + 结论一句话 + 是否建议立实现单)、结果 JSON、PROGRESS;README 状态板一行。
@@ -0,0 +1,30 @@
# TASK · 生时校正匿名聚合统计(2026-09-26)
## 基线
- `origin/staging`(`TASK-rectification-fewer-probes-card-20260926` 合入之后)。分支 `codex/rectification-telemetry-20260926`。
## 背景
线上没有任何校正会话的聚合数据:交付宽度、问了几题、停在哪条规则、门槛是否达标、是否补过经历都不知道(盘点 09-26)。后续所有决策(领域门槛 2→3、引导题是否再调、默认窗口宽度)都缺证据。
## 决策记录(产品 2026-09-26)
- D1 加匿名聚合统计,**只存数字与枚举**,不存出生资料、姓名、邮箱、用户 / 案例 id 以外的任何身份信息、对话内容、模型原文。
- D2 每个校正会话在交付(或放弃 / 超时结束)时写一行:起始窗口半径、出生时间来源类别、提问总数(按类型:定向 / 引导 / 带年月探针 / 性格 / 开放)、用户补经历次数、最终区间宽度(分钟)、候选数、第一名与第二名差距(百分点)、停止原因枚举(收敛 / 题源问空 / 用户说没有了 / 8 轮上限 / 用户中止 / 错误)、精度门槛是否达标、耗时(秒)、算法与策略版本。
- D3 数据只供产品负责人在管理后台看**汇总**(中位、分布、按周),不提供逐条导出;保留期 180 天。
- D4 用户 id 只用于去重与删除联动(账户删除时一并删除),汇总视图不显示。
## 硬红线
1. 隐私:AGENTS §8;字段白名单写进测试(新增字段必须改测试);日志与表中不得出现出生日期 / 时间 / 地点 / 姓名 / 对话文本。
2. 动表:迁移必须向后兼容(加表,不改旧表);**必须真跑 `npm run test:db`**(本机无 Docker 时以门禁 DB job 结果为准,写进 PROGRESS 并附 run 号);RLS:普通用户不可读写,只有服务端写、管理员读。
3. 写入失败不得影响用户会话(异步 / 吞错并记录)。
4. 全量前端测试(Node 22)与基线逐条一致、新增 0;改动断言三栏。
## 任务分解
- T1 迁移(表 + RLS + 保留期清理函数)+ 真实 Postgres 测试。
- T2 写入点:交付 / 结束路径,字段计算纯函数 + 单测(白名单)。
- T3 管理后台汇总页(沿用 admin 现有框架):宽度分布、提问数分布、停止原因占比、门槛达标率、按周趋势。
- T4 记录:CHANGELOG、PROGRESS、`docs/testing/`(产品在后台看到汇总的步骤)、隐私说明写进 `docs/operations/`。