报告前面加一段模型写的解读(issue #113 R1)

引擎在同一份 packet 上给出与对话同源卡相同的事实(include_reading_facts),
报告任务交付前用一次结构化模型调用写八节解读,校验不过或失败就不出解读、
报告照常交付。解读存在计算快照里,读接口一起返回,页面放在引擎正文之前,
后面标「计算依据」。用量按实际 token 记账(BUG-1460、BUG-1461)。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LutgzyJqNhPpZy1nFsJtN3
This commit is contained in:
Jesse_Chen
2026-10-27 11:17:56 +08:00
co-authored by Claude Opus 5.5
parent e5d768f16f
commit cad28ddc04
26 changed files with 1188 additions and 22 deletions
+32
View File
@@ -19690,3 +19690,35 @@
- 复发自:无
- 修复版本:分支 `codex/lagna-precheck-20261027`。
## BUG-1460 | 对话里宫位只给编号、依据在段尾括号里重复一遍,读者看不懂
- 状态:resolved(真实模型输出待 staging 复核)
- 首次发现:2026-10-27
- 最近更新:2026-10-27
- 影响面:普通对话的首轮与追问轮回答(本命、无出生分钟、申报时段三种模式共用的口吻)。
- 用户现象:产品负责人贴来一段现行回答:「落在第 9 宫」「走过你的第 8 宫」只有编号;段尾括号把正文用行话再说一遍;为什么 9 宫就等于方向感没有说;时间那段一口气列了五件天象;问整体运势时结尾猜「你心里正等着一个变化」。朋友对照竞品的评价是竞品「像占星师说的话」,我们的看不懂。
- 触发条件:任何引用宫位或给出盘上依据的回答。
- 根因:2026-10-06 起的回答形状要求「每段判断后在括号里给盘上依据,每段最多一处括号」(BUG-1244 / 1253)。模型照做,括号成了给内行看的脚注;提示词没有要求宫位带生活领域,也没有限制时间段里的天象件数;读心规则允许在任何问题的结尾读用户自己的心。研究见 `docs/research/voice_vs_competitor_2026_10_27.md`。
- 修复:产品 2026-10-27 拍板「R1 C1」。依据改为正文里「因为……」半句,段尾不再用括号复述(`CHART_REASON_RULE`);宫位第一次出现带生活领域,十二宫一张表(`HOUSE_LIFE_AREA_RULE`);讲时间最多三件、由近到远,入庙 / 本垣 / 小运首现带白话(`TIMING_FOCUS_RULE`);用户自己的心只在问情绪、关系感受时读,问事业、钱、时间时结尾不猜动机。示例改成新写法并加一条「段尾括号复述」的 Bad。术语仍只用中文(不采用 C2)。
- 验证:`frontend/tests/consultation-voice-contract.test.ts`、`consult-no-presupposition-20261001.test.ts`、`consult-plain-speech-20261006.test.ts`、`consult-upstream-functional-v2-20261002.test.ts` 按新规则改断言(三栏),consult 全部 536 项通过。名人生平回测需要模型 key,未跑(BLOCKED.md)。
- 防复发:三条规则各是一个常量,提示词只引用常量;合同测试锁住「依据写进正文」「宫位带生活领域」「时间最多三件」和旧括号句不再出现。示例里不再出现「逆行」(BUG-1165 照旧)。
- 相关记录:BUG-1244、BUG-1253、BUG-1255、BUG-1165、BUG-1132~1134。issue #113。
- 复发自:无(推翻 BUG-1244 / 1253 的括号写法,是产品决定)
- 修复版本:分支 `codex/voice-reading-20261027`。
## BUG-1461 | 报告是引擎模板拼的,没有一段写给人读的解读
- 状态:resolved(真实模型输出待 staging 复核)
- 首次发现:2026-10-27
- 最近更新:2026-10-27
- 影响面:新生成的中文个人报告(完整数据版)。
- 用户现象:报告没有总评和性格章,九成以上是表格;大运段每句都在免责,「可能」类词是竞品的约 55 倍,全篇没有一个「你」;还有「本仓功能吉凶层」这类内部说法。用户读不出「我是一个什么样的人、现在这几年怎么走」。
- 触发条件:任何新报告。
- 根因:2026-09-06 产品决定报告改用引擎 Markdown(逐章写作器停用),报告从此是模板拼出来的逐条说明,写不出把几条因素合成一个人的叙事。
- 修复:产品 2026-10-27 拍板 R1。报告任务在引擎正文算好之后、交付之前,多一次模型调用写「解读」:总评、性格、事业、财富、感情、健康、现在这几年、几条建议。素材只用引擎已算好的事实:`/api/professional_report_reference` 新增 `include_reading_facts`,在同一份 packet 上取与对话同源卡相同的叶子(`scripts/report_render/reading_facts.py`),不新增算法。写法与对话 C1 同一套规则。校验不过(外文、字段名、宿命 / 病名 / 投资禁词、节数、长度、免责过多)就重试一次,仍不过或模型失败、超时(120 秒)就不出解读,报告照常交付。解读存在计算快照里,读接口一起返回,报告页在标题与重点卡之后、引擎正文之前显示,后面加「计算依据」小标题;只中文,英文版本轮不出。用量按实际 token 记账,报告价格不变。逐章写作器没有复活。
- 验证:`tests/test_report_reading_facts.py`(事实全来自 packet、开关关时响应不变、开关进缓存键、事实失败不影响报告);`frontend/tests/report-reading-20261027.test.tsx`(校验、重试、超时、取消、快照、读接口、页面顺序与英文不显示、任务链路三种情形、记账)。
- 防复发:解读失败只写 `readingUnavailable`,不让报告失败;页面只读合同模块,不把提示词打进页面包;揭幕后不再加载。真实模型的通过率和耗时看日志 `[personal-report] reading=`。
- 相关记录:BUG-1460。issue #113。`TASK-report-md-page-20260906.md`(零模型成本的决定在此部分推翻)。
- 复发自:无
- 修复版本:分支 `codex/voice-reading-20261027`。
@@ -0,0 +1,40 @@
# 进度:报告开篇解读 + 对话口吻 C1(issue #113,2026-10-27)
- 任务书:`docs/tasks/TASK-voice-reading-20261027.md`
- 分支:`codex/voice-reading-20261027`(基线 `origin/staging` `9ca933968`)
- 执行:Claude(直接执行模式)。BUG-1460(C1)、BUG-1461(R1);staging 合入 #111 后最大号 1459,编号即为最终号。
## 做了什么
| 项 | 状态 | 说明 |
| --- | --- | --- |
| C1 对话 | 完成 | `CHART_REASON_RULE` / `HOUSE_LIFE_AREA_RULE` / `TIMING_FOCUS_RULE`;示例改写;读心第 2 条收窄;VOICE 第七条原则补充 |
| R1-1 事实包 | 完成 | `scripts/report_render/reading_facts.py`;`professional_report_reference` 接 `include_reading_facts`(只在 full_data + markdown),开关进缓存键,失败只返回 `gaps` |
| R1-2 写作 | 完成 | `lib/personal-report-reading.ts`(提示词、重试、超时 120 s)+ `mastra/personal-report-reading.ts`(结构化输出,与合盘写作器同一模式) |
| R1-3 校验 | 完成 | 外文、字段名、禁词(宿命 / 病名 / 投资 / 内部说法 / 北交点)、节数与顺序、长度、每节免责 ≤1 |
| R1-4 存与读 | 完成 | 存进计算快照 v2 的 `reading` / `readingUnavailable`(不改表);读接口返回 `reading`,与英文版共用一次快照读取;页面在导读之后、引擎正文之前渲染,加「计算依据」,目录首条「解读」;英文不显示 |
| R1-5 记账 | 完成 | 报告用量取解读调用的 token,没有解读时为 0;单价结算沿用 `completeUsage` |
| R1-6 文档 | 完成 | DESIGN、VOICE、CHANGELOG、BUG_HISTORY、BLOCKED、真机清单 |
## 改动的既有断言(三栏也写在测试里)
| 文件 | 原值 | 新值 | 原因 |
| --- | --- | --- | --- |
| `consultation-voice-contract.test.ts` | 「然后在括号里给出撑住这段判断的盘上依据」「每段最多一处括号」 | 依据写进正文「因为……」,宫位带领域,时间最多三件;旧句不得出现 | issue #113 C1 |
| 同上 | 示例标签「括号里是依据的占位」;Bad 起点「多对象题」 | 「「因为」后面的依据是占位」;先是新 Bad「段尾括号复述」 | issue #113 C1 |
| 同上 | 父母例括号 `(母亲这条线没有受冲;…)`、事业例括号 `(木星行运 10 宫;…)` | 依据进正文,宫位带领域 | issue #113 C1 |
| 同上 | 「用户自己的心全篇最多读一句」 | 只在情绪、关系感受题读;结尾不猜动机 | issue #113 C1 |
| 同上 | 是非题例 `不是。(母亲这条线没有受冲;4 宫主落 10 宫)…` | `不是。管母亲的 4 宫(母亲、家和住处)这条线没有受冲…` | issue #113 C1 |
| `consult-no-presupposition-20261001.test.ts` | 受冲规则「括号里只写…」;`每段的判断后在括号里给…`;是非题例 | 「依据只写…用白话写进句子」;段规则后接三条新常量;是非题例新写法 | issue #113 C1 |
| `consult-plain-speech-20261006.test.ts` | 「括号里的依据最多两条」「括号里只写最能说明问题的一两条」 | 「说出来的依据最多两条」「依据只写最能说明问题的一两条」 | issue #113 C1 |
| `consult-upstream-functional-v2-20261002.test.ts` | 妈妈段例括号 | 「因为管母亲的 4 宫…没有受冲」 | issue #113 C1 |
| `personal-report-worker.test.ts` | `/inputTokens: 0/` | `/inputTokens: generated\.usage\?\.inputTokens \?\? 0/` | R1 解读按实际 token 记账 |
| `personal-report-view.test.ts` | `<ReportToc headings={outline.headings} …/>` | `headings={tocHeadings}`,只在有解读时多一条「解读」 | R1 解读进目录 |
## 环境缺口
见 `BLOCKED.md` 同名条目:无模型 key,真实解读输出和名人生平回测都没跑。
## 验收数字
见本文件末尾(提交前补)。
+1
View File
@@ -538,3 +538,4 @@
| — | `PROGRESS-full-data-parity-1-fix2-20261022.md` | **#91 A 段第 2 次打回**(Claude 口头修复单 F1~F4):11 节只印「未判定」和键名改读真实记录;测试只认非第一列真实值、禁止键名格;中文瑜伽组合句由中文源给出(BUG-1418);六章降为 `##`、节 `###`(BUG-1419) | 本地完成,待验收 | `codex/full-data-parity-1-fix2-20261022` |
| `TASK-lagna-precheck-20261027.md` | — | **#112 选 A**:星盘页页头告诉用户上升在其时间精度内会不会换(复用现成的 D1 窗口扫描,纯计算);校正开场说清能做 / 不能做(BUG-1444、BUG-1445) | 待执行 | `codex/lagna-precheck-20261027` |
| `TASK-lagna-precheck-fix-20261027.md` | — | **#112 第 1 次打回**:已有进行中的校正时点链接报冲突(应走首页续上);别人的星盘页不该给校正链接 | 待执行 | `codex/lagna-precheck-20261027` |
| `TASK-voice-reading-20261027.md` | `PROGRESS-voice-reading-20261027.md` | **#113 选 R1 C1**:报告前面加一段模型写的「解读」(八节,素材只用引擎事实,失败不影响报告);对话依据写进正文、宫位带生活领域、时间最多三件(BUG-1460、BUG-1461) | Claude 直接执行,待验收 | `codex/voice-reading-20261027` |
+23
View File
@@ -0,0 +1,23 @@
# 真机清单:报告开篇解读与对话口吻(issue #113,2026-10-27)
在 staging 上用自己的账号走。不要把截图里的出生资料贴进仓库。
## 报告
1. 新生成一份个人报告(旧报告不会补上解读)。等待过程和以前一样,没有新的加载画面。
2. 打开后,标题和重点卡下面先是「解读」:总评、性格、事业、财富、感情、健康、现在这几年、几条建议八小节。
3. 每节读起来是对「你」说的话:说了盘上是什么、为什么、生活里是什么样子。宫位第一次出现带括号说明它管什么。
4. 没有英文字母、没有「本仓」「检测器」这类内部说法,没有病名、没有买卖股票基金的建议,没有「注定」「先苦后甜」。
5. 「现在这几年」写了当前大运和接下来两段子运的起止年月,和后面「计算依据」里的大运表对得上。
6. 解读后面有一行小字「计算依据」,下面是原来的报告,内容没变。目录第一条是「解读」,点了跳回开头。
7. 切到 English:没有解读,其余和以前一样。
8. 如果某份报告没有解读,报告本身照常能看(记下时间,告诉我查日志)。
## 对话
9. 问一个事业或感情问题:提到宫位时第一次带生活领域,例如「第 10 宫(事业、社会地位)」。
10. 段尾不再有一串括号把正文重复一遍;依据写在句子里,「因为……」。
11. 问「这段时间整体怎么样」:讲时间最多三件事,由近到远;结尾不猜你为什么问。
12. 问「我妈是不是不太在意我」这类感受题:先答是或不是,可以有一句读你心情的话。
走完回一句「过」,或者贴出不对的段落。