feat(consult): copy the full-data packet into a per-domain judgment table

Dialogue cards now take numbers from the same packet as the full-data report. Each of the twelve domains gets one table the card builder assembles. Lookups allow three calls a turn. further_reading is a per-domain technique index. BUG-1293, BUG-1294, BUG-1295.
This commit is contained in:
jesse-ux
2026-10-09 10:00:45 +08:00
parent 8bb7ff9383
commit 3874a328a5
24 changed files with 2082 additions and 74 deletions
+48
View File
@@ -17327,3 +17327,51 @@
- 复发自:无。
- 修复版本:分支 `codex/rashi-dashas-native-20261008`,未合入,未上线。
- 验收补记(Claude,2026-10-09):本分支的 PyJHora 对照文件原先拿 Raman 本命盘比 Lahiri 的 PyJHora 盘;已改为同一 Lahiri 盘重冻,差异表重写(见进度记录)。报告代码不受影响。
## BUG-1293 | 对话数据卡自己拼了一套数,没有综合判断表
- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,本地未推送、未部署;有针对性回归测试)
- 首次发现 / 最近更新:2026-10-07 / 2026-10-09
- 来源:产品反馈对话「只看本命盘或 D10」;任务书 `TASK-consult-card-full-source-20261007`。
- 影响面:普通对话证据卡的领域段。旧的基础投影仍在,避免首轮回答的字段名变化。新的权威数字是领域段上的综合判断表。
- 现象:事业卡大约 7,600 字符,自然代表星没有被点名,大运主星和事业宫的关系没有表,D10 联动只能卡外补取。
- 触发条件:普通对话计算完成后组装证据卡。
- 根因:09-27 为了把模型可见文本压到约 1.2 万字符,按当时清单挑字段;对话和报告各走一条取数路径。
- 修复:对话卡从完整数据版同一个资料包按领域取叶子(`read_full_data_domain`)。卡片构建器组装综合判断表,模型只解读。数值原样复制。缺的写 `gaps`。没有本仓 `references/` 出处的参与项写 `blocked`。罗睺、计都功能角色留空,表头注明「罗计不单独定功能吉凶」。受冲条数只计数。D16 及以上与 Ghati 只在出生时间已确认或校正已交付分钟时参与。
- 验证:`frontend/tests/consult-card-full-source-20261007.test.ts`(复制、无门槛、Vargottama 由两处星座推导、照进入关系缺口、无事实时不上表)。`tests/test_consult_card_full_source.py` 对虚构密度盘和三张公开盘逐格对照资料包,并锁精度闸。本机没有模型 key,生平回测未跑。
- 防复发:上述测试;事实 JSON 若含 `tajika_named_yogas` 直接拒绝(对话年运仍读 `tajika_yogas`,BUG-1282)。
- 相关记录:BUG-1160、BUG-1161、BUG-1221、BUG-1282。
- 复发自:无。
- 修复版本:本分支提交。未部署。
## BUG-1294 | 对话卡外补取每轮只能 1 次
- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,本地未推送、未部署;有针对性回归测试)
- 首次发现 / 最近更新:2026-10-07 / 2026-10-09
- 来源:产品 2026-10-08 确认把卡外补取上限从 1 改为 3。
- 影响面:`read-consultation-evidence`。第 4 次仍拒绝。KP 补取仍带参考说明,不作结论。
- 现象:需要多看的分盘、Argala、定位星链或三盘联动时,一轮里第二次就被拒绝。
- 触发条件:同一轮里第二次调用补取工具。
- 根因:09-27 把 `MAX_EVIDENCE_LOOKUPS_PER_TURN` 定为 1。
- 修复:上限改为 3。工具说明写明第四次拒绝。系统提示里对应的那一句改短了 20 个字符,没有把读法说明加进系统提示。步数上限仍是 8:一次计算、三次成功补取、一次被拒绝的第四次、再写回答,实测仍能走完。
- 验证:`frontend/tests/consult-evidence-lookup-20260927.test.ts` 前三次返回该节、第四次 `lookup_limit_reached`,步骤为 completed、completed、completed、failed。
- 防复发:该测试锁上限 3 与第四次拒绝。
- 相关记录:BUG-1293、BUG-1256。
- 复发自:无。
- 修复版本:本分支提交。未部署。
## BUG-1295 | 对话进一步阅读指向 oracle 与治理文件
- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,本地未推送、未部署;有针对性回归测试)
- 首次发现 / 最近更新:2026-10-07 / 2026-10-09
- 来源:任务书 T5。产品确认 `further_reading` 改为按领域的技法资料目录。
- 影响面:普通对话工具结果里的 `methodology.further_reading`。不接书籍语料,不做每轮联网。
- 现象:目录里约 19 条多为 oracle / 治理文件,技法章节不在列。
- 触发条件:对话计算返回 methodology。
- 根因:目录按技能包点名的引用收集,没有按领域筛技法文件。
- 修复:每个领域最多 8 条,格式 `领域: references/...`,去掉 oracle / 治理文件,路径必须真实存在。清单写明需要时用 `skill_read` 读冒号后面的章节。新增读法不进系统提示。
- 验证:`frontend/tests/consultation-methodology.test.ts` 对 12 个领域检查条数、前缀和路径。
- 防复发:该测试。
- 相关记录:BUG-1293。
- 复发自:无。
- 修复版本:本分支提交。未部署。
@@ -0,0 +1,96 @@
# PROGRESS · 对话数据卡与报告同源(2026-10-09)
分支 `codex/consult-card-full-source-20261007`。基线 HEAD `e1c7383c`。本地未推送。状态:待验收。
## 做了什么
对话卡的新数字从完整数据版同一个资料包来,入口是 `read_full_data_domain`。12 个领域一次做完。每个领域一张综合判断表,由卡片构建器组装,模型只解读。旧的基础投影留着,所以首轮回答的字段名不变;新的权威数字是领域段上的表。表是资料包里的挑选,不是第二套计算。
卡版本仍是 `evidence-card-v2`。没有事实时不上表,golden 的 `meta.gaps` 仍为空。年运对话继续读 `tajika_yogas`,不读 `tajika_named_yogas`。KP 不上卡,补取仍带参考说明。不做每轮联网,不接书籍语料。
`scripts/jyotish_api_server.py` 只在原有的咨询计算入口上薄薄包了一层,主体在 `scripts/consult_full_data_cache.py` 与 `scripts/consult_card_domain_facts.py`。类方法数仍是 218。文件换行数 10,956,粗护栏上限 11,224。`page.tsx` 的 useState / useRef 没有增加。没有第二个聊天输入框。
## T0 · 12 领域对照
共用层里,Parashari 星照在 `references/strict-workflow-router.md` 找不到「单独列为参与层」的段落,12 个领域都是 `blocked`。表上的「照」因此记在关系缺口里,不重算。KP 按产品决定写「不参与」。其余共用层有出处:Sudarshana、D9、Bhava Chalit、Shadbala、Bhava Bala、Avastha、Vimsopaka、八分法、功能吉凶、Jaimini 星照、Argala、定位星链、Vimshottari、Narayana、Yogini、行运、双重过运、瑜伽 hits。
| 领域 | 专属项出处 | blocked |
| --- | --- | --- |
| 事业 | D10、A10、AL、AmK、Karakamsha、Ghati、太阳/土星/水星/木星、10 宫、D1/D9/D10 联动:`strict-workflow-router.md`、`event_judgment_career.md`、`jaimini-complete-system.md`、`deep-analysis-complete-workflow.md`、`pdf-chart-reading-guide.md` | Parashari 星照;Vighati(`references/` 无条目) |
| 财富 | D2、D11、Hora、Sree、木星/金星/水星、2/11/5/9/10 宫:`event_judgment_wealth.md`、`deep-analysis-complete-workflow.md`、`promise-assessment-templates.md` | Parashari 星照;Indu;从 AL 起第 2 宫;从 AL 起第 11 宫 |
| 婚恋 | D9 第 7 宫、UL、DK、金星、木星、Vivah Saham、火星、7 宫:`event_judgment_marriage.md`、`jaimini-complete-system.md` | Parashari 星照;UL 起第 2 宫;A7 |
| 健康 | D6、D8、D30、第 22 个 Drekkana、Badhaka、太阳/月亮/土星/火星、1/6/8/12 宫:`strict-workflow-router.md`、`shodasavarga-complete-guide.md`、`badhaka-obstacle-planet-guide.md` | Parashari 星照;第 64 个 Navamsa;Gulika;Mandi;Pranapada(问事章有,未列入本命健康) |
| 子女 | D7、PK、木星、5 宫:`strict-workflow-router.md`、`jaimini-complete-system.md`、`house-domain-planet-mapping.md` | Parashari 星照 |
| 父母 | D12、MK、PiK、太阳、月亮、4 宫、9 宫:同上三份 | Parashari 星照 |
| 学业 | D24、水星、木星、4/5/9 宫:`strict-workflow-router.md`、`house-domain-planet-mapping.md` | Parashari 星照;D5(未找到标成学业分盘的段落) |
| 迁居 | D4、罗睺、4/9/12 宫:`birth-time-rectification-decision-tree.md`、`house-domain-planet-mapping.md` | Parashari 星照;D12(路由器标给家族,未标给迁居) |
| 家庭 | D12:`strict-workflow-router.md` | Parashari 星照;D4(出处是搬迁,不是家庭);D7(出处是子女);自然代表星整组 |
| 流年 | Tajika、Muntha、年主、Mudda、Sahams:`varshaphala-annual-chart-guide.md` | Parashari 星照;单独的自然代表星;单一本命宫 |
| 时间 | Narayana 子运、年盘:`bphs-ch48-narayana-dasha.md`、`varshaphala-annual-chart-guide.md` | Parashari 星照;单独的自然代表星;单一本命宫 |
| 综合 | D1、D9、AL、Karakamsha、1 宫:`strict-workflow-router.md`、`pdf-chart-reading-guide.md`、`jaimini-complete-system.md`、`house-domain-planet-mapping.md` | Parashari 星照;D10(标给事业);D2(标给财富);自然代表星整组 |
自然代表星没有出处的领域是家庭、流年、时间、综合,写的是 `blocked`,没有自拟。家庭领域的分盘列仍是 D4,参与清单里的家庭 D4 是 `blocked`:出处说的是搬迁,不是家庭。这是故意分开的。
Argala 与定位星链有出处,卡上放的是路径引用,不在对话卡里重算。若以后要把 `argala.houses` 的净结果抄上卡,那是另一次叶子复制。
## T1 · 缓存
键是年月日时分秒、经纬度、时区、岁差、交点模式、引擎版本、schema `consult-full-data-cache-v1`。文件名是 sha256,放在 `scratch/local/consult_full_data_cache`(服务器上这块目录就是 `api_scratch` 卷)。键里没有「今天」,所以当前大运冻在第一次计算的那天。改出生资料会换成另一把键(BUG-1251)。精度闸在取事实时做,不进缓存键。未命中同步计算,没有另加超时绕过。超过 20 秒会标 `slow`,本机没有出现。
| 情况 | 未命中整包 | 领域取数 |
| --- | --- | --- |
| 虚构盘 | 7.342 秒 | — |
| 乔布斯公开盘 | 7.075 秒 | 0.145 秒 |
| 奥巴马公开盘 | 4.668 秒 | 0.118 秒 |
| 泰勒公开盘 | 4.421 秒 | 0.104 秒 |
| 乔布斯同一身份再取 | 命中,装入 0.044 秒 | 十二领域合计 0.552 秒,约 0.046 秒/域 |
都低于 20 秒,命中后的领域取数也低于约 1.66 秒/域。没有另做事实侧车缓存。
## T2–T5
综合判断表:每个因素一行。列按任务书。宫主另起一行。受冲是计数加明细,表里没有门槛,也没有「两个及以上」。Vargottama 由抄来的 D1 星座和 D9 星座是否相同推导。罗计功能角色为空。大层 JSON 超过 800 字符或含 `tajika_named_yogas` 时只留路径、检查记 `nonempty`;判断表上的标量格子是全文复制。
乔布斯、奥巴马、泰勒三张公开盘 × 12 领域,以及虚构密度盘 × 12 领域,叶子对照通过。
精度闸:`declared_accuracy` 为 `rectified`,或 `birth_time_status` 为 accepted / confirmed,或请求里明确带了 `birth_time_accuracy=confirmed`,并且有时、分,才放行 D16 及以上与 Ghati。只申报了分钟、尚未接受,仍然不放行。
补取上限 3。测试:前三次成功,第四次 `lookup_limit_reached`。`AGENT_MAX_STEPS` 仍是 8。一次计算加三次成功补取、一次被拒绝的第四次、再写回答,测试跑完了,所以不加步数。
`further_reading` 每领域 1–8 条,形如 `领域: references/...`,无 oracle、无治理文件。索引上限 24 改为 48。共享方法正文没有加长。
临时上限:卡 ≤ 20,000 字符,加清单 ≤ 26,000。最终上限等 T6,本单不定。
## T6 / T7 · 环境缺口
本机没有模型 key。没有寻找、没有读取、没有发明 key。没有输入 token、首字时间、总耗时、空答率,也没有生平回测的冲突数。这两项不能写成通过。
## 系统提示
BUG-1256 修完后的本命系统提示是 26,591 字符,上限 26.6K。本单只把「补取一次」那句改成「最多三次」,新句短 20 字符。按 Linux 上真实技能文件(本机该文件是一行相对指针)用同一套摘录规则测量:26,571 字符,仍 ≤ 26,600。方法块仍小于 4,000。首轮形状与口吻没有改。新增读法在清单里。
## 本机验证
- `tsc --noEmit`:退出码 0。
- `npm run lint`:退出码 0,0 error。既有 warning 未动。
- 相关前端测试:综合判断表、补取 3/4、清单、资料目录、口吻、预算断言通过。
- `skill-binding.test.ts` 开头两条在本机失败:`skills/jyotish-vedic-astrology/SKILL.md` 在 Windows 上是一行 `../../SKILL.md`,不是符号链接。该文件本单没有改。Linux 上 `readFileSync` 会跟到真文件。其余该文件测试通过,方法块长度断言通过。
- Python:`tests/test_consult_card_full_source.py`(不含三张公开盘的快测)与 `tests/test_api_server_growth_contract.py` 通过。三张公开盘的未命中耗时见上表,通过。
- 未跑:Linux 全量、快速门、`npm test` 全套、`next build`、浏览器走查。不能声称这些通过。
## 改过的既有断言
| 位置 | 原值 | 新值 | 原因 |
| --- | --- | --- | --- |
| 补取上限 | 1 | 3 | 产品 2026-10-08,BUG-1294 |
| 补取测试 | 第二次拒绝 | 第三次成功、第四次拒绝 | 同上 |
| 系统提示句子 | once | at most three times | 同句短 20 字符,BUG-1256 |
| 共用清单条数 | 8 | 9 | 受冲只计数、资料用 skill_read,BUG-1293 |
| 清单字段扫描 | 只放过 blocked | 再放过 skill_read、further_reading | 这两个词是工具和目录名 |
| 卡预算三处 | 12,500 / 18,500 | 20,000 / 26,000 | 产品临时上限,最终等 T6 |
资料目录测试改为按 12 个领域检查真实路径。行走源码的测试在 Windows 上改用 `fileURLToPath`,期望的相对路径名单没变。
## 明确没做
没有 `git push`,没有推 `staging`,没有改 workflow,没有提升 `main`。没有模型 key。
+2 -3
View File
@@ -129,9 +129,8 @@
| 任务书 | 进度 | 主题 | 状态 | 落点 |
| --- | --- | --- | --- | --- |
| `TASK-consult-card-full-source-20261007.md` | — | **对话数据卡与报告同源 + 领域综合判断表**:事业卡只有约 7,600 字符、无自然代表星、无大运主星关系、D10 联动只能补取、补取上限 1;全 12 领域;综合判断表、参与清单(不止 D1/D9,含精度闸)、补取 3 次、资料目录均已确认;KP 不上卡、不联网、不接书籍语料;排在 sync6 与报告单之后 | 验收未通过(`35dafd1e`,见 fix-20261009) | — |
| `TASK-consult-card-full-source-fix-20261009.md` | — | **对话卡同源修复**:缓存键无日期致当前大运冻结、整卡 37.5K(每格带内部路径)、星照整列 blocked(资料库其实有出处)、前端测试手写数据、无预热;合入前用临时 key 跑模型 A/B 与生平回测 | F1–F5 已验收,F6 未过(`e47c161a`,见 fix2) | — |
| `TASK-consult-card-full-source-fix2-20261009.md` | — | **对话卡同源第二轮**:齐达内事业被「水星=说写算」带偏致严重冲突 1→3;事业清单加「代表星只看力量受冲、不按星性猜职业」后重跑回测(≤1 才合入);预热改为不占重计算名额 | 待领取 | — |
| `TASK-consult-card-full-source-20261007.md` | `PROGRESS-consult-card-full-source-20261007.md` | **对话数据卡与报告同源 + 领域综合判断表**:事业卡只有约 7,600 字符、无自然代表星、无大运主星关系、D10 联动只能补取、补取上限 1;全 12 领域;综合判断表、参与清单(不止 D1/D9,含精度闸)、补取 3 次、资料目录均已确认;KP 不上卡、不联网、不接书籍语料;排在 sync6 与报告单之后 | 验收未通过(`35dafd1e`,见 fix-20261009) | `codex/consult-card-full-source-20261007` |
| `TASK-consult-card-full-source-fix-20261009.md` | — | **对话卡同源修复**:缓存键无日期致当前大运冻结、整卡 37.5K(每格带内部路径)、星照整列 blocked(资料库其实有出处)、前端测试手写数据、无预热;合入前用临时 key 跑模型 A/B 与生平回测 | 待领取 | — |
| — (产品 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 |
@@ -0,0 +1,12 @@
# 真机清单:对话综合判断表(2026-10-09)
对应任务书 `docs/tasks/TASK-consult-card-full-source-20261007.md`。部署到 staging 之后照做。本机没有模型 key,下面的结果列留空。
准备:用一个出生时间已确认的账号,新开普通对话。每题只问一次。看回答有没有用到该领域综合判断表里的因素(宫、宫主、自然代表星、当前大运主星、受冲是计数而不是结论)。
| # | 领域 | 问法 | 应看到 | 结果 |
| --- | --- | --- | --- | --- |
| 1 | 事业 | 我的事业会往什么方向走? | 回答用到事业综合判断表里的因素 | |
| 2 | 婚恋 | 我的婚姻和感情会是什么样? | 回答用到婚恋综合判断表里的因素 | |
| 3 | 财富 | 我的财运怎么样? | 回答用到财富综合判断表里的因素 | |
| 4 | 健康 | 我的身体底子怎么样? | 回答用到健康综合判断表里的因素 | |