Files
Jyotisha/docs/tasks/TASK-voice-reading-20261027.md
T
2026-10-27 10:02:49 +08:00

5.1 KiB
Raw Blame History

任务书:报告前加「解读」+ 对话口吻 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 修复分支也在加号,合入时按实际最大号顺延改号。