docs(tasks): consult evidence-card implementation brief

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
This commit is contained in:
Jesse_Chen
2026-09-27 01:52:07 +08:00
co-authored by Claude Opus 5.5
parent 5bafdfdc8b
commit 599fe7a94b
2 changed files with 114 additions and 0 deletions
+1
View File
@@ -129,6 +129,7 @@
| — (产品 09-27 拍板 D1–D4,直接执行) | [PROGRESS](PROGRESS-home-landing-blank-20260927.md) | **登录后 / 裸 `/` 落空白首页**:真机登录后在「首页」提问其实问进了上一次生时校正。删登录返回存根(401 / 次级页链接写、登录后写回 `?c=` 打开),裸 `/` 不再落最近会话,一律当前人物的空白首页(复用空草稿);`?c=` / `?new=1` / 对话内刷新不变;推翻 BUG-1038 存根与 BUG-599 默认落点 | 已验收(真机欠) | `codex/home-landing-blank-20260927`(BUG-1052,本地未推) |
| — (产品 09-26 口头拍板 D1–D3,直接执行) | `PROGRESS-consult-answer-truncation-20260926.md` | **普通咨询回答写到一半被掐断仍扣点(BUG-1051,复发自 BUG-305)**:工具循环与写回答共用 110 秒 signal;Mastra 1.50 超时不抛错(`abort` 块 + `finish(tripwire)` 后正常关流),结算只认抛错与 `length`。D1 写回答自有 70 秒时钟(首用起算,续写 / 回答重试共用,最坏 180 秒,`maxDuration` 240);D2 写回答的最后一个流不是 `stop` 且有正文 → `answer_truncated`、不扣点、记 abort 步、不冲半句,`length` 续写不变;D3 观测加 `composeFinishReason` / `composeAborted` / `answerVisibleChars` | 已验收(真机欠) | `codex/consult-answer-truncation-20260926`(本地,未推送);新回归 15 条用真实 Mastra `Agent`(修复前 11 条红);全量失败名单 0 新增;Python 948/1;`/` ○、gzip 0%;真机清单 `docs/testing/consult-answer-truncation-20260926.md` |
| `TASK-consult-evidence-card-research-20260927.md` | `PROGRESS-consult-evidence-card-research-20260927.md` | **普通对话数据卡调研**:引擎输出逐项分五类计量(现约 4 万 token、父母问题相关约 3.5%);四处领域→技法来源对账并起草各领域数据卡(家庭拆父母/子女);卡体量与逐字一致性;按卡算的提速空间;反馈迭代埋点方案。只调研不改线上 | 已验收(待产品拍板 7 项) | `codex/consult-evidence-card-research-20260927` 快进 staging;报告 `docs/research/consult_evidence_card_research_2026_09_27.md`;投影缺口记 BUG-1054 investigating |
| `TASK-consult-evidence-card-20260927.md` | `PROGRESS-consult-evidence-card-20260927.md` | **普通对话改用数据卡**(产品 09-27 同意调研 7 项 + 补取一次):先修 BUG-1054 投影丢 Narayana 当前段/PD;新增父母/子女领域(引擎仍走 family);模型只读答题契约 + 基础段 + 领域段,研究/西洋/状态/不适用留后台;MEVG/真实案例只留一行;补取工具每轮 1 次;反馈 6 项日志 | 待领取 | 基线须含 eef0cb74(BUG-1053)与 560d4fc2 |
| — (产品 09-27 拍板 D1–D3,直接执行) | `PROGRESS-consult-single-pass-answer-20260927.md` | **普通咨询回答没看过星盘(BUG-1053,引入 `04463e9a`,生产不受影响)**:本命主循环工具结果后那一步看得到证据、正文却被丢弃,用户看到的是另开的 compose 流(只有历史 + 问题、判断依据恒空)写的。D1 删 compose / interpret / drain,主循环最后一步的正文即回答(按步取答,调用工具的那一步正文整段丢);写作要求搬进用户轮;续写带计算结果;工具 110 秒不变,拿到计算结果后循环交给 70 秒答案钟,最坏 180 秒;BUG-1051 结算规则保留(按写回答那一步判定)。D2 观测字段名不变、含义改为写回答那一步 | 已验收(真机欠) | `codex/consult-single-pass-answer-20260927`(本地,未推送);新回归 15 条用真实 `getJyotishAgent` + 记录提示词的假模型 + golden 计算数据;全量失败名单 0 新增;Python 948/1;`/` ○、gzip +0.24%;真机清单 `docs/testing/consult-single-pass-answer-20260927.md` |
| `TASK-scroll-anchor-hook-fixes-20260926.md` | `PROGRESS-scroll-anchor-hook-fixes-20260926.md` | **滚动锚两处老问题**:直接打开已有会话时监听未挂上(BUG-1043)、校正长回答钉顶后因 96px 阈值被拉到底(BUG-1044)。排在 BUG-1042 合入后。挂载改由容器元素本身驱动(每次提交比对元素 / active / resetKey);钉顶只由用户滚动手势解除 | 已验收(Claude 09-26 直接执行:子代理复现两处根因并修复;Claude 独立复验 tsc/lint 0、全量 3970 条失败名单与基线逐条一致、四路由 ○、gzip 不变;iOS 惯性滚动留真机清单) | `da2613ff`(随 `f1d16405` 部署,health 一致) |
| `TASK-latest-turn-actions-gap-20260926.md` | — | **最后一轮正文与点赞 / 踩之间空大半屏**:BUG-930 钉顶留白(`min-height: 视口 − 本轮开头`)加在 `.message-assistant` 上,把兄弟节点 `.message-actions` 推到留白之后;改为加在整轮外层,按钮紧贴正文、空白落在后面;不动滚动 hook | 已验收(Claude 09-26 直接执行:子代理实现,Claude 独立复验 tsc/lint 0、全量 3961 条失败名单与基线逐条一致、四路由 ○、gzip 不变;CDP 实测间距 450–600px → 23px,钉顶仍在) | `080ea5ca`(已部署 `509987b9`,health 一致) |
@@ -0,0 +1,113 @@
# 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-1055 起。
- 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** 起,开工与提交时各核对一次 `docs/BUG_HISTORY.md` 最大号。