feat(shadbala): BPHS minimum check first, bands labelled as the site's (T3, BUG-1208)

Astrologer ruling 甲13. New scripts/shadbala_display.py (display only; shadbala.py is
frozen and unchanged): chart.shadbala now carries min_required, meets_minimum,
minimum_check (达到/未达到 BPHS 最低要求), level_source=site_band and level
'<band>(网站分档)'; report Shadbala table gains 'BPHS minimum' and 'Site band'
columns (zh/en); evidence snapshot ranking and health narrative say the minimum
check first and mark the band as the site's.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
This commit is contained in:
Jesse_Chen
2026-10-03 12:30:19 +08:00
co-authored by Claude Opus 5.5
parent de79390175
commit 5fdf2f7498
5 changed files with 137 additions and 5 deletions
+8 -3
View File
@@ -1124,9 +1124,12 @@ def render_pl9_parity_markdown(packet: dict) -> str:
f"- Shadbala 方法:{_cell(shadbala.get('method'))}",
f"- 外部边界:{_cell(shadbala.get('external_parity_boundary'))}",
'',
'| Planet | Sthana | Dig | Kala | Chesta | Naisargika | Drik | Total | Required |',
'|--------|--------|-----|------|--------|------------|------|-------|----------|',
'| Planet | Sthana | Dig | Kala | Chesta | Naisargika | Drik | Total | Required | BPHS minimum | Site band |',
'|--------|--------|-----|------|--------|------------|------|-------|----------|--------------|-----------|',
])
# BUG-1208 (甲13): whether the BPHS minimum is met comes first; the
# 150/125/100/75/50 band is the site's own and is labelled so.
from shadbala_display import band_text as _band_text, check_text as _check_text, row_fields as _row_fields
for planet in ('Sun', 'Moon', 'Mars', 'Mercury', 'Jupiter', 'Venus', 'Saturn'):
row = _dict(shadbala_planets.get(planet))
if not row:
@@ -1137,7 +1140,9 @@ def render_pl9_parity_markdown(packet: dict) -> str:
f"| {_cell(_token(planet))} | {_num(_dict(row.get('sthana_bala')).get('total') or row.get('sthana_bala'))} | "
f"{_num(_dict(row.get('dig_bala')).get('total') or row.get('dig_bala'))} | {_num(_dict(row.get('kala_bala')).get('total') or row.get('kala_bala'))} | "
f"{_num(_dict(row.get('chesta_bala')).get('total') or row.get('chesta_bala'))} | {_num(row.get('naisargika_bala'))} | "
f"{_num(_dict(row.get('drik_bala')).get('total') or row.get('drik_bala'))} | {_num(total)} | {_num(required)} |"
f"{_num(_dict(row.get('drik_bala')).get('total') or row.get('drik_bala'))} | {_num(total)} | {_num(required)} | "
f"{_cell(_check_text(_row_fields(row)['meets_minimum'], _pl9_report_language(packet)))} | "
f"{_cell(_band_text(row.get('strength_level'), _pl9_report_language(packet)))} |"
)
lines.append('')
lines.extend([