feat(tajika): year lord by the Panchadhikari rule, ported from upstream c7117f92 (BUG-1214)

Round-4 astrologer ruling Q3. tajika.calc_panchadhikari_year_lord and its
missing pieces (Tri-Rasi tables, planet index maps, ayanamsa-aware PyJHora
lookups) plus references/tajika_panchavargiya_rules.json (blob e8c15ac3) are
ported verbatim from yinduzhanxing c7117f92, with one keyword added
(muntha_sign_idx): upstream builds the Muntha-lord candidate from the annual
Lagna + years; ours stays natal Lagna + completed years (BUG-1212).

Both annual producers (solar_return_full_report, cmd_tajika) call the new
tajika_year_lord.select_annual_year_lord, so the pack conflict gate compares
the same rule. Output carries candidates / candidate_list with Panchavargiya
score and engine, aspect flags, selection_basis and a one-sentence basis
(zh/en). The product path always uses the native proxy (PyJHora is AGPL, absent
from the API image and CI); JYOTISH_YEAR_LORD_PYJHORA_REFERENCE=1 restores the
upstream PyJHora lookup for research. Card varshesha_basis and the report
'Selection basis' rows show the sentence; the BUG-1212 stand-in label is gone.
Mudda Dasha and Tri-Pataka follow the selected year lord.

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 16:30:28 +08:00
co-authored by Claude Opus 5.5
parent bc03bba26b
commit 0afcc2d9a3
11 changed files with 633 additions and 45 deletions
+4 -4
View File
@@ -576,12 +576,12 @@ def render_pl9_parity_markdown(packet: dict) -> str:
if year_lord.get('status') == 'conflict':
return '两种计算口径给出的年主不同,暂不合并'
data = _dict(year_lord.get('data') or year_lord)
muntha_data = _dict(_dict(muntha).get('data'))
# BUG-1214: the producer's one-sentence Panchadhikari basis (replaces
# the BUG-1212 "Muntha lord for now" stand-in).
if data.get('selection_basis_text'):
return _cell(data['selection_basis_text'])
if data.get('selection_basis'):
return _cell(data['selection_basis'])
if data.get('year_lord') and data['year_lord'] == muntha_data.get('muntha_lord'):
# BUG-1212 (甲11): say plainly that this is a stand-in for Panchavargiya.
return '暂用 Muntha 主星;占星师口径为 Panchavargiya,待接入'
return '-'
def _degree(value) -> str: