docs(tasks): sync6 upstream fixes, full-data report edition, consult card from the report packet

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-10-07 16:01:45 +08:00
co-authored by Claude Opus 5.5
parent 0ed45a4b3a
commit 0cdb1c42d4
4 changed files with 269 additions and 0 deletions
+3
View File
@@ -129,6 +129,7 @@
| 任务书 | 进度 | 主题 | 状态 | 落点 |
| --- | --- | --- | --- | --- |
| `TASK-consult-card-full-source-20261007.md` | — | **对话数据卡与报告同源 + 领域综合判断表**:事业卡只有约 7,600 字符、无自然代表星、无大运主星关系、D10 联动只能补取、补取上限 1;全 12 领域;综合判断表 / 联动 / 补取 3 次 / 资料目录待产品确认;KP 不上卡、不联网、不接书籍语料;排在 sync6 与报告单之后 | 待领取 | — |
| — (产品 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 |
@@ -200,6 +201,7 @@
| 任务书 | 进度 | 主题 | 状态 | 落点 |
| --- | --- | --- | --- | --- |
| `TASK-report-full-data-edition-20261007.md` | — | **报告改为完整数据版、删除阅读版**:网站阅读版中文 7.6 万字符 vs 上游 `pl9_ai_density` 97 万;移植原始数据附录 / 清理器 / 时间补充,中英文;我方报告口径(BUG-1199~1229)全部保持;旧报告仍可打开;排在 sync6 之后 | 待领取 | — |
| `TASK-report-reader-main-fix-20260925.md` | `PROGRESS-report-reader-main-fix-20260925.md` | **读者版修复**:真实年主比较、分字段绑定与未来返照;保留 Bhava Bala 和标题,隔离报告/聊天规则 | 已验收(Claude 09-25:年运表逐年填齐且不同、Bhava Bala 保留、泄漏 0) | `4d801e53`(已部署,health 核对一致) |
| `TASK-report-reader-main-20260924.md` | `PROGRESS-report-reader-main-20260924.md` | **报告正文换上游读者版 reader_main + KP / Muntha 计算缺陷 + 投影截断(BUG-1026/1027/1028)**:正文一直是上游审计版(读者版 09-09 才出、从未同步),本仓又自加「结论等级规则」/英文段/异常原文;投影黑名单不认 PL9 词汇且截断半句、删表留说明;KP args `vars()` 拷贝为空恒失败;Muntha 漏合 `birth_asc_sign_idx` → Year Lord 恒火星。产品拍板接入读者版、旧报告不回填。 | 部分通过(Claude 09-25:读者版切换、泄漏 0 命中、KP 已修;年运 Year Lord/Muntha 全为「-」P1、投影误删 Bhava Bala P2 → 修复单) | `3c2f7bd5`(已部署) |
| `TASK-report-reader-actions-20260924.md` | — | **报告操作收敛**:列表只留「查看报告」;阅读页删「下载原始附录」「打印」,导出改图标按钮;导出对话框 ≥860 居中、窄屏仍贴底(修订 chapter-export D9/D10)。产品变更,不开 BUG 号 | 基本通过(Claude 09-24:入口收敛、图标、≥860 居中均符合;原始附录三文件因执行方权限未删、PROGRESS/清单未写 → 并入修复单) | `f125fae0`(未部署) |
@@ -311,6 +313,7 @@
| `TASK-rectification-targeted-collect-cards-20260913.md` | `PROGRESS-rectification-targeted-collect-cards-20260913.md` | 定向补事改逐条点选卡(有/没有/记不清 → 有则口述年月;没有不计分只防复问;全没有出卡)+ 文案说清剩余候选与线 + 卡下「再答两道参考题」入口(BUG-661~663,Skill 10.0.25) | 已实现 `530f260f`,已部署;2026-09-13 验收:T1/T2/T4 通过,T3 入口留死角 → `TASK-rectification-tie-break-entry-fix-20260913.md` | `codex/rectification-targeted-collect-cards-20260913` |
| `TASK-rectification-probe-supply-research-20260913.md` | — | 研究单:六题后引擎在剩余候选上再出带年月题的四种放宽规则,20 例公开 AA 数据离线量收益,有收益才立实现单 | 已合入(离线测量,不改线上) | `b063c668` |
| `TASK-rectification-refresh-r3-r4-20260913.md` | `PROGRESS-rectification-refresh-r3-r4-20260913.md` | 刷新阶段 R3(MIN_BOUNDARY_DAYS 45→30)+ R4(pratyantar 与 D9/D10 上升 Narayana);首轮出题不变。即使放宽仍有 0 题例子,定向补事另线保留(BUG-664/665) | 已实现 `ab1ade59`,已部署;2026-09-13 验收通过(实现单由执行方自拟,无产品决策记录段;收益口径见研究文档) | `codex/rectification-refresh-r3-r4-20260913` |
| `TASK-upstream-sync6-20261007.md` | — | **上游同步第六轮(`23be1807`)**:10-05 五个计算修正一行未合——D5/D6/D8/D11 映射(乔布斯盘四张分盘星座全不同)、Vimsopaka 权重、Yogini 顺序与出生余额、Panchadhikari 宫位参照、Narayana 并列、特殊上升、出生秒数、Neecha Bhanga 两条件、首段大运子运、岁差被覆盖;逐项对照原书核实;最先做 | 待领取 | — |
| `TASK-rectification-tie-break-entry-fix-20260913.md` | `PROGRESS-rectification-tie-break-entry-fix-20260913.md` | 修复单:参考题入口只读 `window_scan` 标志位 → 两道答完后仍显示、再点弹「现在没有可答的参考题」;并按产品拍板改成点一次连出 D9+D10(BUG-666~668,Skill 10.0.26) | 已合入(无独立验收记录) | `99127601`(BUG-666~668 resolved;已部署 staging,run 2589) |
@@ -0,0 +1,91 @@
# TASK · 对话数据卡与报告同源,按领域给出综合判断表(2026-10-07)
- 基线:`origin/staging` 合入 `TASK-upstream-sync6-20261007` 与 `TASK-report-full-data-edition-20261007` 之后的 SHA(开工时记下)。写作时为 `0ed45a4b`。
- 分支 / worktree:`codex/consult-card-full-source-20261007` / `.worktrees/consult-card-full-source-20261007`
- 串行顺序:sync6 → 报告单 → 本单。本单依赖报告单 T7 提供的资料包取值入口。报告单 T0–T3 完成后,本单的 T0 盘点可以先做;改代码要等报告单合入后再 rebase。
- BUG 编号:与另两份单共用一个序列,开工时核对 `docs/BUG_HISTORY.md` 最大号。
## 1. 事故实证
产品 10-07 反馈:对话里 AI「只看本命盘或 D10」,没有把事业代表星、大运主星和事业的关系、各项分值、KP、功能吉凶、相位、D10 映射回 D1 / D9 综合起来;也没用上资料库和公认技法。
用乔布斯 golden 盘(`frontend/tests/fixtures/consult-evidence-card-golden.json`)导出事业题的数据卡(`buildEvidenceCard`),约 7,600 字符:
| 产品说的缺口 | 引擎算了吗 | 卡上有吗(`frontend/src/lib/consultation-evidence-card.ts`) |
| --- | --- | --- |
| 10 宫、宫主、宫内星、照 10 宫的星 | 算了 | 有 |
| 事业的自然代表星(太阳、土星、水星、木星) | 位置算了 | 没被点名:`EVIDENCE_CARD_SPECS.career` 的 `planets: []`,清单只要求看 AmK |
| 大运主星和事业的关系 | 原料分散在各处 | 没有关系表。罗睺、计都当大运主星时没有功能吉凶(判定表只列七星)。样例当前正走罗睺大运,卡上没有一行写罗睺对事业的意义 |
| 分值综合 | 算了 | Shadbala 七星有;八分法只给 10 宫 SAV;没有把各项放在一起的表 |
| D10 映射回 D1 / D9 | **算了**(`consultation_native_layers.inter_chart_linkage`:每星在 D1 / D9 / D10 落第几宫) | 不在卡上,只能补取;D10 段只有星座,没有宫 |
| 卡外补取 | — | `MAX_EVIDENCE_LOOKUPS_PER_TURN = 1` |
| 资料库 | 有 190 份 | `methodology.further_reading` 的 19 条多为 oracle / 治理文件,KP、宫位对照、分盘深读、Argala、Jaimini 等技法书不在列 |
| Avastha、Bhava Bala、Vimsopaka | 报告资料包里有 | 对话链不算 |
| KP | 引擎有宫头 | 09-27 按顾问意见不上卡(`observation_only_truth_blocked`,原因 `licensed_provider_not_terms_safe`) |
| 联网 | — | 卡上写死「全网资料核对、真实案例校准:未做,置信度封顶」 |
## 2. 根因
09-27 数据卡改造时,为了解决「模型可见 13–14 万字符、读不过来」,把每个领域压成约 1.2 万字符,并按当时的清单挑字段。挑法只覆盖必看项,没有「把各因素放到一起比」的结构;对话和报告从两条路取数,深度不同。
## 3. 决策记录
产品 2026-10-07 已定:
1. **同源**:对话数据卡的数值取自与报告完整数据版**同一个资料包**(报告单 T7 的取值入口),按领域挑选。对话链不再单独拼一套。
2. **全领域一次做完**:12 个领域都改。
3. 任务书交 coding agent 执行,Claude 验收。
Claude 10-07 建议,**待产品确认**(产品当时回复「先记下」;确认结果由 Claude 补写在这里。确认之前,执行方只做 T0、T1):
4. 每个领域上卡一张**综合判断表**(定义见 T2),由卡片构建器从资料包取值组装。模型只负责解读,不再自己从几处拼。
5. 领域分盘与 D1 / D9 的联动上卡(事业 D10,婚恋 D9,财富 D2 / D11,其余按 `EVIDENCE_CARD_SPECS` 现有分盘)。
6. 卡外补取上限从 1 次改为 3 次。
7. `further_reading` 改为按领域的技法资料目录。
明确不做:
8. **KP 不上卡**:产品 10-07 说「先记下」,维持 09-27 决定,补取时仍带 `EVIDENCE_LOOKUP_KP_NOTE`。
9. **不做每轮实时联网**。
10. **不接上游书籍 / 文章语料**(`references/book_corpus`、`article_corpus`、`search_jyotish_books.py`):第三方作品不随仓库授权,商用前需要产品另行决定。
本单推翻的既有决定(执行方据此可以改,不得拒改):
- 09-27 数据卡 v1 / v2 的「每领域卡 ≤ 12,500 字符、加清单 ≤ 18,500 字符」上限(BUG-1160 / 1161 / 1221)。新上限由 T6 实测后报产品定,在此之前按卡 ≤ 20,000、加清单 ≤ 26,000 执行。
- 09-27 D8「卡外只补取一次」。
## 4. 硬红线
1. 卡上数值一律从资料包原样复制,不改写、不四舍五入、不翻译(现有 `consultation-evidence-card.ts` 的不变式保持)。缺什么写进 `gaps`,不补。
2. 综合判断表里的「受冲条数」只是计数,**不设门槛、不下结论**。产品 10-02 已定:只说压力迹象和现实范围,请用户补充;「≥2 条就判定」是被推翻的设计,不得复活。
3. 罗睺、计都的功能吉凶:引擎没有就不填。只列它们的定位星、同宫星与这些星的功能角色,表头注明「罗计不单独定功能吉凶」。该怎么判写进给占星师的下一轮问题。
4. 自然代表星表必须有出处:从本仓 `references/`(如 `house-domain-planet-mapping.md`、`event_judgment_*.md`、`strict-workflow-router.md`)逐条引用文件与段落;本仓找不到出处的领域写 `blocked`,不自拟。
5. 普通对话的生平回测(`scripts/research/capture_consult_biography_backtest_golden.py` 一套)严重冲突数不得高于开工基线;对照组误报不得增加。没有模型 key 时写成环境缺口,不得宣称通过。
6. 首轮回答的形状、口吻规则(BUG-1244、1245、1255)不改;系统提示不增长(BUG-1256 的 26.6K 为上限)。新增的读法说明进清单,不进系统提示。
7. 前端红线照常:tsc 0、lint 0 error、`npm test` 失败名单与基线相同、build `/` Static、gzip ±2%。`scripts/jyotish_api_server.py` 不增长。
## 5. 任务分解
| # | 内容 | 验收标准 |
| --- | --- | --- |
| T0 | 盘点:对话链现在怎么拿数(`run-jyotish-consultation` → `toAgentConsultationContext` / `toModelOutput` → `buildEvidenceCard`);资料包里每个领域能取到的字段;12 个领域各自的「宫 / 宫主 / 自然代表星 / Jaimini 代表星 / 分盘」清单及出处 | 进度记录里有 12 行领域对照表,每行注明出处或 `blocked` |
| T1 | 资料包缓存:按「星盘身份 + 计算档(岁差、交点)+ 引擎版本」缓存资料包(放 `api_scratch`)。星盘新建或修改资料后在后台预热;对话命中缓存直接读;未命中就同步计算 | 命中时每领域取数耗时不高于现状(约 1.66 秒 / 域);未命中时 2 vCPU 档位实测耗时写进进度记录,**超过 20 秒就停下报产品**;改出生资料后缓存一定失效(参照 BUG-1251) |
| T2 | 综合判断表:每个领域一张,每个因素一行。因素包括本领域的宫、宫主、自然代表星、Jaimini 代表星、当前 Vimshottari MD / AD / PD 主星、当前 Narayana MD 星座及其主星。每行的列:D1 星座 / 宫 / 尊贵;功能角色;Shadbala 与 BPHS 最低要求;该星所落星座的 BAV 与本领域宫的 SAV;受冲条数及各条明细(按 `CONDENSED_SHARED_READING_LINES` 的规则);D9 星座、尊贵、Vargottama;本领域分盘的落宫;与本领域宫的关系(主管 / 落入 / 照 / 与宫主同宫) | 乔布斯、奥巴马、泰勒三盘 × 12 领域都能生成;每格都能追到资料包里的字段;新增测试逐格对照资料包 |
| T3 | 联动上卡:领域分盘与 D1 / D9 的宫位对照(事业用 `inter_chart_linkage`;其他领域从资料包的分盘表取) | 事业卡含每星 D1 / D9 / D10 落宫;其他领域按 T0 表 |
| T4 | 补取 3 次:`MAX_EVIDENCE_LOOKUPS_PER_TURN = 3`;第 4 次仍按现有方式拒绝 | 测试覆盖第 3 次成功、第 4 次拒绝;步数上限 `AGENT_MAX_STEPS` 是否需要加,按实测决定并写明 |
| T5 | 资料目录:`further_reading` 改为按领域列出本仓技法资料(每领域 ≤ 8 条,去掉 oracle / 治理文件);清单说明中写「需要时用 skill_read 读对应章节」 | 12 个领域各有目录;路径都真实存在(测试断言) |
| T6 | 体量与耗时:沿用 `docs/testing/prompt-slim-20261007-model-runs.md` 的 A/B 做法,比较改前改后的输入 token、首字时间、总耗时、空答率 | 数字写进进度记录,供产品定新的卡片上限;没有 key 就写环境缺口 |
| T7 | 回测:生平回测改前改后各跑一次(每份 2 次) | 按红线 5 判定 |
| T8 | 记录 | `docs/BUG_HISTORY.md`、`CHANGELOG.md`、`docs/tasks/PROGRESS-consult-card-full-source-20261007.md`、状态板、`docs/testing/` 真机清单(事业、婚恋、财富、健康各问一题,看回答是否引用了综合判断表里的因素) |
## 6. 让步顺序
T5 → T4 → T3 中事业以外的领域(先保证事业)。T1、T2、红线 1–5 不让步。
## 7. 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/consult-card-full-source-20261007 .worktrees/consult-card-full-source-20261007 origin/staging
grep -o "^## BUG-[0-9]*" docs/BUG_HISTORY.md | sed 's/## BUG-//' | sort -n | tail -1
```
@@ -0,0 +1,86 @@
# TASK · 个人报告改为完整数据版,删除阅读版(2026-10-07)
- 基线:`origin/staging` 合入 `TASK-upstream-sync6-20261007` 之后的 SHA(开工时记下)。写作时为 `0ed45a4b`。
- 上游参照:`/workspace/yinduzhanxing` `origin/main` @ `23be1807`,`scripts/jyotish_engine.py` 中的 `pl9_ai_density` 分支。
- 分支 / worktree:`codex/report-full-data-edition-20261007` / `.worktrees/report-full-data-edition-20261007`
- 串行顺序:等 sync6 合入 staging 后开工。可以与 `TASK-consult-card-full-source-20261007` 并行,但**两单都会动报告资料包的构建**(`build_professional_report_reference_packet`):本单先合,对话单在本单之上 rebase。
- BUG 编号:与 sync6、对话单共用一个序列,开工时核对 `docs/BUG_HISTORY.md` 最大号。
## 1. 事故实证
产品 10-07 上传了一份上游导出的用户报告(英文,约 350 万字符),认为它的密度和准确度都远超网站报告。用乔布斯公开盘在两边各导出一份对照(复现方法:上游 `jyotish_engine.py pl9-export --pdf-edition pl9_ai_density --pack full`;我方 `scripts/professional_report_reference.py::build_professional_report_reference`,`edition=reader_main`、`packs=["full"]`、`include_fact_tables=True`):
| 项 | 网站阅读版 | 上游完整数据版 |
| --- | --- | --- |
| 中文正文 | 7.6 万字符(另有事实表 JSON 约 49 万字符,只在网页表格里出现) | 97 万字符 |
| 开篇重点(当前大运;事业、财富、婚恋宫主带功能吉凶) | 无 | 有 |
| 九星逐星解释 | 无 | 有 |
| 宫主逐宫解释、Dosha 逐项 | 一张简表 | 完整 |
| 大运 / 子运解释 | 2 行 | 2,323 行 |
| 正文出现「功能」 | 0 次 | 44 次 |
| 其他大运(Narayana、Sthira、Niryaana Shoola、Drig、Navamsha、Lagna Kendradi、Shoola、Chara) | 无 | 有 |
| 年运解释、Mudda / Patyayini 表、Tajika 格局与强度、Sahams、Tripataki、月返照、八年总览 | 只有数据表 | 有表也有解释 |
| 结构化附录(功能吉凶层、单星八分表、KP 宫头征象星、Sudarshana、D81 / D108 / D144) | 无 | 有 |
| 英文独有原始数据(Argala、定位星链、双重过运、三年星历、Shadbala 分项、Avastha 输入、Vimsopaka 明细等) | 无 | 有 |
| 本机生成耗时 | 约 8 秒(排盘 1.2 秒 + 资料包 6.6 秒) | 34 秒(中文) |
## 2. 根因
我方移植报告时只搬了阅读版:`scripts/pl9_reader_export.py` 模块说明写明「`pl9_ai_density` is not ported」。缺的部分是上游 `jyotish_engine.py` 里的这些函数:`_render_pl9_ai_density_raw_data_markdown_en` / `_zh`、`_sanitize_pl9_ai_density_markdown` / `_en`、`_pl9_ai_density_visibility_receipt`、`_attach_pl9_source_visible_tables`,以及 `scripts/customer_timing_supplement.py`(`build_customer_timing_supplement`)。正文主体 `render_pl9_parity_markdown` 我方已经有(在 `pl9_reader_export.py` 里)。
## 3. 决策记录(产品 2026-10-07)
1. **删除阅读版**(中文、英文两种)。网站「生成报告」改为直接生成完整数据版,即上游 `pl9_ai_density` 的同等内容,中文、英文两份。
2. 「多余入口宁可删除」:阅读版的生成路径、切换入口和只为阅读版存在的代码一并删除,不保留开关。
3. 删除功能允许测试总数下降。这是对 AGENTS §7.3 的明确授权,范围仅限因删除阅读版而失去对象的测试。每删一条,在进度记录里写「测试名 / 原断言 / 删除原因」三栏;**守着计算口径的测试必须迁到新版本,不得删除**,见红线 2。
4. 已生成的旧报告(阅读版)必须仍能打开,只读,不自动重算。用户想要新版就重新生成。
5. 产品上传的那份用户报告只作为对照参考,**不得进入仓库**。
## 4. 硬红线
1. 正文的数值一律来自我方引擎(含 sync6 的修正)。不得因为移植上游渲染器,就把上游的计算函数一起带进来。上游渲染器读的字段我方没有时,写进缺口清单,不补算、不编。
2. 我方已经落地的报告口径**在新版本里全部保持**。下列测试改为对新版本断言,不删除:
- `tests/test_report_chart_blank_columns.py`(BUG-1199~1203、1209:去 Kranti、八分法分栏、上升星宿、分盘尊贵、图盘不重复)
- `tests/test_bhava_bala_formal.py`(BUG-1210:本站 +2 / −1.5 分不显示)
- `tests/test_shadbala_minimum_first.py`(BUG-1208:先写 BPHS 最低要求,分档标为「网站分档」)
- `tests/test_narayana_legacy_label.py`(BUG-1215、1218:旧算法标注,Rath 版并列)
- `tests/test_chara_karaka_8_bphs_order.py`(BUG-1204)
- `tests/test_neecha_bhanga_conditions.py`(BUG-1205:落陷取消列出成立的条件,不叫 Raja Yoga)
- `tests/test_year_lord_basis_label.py`、`tests/test_year_lord_blocked_no_fallback.py`(BUG-1212、1214、1216、1217、1223)
上游原始数据附录里如果出现这些规则禁止的写法(例如把 Neecha Bhanga 写成 Raja Yoga,或显示本站 bhava 分),一律按我方口径改写。
3. 隐私与泄漏:沿用 `tests/test_report_reader_main.py` 的 `LEAK_PATTERNS`(`blocked`、`executed`、`PyJHora`、`pl9_*`、`Traceback` 等)检查新版本中英文全文;上游自带的清理器只作补充,不能替代。
4. 计算档:按上游 `e4a6ac01` 的说法,客户版保持调用方给定的天文输入,解太阳返照时不加偏移,**不得启用**上游工程对标档里拟合的「视位置 / −5 秒 / 交点修正」。
5. `scripts/jyotish_api_server.py` 不增长:新代码放进新模块(建议 `scripts/pl9_full_data_export.py`),由 `professional_report_reference.py` 调用。`scripts/jyotish_engine.py` 只许极小的接线改动。
6. 前端:`tsc --noEmit` 0、`npm run lint` 0 error、`next build` 后 `/` 仍 Static、首屏 gzip 变化在 ±2% 以内;改 UI 的提交同时更新 `frontend/DESIGN.md`。
7. 不改 workflow、不提升 main。需要动表就真跑 `npm run test:db`(或按记忆里的本机 PG17 替身法),并在进度记录写明。
## 5. 任务分解
| # | 内容 | 验收标准 |
| --- | --- | --- |
| T0 | 盘点:列出阅读版在后端(`professional_report_reference.py` 的 `READER_MAIN_EDITION` / `REPORT_VERSION_READER`、`pl9_reader_export.py`、`pl9_reader_english*.py`、`reader_appendix_language*`、`reader_dasha_applicability.py`)和前端(`frontend/src/lib/personal-report-longform-generate.ts` 的 `fetchLongformMarkdown`、`personal-report-raw-appendix.ts`、`personal-report-longform-snapshot.ts`、`report-public-projection`、`frontend/src/components/personal-report/*`、`app/api/reports/[reportId]/raw-appendix`)的所有触点;标出哪些删、哪些改、哪些留 | 进度记录里有触点表;产品确认之前不删 |
| T1 | 后端移植:上述上游函数与 `customer_timing_supplement` 移进新模块;`build_professional_report_reference` 新增完整数据版(建议 `edition: "full_data"`、`report_version: pl9_personal_long_report.v4`),中英文各一份 | 乔布斯、奥巴马、泰勒、虚构盘四张盘中英文都能生成;章节目录与上游 `23be1807` 同盘导出逐节对照,缺节写进缺口清单并说明原因 |
| T2 | 英文清理闸 | 上游英文版在本机对乔布斯盘报错:`pl9 markdown hygiene failed ... chinese_characters:14981`。我方英文版四张盘全部通过清理闸,正文不含中文;过不了的写 BUG,并走既有的「英文暂不可用」路径,不得输出夹中文的英文报告 |
| T3 | 我方口径保持 | 红线 2 的测试全部迁到新版本并通过 |
| T4 | 前端切换与删除 | 「生成报告」只生成完整数据版;阅读版的切换、生成路径和组件删除;旧报告(v3)能打开(用 staging 或本机库里的旧记录验证,写明来源);英文切换沿用 BUG-1126 的要求(切换后正文真的换) |
| T5 | 大体量显示 | 中文约 100 万字符、英文约 350 万字符时:报告页可以滚动、跳章节、搜索,不卡死;按章节分页或懒加载;提供 Markdown 下载(PDF 不在本单范围)。记录本机 Chrome 或 jsdom 下的首屏耗时与内存 |
| T6 | 生成耗时与存储 | 在 2 vCPU 档位下估算生成耗时,确认在 `ENGINE_TIMEOUT_MS = 180_000` 以内;单份报告存储体量(中 + 英)写进进度记录;超出现有列或接口上限时停下报告,不擅自改表 |
| T7 | 对话单的接口 | 新版本的资料包(packet)对外提供一个只读的取值入口,供 `TASK-consult-card-full-source-20261007` 按领域读取;本单只定义并测试这个入口,不改对话 |
| T8 | 记录 | `docs/BUG_HISTORY.md`、`CHANGELOG.md`(用户可感知:报告变成完整数据版)、`frontend/DESIGN.md`、`docs/tasks/PROGRESS-report-full-data-edition-20261007.md`、状态板、`docs/testing/` 真机清单(生成、打开旧报告、切换中英、跳章节、下载) |
## 6. 让步顺序
T5 的搜索 → T5 的懒加载(先只做按章节分页)→ T1 的英文独有原始数据段(先保证中英文正文齐全)。T2、T3、T4 中「旧报告能打开」这一条不让步。
## 7. 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/report-full-data-edition-20261007 .worktrees/report-full-data-edition-20261007 origin/staging
grep -o "^## BUG-[0-9]*" docs/BUG_HISTORY.md | sed 's/## BUG-//' | sort -n | tail -1
```
## 8. 验收口径
Python:快速门 `failures []`、Python 全量失败名单 ⊆ 基线。前端:tsc / lint / `npm test` 失败名单与基线逐条相同(删除的测试另列)、build Static、gzip ±2%。真机走查留给 `docs/testing/` 清单,不得写成「通过」。
@@ -0,0 +1,89 @@
# TASK · 上游同步第六轮:上游 10-05 五个计算修正(2026-10-07)
- 基线:`origin/staging` @ `0ed45a4b`(staging 已部署同一 SHA)。
- 上游参照:`/workspace/yinduzhanxing` `origin/main` @ `23be1807`。只按下表逐提交挑选,不整文件覆盖。
- 分支 / worktree:`codex/upstream-sync6-20261007` / `.worktrees/upstream-sync6-20261007`
- 串行顺序:**本单最先做**。`TASK-report-full-data-edition-20261007`(报告)与 `TASK-consult-card-full-source-20261007`(对话数据卡)都基于本单合入后的 staging 开工。
- BUG 编号:开工时核对 `docs/BUG_HISTORY.md` 最大号(写作时 BUG-1259)后顺延;三份单共用一个序列,先开工的先取号。
- 若执行方因权限无法跨仓读取或拷贝上游代码:停下,在进度记录里写明,由 Claude 移植代码,测试 / golden / 评测交执行方。
## 1. 事故实证
产品 10-07 拿一份上游导出的用户报告(`pl9_ai_density` 版)和网站报告对比,认为前者准确得多。Claude 用乔布斯的公开盘(AA,1955-02-24 19:15 San Francisco,Lahiri,平均交点)在两边各导出一份,结果如下:
| 项 | 我方 `0ed45a4b` | 上游 `23be1807` |
| --- | --- | --- |
| D5 太阳 / 月亮 | 白羊 / 摩羯 | 射手 / 双鱼 |
| D6 太阳 / 月亮 | 白羊 / 天蝎 | 双子 / 射手 |
| D8 太阳 / 月亮 | 金牛 / 水瓶 | 双鱼 / 天蝎 |
| D11 太阳 / 月亮 | 双子 / 白羊 | 天秤 / 天秤 |
| Yogini 第一段 | 木星,出生起满 5 年 | 水星,只剩出生余额 0.81 年 |
| Shadbala 木星第 3 列 | 80.59 | 39.41(**原因未定位**,见 T9) |
对照上游五个提交里新增的代码行,逐行检查它们在我方文件中是否存在:
| 上游提交 | 文件 | 我方状态 |
| --- | --- | --- |
| `f32472b5` | `scripts/varga.py`、`scripts/vimsopaka_calculator.py`、`scripts/divisional_charts_extended.py` | 新增行 0 / 7、0 / 32;extended 与上游改前逐字节相同 |
| `1918ffaf` | `scripts/yogini_dasha.py`、`scripts/tajika.py`、`scripts/special_lagnas.py`、`scripts/narayana_dasha.py`、`yoga_rules` | yogini 与上游改前相同;tajika 0 / 8;special_lagnas 0 / 37;narayana 3 / 32 |
| `e4a6ac01` | `scripts/solar_return.py`、`scripts/cmd_solar_return.py` 等 | solar_return 0 / 5 |
| `4a807e7d` | `scripts/jyotish_engine.py`(Neecha Bhanga、首段大运子运、渲染) | 8 / 94 |
| `23be1807` | `scripts/ayanamsa_utils.py`、`scripts/bhava_chalit.py`、`scripts/cmd_nakshatra_adv.py`、`scripts/jyotish_engine.py` | ayanamsa_utils 0 / 6;另两个文件与上游改前相同;engine 8 / 55 |
影响面:普通对话的健康卡用 D6 / D8,财富卡用 D11,学业卡用 D5;报告的分盘表、Vimsopaka、Yogini、年主都受影响。
## 2. 根因
我方上次对齐上游是 10-04 的 `03bea6ed`(第一到第五批)。上游 10-05 又提交了这五个计算修正,我方没有同步。
## 3. 决策记录(产品 2026-10-07 授权)
1. 同步上游 10-05 的计算修正。**逐项对照上游声称的原书出处核实后再合入**,不整包照搬。上游以前出过「只换标签、声称已修」的情况(`c7117f92` 的 Narayana),所以核实是本单的一部分,不是可选项。
2. 核实可以只读上游仓的 `references/book_corpus/`(PVR Integrated Approach 切卡包、V.P. Goel 等)。**不得把书籍原文拷进我方仓库**:这些第三方作品不随仓库授权。
3. 不搬:`0c0f31b2`(上游自家隐私清理);`089f80d1`、`49ff15e8`、`0f955334`、`2b10d566`、`ddec2a9a`(书籍与文章语料、全文检索)——涉及版权,待产品另定;`e4a6ac01` 中的 MCP、`canonical_jyotish_profile`、`pl9_compatibility_profile`、`evidence_labeled_reporting`,我方没有这些模块,只取其中的出生秒数传递,以及 Shadbala 方法说明不再夸大的部分(若我方有对应代码)。`e4a6ac01` 关于 `pl9_ai_density` 客户档的部分留给报告单。
| 项 | 上游提交 | 内容 | 核实依据(上游自称) |
| --- | --- | --- | --- |
| U1 | `f32472b5` | D5 / D6 / D8 / D11 映射改为有出处的版本;extended 计算委托 `varga.calc_varga`;记录 `mapping_source` | PVR Integrated Approach §6.2.5 / 6.2.6 / 6.2.8 / 6.2.11 |
| U2 | `f32472b5` | Vimsopaka:去掉 D9 的 3.0 权重;自宫 virupa 改为 20;Neecha Bhanga 不作为尊贵输入;分档改名 | BPHS 16 分盘体系 |
| U3 | `1918ffaf` | Yogini:按原书顺序;按月宿起运(我方 sync5 已改);计算出生余额 | V.P. Goel,Classical 章 Table I |
| U4 | `1918ffaf` | Tajika Panchadhikari:`planet_house` 改为相对年盘上升的第 1–12 宫,星座序号单独存(我方 BUG-1214 移植自 `c7117f92`,**很可能带着这个错**) | — |
| U5 | `1918ffaf` | Narayana 两种算法并列报告;解释行写明实际选用的起运规则 | — |
| U6 | `1918ffaf` | 特殊上升点:从出生点推算,不再用午夜近似;补 Varnada、Pranapada;PyJHora 生产者传入岁差 | — |
| U7 | `1918ffaf` | `yoga_rules` 的 `jupiter_upachaya_from_moon`:按月亮起第 3/6/10/11 宫实现,标为「配置」,不叫瑜伽 | — |
| U8 | `e4a6ac01` | 年盘与太阳返照:出生秒数一路传递 | — |
| U9 | `4a807e7d` | Neecha Bhanga 补两个条件(定位星落月亮起角宫、落上升起角宫);首段大运被出生截断时,AD / PD 按完整大运起点推,只裁显示部分;宫位力量表不再多印一行汇总;Karaka 表加排位度数列 | — |
| U10 | `23be1807` | 岁差:import 时的引导设定不再覆盖调用方已选的岁差;行运、Bhava Chalit、星宿命令都用本命岁差,并传入出生秒数 | — |
## 4. 硬红线
1. 打分语义变化按 BUG-1181 先例处理:同一输入出不同分时,升生时校正算法身份(当前 `scoring-10`);记忆化 golden 出新版本、旧版冻结;研究记录按 ERR-110 重新冻结;验证历史校正记录仍能打开(BUG-621);前端与数据库里的版本字面量按 BUG-1181 改为代数判断。
2. 生时校正 v5 77 例评测任一格下降超过 1 个百分点:停下逐项定位,报给产品,不得自行调参。
3. 引擎数值一变,就跑 **Python 全量**,失败名单必须是基线的子集(基线在 Linux 上约 62 条)。快速门曾漏掉一条读者测试(BUG-1220)。
4. `scripts/jyotish_api_server.py` 只许 bugfix 级改动(增长合同)。golden 一律用真实引擎重新生成,不手改。任何既有断言的改动写「原值 / 新值 / 原因」三栏。
5. 不改 workflow、不提升 main、不动迁移(除非 T1 的版本字面量必须动守卫,届时按 sync5 先例只改守卫一行,并真跑 `npm run test:db`)。
6. 隐私:只用公开名人盘或虚构盘。产品上传的那份用户报告不得进入仓库、测试、进度记录或 Bug 历史。
## 5. 任务分解
| # | 内容 | 验收标准 |
| --- | --- | --- |
| T0 | 开工前置:`git fetch origin --prune`;`git worktree add -b codex/upstream-sync6-20261007 .worktrees/upstream-sync6-20261007 origin/staging`;读 `docs/research/pre_work_error_ledger.md`;跑 `python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45`;在基线上记录 Python 全量、`npm test`、v5 评测三份基线数字 | 进度记录里有三份基线 |
| T1 | U1 + U2 | 乔布斯、奥巴马、泰勒三盘的 D5 / D6 / D8 / D11 与上游 `23be1807` 一致;按 PVR 原书各给一个手算示例并写进测试;Vimsopaka 全自宫反例等于 20 |
| T2 | U3 | 三盘的 Yogini 首段余额、起止日期与上游一致;按 Goel Table I 写顺序断言 |
| T3 | U4 | 构造一个能区分「0 起星座序号」和「1 起相对宫」的用例;年主结果与上游一致;BUG-1214 记录补关联 |
| T4 | U5 + U6 + U7 | Narayana 两种算法并列显示,且不改打分(打分仍用旧 Narayana,产品 10-04 已定);Varnada、Pranapada 上卡或进报告的位置写清;`jupiter_upachaya_from_moon` 在卡和报告里不再叫瑜伽 |
| T5 | U8 + U9 | 出生秒数非 0 的虚构盘:年盘时刻与上游一致;首段大运被截断的盘:AD / PD 边界与上游一致;Neecha Bhanga 的 `conditions_checked` 含两个新条件 |
| T6 | U10 | 6 种岁差各跑一次:本命、行运、Bhava Chalit、星宿命令实际使用的岁差都等于请求的岁差(断言 `requested == applied`);同时核实我方是否存在 import 引导覆盖已选岁差的问题,写明有或没有 |
| T7 | 下游 golden 与卡片 | 重新生成 `frontend/tests/fixtures/consult-evidence-card-golden.json` 等真实引擎 golden;健康 / 财富 / 学业卡的分盘值变化逐盘列表 |
| T8 | 生时校正 | 按红线 1、2 执行;报告 v5 前后每格数字 |
| T9 | Shadbala 木星第 3 列差异 | 只定位、不修:找出是上游哪个提交造成的、哪边符合原书,写进进度记录与 Bug 历史(`investigating`);如果属于本单五个提交之一,就按该项一起合入 |
| T10 | 记录 | 每项一个提交,提交说明写上游提交号与 BUG 号;`docs/BUG_HISTORY.md`、`CHANGELOG.md`、`docs/tasks/PROGRESS-upstream-sync6-20261007.md`、`docs/tasks/README.md` 状态板 |
## 6. 让步顺序
时间不够时按这个顺序往后放:T9 → T4 的 U6(特殊上升点)→ T4 的 U5(Narayana 并列)。U1 / U2 / U3 / U4 / U10 不让步。
## 7. 验收口径
ruff、py_compile、快速门 `failures []`、Python 全量失败名单 ⊆ 基线、`tsc --noEmit` 0、`npm run lint` 0 error、`npm test` 失败名单与基线逐条相同、`next build` 后 `/` 仍 Static、v5 评测每格不降超过 1 个百分点。名人生平回测需要模型 key,没有就写成环境缺口。