docs(rectification): chart-tier caveats records — BUG-1138/1139, changelog, voice, design, device checklist, progress (T4)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
f8b4f46d0d
commit
87719a6c84
@@ -15224,6 +15224,35 @@
|
||||
- 防复发:同上合同测试。
|
||||
- 相关记录:BUG-1132
|
||||
- 修复版本:分支 `codex/consult-plain-answer-20261001`(未部署)
|
||||
## BUG-1138 | 校正采用后聊天不知道哪些分盘判断不了,照样按存下的分钟读 D9 / D10
|
||||
|
||||
- 状态:resolved(代码 + 回归测试;未部署,真机与真实模型待部署后复核)
|
||||
- 首次发现 / 最近更新:2026-10-01 / 2026-10-01
|
||||
- 影响面:`frontend/src/lib/report-candidate-range.ts::loadReportCandidateRange`(聊天与报告共用)、`frontend/src/lib/consultation-route-service.ts::prepareConsultationRoute`、`frontend/src/mastra/consultation-workflow.ts::runConsultationWorkflow` / `projectEvidenceContract`、`frontend/src/lib/consultation-birth-time-mode.ts`。
|
||||
- 用户现象:盘型口径的交付卡对宽窗口用户写「D9 / D10 分不开」,但采用后在聊天里问婚恋 / 事业,回答照样按存下的那一分钟读 D9 / D10 下结论,没有任何提示。
|
||||
- 触发条件:资料 `active_birth_provenance.contract = "segment-v1"`,且该次校正结果 `segment_summary` 中目标分盘档位为 `blocked` 或 `indistinct`。
|
||||
- 根因:盘型口径只改了校正交付卡;下游聊天只拿一个分钟与采用区间,不读分盘档位(旧版校正同样如此,旧版连卡片都不提示)。
|
||||
- 修复:新模块 `rectification-adopted-chart-tiers.ts` 按来源记录读该 Case 的档案(`get_agentic_rectification_case_dossier`,服务账号),解析 `segment_summary`(采用的那次结果;若之后同一 Case 有更新的结果则用更新的,不跨 Case),5 分钟缓存;共用的范围读取函数在有不可判分盘时附带 `unreliableVargas`。聊天把它写进排盘工具输入,工作流调用时从发给引擎的载荷里剔除,写入 `answer_policy.unreliable_vargas` / `deterministic_claims_forbidden_for` 与一句服务端说明(VOICE「采用后判断不了的分盘」)。为不改另一单正在改的 `consult/route.ts`,挂接点放在路由已经注入的范围读取函数里。
|
||||
- 验证:`tests/rectification-adopted-chart-tiers.test.ts`(segment-v1 / 旧采用 / 未校正 / 结果缺失 / 摘要损坏五种输入、跨 Case 拒绝、缓存);`tests/rectification-chart-tier-caveats-consult.test.ts`(范围读取 A/B、工具输入 A/B 与旧资料字节快照、引擎载荷不含该字段、模型数据包带策略与说明);旧资料聊天工具输入、引擎请求、工作流上下文、模型数据包与基线 `437dcecb` 逐字节相同(脚本见 PROGRESS);`tests/database-segment-adoption.test.ts` 追加真库读取断言(PostgreSQL 17 本地替身,正式证据待真 Docker)。
|
||||
- 防复发:读取失败只记日志不阻断聊天;非 segment-v1 资料不发 RPC;模型侧沿用 `mastra/index.ts` 既有「`deterministic_claims_forbidden_for` 是硬禁令」规则,不新增提示词。
|
||||
- 相关记录:BUG-1115~1117、BUG-1131、BUG-1139、BUG-690
|
||||
- 复发自:无
|
||||
- 修复版本:`codex/rectification-chart-tier-caveats-20261001`(未合入、未部署)
|
||||
|
||||
## BUG-1139 | 校正采用后新报告不标注判断不了的分盘
|
||||
|
||||
- 状态:resolved(代码 + 回归测试;未部署,真机待部署后复核)
|
||||
- 首次发现 / 最近更新:2026-10-01 / 2026-10-01
|
||||
- 影响面:`frontend/src/lib/personal-report-longform-generate.ts::generatePersonalReportLongform`、新模块 `frontend/src/lib/personal-report-chart-caveats.ts`;报告读取范围同 BUG-1138 的共用函数。
|
||||
- 用户现象:宽窗口用户采用后生成的个人报告,D9 / D10 图盘与数值位置表照常呈现,读者不知道这几张盘在出生时间范围里会变。
|
||||
- 触发条件:同 BUG-1138,且生成新报告(长报告路径;写作模型路径在生产关闭)。
|
||||
- 根因:同 BUG-1138,报告链路不读分盘档位。
|
||||
- 修复:长报告取回引擎正文后、计算快照哈希前,在不可判分盘的图盘标题(`D9 …`、`Navamsha`、`D10 …`)与数值位置表标题下各插一行固定提示,中英文正文各用本语言;按标题里的盘代号匹配,不匹配正文;幂等。图盘卡片解析允许标题与图之间恰好一段说明,提示行成为图注,网格不拆。发给引擎的载荷不变,不改 Python;写作模型路径(`demoteThemesMissingRequiredCharts`)生产关闭,本轮不接。
|
||||
- 验证:`tests/rectification-chart-tier-caveats-report.test.ts`:旧资料 / 空档位正文逐字节不变;读者版真实输出(虚构出生)D9+D10 命中 5 个标题、只标 D9 时命中 3 个、表格行数不变、幂等;英文版命中英文标题且提示无汉字;密度版真实输出图盘卡片数不变且 3 张卡带提示图注;生成流程 A/B:引擎载荷相同、旧资料落库正文与引擎原文逐字节相同、新资料只多 3 行提示。
|
||||
- 防复发:提示只加在新生成报告的快照里,旧报告不回改;匹配基于引擎盘代号,若引擎改标题需同步 `CHART_PATTERNS` 与测试。
|
||||
- 相关记录:BUG-1138、BUG-1115~1117、BUG-1016(图盘网格)
|
||||
- 复发自:无
|
||||
- 修复版本:`codex/rectification-chart-tier-caveats-20261001`(未合入、未部署)
|
||||
|
||||
## BUG-1140 | staging 镜像打包失败:`frontend/scripts` 下的研究脚本引用了 `frontend/tests` 的夹具
|
||||
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
# PROGRESS · 报告与聊天标注判断不了的分盘(2026-10-01)
|
||||
|
||||
任务书:`TASK-rectification-chart-tier-caveats-20261001.md`(BUG-1138 / BUG-1139)。执行:Claude fork 子代理。分支 `codex/rectification-chart-tier-caveats-20261001`,基线 `origin/staging` @ `437dcecb`。只 commit,未 push。
|
||||
|
||||
## 环境
|
||||
|
||||
Linux,Node 22.14(`/exec-daemon/node`),Python 3.13(系统 `python3`,本机无 `.venv`)。`frontend/node_modules` 用 `cp -al` 硬链主检出(同一 lockfile;Turbopack 不接受软链),未执行 `npm ci`。基线在独立 worktree `.worktrees/tier-caveats-base`(`437dcecb`)同机同依赖量。无 Docker:真库断言用 PostgreSQL 17.9 本地替身,正式证据待产品真 Docker。
|
||||
|
||||
## 实现
|
||||
|
||||
| T | 内容 | 提交 |
|
||||
| --- | --- | --- |
|
||||
| T1 | `frontend/src/lib/rectification-adopted-chart-tiers.ts`:仅 `active_birth_provenance.contract === "segment-v1"` 时按 `case_id` 读 `get_agentic_rectification_case_dossier`(服务账号),解析 `latest_result.decision_receipt.inference_state.segment_summary`,`blocked` / `indistinct` → 不可判分盘;同 Case 有更新结果用更新的,跨 Case 拒绝;5 分钟缓存;失败记日志返回 null | `5f279214` |
|
||||
| T2 | 聊天:共用范围读取 `loadReportCandidateRange` 在 segment-v1 时附带 `unreliableVargas`(经服务账号读资料来源列,`20260927020000` 已授列权);`prepareConsultationRoute` 写入排盘工具输入 `unreliable_vargas`;`runConsultationWorkflow` 从引擎载荷剔除该字段,并经 `applyUnreliableVargasToWorkflowContext` 写 `answer_policy.unreliable_vargas` / `deterministic_claims_forbidden_for` 与一句 `user_facing_limitation`;`projectEvidenceContract` 把两项透传进模型数据包。**未改** `consult/route.ts`、`product-voice.ts`、`consultation-evidence-card.ts`、`consultation-thinking-plan.ts`(挂接点在路由已注入的范围读取函数) | `e68ac9b2` |
|
||||
| T3 | 报告:`frontend/src/lib/personal-report-chart-caveats.ts` 在不可判分盘的图盘标题与数值位置表标题下插一行提示;`generatePersonalReportLongform` 在计算快照哈希前对中英文正文各自应用;引擎载荷不变,不改 Python | `6372ad8a` |
|
||||
| 真库 | `tests/database-segment-adoption.test.ts` 追加:采用后服务账号读来源列 + 档案 RPC → `{ source: "segment-v1", resultMatch: "adopted", unreliable: [] }` | `da88c325` |
|
||||
| T4 | BUG-1138 / 1139、CHANGELOG、VOICE、DESIGN、真机清单、本记录、README | 末提交 |
|
||||
|
||||
## helper 五种输入(T1 测试)
|
||||
|
||||
| 输入 | 输出 |
|
||||
| --- | --- |
|
||||
| segment-v1,结果 D9/D10 blocked(虚构 ±60 宽窗) | `{ source: "segment-v1", resultMatch: "adopted", unreliable: ["D9","D10"] }`,1 次 RPC |
|
||||
| 旧采用(`contract: "candidate-v2"`) | `null`,0 次 RPC |
|
||||
| 未校正(provenance 为 null) | `null`,0 次 RPC |
|
||||
| 结果缺失(RPC 报错 / 档案无 latest_result) | `null` + 警告 `P0001` / `invalid_segment_summary` |
|
||||
| 摘要损坏(档位与占比不一致) | `null` + 警告 `invalid_segment_summary` |
|
||||
|
||||
另:真实引擎扫描(公开 AA,31 分钟)窄窗 → D1 certain、D9/D10 credible,不标注。
|
||||
|
||||
## 聊天 A/B
|
||||
|
||||
- 工具输入:segment-v1 多 `unreliable_vargas: ["D9","D10"]`,其余字段与旧采用逐字节相同;旧采用工具输入字节快照锁在测试里。
|
||||
- 引擎载荷:带 / 不带 `unreliable_vargas` 逐字节相同(字段不出站)。
|
||||
- 上下文与模型数据包:segment-v1 多 `answer_policy.unreliable_vargas`、`deterministic_claims_forbidden_for`,`user_facing_limitation` 末尾追加「你的出生时间范围里,婚恋(D9)、事业(D10)的上升会变,这几张盘判断不了;涉及它们的部分只看本命盘和大运,不按它们下结论。」
|
||||
- **旧资料逐字节不变(硬红线 1)**:基线 worktree 与本分支各跑同一脚本(`scratchpad/tier/peek2.ts`、`peek3.ts`):旧采用聊天工具输入 `cmp` 相同;真实工作流 golden 下「引擎请求 + 工作流上下文 + 模型数据包」226,949 字节 `cmp` 相同。
|
||||
|
||||
## 报告 A/B
|
||||
|
||||
- 引擎载荷:旧 / 新资料逐字节相同。
|
||||
- 落库正文:旧资料 = 引擎原文逐字节;新资料(D9+D10)多 3 行(密度版真实输出:D9 两处、D10 一处图盘标题),删去这 3 行后与引擎原文相同;图盘数不变。
|
||||
- 读者版真实输出(虚构出生)命中标题:`##### Navamsha`、`##### D9 九分盘`、`##### D10 Dasamsa`、`#### D9 九分盘 数值位置表`、`#### D10 Dasamsa 数值位置表`;英文版:`##### Navamsha`、`##### D9 Navamsa`、`#### D9 Navamsa Position Table`。
|
||||
- 样例:
|
||||
|
||||
```
|
||||
##### D9 九分盘
|
||||
|
||||
提示:出生时间范围内这张盘的上升会变,这一节仅供参考。
|
||||
|
||||
(图盘)
|
||||
```
|
||||
|
||||
- 图盘网格:卡片解析允许标题与图之间恰好一段,提示行成为图注;密度版卡片数前后相同,3 张卡带该图注。
|
||||
|
||||
## 门禁(基线 `437dcecb` vs 本分支,同机同依赖)
|
||||
|
||||
| 检查 | 基线 | 本分支 |
|
||||
| --- | --- | --- |
|
||||
| tsc | 0 | 0 |
|
||||
| lint | 0 error / 126 warning | 0 error / 126 warning |
|
||||
| npm test | 4809 / pass 4744 / fail 24 / cancel 0 / skip 41 | 4823 / pass 4758 / fail 24 / cancel 0 / skip 41;失败清单逐名相同,基线名 0 丢失,新增 14 |
|
||||
| `/` | Static | Static |
|
||||
| 首屏 gzip(`/` 预渲染 HTML 引用 JS + CSS,gzip -9) | JS 555,325 / CSS 68,764 | JS 555,325 / CSS 68,764(±0.00%) |
|
||||
| 快速门 Python | 1036 passed / 1 skipped | 1036 passed / 1 skipped / 0 failed |
|
||||
| 快速门 npm 步 | 24 环境失败(Docker / PG / 部署) | 同 24 条 |
|
||||
| 真库(替身)`database-segment-adoption.test.ts` | — | 2/2 |
|
||||
| 隐私守卫 | — | 通过 |
|
||||
|
||||
## 改动的既有断言
|
||||
|
||||
无。`tests/database-segment-adoption.test.ts` 只追加断言,未改既有断言。
|
||||
|
||||
## 缺口
|
||||
|
||||
- 真 Docker 未跑(替身证据);真机与真实模型输出待部署 staging 后按 `docs/testing/rectification-chart-tier-caveats-20261001.md` 走。
|
||||
- 写作模型报告路径(`PERSONAL_REPORT_WRITER_ENABLED = false`)未接 `demoteThemesMissingRequiredCharts`;该路径生产关闭,开启前需补。
|
||||
- 只给图盘 / 数值位置表加提示,未给依赖 D9/D10 的主题段落(报告正文为引擎输出,无稳定的主题→分盘映射);若要按主题降级需引擎侧配合,另立单。
|
||||
- 已生成的旧报告不回改(任务书 D3)。
|
||||
@@ -261,7 +261,7 @@
|
||||
| `TASK-rectification-varga-resolution-20260930.md` | — | **「盘型口径」实现单**:交付改为「每张目标盘的上升 + 可信度档位」(≤±10:≥0.6 较可信 / 0.5–0.6 倾向 / <0.5 分不开;≤±30 只有较可信或分不开;>±30 只给 D1);按问题域取盘(婚恋 D1+D9 / 事业 D1+D10 / 综合三张);段扫描端点 + 「盘型一致不用校正」出口;按段选题仅 ≤±30;不得用占比提前停;采用落库头段交集中点。不改引擎 / 常数 / 冻结文件。红线:回放 ±10/±30 真值段保留 76/76、头段命中不低于研究「按段」列;段级汇总与研究 JSON golden 逐格一致 | 已验收(Claude 10-01,经修复单 BUG-1132;分支 codex/rectification-varga-resolution-fix-20261001) | — |
|
||||
| `TASK-rectification-varga-resolution-fix-20261001.md` | — | **盘型口径修复单**:F1 开案 RPC 42501(推荐包装改 security invoker,禁补属主授权)、F2 Docker 真库全量 test:db + 旧会话可打开、F3 用 `--posterior production` 重生成正式回放文件(Claude 同命令已得差 0)、F4 研究 PG harness、F5 记录。部署须先迁移 | 已执行并验收(Claude 10-01 直接执行:开案 42501 修复、history/harness 改 V10 写轮次、迁移改名 20261001*、正式回放替换;真库替身全量与 staging 一致;真 Docker 复跑与真机待产品) | 基于 review/rectification-varga-resolution-20260930 ce9d669c |
|
||||
| `TASK-rectification-message-cleanup-20261001.md` | — | **校正消息清理**:题干两遍(作废旧焦点仍打印题干 + 独立问题块再打印一次)→ 一屏一题干;证据轮正文改为「记下了 N 件事」+ 服务端清单可展开;校正结算后不显示「已完成 N 步」与「1.」泄漏。推翻 BUG-917 作废题留题干、VOICE 逐条复述 | 待领取 | BUG-1135~1137 |
|
||||
| `TASK-rectification-chart-tier-caveats-20261001.md` | — | **报告与聊天标注判断不了的分盘**:采用后读 `active_birth_provenance`(segment-v1)→ 结果 `segment_summary` 档位,blocked/indistinct 的 D9/D10 在聊天 answer_policy 与一句说明、报告章节顶部提示 + 主题降级;旧资料逐字节不变;不改库、不改 consult/route.ts | 待领取 | BUG-1138~1139 |
|
||||
| `TASK-rectification-chart-tier-caveats-20261001.md` | `PROGRESS-rectification-chart-tier-caveats-20261001.md` | **报告与聊天标注判断不了的分盘**:采用后读 `active_birth_provenance`(segment-v1)→ 结果 `segment_summary` 档位,blocked/indistinct 的 D9/D10 在聊天 answer_policy 与一句说明、报告章节顶部提示 + 主题降级;旧资料逐字节不变;不改库、不改 consult/route.ts | 已实现待验收(fork 10-01:helper + 聊天 + 报告长报告路径;旧资料聊天 / 报告逐字节不变;npm 失败清单同基线、gzip ±0.00%、快速门 Python 0 失败;真 Docker 与真机待) | BUG-1138~1139 |
|
||||
| `TASK-rectification-typed-event-scoring-research-20260929.md` | `PROGRESS-rectification-typed-event-research-20260929.md` | **打字经历按选择题规则计分(离线研究,不上线)**:计分通道不对称 + 已入账年份挡题;R0 学业质量题措辞 / 年精度显示成 1 月(冻结文件,需重新冻结) | 已验收(Claude 2026-09-29 合并验收:全量前端 4302/24 与基线同 24 条环境失败、tsc 0、lint 0 error、`/` Static、gzip +0.16%、快速门 pytest 1001 passed、两份回放复跑一致),待部署核对 | BUG-1088、1089 |
|
||||
| `TASK-report-reader-polish-20260929.md` | `PROGRESS-report-reader-polish-20260929.md` | **报告页打磨**:生成入口挪进页面主体(删标题栏按钮)、详情页到底部按钮(懒渲染一次到底)、导出按钮带文字、目录一级/二级分层、去掉「字段」与 RL/NL 缩写表头、状态列同义重复去重、报告表格淡底色、分块导出显示真实文件大小 | Claude 直接执行并自验(tsc 0、lint 0 error、全量 fail 与基线同 24 条、`/` Static、gzip +7 B、快速门 Python 1000 passed),已部署 staging `d7772011`,真机欠 | BUG-1092~1094 |
|
||||
| `TASK-report-english-edition-20260929.md` | `PROGRESS-report-english-edition-20260929.md` | **报告中英两版**:同一次引擎计算渲染 zh/en 两遍(不用模型翻译),瑜伽库 477 条补英文、模板与前端表头英文化;中文逐字节不变、英文零汉字、两版数字序列一致;阅读页 `?lang=en` 切换,导出当前语言 + 「问 AI 建议导出英文版」提示;旧报告不补英文 | Claude 直接执行(含两个 fork 子代理)并自验(tsc 0、lint 0 error、全量 fail 与基线同 24 条、`/` Static、gzip +0.06%、Python 定向全绿),已部署 staging `d7772011`,真机欠 | — |
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
# 真机清单:校正后判断不了的分盘(BUG-1138 / BUG-1139)
|
||||
|
||||
> 部署 staging 后由产品负责人用受控账号走一遍。自动化覆盖了数据与文本,这里核对真实模型与页面。
|
||||
|
||||
## 准备
|
||||
|
||||
- 一个受控测试账号,资料填一个**虚构**出生日期,出生时间来源选「大概时间」,前后误差选最宽(约 ±60 分钟)。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. 发起生时校正,按提示答题直到出交付卡。卡上应只给 D1,D9 / D10 写「分盘解读需要更准的出生时间」。点「改用这个时间」采用。
|
||||
2. 回首页问一个婚恋问题(例如「我的婚姻怎么样?」)。
|
||||
- 回答里有一句大白话:出生时间范围里婚恋(D9)的上升会变、判断不了,只看本命盘和大运。
|
||||
- 回答不出现「blocked」「档位」「segment」等字样,不拒答。
|
||||
3. 再问一个与 D9 无关的问题(例如「这周适合做什么?」)。不应硬塞那句说明。
|
||||
4. 生成一份新的个人报告并打开。
|
||||
- 「本命与分盘北印度图盘」里 D9 / D10 图下有一行「提示:出生时间范围内这张盘的上升会变,这一节仅供参考。」,图照常显示,图盘网格没有被拆成两块。
|
||||
- D9 / D10「数值位置表」标题下同样有这一行,表格完整。
|
||||
- 切到 English:同位置是英文提示句。
|
||||
5. 对照:另一个**没做过新版校正**的账号生成报告,正文里没有任何这类提示。
|
||||
|
||||
## 记录
|
||||
|
||||
每步写「通过 / 不通过 + 截图」,贴回会话。
|
||||
Reference in New Issue
Block a user