Files
Jyotisha/docs/tasks/TASK-report-chart-blank-columns-20261003.md
T

11 KiB
Raw Blame History

TASK · 报告与星盘页的「空列」:Kranti、八分法宫位表、上升星宿、分盘庙旺、重复分盘(2026-10-03)

  • 基线:origin/staging 1af34880
  • 分支 / worktree:codex/report-chart-blank-columns-20261003 / .worktrees/report-chart-blank-columns-20261003
  • 模式:任务书模式(执行方实现,Claude 验收)
  • BUG 编号起点:BUG-1199(开工时 grep -o "^## BUG-[0-9]*" docs/BUG_HISTORY.md | sort -t- -k2 -n | tail -1 核对;若已被占用顺延)
  • 串行:本单不改 page.tsx;改 scripts/pl9_reader_export.py / scripts/ashtakavarga.py / chart-view-mapper.ts 的在途分支若有,先合者优先,后者 rebase。

事故实证(产品 10-01 staging 真机截图,行号以符号为准)

# 位置 现象
E1 报告「Declination / Kranti / Speed」 Kranti 列七行全 -
E2 报告「Ashtakavarga 完整宫位分数」 「BAV/承接」「Full with 上升」两列全 -;「SAV」列 12 宫合计 386
E3 报告末尾「分盘核对」 正文开头「本命与分盘北印度图盘」已画过的 D1、D2… 又画一遍;该段在目录外、未套卡片样式
E4 /chart D1 表上升行 星宿 / 宿主 / pada 全 —(狮子 14°32′,应为 Purva Phalguni 第 1 足、宿主金星)
E5 /chart D9 表「庙旺」列 只有入旺 / 自宫 / 落陷有字,其余全 —(如太阳在金牛=敌宫、月亮在摩羯=中性)

根因

  • E1:pl9_reader_export.py p33 表读 strengths.kranti_local.planets[*].kranti_degrees,全仓无任何 producer;jyotish_engine.py 的 materials kranti 自己写着 missing_in_local / blocked、"no independent Kranti producer is registered"。表照样留了这一列。
  • E2(含数字标错):ashtakavarga.py::_map_to_houses_values(full_sav, …) 只写 sign + sav_score,而传入的是 full_sav = sav + lagna_sav(337 + 49 = 386)。reader 表 row.get('sav') or row.get('sav_score') 取到的是含上升合计却标成 SAV;bav / full_with_lagna 字段不存在 → 两列 -。同页上方「SAV score」表是 337 口径,两表互相矛盾。
  • E3:personal-report-page.tsx 在 Markdown 正文后无条件挂 ReportCalculationCharts;正文的 ```jyotish-chart 围栏已画全部分盘。report-export-blocks.ts::buildReportExportBlocks 已按 chartIds 去重,页面没用同一规则。
  • E4:jyotish_engine.py::compute_chart_data 给九曜按 nak_span 算了 nakshatra / nakshatra_pada / nakshatra_lord,result["ascendant"] 漏了这三项;chart-view-mapper.ts::ascendantRow 按约定"引擎不给就留空"。
  • E5:BUG-1076 / BUG-1099 有意只做三档(chart-view-varga.ts::vargaDignity,前端自带一份表)。引擎在 Vimsopaka 路径已有完整判定:_get_dignity_level(planet, varga_sign, varga_deg, _build_dignity_context(vdata)),星盘页没接。

决策记录(产品 2026-10-03 拍板)

  1. Kranti 列删除。不按古典公式补算:无 PL9 原值可对照,Declination 列已是真实赤纬。引擎内部 materials 的 kranti: blocked 审计口径与 full_report_quality_gate.py 的 RESTRICTED_MATERIAL_IDS 不动。
  2. 八分法宫位表三列都给真数:宫位 · 星座 · SAV(不含上升,合计 337)· 上升 BAV(合计 49)· 含上升合计(386),末尾加合计行。
  3. 分盘表庙旺接引擎完整十档,与 D1「状态」列同一口径(DIGNITY_LABELS 同文)。本条有限推翻 BUG-1076「三档庙旺」与 BUG-1099「三档庙旺保留」:三档是当时的范围收口,不是红线;BUG-1099 的能力声明规则(列可用性看有效来源、不看命中)继续有效。前端那份 vargaDignity 自算表随之删除(不留第二套判定)。
  4. 报告末尾「分盘核对」去重:页面与导出用同一条去重规则,正文已画过的盘不再画;新报告该段整体消失,老报告缺哪张补哪张。「分盘对出生时间敏感,不单独增加结论的确定性」这句挪到正文「本命与分盘北印度图盘」标题下(中英两版)。
  5. 上升补星宿 / pada / 宿主:与九曜同一公式,属漏算,不是推断。上升「状态」列维持 —。

硬红线

  1. house_scores_full[*].sav_score 的语义与数值不变(生时校正 minute_rectification_feature_facts_v4.py、dynamic_rectification_fact_priority.py、active_rectification_event_engine.py 在读它)。只能新增字段。
  2. scripts/jyotish_api_server.py 不增长(tests/test_api_server_growth_contract.py);分盘庙旺的标注写在独立模块或 divisional_charts_extended.py 输出里,主文件最多改一行调用。
  3. 不改 Kranti 的 blocked 状态、不新增任何 Kranti 数值。
  4. page.tsx 不增长;不加 spinner / 骨架;不改 DB 结构。
  5. 合同测试 fixture 必须来自真实引擎输出(golden 重录要写重录命令)。
  6. 改既有断言写「原值 / 新值 / 原因」三栏(预计涉及:chart-varga-table.test.tsx 的「自宫」→ 入庙(Own Sign)、chart-view-varga-dignity.test.ts、test_chart_page_vedic_tables_contract.py、报告 golden 表头)。
  7. 示例只用公开名人或虚构盘,不得用截图里的出生资料。

任务分解

T1 · 报告 p33 表删 Kranti 列(BUG-1199)

  • pl9_reader_export.py:表头改 | Planet | Degree | Declination | Speed |,标题改 ### p33 Declination / Speed;同步 pl9_reader_english_terms.py 对应条目(无则不加)。
  • 验收:Python 定向测试断言新报告 Markdown 不含 Kranti 列头、四列齐全;full_report_quality_gate 原有用例全绿。

T2 · 八分法宫位表三列真数(BUG-1200)

  • ashtakavarga.py::_map_to_houses_values 增字段 sav(不含上升)、lagna_bav、full_with_lagna,保留 sav_score(= 含上升,红线 1)。上升 BAV 取 lagna_sav(bav_results['Lagna'])。
  • pl9_reader_export.py p53 表:| House | Sign | SAV | Lagna BAV | SAV + Lagna |,末行合计;中文版表头经现有中英术语表走「宫位 · 星座 · SAV · 上升 BAV · 含上升合计」(以 reader 现有的中文投影机制为准,不得出现「Full with 上升」这种半翻译)。
  • 验收:测试断言每行 sav + lagna_bav == full_with_lagna;合计行 SAV = 337、全表合计 = sav.full_total_with_lagna;该表 SAV 列与上方「Sign | SAV score」表按星座逐格相等;sav_score 旧值逐宫不变(对基线快照)。

T3 · 星盘页上升补星宿(BUG-1201)

  • compute_chart_data 的 result["ascendant"] 加 nakshatra / nakshatra_pada / nakshatra_lord,公式与九曜同一(共用一个小函数,不复制三行)。
  • _build_api_chart_cache_payload 的 cache_schema_version 4 → 5,否则旧缓存永远没有这三项。开工先 grep 所有对 chart 结果做哈希 / 指纹的地方(报告 result_binding、天空封面指纹等,见 BUG-693/694),确认加字段不会让历史报告 / 历史校正打不开或被判过期;有影响就写进进度记录并停下来问。
  • 前端 ascendantRow 不改逻辑,只更新注释。
  • 验收:golden frontend/tests/fixtures/chart-view-golden.json 用真实引擎重录(写命令);断言上升行三列有值且与按经度独立计算一致;Python 测试覆盖星宿边界(13°20′ 整倍数两侧)。

T4 · 分盘庙旺接引擎十档(BUG-1202)

  • Python:/api/varga_full 每张分盘每颗星加 dignity_level(EXALTED / MOOLATRIKONA / OWN_SIGN / GREAT_FRIEND / FRIEND / NEUTRAL / ENEMY / GREAT_ENEMY / DEBILITATED / NEECHA_BHANGA),算法即 Vimsopaka 路径的 _get_dignity_level(pn, sign, deg_in_sign, _build_dignity_context(vdata)),抽成一个函数两处共用。
  • 前端:chartViewVargaSchema.dignity 枚举扩到十档;标签与 D1「状态」列同文(引擎 DIGNITY_LABELS);删除 vargaDignity 与 vedic-chart-tables.json 里只为它服务的表(若别处仍用则保留并在进度记录说明)。旧缓存 / 旧模块快照无 dignity_level 时按 BUG-1099 规则整列不渲染,不得前端自算兜底。
  • 验收:golden 重录;D9 行断言至少覆盖一颗入敌、一颗中性、一颗入旺、一颗自宫;Python 合同测试断言 /api/varga_full 的 dignity_level 与 Vimsopaka 输入逐星一致;无 dignity_level 的旧 payload 渲染时无庙旺列。

T5 · 报告末尾分盘去重 + 提示前移(BUG-1203)

  • 把 buildReportExportBlocks 里"正文围栏已画过的分盘 id"抽成共享函数;ReportCalculationCharts 只画不在其中的盘,全被覆盖时整段不渲染。
  • pl9_reader_export.py 在 ### p6-p17 本命与分盘北印度图盘 下加那句提示;英文版走术语表(沿用现 COPY.en.note 文案)。report-calculation-charts.tsx 的 COPY.note 随之删除。
  • 验收:新报告 fixture(围栏齐全)→ 页面无「分盘核对」段;老报告 fixture(无围栏)→ 该段照旧出现;导出结果与修前逐字节一致;中英两版正文 p6-p17 标题下各有一句提示。
  • frontend/DESIGN.md 同提交更新(报告图盘只在正文出现一次)。

让步顺序(时间不够时从下往上砍,必须写进进度记录)

T5 的「提示前移」→ T4 的删前端旧表(保留但不再调用)→ T3 的缓存 bump(改成写清"新排盘才有")。T1、T2 不可让步(T2 是数字标错)。

门禁

  • Python:.venv/bin/python -m pytest tests/<相关文件>;run_quality_gate.py --profile quick;test_api_server_growth_contract.py。
  • 前端:tsc --noEmit 0;npm run lint 0 error;npm test 失败名单与基线逐名一致、总数不降;next build 后 / Static;首屏 gzip ±2%。
  • 部署后:/api/health 的 deployment.gitCommit = 合入 SHA;真机清单写 docs/testing/report-chart-blank-columns-20261003.md(报告重新生成一份看 E1–E3;/chart 看 E4–E5;打开一份旧报告和一份旧校正确认能打开)。

开工前置命令

cd /workspace/Jyotisha && git status -sb | head -1
git fetch origin --prune
git worktree add -b codex/report-chart-blank-columns-20261003 .worktrees/report-chart-blank-columns-20261003 origin/staging
grep -o "^## BUG-[0-9]*" docs/BUG_HISTORY.md | sed 's/.*-//' | sort -n | tail -1   # 期望 1198
grep -n "BUG-1076\|BUG-1099" docs/BUG_HISTORY.md                                    # 读完两条旧记录

记录

docs/BUG_HISTORY.md(BUG-1199~1203,E5 关联 BUG-1076/1099 并写明推翻范围)、CHANGELOG.md、frontend/DESIGN.md、docs/tasks/PROGRESS-report-chart-blank-columns-20261003.md、docs/tasks/README.md 状态板一行。