docs(report): record the skill-parity round, BUG-467 and what stayed blocked
PROGRESS carries the engine contract snapshot (including the fields the task brief assumed exist but the consultation API does not return), the claim card before/after text, the per-section prompt growth table, the knowledge pack inventory, and the actual quality-gate output. BLOCKED records four things: no model credentials and no PostgreSQL here, so the live writer comparison could not be produced; the per-section prompt p50 landing at 2.83x raw (2.28x cost-weighted), which is over the brief's 2x line and needs a decision rather than an evidence cut; and the fact that /api/consultation_workflow serves the reduced prompt pack, so the server narrative seeds the brief pointed at do not exist yet. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016P5RoqzmUQEbeC2qjAkeGr
This commit is contained in:
@@ -7166,3 +7166,19 @@
|
||||
- 相关记录:BUG-464、BUG-465
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-467 | 引擎算出的解读事实被报告提取层全部丢弃,claim card 只剩执行回执
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-01
|
||||
- 最近更新:2026-09-01
|
||||
- 影响面:`buildReportEvidencePacket`、`buildReportEvidenceBundleV2` 的 claim card 构造、`filterReportEvidenceBundleForSection`、`ReportEvidenceBundleV2` schema、报告 writer 指令与 `jyotish-personal-report` Skill
|
||||
- 用户现象:个人报告读起来空洞、各主题高度雷同,说不出这张盘特有的任何东西;报告正文只能围绕"服务器已闭合本主题所需的最低证据组"这类回执文案展开。
|
||||
- 触发条件:任意一次个人报告生成。`/api/consultation_workflow` 响应里已经带有解读层,但报告路径不读。
|
||||
- 根因:结构性矛盾。引擎响应的 `chart.ai_prompt_pack.evidence_snapshot.functional_benefic_malefic`、`.strength.shadbala_ranking`、`chart.modules.ashtakavarga.sav`、`chart.modules.dasha_sub_periods.current`、`chart.yogas`、`chart.modules.guided_topics` 都存在,但提取层只保留行星/宫位/上升、两条 Dasha 时间线、varga 宫位占据和技法执行回执。于是 claim card 的 `conclusion` 是模板句、`supportingFacts` 是"XX 已执行并纳入本主题证据计划"。写作端合同又规定 claimCards 是唯一结论来源——结论来源里没有结论,模型只能输出空洞合规文本或悄悄违规自行解读原始盘面(schema 查不出来)。同时写作端拿不到任何解读方法论。
|
||||
- 修复:`ReportEvidenceBundleV2` 新增 `interpretiveFacts`(yogas / functionalRoles / shadbalaRanking / savScores+savTotal / currentDasha / convergenceDomains)与 `themeNarrativeSeeds`,均必填、允许为空、保持 `.strict()`、进入 canonical 排序与 `bundleHash`,并对悬空 ref、重复 rank/house/theme、越界文本 fail closed。提取走 allowlist:yoga 分类与功能吉凶角色是闭合枚举,行星过 `safeCelestialName`,SAV 按上升整宫把星座分投影成宫位分,叙事种子逐行过违禁词清洗(含外部供应商名与内部路由词一律丢行)。claim card 的 `conclusion` / `supportingFacts` 改为由这些事实确定性拼装,risks 进 `counterFacts`;`assertionLevel` 推导规则一字未改,只在完全没有种子时把 consensus 压到 `single_system_inference`。`filterReportEvidenceBundleForSection` 按主题裁剪种子与 SAV 宫位,同时让盘面通用层(功能吉凶、yoga、八分力、当前大运)的 receipt 随每章下发。新增 `frontend/src/lib/report-interpretation-packs/`:通用包进 `cachedSystemMessage` 缓存前缀,本章主题包放缓存边界之后;包内只写措辞与解释方式,不含路径、内部名词、供应商名与任何用户数据。Skill 升到 `1.1.0`(`1.0.0` 转 deprecated)并写明知识包不是事实来源。telemetry 只补记 `interpretiveFactCount` 与 `knowledgePackCharacters` 两个数值。
|
||||
- 验证:先用虚构 smoke 出生数据真实调用本地 `/api/consultation_workflow` 九个主题各一次,把字段存在性写进 `PROGRESS-report-skill-parity-20260901.md`(`timing.vimshottari`、`timing.convergence_top_domains`、`strength.sav_scores`、三个 `*_narrative` 在该响应里确实不存在,按缺失处理,未伪造)。`frontend/tests/report-interpretive-facts.test.ts` 用合成夹具锁住每层提取条数、`hit:false` 的候选 yoga 不算成盘、非法行星名被丢弃、超长种子截断、外部供应商行被丢、hash 在字段顺序扰动下不变、越界输入 fail closed、有种子/无种子两种 claim card 行为、consensus 防升级回归、按主题裁剪。`frontend/tests/report-interpretation-packs.test.ts` 锁每主题可解析、单包 ≤3000 字符、违禁词/路径扫描、缓存前缀逐字节稳定。`./node_modules/.bin/tsc --noEmit`、`eslint` 0 error、`next build` 通过,前端全量 `tsx --test` 与基线同一失败集(均为本机缺 Docker/PostgreSQL 的数据库与部署夹具)。
|
||||
- 防复发:bundle 内自由文本只允许来自服务器自产生成器,用户 question 与模型历史输出一律不得写入。新增字段必须有长度上限、数量上限与字符净化,schema 保持 `.strict()`,hash 必须覆盖。不得因内容变丰富而提升 `assertionLevel`,不得删改 consensus ≥2 verified 校验。`modules.yogas.yogas` 里 `hit=false` 的规则行不是成盘 yoga,不得当证据。知识包只约束措辞,不得成为 bundle 之外新占星断言的来源;包内不得出现路径、内部模块名、引擎/供应商名或 prompt 模板。写作 agent 仍然 no skills / no tools / no memory,章节仍串行。
|
||||
- 相关记录:BUG-457
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
Reference in New Issue
Block a user