docs(tasks): #113 reading + C1 plan

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 10:02:49 +08:00
co-authored by Claude Opus 5.5
parent 6fd67f8679
commit e5d768f16f
+52
View File
@@ -0,0 +1,52 @@
# 任务书:报告前加「解读」+ 对话口吻 C1(issue #113,2026-10-27)
- 基线:`origin/staging` `9ca933968`
- 分支:`codex/voice-reading-20261027`,工作树 `.worktrees/voice-reading-20261027`
- 执行:Claude(直接执行模式,产品负责人原话「这部分需要你来改」);验收由 Claude 另起一遍完整复验。
- 研究依据:`docs/research/voice_vs_competitor_2026_10_27.md`
## 决策记录
产品负责人 10-27 在 #113 回复「R1 C1 这部分需要你来改」:
- **R1**:报告最前面加一段**模型写的解读**(总评、性格、事业、财富、感情、健康、现在这几年、几条建议),素材只用引擎已算好的事实,不新增算法。原有引擎正文与表格整体放在解读之后,作为「计算依据」。
- **C1**:对话保留「懂行的姐姐」口吻,改 4 处:宫位第一次出现带生活领域;依据写进正文「因为……」,段尾不再用括号复述;时间最多三件、由近到远,术语首现带白话;问事业 / 钱 / 时间时结尾不猜动机。**推翻** VOICE 第七条原则里「依据放段尾括号、每段最多一处括号」(BUG-1244 / 1253 的括号写法),其余不变。
- 不采用 C2:术语仍只用中文,不引入梵文外文(BUG-1132~1134 保持)。
- 推翻 2026-09-06「报告零模型成本」(`TASK-report-md-page-20260906.md`)的一部分:每份报告多一次模型调用;报告价格不变,模型用量按实际 token 记账。旧的逐章写作器(`PERSONAL_REPORT_WRITER_ENABLED = false`)**不复活**,解读是一个新的、单次的小调用。
## 硬红线
- 不写病名、诊断、投资指令、确定性的死亡 / 婚姻结局、「注定」「先苦后甜」(AGENTS Part B4)。候选出生时间不写成已确认。
- 解读只能引用事实包里的事实;不出现英文 / 梵文、字段名、内部口径句(「本仓」「检测器」)。罗睺 / 计都统一。
- 模型失败、超时、校验不过:报告照常交付,只是没有解读,不报错、不让整份报告失败。
- 一次揭幕:解读在报告「完成」之前写好,不在揭幕后再冒出来;报告页揭幕后不得出现加载。
- 不改引擎 markdown 与中英逐行对齐(`report-english-edition.test.tsx`);解读是单独存的一块。
- `scripts/jyotish_api_server.py` 不增长;冻结的校正打分文件不动;不改数据库结构(用现有 `personal_report_sections`)。
- 不放出真实用户资料;测试只用虚构或公开名人盘。
## 任务分解
### C1 对话(已完成,`6fd67f867`)
`consultation-thinking-plan.ts` 新增 `CHART_REASON_RULE`、`HOUSE_LIFE_AREA_RULE`(十二宫生活领域一张表)、`TIMING_FOCUS_RULE`;`product-voice.ts` 示例改成「因为……」写法并加一条 Bad;读心第 2 条收窄;`VOICE.md` 第七条原则加 C1 补充。改动的断言均写三栏。
### R1 报告解读
1. **事实包(Python)**:`professional_report_reference` 接受 `include_reading_facts: true`(只在 `full_data`),返回 `reading_facts`:用 `build_consult_card_facts` 在同一份 pl9 packet 上取 career / wealth / marriage / health / general 与当前运期;缓存键带上这个开关。验收:pytest 断言事实全部来自 packet(沿用 `assert_fact_leaves`),开关关时输出与今天逐字节一致。
2. **写作(Next.js)**:新模块 `lib/personal-report-reading.ts` + `mastra/personal-report-reading.ts`:一次结构化调用,固定 8 节(总评、性格、事业、财富、感情、健康、现在这几年、几条建议),提示词复用 C1 三条规则与 `PLAIN_SPEECH_RULE`;写法照研究第 3 节 1~5:每段「盘面 → 为什么 → 生活里的样子」,第二人称,免责每章最多一句。超时 120 s,失败重试 1 次。
3. **校验**:拉丁字母、字段名、禁词(注定、先苦后甜、病名清单、投资指令)、节数与节名;不过就丢弃,不出解读。
4. **存与读**:worker 在交付前写入 `personal_report_sections`(`section_id = "reading-v1"`,只中文);`GET /api/reports/[id]` 返回 `reading`;报告页在重点卡之后、引擎正文之前渲染「解读」,引擎正文前加一行小标题「计算依据」。英文版本轮不出解读。
5. **记账**:解读调用的 token 走现有 `completeUsage` 结算口径(成本 = token × 单价),不改报告点数。
6. **文档**:`frontend/DESIGN.md`(报告页结构)、`VOICE.md`(解读写法)、`CHANGELOG.md`、`docs/BUG_HISTORY.md`(「报告与对话看不懂」一条,C1 与 R1 各记修复),`docs/testing/voice-reading-20261027.md` 真机清单。
## 让步顺序
时间不够时:先保 C1 与 R1 的失败兜底;英文解读、「计算依据」小标题可以后补。
## 环境缺口
本机没有模型凭据:名人生平回测(AGENTS §10)和真实解读输出都只能部署 staging 后看。测试用假模型覆盖形状、校验、兜底与记账;真实输出交产品负责人在 staging 读两三份。
## BUG 编号
开工时 staging 最大号 1447(#112)。#111 修复分支也在加号,合入时按实际最大号顺延改号。