Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
11 KiB
11 KiB
TASK · 报告与星盘页的「空列」:Kranti、八分法宫位表、上升星宿、分盘庙旺、重复分盘(2026-10-03)
- 基线:
origin/staging1af34880 - 分支 / 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.pyp33 表读strengths.kranti_local.planets[*].kranti_degrees,全仓无任何 producer;jyotish_engine.py的 materialskranti自己写着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 拍板)
- Kranti 列删除。不按古典公式补算:无 PL9 原值可对照,Declination 列已是真实赤纬。引擎内部 materials 的
kranti: blocked审计口径与full_report_quality_gate.py的RESTRICTED_MATERIAL_IDS不动。 - 八分法宫位表三列都给真数:宫位 · 星座 · SAV(不含上升,合计 337)· 上升 BAV(合计 49)· 含上升合计(386),末尾加合计行。
- 分盘表庙旺接引擎完整十档,与 D1「状态」列同一口径(
DIGNITY_LABELS同文)。本条有限推翻 BUG-1076「三档庙旺」与 BUG-1099「三档庙旺保留」:三档是当时的范围收口,不是红线;BUG-1099 的能力声明规则(列可用性看有效来源、不看命中)继续有效。前端那份vargaDignity自算表随之删除(不留第二套判定)。 - 报告末尾「分盘核对」去重:页面与导出用同一条去重规则,正文已画过的盘不再画;新报告该段整体消失,老报告缺哪张补哪张。「分盘对出生时间敏感,不单独增加结论的确定性」这句挪到正文「本命与分盘北印度图盘」标题下(中英两版)。
- 上升补星宿 / pada / 宿主:与九曜同一公式,属漏算,不是推断。上升「状态」列维持
—。
硬红线
house_scores_full[*].sav_score的语义与数值不变(生时校正minute_rectification_feature_facts_v4.py、dynamic_rectification_fact_priority.py、active_rectification_event_engine.py在读它)。只能新增字段。scripts/jyotish_api_server.py不增长(tests/test_api_server_growth_contract.py);分盘庙旺的标注写在独立模块或divisional_charts_extended.py输出里,主文件最多改一行调用。- 不改 Kranti 的 blocked 状态、不新增任何 Kranti 数值。
page.tsx不增长;不加 spinner / 骨架;不改 DB 结构。- 合同测试 fixture 必须来自真实引擎输出(golden 重录要写重录命令)。
- 改既有断言写「原值 / 新值 / 原因」三栏(预计涉及:
chart-varga-table.test.tsx的「自宫」→入庙(Own Sign)、chart-view-varga-dignity.test.ts、test_chart_page_vedic_tables_contract.py、报告 golden 表头)。 - 示例只用公开名人或虚构盘,不得用截图里的出生资料。
任务分解
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.pyp53 表:| 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_version4 → 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 --noEmit0;npm run lint0 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 状态板一行。