From b62308c4ad6de6066645c7b93b9175033b130cac Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Thu, 1 Oct 2026 21:14:57 +0800 Subject: [PATCH] fix(rectification): segment verification report drops the minute leaderboard (BUG-1151) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8 --- CHANGELOG.md | 5 ++++ docs/BUG_HISTORY.md | 16 +++++++++++++ ...-rectification-post-adopt-card-20261001.md | 4 ++++ docs/tasks/README.md | 2 +- .../rectification-post-adopt-card-20261001.md | 1 + frontend/DESIGN.md | 2 +- .../v9/skill-verification-report.ts | 23 ++++++++++++------- frontend/src/mastra/rectification-v9-tools.ts | 1 + .../rectification-product-delivery.test.ts | 7 ++++++ 9 files changed, 51 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6c6f3b0..7e3cbebb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # 印度占星 Skill 更新日志 +## 2026-10-01 — 盘型口径的验证报告不再按分钟排名 + +- 交付卡「查看验证报告」在盘型口径下去掉「当前候选基本并列」「本命上升(该分钟)」和「排名 / 时间 / 相对支持」表,保留事件吻合、大运对照和技法审计;已有校正打开报告即生效(BUG-1151)。 +- 旧的分钟口径报告不变。Skill 版本不变;不改数据库结构。 + ## 2026-10-01 — 采用后的核对题可以作答了;交付收尾那句话不再丢 - 修复:采用后的核对题点任何选项都提示「这次没提交上」。现在能正常作答(BUG-1150)。 diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index 866a7039..53518667 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -15467,3 +15467,19 @@ - 相关记录:BUG-912、BUG-498、BUG-1146、BUG-1149。 - 复发自:无 - 修复版本:`codex/rectification-post-adopt-verify-20261001`。 + +## BUG-1151 | 盘型口径的验证报告仍按分钟排名,与卡片「D9 较可信」打架 + +- 状态:resolved(2026-10-01 Claude 直接执行;产品 10-01 选 A) +- 首次发现 / 最近更新:2026-10-01 / 2026-10-01 +- 影响面:`v9/skill-verification-report.ts::buildSkillVerificationPacket`(新增 `segmentProduct`)、`mastra/rectification-v9-tools.ts`(盘型口径报告打开开关)。报告每次读取时现算,已有校正打开即生效。 +- 用户现象:交付卡「查看验证报告」里写「当前候选基本并列:04:53、05:06…」「本命上升(该分钟)」,并附「排名 / 时间 / 相对支持」表;卡片顶部却是「D9 天蝎(较可信)」。 +- 根因:盘型口径实现(BUG-1115~1117)只在报告前加了盘型摘要与「只供引擎诊断」一句,并删掉 D9/D10 换升行;八法报告的筛选段与候选窗表仍是分钟口径。 +- 决策记录:产品 10-01 选 A——盘型口径下报告去掉分钟排名表、并列/代表分钟行、「本命上升(该分钟)」;保留不可分宽度、事件吻合、Dasha 表与技法审计。分钟口径(旧案例)报告逐字不变。 +- 修复:`segmentProduct` 为真时不输出上述三处;盘型口径报告传 `segmentProduct: segmentReport`。 +- 验证:`frontend/tests/rectification-product-delivery.test.ts`(真引擎 golden)新增断言:盘型口径报告不含「当前候选基本并列 / 当前代表分钟 / 本命上升(该分钟)/ 相对支持 / 候选窗」,仍含「不可分宽度」「Technique Audit Table」;分钟口径仍含排名表与「本命上升(该分钟)」。去掉开关时 15 条红。 +- 防复发:盘型口径的用户可见面(气泡、卡片、报告)都不得出现分钟排名。 +- 相关记录:BUG-1115~1117、BUG-1147。 +- 复发自:无 +- 修复版本:`codex/rectification-post-adopt-verify-20261001`。 + diff --git a/docs/tasks/PROGRESS-rectification-post-adopt-card-20261001.md b/docs/tasks/PROGRESS-rectification-post-adopt-card-20261001.md index 1cacdcd9..e4f406e0 100644 --- a/docs/tasks/PROGRESS-rectification-post-adopt-card-20261001.md +++ b/docs/tasks/PROGRESS-rectification-post-adopt-card-20261001.md @@ -55,3 +55,7 @@ Python 快速门:本单不改 `scripts/**`、`tests/**`,未跑。`test:db` 同根问题:交付收尾补写轮次的 `:gate` 请求号也不是 uuid,一并修。真机反映的「选中后旁白和卡片消失一会儿」本机无浏览器未复现;采用路径现在不再发只读续跑、收尾句能落库,待真机复测,复现则请录屏。 第二轮门禁(`52495df7`,基线 staging `fa6d026f`):tsc 0、lint 0 error、用例 4866(失败 24 条与 f1a169cb 基线逐条一致、cancelled 0;唯一「缺失」名为 c0f05912 改名)、`/` ○ Static、首屏 gzip JS 555,642、镜像 COPY 布局构建通过;真库重放 8 条中可采用的 1 条:采用轮次写入、作答成功。 + +## 第三轮:验证报告去分钟排名(BUG-1151,产品选 A) + +`buildSkillVerificationPacket` 加 `segmentProduct`;盘型口径不出并列/代表分钟行、「本命上升(该分钟)」、候选窗排名表。golden 测试加断言,去开关 15 条红。 diff --git a/docs/tasks/README.md b/docs/tasks/README.md index 91101f12..40f6fb1e 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -265,7 +265,7 @@ | `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-angle-timing-research-20261001.md` | `PROGRESS-rectification-angle-timing-research-20261001.md` | **角度类时间技法研究(离线)**:行运土木罗压本命上升 / 天顶度数、次限推运角、太阳弧角(1° ≈ 4 分钟出生时间),77 例 v5;乱序日期对照 ≥ 50 次必做、留一法、不得挤出真值;显著才叠加到六题后验比头段命中与区间宽度 | 已实现待验收(0/9 预登记检验显著,BUG-1141 closed_by_design;分支 codex/rectification-angle-timing-research-20261001,未推送) | BUG-1141 | | (直接执行,无任务书) | `PROGRESS-rectification-segment-order-20261001.md` | **健康区分题写入失败(BUG-1143)+ 按盘型挑题默认开启(BUG-1144)**:区分类焦点把 `health_pressure` 原样写入、违反表约束、写入被吞后提前交付(BUG-672 同族);修后 77 例真库回放平均问题数 ±10 2.8→4.6、±30 3.6→5.4,D10 头段 ±30 39→52;按段选题 ≤61 分钟默认开,±30 D9 46→51、D10 52→55,真值段 76/76 | 已验收(Claude 10-01 直接执行) | 分支 codex/rectification-segment-order-20261001 | -| (直接执行,无任务书) | `PROGRESS-rectification-post-adopt-card-20261001.md` | **采用后核对题无按钮(BUG-1146)+ 盘型口径回复念分钟排名(BUG-1147)**:keep 分支丢探针身份致 GET 空卡(BUG-498 复发);采用接口不写轮次、只读运行被 60 秒交付窗口挡掉,题挂到上一题回复下;改为采用接口写「已采用 HH:MM。再核对一件过去的事。」轮次并挂题。盘型口径下去掉「领先 / 落后」、交付旁白不再说「分不开」、边界句只说一次 | 已验收(Claude 10-01 直接执行);真机回报后补修 BUG-1149(请求号非 uuid 被真库拒写)、BUG-1150(核对题作答 stale_probe),本机真库重放通过;真机清单 `docs/testing/rectification-post-adopt-card-20261001.md` | 分支 codex/rectification-post-adopt-verify-20261001 | +| (直接执行,无任务书) | `PROGRESS-rectification-post-adopt-card-20261001.md` | **采用后核对题无按钮(BUG-1146)+ 盘型口径回复念分钟排名(BUG-1147)**:keep 分支丢探针身份致 GET 空卡(BUG-498 复发);采用接口不写轮次、只读运行被 60 秒交付窗口挡掉,题挂到上一题回复下;改为采用接口写「已采用 HH:MM。再核对一件过去的事。」轮次并挂题。盘型口径下去掉「领先 / 落后」、交付旁白不再说「分不开」、边界句只说一次 | 已验收(Claude 10-01 直接执行);真机回报后补修 BUG-1149(请求号非 uuid 被真库拒写)、BUG-1150(核对题作答 stale_probe),本机真库重放通过;BUG-1151 盘型报告去分钟排名(产品选 A);真机清单 `docs/testing/rectification-post-adopt-card-20261001.md` | 分支 codex/rectification-post-adopt-verify-20261001 | | `TASK-rectification-typed-event-scoring-research-20260929.md` | `PROGRESS-rectification-typed-event-research-20260929.md` | **打字经历按选择题规则计分(离线研究,不上线)**:计分通道不对称 + 已入账年份挡题;R0 学业质量题措辞 / 年精度显示成 1 月(冻结文件,需重新冻结) | 已验收关单(Claude 10-01:三类技法 9 项检验 0 显著,真值平均排位 0.49~0.59;Claude 补正对照——埋入信号排位 0.077、挪年 0.502——流程有效;BUG-1141 closed_by_design) | 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`,真机欠 | — | diff --git a/docs/testing/rectification-post-adopt-card-20261001.md b/docs/testing/rectification-post-adopt-card-20261001.md index 8b32d4b9..c9a99787 100644 --- a/docs/testing/rectification-post-adopt-card-20261001.md +++ b/docs/testing/rectification-post-adopt-card-20261001.md @@ -12,6 +12,7 @@ 4. **刷新**:刷新页面,核对题还在、四个按钮还在、仍挂在那条采用消息下面。 5. **答核对题**:点一个按钮,不出现「这次没提交上」,能进入下一题或看到「前事核对到这里…」。 5a. **选中时**:点「更像这个」后,上面的旁白和卡片不应消失;如果仍消失一下,请录屏发给 Claude。 +5b. **验证报告**:交付卡点「查看验证报告」,里面没有「当前候选基本并列」「本命上升(该分钟)」和「排名 / 时间 / 相对支持」表。 6. **旧校正会话**:从会话列表打开一个以前的校正会话,能打开、不报错。 有任何一项不符,截图发给 Claude。 diff --git a/frontend/DESIGN.md b/frontend/DESIGN.md index 3163b17f..7c04e4c7 100644 --- a/frontend/DESIGN.md +++ b/frontend/DESIGN.md @@ -4,7 +4,7 @@ This file adapts the full visual analysis in `CLAUDE_DESIGN.md` to the shipped J ## 校正按盘型交付(2026-09-30,在途,BUG-1115~1117) -复用范围卡布局:主行逐张写目标盘的上升与可信档位,分钟范围降为次行。完整扫描缺失时明确不能证明全窗一致;超过 61 分钟的 D9/D10 不作解读推荐。采用按钮沿用旧 owner/result/candidate 与门控,不另造候选:采用服务端头段交集/优先级/clamp 后的实际日期和分钟。已采用状态只认服务端核验的 result、候选锚点、date/time 与 segment provenance 身份,不能仅凭钟点相同点亮;只读与锁门仍禁用。来源偏移按实际采用日历日期计算,原填报资料保留,采用不等于确认。不增加 Home 状态、等待动画或新输入框。当前自动化/真机验收未闭环,不视作上线完成。 +复用范围卡布局:主行逐张写目标盘的上升与可信档位,分钟范围降为次行。完整扫描缺失时明确不能证明全窗一致;超过 61 分钟的 D9/D10 不作解读推荐。采用按钮沿用旧 owner/result/candidate 与门控,不另造候选:采用服务端头段交集/优先级/clamp 后的实际日期和分钟。已采用状态只认服务端核验的 result、候选锚点、date/time 与 segment provenance 身份,不能仅凭钟点相同点亮;只读与锁门仍禁用。来源偏移按实际采用日历日期计算,原填报资料保留,采用不等于确认。不增加 Home 状态、等待动画或新输入框。当前自动化/真机验收未闭环,不视作上线完成。折叠的「查看验证报告」同样不出分钟排名:无并列/代表分钟行、无「本命上升(该分钟)」、无候选排名表(BUG-1151)。 ### 新产品缺扫描与部分扫描(T4 子组,在途) diff --git a/frontend/src/lib/rectification-agentic/v9/skill-verification-report.ts b/frontend/src/lib/rectification-agentic/v9/skill-verification-report.ts index b36bfa01..6b6b8d2e 100644 --- a/frontend/src/lib/rectification-agentic/v9/skill-verification-report.ts +++ b/frontend/src/lib/rectification-agentic/v9/skill-verification-report.ts @@ -62,6 +62,11 @@ export type SkillVerificationReportInput = Readonly<{ holdoutReservationStatus?: "reserved" | "not_reserved_min_events"; separation?: CandidateSeparation; engineResultId?: string | null; + /** + * Segment (盘型) product (BUG-1151, product 10-01 option A): the report carries no minute + * leaderboard — no tie/representative line, no 「本命上升(该分钟)」, no candidate-rank table. + */ + segmentProduct?: boolean; }>; export function signByCandidateFromTransitions( @@ -179,11 +184,11 @@ export function buildSkillVerificationPacket(input: SkillVerificationReportInput "这是当前窗的相对拟合,标签是 `candidate_range_not_birth_time_truth`。采用只会把代表性时间写入当前排盘,不是已确认的唯一出生分钟。", "", "### 筛选", - tied + ...(input.segmentProduct ? [] : [tied ? `- 当前候选基本并列:${(input.separation?.credibleRange ?? []).join("、") || "尚未拉开"}。${time} 只是后续计算的代表点,不是赢家。` - : `- 当前代表分钟:${time}`, + : `- 当前代表分钟:${time}`]), `- 不可分宽度:${width}`, - `- 本命上升(该分钟):${lagna}`, + ...(input.segmentProduct ? [] : [`- 本命上升(该分钟):${lagna}`]), d9Differs ? "- D9 仍会换升。这是候选结构差异,应生成区分探针,不能直接宣布不可分。" : "- D9 上升在当前窗较稳。", @@ -191,11 +196,13 @@ export function buildSkillVerificationPacket(input: SkillVerificationReportInput ? "- D10 仍会换升。这是候选结构差异,应生成区分探针,不能直接宣布不可分。" : "- D10 上升在当前窗较稳。", "", - "### 候选窗(正文复述;卡片仍作采用控件)", - "| 排名 | 时间 | 相对支持 |", - "|---|---|---|", - ...(candidateLines.length > 0 ? candidateLines : ["| — | — | 还没有可出示的候选 |"]), - "", + ...(input.segmentProduct ? [] : [ + "### 候选窗(正文复述;卡片仍作采用控件)", + "| 排名 | 时间 | 相对支持 |", + "|---|---|---|", + ...(candidateLines.length > 0 ? candidateLines : ["| — | — | 还没有可出示的候选 |"]), + "", + ]), "### 各候选分盘上升(只抄本表)", "| 时间 | D9 | D10 |", "|---|---|---|", diff --git a/frontend/src/mastra/rectification-v9-tools.ts b/frontend/src/mastra/rectification-v9-tools.ts index 3c7c04be..806afdc7 100644 --- a/frontend/src/mastra/rectification-v9-tools.ts +++ b/frontend/src/mastra/rectification-v9-tools.ts @@ -551,6 +551,7 @@ export function latestResultToolProjection( ? "reserved" : "not_reserved_min_events", separation: decision.separation, engineResultId: latest.resultId, + segmentProduct: segmentReport, }); const protectedPacket = segmentReport ? { ...skillPacket, diff --git a/frontend/tests/rectification-product-delivery.test.ts b/frontend/tests/rectification-product-delivery.test.ts index 7e4f48fb..5f73c0bf 100644 --- a/frontend/tests/rectification-product-delivery.test.ts +++ b/frontend/tests/rectification-product-delivery.test.ts @@ -71,12 +71,19 @@ for (const domain of [null, "marriage", "career", "general", "report", "other"] assert.match(markup, /目前范围/); assert.doesNotMatch(markup, /用哪张盘解读/); assert.doesNotMatch(narration + stopped + report, /上升盘型暂未知|representative_diagnostic_not_adopted_chart/); + // BUG-1151: the minute product keeps its leaderboard. + assert.match(report, /\| 排名 \| 时间 \| 相对支持 \|/); + assert.match(report, /本命上升(该分钟)/); } else { assert.deepEqual(delivery.product_delivery, productDeliveryForDomain(domain)); assert.match(markup, /用哪张盘解读/); assert.doesNotMatch(markup, /最可能/); assert.doesNotMatch(narration + stopped + timeline?.workingLabel, /目前范围|眼下更像|代表分钟 \d/); assert.match(report, /只供引擎诊断/); + // BUG-1151 (product 10-01 option A): no minute leaderboard in the segment report. + assert.doesNotMatch(report, /当前候选基本并列|当前代表分钟|本命上升(该分钟)|相对支持|候选窗/); + assert.match(report, /不可分宽度/); + assert.match(report, /Technique Audit Table/); const nestedMissing = { ...delivery }; delete nestedMissing.product_delivery; const recovered = parseRectificationCandidateResult({ ...projected, rangeDelivery: nestedMissing });