Files
Jyotisha/docs/tasks/TASK-consult-evidence-card-20260927.md
T

114 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TASK · 普通对话改用「数据卡」:按问题挑数据给模型,家庭拆父母/子女,补取一次,反馈记录(2026-09-27)
## 基线
- `origin/staging`,必须包含 BUG-1053(`eef0cb74`,去掉盲写第三步)与数据卡调研(`d8d03b5a` + 门禁补修 `560d4fc2`)。开工时 `git fetch` 后核对这三个提交是 `origin/staging` 的祖先,并把实际基线写进 PROGRESS。
- 分支 `codex/consult-evidence-card-20260927`,工作树 `.worktrees/consult-evidence-card-20260927`。
- 依据:`docs/research/consult_evidence_card_research_2026_09_27.md`(已验收,见 `docs/tasks/PROGRESS-consult-evidence-card-research-20260927.md` 逐条验收表)、草案 `docs/research/consult_evidence_card_draft_2026_09_27.json`、研究库 `scripts/research/consult_evidence_card_lib.py`(`CARD_SPECS`、`verbatim_check`、分类规则)。
## 事故实证(行号按符号定位,会漂)
1. 调研实测(3 张公开 AA 盘 × 10 种问法):模型每轮可见 13.3–14.4 万字符(≈3.8–4.1 万 token);核心数据 32%、研究用 33%、西洋 25%、状态说明 8%、不适用 2%;`frontend/src/mastra/consultation-tools.ts` `toModelDomainPlanContext` 单领域时把同一包再放进 `consultations`,约占 49%;`technique_audit_table` / `varga_spectrum` / `western_spectrum` 各出现 4 次。领域数据卡只有现状的 2.3%–4.3%。
2. 「家庭」混父母与子女:`frontend/src/lib/consultation-domain-registry.ts` `family` 别名无「父母」;`frontend/src/lib/consultation-methodology.ts` `family.strictRoute: null`;`frontend/src/mastra/consultation-workflow.ts` `DOMAIN_MUST_USE_LAYERS` 无 family。Skill 已写明子女 D7、父母/家族 D12(`skills/jyotish-vedic-astrology/references/strict-workflow-router.md` 共用基线;`references/birth-time-rectification-decision-tree.md` §4)。
3. **BUG-1054**(investigating):`consultation-workflow.ts` `timingKeys` 缺 `md` / `ad` / `pd` 与 `pratyantardashatimeline`,`projectAllowlistedTree` 按键白名单丢弃,模型拿不到当前 Narayana 段与 Vimshottari PD 起止。30/30 复现。
4. 本机计时:一轮约 2.6 s,校正门约 2.5 s;研究分盘合计 < 0.01 s。少算提速可忽略。
## 根因
咨询「全算全给」,没有按问题筛选的一层;领域→技法散在注册表、方法学、前端必用层、Python 焦点四处且不一致;投影白名单还漏了两段时间数据。
## 决策记录(产品 2026-09-27,逐条同意调研报告 7 项推荐 + 补取一次)
- D1 **写答案的模型只读数据卡**:基础段(上升、十二宫星座与宫主、行星落宫、功能吉凶含宫主归属、当前 Vimshottari MD/AD/PD 起止、Narayana 当前段)+ 当前问题所属领域段(按调研草案 `CARD_SPECS`)。一句问两件事时合并两张卡,基础段只放一份(沿用现有一轮最多 2 领域的规则)。追问未点领域时沿用上一轮领域(现有路由/会话上下文如已处理则保持)。
- D2 **「家庭」拆成「父母」「子女」**:新增领域 `parents`(D12、4 宫、9 宫及宫主、月亮、太阳)与 `children`(D7、5 宫及宫主、木星);别名至少含 父母/父亲/母亲/爸爸/妈妈/爸妈/parents 与 子女/孩子/儿子/女儿/children。**两者在引擎侧仍走 Python `family` 主题**(`workflowThemes: ["family"]`),只在卡的领域段上区分,不改 Python 引擎。原 `family` 保留作兜底(问「家里」「家庭氛围」等泛问)。
- D3 **状态说明、研究用分盘(40 张 D-N、D81/D108/D144、Ashtottari)、西洋层、本轮不适用项不进写答案的上下文**:照旧计算、照旧进回执与「本轮技法」折叠面板、报告与审计照用。
- D4 **MEVG / 真实案例校准**:模型不读长状态说明;卡的元信息里固定一行「全网资料核对、真实案例校准:未做,置信度封顶」,回执保留原状态行。这是产品对 AGENTS Part B B3/B4 在普通对话里的落法决定;Part B 其余要求(双轨大运、领域分盘、功能吉凶、原始数据)必须由卡覆盖。
- D5 **先修 BUG-1054,再上卡**(同一分支内先后两个提交)。
- D6 **不为提速改计算**:Python 引擎、计算范围、校正门都不动。
- D7 **反馈记录只存 6 项**:领域、卡版本、卡字符数、卡 token 估计、答案引用了卡里哪些字段名、点赞/点踩;不存问题、回答、出生资料、姓名、邮箱、用户/会话 id、匹配到的原文。
- D8 **补取一次**:卡里没有、确实需要时(例如用户点名问 D60、某个西洋层、某个格局明细),模型可调用一个只读补取工具,从**本轮已算好的请求级缓存**里取指定一段(受限枚举),不重算;每轮最多 1 次。
- 推翻/改写的既有口径:`frontend/src/mastra/index.ts` 系统提示中「evidence_contract.technique_audit_table is the invocation record… Use every executed layer…」一类要求模型通读全量层的句子,按 D1/D3 改写为「以数据卡为准,卡外数据可补取一次」。BUG-287「咨询默认计算全部分盘并挂上西洋层」的**计算**口径不变,只改**给模型看什么**。
## 硬红线
1. **答题契约不丢**:系统提示依赖的 `status`、`evidence_contract.answer_policy`(含 `can_answer_direction`)、`hard_blockers`、`claim_cards`、`rectification`(及现有提示里引用到的其它顶层键)必须仍出现在模型可见内容里,行为与现状一致;逐项列出并测试。
2. **事实逐字**:卡里的值只从投影/引擎原值复制,不改写不换算。回归测试用**真实引擎响应**(golden fixture,AGENTS §7.4),逐字核对上升星座、月亮星座与宫位、当前 MD/AD/PD 起止、Narayana 当前星座、D12/D7/D9/D10 的相关落点。
3. **Part B 覆盖**:每张卡都含双轨大运(Vimshottari + Narayana)、领域分盘、功能吉凶、原始度数/日期;测试逐领域断言。
4. **BUG-1053 不回退**:写答案的那一步看得到卡(真实 Agent + 记录 prompt 的假模型断言);调工具前的文字不进答案;非 `stop` 收尾 → `answer_truncated` 不扣点;续写带卡。补取工具调用发生在答题阶段时,不得让已放出的正文被截断或重复,也不得重置 110 s / 70 s 双钟的语义(写清楚设计)。
5. 不改 Python 引擎、`jyotish_api_server.py`(行数与类方法数守门)、迁移(除非 D7 需要新表——见 T6 让步)、`.gitea/**`、`deploy/**`。
6. 前端红线全套:tsc 0、lint 0 error、全量测试(Node 22)失败名单与基线逐条一致、`/` ○ Static、gzip ±2%;改既有断言写三栏;**全量 Python 门禁集必跑**(含 `tests/test_api_server_growth_contract.py`:handler 伪造点不得增长,注释里也不能出现该字面量)。
7. 隐私:AGENTS §8;反馈记录字段白名单写进测试。
8. 禁止 `git stash`;只 `git add <具体路径>`,提交前看 `git diff --cached --stat`(ERR-112)。
## 任务分解(每条带验收标准)
### T1 修 BUG-1054(先单独一个提交)
- `timingKeys`(或对应投影)放行 Narayana 当前段的嵌套键与 PD 时间线,保持其余白名单不变、深度/条数上限不变。
- **验收**:golden 回归测试断言引擎的当前 Narayana 星座与 PD 起止原样出现在模型可见 timing 内容里(不能只断言键存在);BUG-1054 记录补修复与验证,状态 resolved(部署后补 run 号)。
### T2 领域:新增 parents / children
- 注册表、方法学(`strictRoute` 与必用层)、`DOMAIN_MUST_USE_LAYERS`、领域 zod 枚举、领域计划工具说明、`MAX_CONSULTATION_DOMAIN_PLAN_VALUES` 相关 schema 同步;引擎侧映射到 `family`。
- 路由:模型从枚举里选;服务端别名兜底。「我和父母关系如何」→ parents;「孩子学业」→ children(若同时命中 education,按现有两领域规则)。
- **验收**:分类/路由单测覆盖别名与混合问法;原 `family` 泛问仍可用;领域在回执、`/admin` 相关展示处有中文名(父母 / 子女)。
### T3 数据卡构建器
- 新模块 `frontend/src/lib/consultation-evidence-card.ts`(参数式纯函数,无 React hook):输入投影后的上下文 + 领域列表,输出卡(基础段 + 领域段 + 元信息:卡版本 `evidence-card-v1`、领域、D4 那一行、卡外可补取的段名清单)。
- 领域段内容以调研草案 `CARD_SPECS` 为准,把它移植成 TS 常量(单一来源);调研报告里健康 D30、学习 D5 的差异按 Python 焦点纳入,并在 PROGRESS 列出最终对照表。
- 工具结果给模型的部分改为:答题契约(红线 1)+ 数据卡;完整结果仍留在服务端(请求级缓存、回执、技法折叠面板、报告路径不受影响)。去掉 `consultations` 整包重复。
- **验收**:3 盘 × 10 问法(沿用调研脚本的公开盘与问法)模型可见字符数下降到调研卡体量量级(单领域 ≤ 12,000 字符,含答题契约;超出须在 PROGRESS 说明);红线 1/2/3 测试全过;「本轮技法」折叠面板内容与改前逐行一致。
### T4 提示与 Skill 对齐
- 改写系统提示(`frontend/src/mastra/index.ts`、`product-voice.ts` 等)里要求通读全量层、引用审计表的句子;写明「以数据卡为准;卡外数据用补取工具一次」。
- 若 `skills/jyotish-vedic-astrology` 文本需同步,按 Skill 版本规则 bump(快照 + registry sha + 旧版本 deprecated 保留,BUG-621 教训),CHANGELOG 写明。
- **验收**:提示与 Skill 中不再出现「用尽每个已执行层」类要求;Skill 版本相关测试三栏更新。
### T5 补取工具(D8)
- 新工具(如 `read-consultation-evidence`),参数为受限枚举(分盘编号、西洋层名、格局明细、Ashtakavarga、Shadbala 等调研 R1 中「核心数据」之外但有数据的段),只读请求级缓存;缓存未命中返回结构化「不可用」,不触发重算;每轮最多 1 次(第二次返回拒绝)。
- 与 BUG-1053 的按步截留、双钟、结算规则一致(红线 4)。
- **验收**:测试覆盖命中、未命中、超次数、答题阶段内调用后正文完整;回执记一条补取步骤(中文人话标签)。
### T6 反馈记录(D7)
- 每轮在 `[agent-observability]` 记录 6 项(数字/枚举/字段名);「引用了哪些字段」按调研 R5 的判定规则(ISO 日期、度数、≥8 字符的「行星在星座」短语原样出现才算),匹配原文不落库。
- 点赞/点踩:查清现有赞踩的存储位置;若已落库,按轮关联卡版本与领域即可;若需要新表,**本单只做日志**,新表与后台汇总另开单(让步项)。
- **验收**:字段白名单测试;日志不含用户文本(测试用虚构敏感串断言不出现)。
### T7 记录
- `docs/BUG_HISTORY.md`:BUG-1054 修复;若实现中发现新缺陷从 BUG-1059 起。
- CHANGELOG(用户可感知:回答依据更集中、父母/子女分开);`frontend/DESIGN.md`(若回执出现补取步骤);`frontend/docs/VOICE.md`(新领域中文名、补取步骤文案)。
- `docs/tasks/PROGRESS-consult-evidence-card-20260927.md`:最终领域→技法对照表、体量前后对比、红线测试清单、失败名单对比、三栏改动。
- `docs/testing/consult-evidence-card-20260927.md`:真机清单——父母、子女、婚恋、事业各问一次(默认模型与 gpt-5.6-luna),把回答里的上升/月亮/宫位/大运日期与「星盘」页核对;追问「那明年呢」看是否沿用领域;点名问 D60 看补取;看等待时间。
- `docs/tasks/README.md` 本单一行改「待验收」。
## 让步顺序
1. T1、T2、T3、红线 1–4 必须完成。
2. T4 必须完成(否则提示与卡矛盾)。
3. T5 可降级为下一单,但 T3 的元信息里要留「卡外可补取的段名」。
4. T6 可只做日志。
## 开工前置命令
```bash
cd /workspace/Jyotisha && git fetch origin --prune
git merge-base --is-ancestor eef0cb74 origin/staging && git merge-base --is-ancestor 560d4fc2 origin/staging && echo base-ok
git worktree add -b codex/consult-evidence-card-20260927 .worktrees/consult-evidence-card-20260927 origin/staging
ln -s /workspace/Jyotisha/frontend/node_modules .worktrees/consult-evidence-card-20260927/frontend/node_modules
cd .worktrees/consult-evidence-card-20260927 && git status -sb
export PATH=/exec-daemon:$PATH # Node 22
```
先读:`AGENTS.md`(§5–§8、Part B)、`frontend/AGENTS.md`、`frontend/DESIGN.md`、`frontend/docs/VOICE.md`、调研报告与逐条验收表、`docs/BUG_HISTORY.md` 的 BUG-287、BUG-298、BUG-943、BUG-1051、BUG-1053、BUG-1054、`docs/research/pre_work_error_ledger.md` ERR-110/111/112。
基线测试:开工先在未改动的基线上跑全量前端测试(Node 22)与全量 Python 门禁集,存日志作对比。
## BUG 编号
修 BUG-1054(已存在)。BUG-1055~1058 已预留给并行的 `TASK-rectification-grounding-20260927`,本单新缺陷从 **BUG-1059** 起,开工与提交时各核对一次 `docs/BUG_HISTORY.md` 最大号。