815 Commits
Author SHA1 Message Date
Jesse_ChenandClaude Opus 5.5 2df6ee7270 test(sync6): regenerate the dated-transition scan golden and move the Saturn/Venus antardasha start (BUG-1260, BUG-1268)
Independent Staging Quality Gate / validate (push) Waiting to run
Independent Staging Quality Gate / publish (push) Blocked by required conditions
fb8277bf left the quick gate red: the native scan golden still carried the
pre-PVR D5/D11 signs, and the user-invocation contract still expected the
antardasha start laid from the day-truncated mahadasha date. Both values now
come from the real engine; Python full suite is back to the 62-failure
baseline, quick gate passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-07 23:04:37 +08:00
jesse-ux 3b84a3b028 fix(rectification): re-freeze sealed identity after D5/D11 (ERR-110, BUG-1260) 2026-10-07 18:08:25 +08:00
jesse-ux d46f9675aa fix(rectification): bump scoring identity to scoring-11 after D5/D11 (BUG-1260) 2026-10-07 17:47:00 +08:00
jesse-ux 5eb11e7cd1 fix(narayana): show the source-aware seed beside the historical sequence (BUG-1264, upstream 1918ffaf) 2026-10-07 17:42:13 +08:00
jesse-ux edeec41309 fix(dignity): record Neecha Bhanga kendras and clip the first dasha from its full parent (BUG-1268, upstream 4a807e7d) 2026-10-07 17:40:58 +08:00
jesse-ux f02d27a73f fix(solar-return): thread the birth second into the return instant (BUG-1267, upstream e4a6ac01) 2026-10-07 17:36:52 +08:00
jesse-ux eb739d4e6b fix(yoga): record Jupiter upachaya from the Moon as a configuration (BUG-1266, upstream 1918ffaf) 2026-10-07 17:36:06 +08:00
jesse-ux 4e134b9b9f fix(ayanamsa): keep a caller-selected mode across import and transit paths (BUG-1269, upstream 23be1807) 2026-10-07 17:05:18 +08:00
jesse-ux 4b9c019814 fix(special-lagnas): compute birth-instant points via PyJHora (BUG-1265, upstream 1918ffaf) 2026-10-07 16:59:28 +08:00
jesse-ux 778cb6389c fix(tajika): store year-lord house separately from sign (BUG-1263, upstream 1918ffaf) 2026-10-07 16:52:41 +08:00
jesse-ux 3adb2460e3 fix(yogini): use Goel Table I order and birth balance (BUG-1262, upstream 1918ffaf) 2026-10-07 16:48:25 +08:00
jesse-ux ab9e30560a fix(vimsopaka): score sign-owner relationships on a 20-point scale (BUG-1261, upstream f32472b5) 2026-10-07 16:43:34 +08:00
jesse-ux db68e90816 fix(varga): source D5/D6/D8/D11 from PVR 6.2 (BUG-1260, upstream f32472b5) 2026-10-07 16:39:01 +08:00
Jesse_ChenandClaude Opus 5.5 6ad0bea320 feat(rectification): start from an offer card in the consultation, come back to it (BUG-1247~1251)
TASK-rectification-in-chat-step1-20261006, direct execution.

- The homepage 生时校正 pill and the text trigger (isRectificationHandoffQuestion)
  are gone. The consult agent decides (RECTIFICATION_OFFER_RULE, one
  definition) and calls offer-birth-time-rectification; the server decides
  whether a card may show (self, product on, no case in progress,
  feature_pricing price). The offer is stored with the answer and travels on
  run.completed; the card hangs under that answer.
- Opening from the card binds the offer to the case in the consultation's own
  messages (no table change); GET/POST /api/rectification/cases/[caseId]/source
  find the source and go back: one divider (time changed or not), earlier
  answers captioned 按校正前的时间, and a 按新时间重新看 button that sends only
  when clicked. Auto-return after the post-adopt check or a terminal case, only
  for work done in this view.
- Model history skips the divider and notes answers written with the old time.

Full suite 4987 / fail 24, identical to 6ec8efd5 (4973 / 24), no test name
lost; tsc 0; lint 0 errors; build keeps / Static, first-load gzip +0.20%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-07 12:58:58 +08:00
jesse-uxandJesse_Chen c40f23c20e research(rectification): nadi second-level study helpers and N0 checks (BUG-1240)
Five-level Vimshottari and equal-division D150 helpers, plus a runner that
refuses to score until the preregistration file exists. First three lords
match the production chain on the v5 events. No production files changed.
2026-10-05 23:26:05 +08:00
jesse-ux 137ed6f408 fix(consult): stop the consult-gate VedAstro wait and record step timing
Consult turns reuse a same-day official snapshot inside the rectification gate, or record deferred_in_consultation instead of starting another 4-second snapshot. Classification, step 0, step 1, and the time to the first answer character go into the existing usage metadata and a new admin usage column.

BUG-1231, BUG-1232
2026-10-05 02:33:36 +08:00
jesse-ux 2c64b66423 fix(gate): keep quality-gate logs readable (BUG-1230)
Summarize successful steps, print the failing check and error text,
and split the validate job into seven steps. Local npm test stays TAP.
2026-10-04 22:58:17 +08:00
Jesse_ChenandCursor baf4ae8b34 feat(narayana-rath): follow book p.43 for dual lords and node years (BUG-1227~1229)
Independent Staging Quality Gate / validate (push) Failing after 16m17s
Independent Staging Quality Gate / publish (push) Skipped
Round-7 option A is text-first, so Scorpio and Aquarius lords, the Ketu-only degree reversal, and node exaltation years now live in the Rath display layer. Scoring files stay unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-04 18:37:34 +08:00
Jesse_ChenandClaude Opus 5.5 153c6e99eb test(report): reader annual-conflict case follows the corrected return instant (BUG-1220)
Independent Staging Quality Gate / validate (push) Successful in 13m33s
Independent Staging Quality Gate / publish (push) Successful in 3m35s
The fictional chart's 2026 return moves 08:48:04 -> 08:41:55 (PyJHora within
0.09 min); the annual Lagna crosses from Taurus 1.3 to Aries 29.6 and the
current-year lord becomes Jupiter. Not in the quick gate, so the BUG-1220
acceptance missed it. Full Python suite: 62 failures before and after,
identical lists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-04 09:03:31 +08:00
Jesse_ChenandClaude Opus 5.5 92c78d4e82 docs: astrologer rulings batch 5 records (BUG-1223~1227; T1 p.43 dual lord blocked by red line; T6 v5 re-run)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-04 08:39:53 +08:00
Jesse_ChenandClaude Opus 5.5 1dd8e11bff feat(narayana-rath): flag Wadiyar pairs as book_software_rule8_exception (BUG-1226)
Round-6 ruling Q6b: Table 25 Gemini/Sagittarius and Virgo/Pisces are the
book software's seventh-level Rule 8 special case; keep the general result
(Sagittarius, Pisces at level 5), every Rath output carries the note
(known_book_differences), test pins the two pairs.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-04 07:35:37 +08:00
Jesse_ChenandClaude Opus 5.5 57ef4560ce feat(narayana-rath): AD direction checked against p.51, book divergence listed (BUG-1225)
Round-6 ruling Q7: default by the AD start sign's odd/even (Table 13, as in
Table 25); Saturn in the MD sign -> always zodiacal (Table 11); Ketu ->
reversed (Table 14); both -> Ketu first. Each AD rule now carries
direction.book_divergence (p.47 J.S. 1.1.34; J.S. 2.4.31-32), not applied;
reference report shows one line, English twins added. Table 25 Taurus 12/12.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-04 07:35:11 +08:00
Jesse_ChenandClaude Opus 5.5 61bd4425cd feat(narayana-rath): Rahu/Ketu dignity and debilitation at level 3 (BUG-1224)
Round-6 ruling Q2: node dignity by Rath Table 9 p.41-42 (own Aq/Sc, MT Vi/Pi,
Phalita exaltation Ge/Sg), debilitated ranks below none (p.67: debilitated
Ketu weaker than Mars by Rule 3). Rath module only; natal table unchanged.
Book acceptance unchanged (15/17 general, 18 explicit 12/12, 28/30, 24/36).
Goldens recaptured (only rath.source text changes).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-04 07:33:55 +08:00
Jesse_ChenandClaude Opus 5.5 7dda1b45c3 fix(tajika): year lord blocked instead of Muntha-lord stand-in (BUG-1223)
Panchadhikari blocked -> status blocked + reason, year_lord None, sentence
「年主暂无法确定(原因)」 on card and report; Tri-Pataka blocked with it;
Mudda unchanged. Aligned with upstream 03bea6ed. Nine public charts: both
producers byte-identical before/after.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-04 07:25:48 +08:00
Jesse_ChenandClaude Opus 5.5 a6cf8f8f7a feat(tajika): annual strength layer uses the Tajika five-fold Panchavargiya (BUG-1222)
Product decision 2026-10-03: the annual Harsha / Panchavargiya strength
layer's Panchavargiya column is the same `_calc_native_panchavargiya_bala`
score the year-lord selection compares (BUG-1217): five components, score
out of 20, labelled 「Tajika 五分力量」 / "Tajika five-fold strength". The
unreachable dignity-proxy block is removed; Harsha Bala unchanged; the
combined figure stays blocked (not ruled).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 22:52:12 +08:00
Jesse_ChenandClaude Opus 5.5 01929baea6 fix(solar-return): return instant in the solver's frame, annual chart keeps seconds (BUG-1220)
Independent Staging Quality Gate / validate (push) Successful in 20m3s
Independent Staging Quality Gate / publish (push) Successful in 4m2s
The natal Sun target came from compute_chart_data while the solver iterates
on _get_sun_lon_jd (swe sidereal flags); the frames differ by up to ~17",
moving the return by up to ~7 minutes. The annual chart was also cast at the
truncated minute. Ports upstream yinduzhanxing 7cc6425d / 46ed9399 (these two
hunks only). PyJHora reference: 3 cases within 0.03 min. 243 public-figure
annual charts: annual Lagna changes 13, year lord 11, Mudda first lord 0.
v5 77 cases identical to 3c27c38e; consult goldens re-captured byte-identical.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-03 22:10:20 +08:00
Jesse_ChenandClaude Opus 5.5 bf8d704708 feat(narayana): show the Sanjay Rath version beside the legacy one (T4, BUG-1218)
Display only; scoring and timing conclusions keep the legacy algorithm.
narayana_legacy_label attaches a Rath view (seed, deciding level, direction,
24 MDs, running MD/AD) under modules.narayana_dasha.rath for the consultation
modules, full reading Step 4.13 and the CLI. Reference report: one summary
line under the legacy line plus Rath MD / running-MD AD tables (English terms
added). Evidence card: narayana_rath (label, seed sign, level, running MD) on
timing / annual cards only — other cards sit at 11,979 of 12,000 characters.
Goldens re-captured from the real engine.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 21:09:40 +08:00
Jesse_ChenandClaude Opus 5.5 735d66fd65 feat(narayana): Table 18 as a flagged book example with the explicit seed; book software-verdict and Table 25 tests (BUG-1218)
Red line 3 revised by the product owner (2026-10-03 evening, audit da95d92d):
Indira Table 18 is a book-internal contradiction. calc_narayana_rath(...,
seed_sign_idx, book_example="rath_p66_indira_ak") reproduces it 12/12 flagged
book_example_exception and carries the general rule's Capricorn unchanged.
New tests: five D1 software-verdict tables 28/30 (two Wadiyar level-5 misses
pinned), co-lords 8/10, Table 25 sub-periods 24/36 (Gemini MD 0/12 pinned).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 21:09:31 +08:00
Jesse_ChenandClaude Opus 5.5 f5d24f42d2 test(tajika): three-column note on the rewritten Mudda assertion (BUG-1216)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 21:09:31 +08:00
Jesse_ChenandClaude Opus 5.5 c41555f69e feat(narayana): Rath start-sign seven-level rule, Ketu/Saturn exceptions, AD start rule; Table 18 not reproduced, not wired (BUG-1218)
Astrologer round-5 Q1-Q4 in scripts/narayana_rath.py (frozen narayana_dasha.py
untouched). Levels 1-2 are upstream c7117f92's rath_p36_role_conjunction_v1
counting (test compares with the upstream function); Ketu reversal is the
upstream rath_ketu_table12_v1 branch; Ketu first when Saturn shares the seed.
Book tables: 15 Cancer (level 1) and 17 Pisces (level 2) reproduce; 18 gives
Capricorn at level 5, so the Indira AK example (full tie only) is never
reached -> red line 3: no T4 wiring, no T5 trial.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 21:09:31 +08:00
Jesse_ChenandClaude Opus 5.5 1c39988b3c feat(tajika): year lord compared by the Tajika five-fold Panchavargiya (BUG-1217)
Ports _calc_native_panchavargiya_bala and its helpers verbatim from upstream
yinduzhanxing c7117f92 (astrologer round-5 Q5). calc_panchadhikari_year_lord
now scores candidates with it (engine tajika_native_five_fold); the
D1/D2/D3/D9/D12 dignity proxy no longer selects a year lord, and a missing
annual planet blocks instead of falling back to it. Basis note reads
「按 Tajika 五分力量」 / "by Tajika five-fold strength".

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 21:09:31 +08:00
Jesse_ChenandClaude Opus 5.5 9d81f15afa feat(tajika): Mudda Dasha from natal Moon nakshatra + completed years, not the year lord (BUG-1216)
Ports calc_mudda_with_dasha_balance verbatim from upstream yinduzhanxing
c7117f92 (astrologer round-5 Q7). tajika_mudda.annual_mudda_dasha is the one
product entry for solar_return_full_report, cmd_tajika and full-reading
Step 9; periods are cropped to the Varsha year and carry months for the
month-window consumers. The consultation card re-anchors the engine's dates.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 21:09:31 +08:00
Jesse_ChenandClaude Opus 5.5 693467bf0c fix(consult): card carries the engine's short Narayana label; AD/PD drop derivable years (BUG-1215)
The full note pushed steve_jobs/marriage to 12,028 characters (budget
12,000), and cutting it in the card broke the 'nothing rewritten' contract.
The engine now also writes algorithm_label 旧算法(从上升起、一律顺行), the card
copies it verbatim, and Narayana AD/PD rows drop years (end_age - start_age).
Largest card 11,979 (baseline 11,983). Goldens re-captured; the biography
golden now keeps the Narayana label keys too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 16:48:19 +08:00
Jesse_ChenandClaude Opus 5.5 9eb22f6363 feat(narayana): label the product Narayana as the legacy algorithm (T4, BUG-1215)
Round-4 ruling Q4 / product decision A: scoring and the consultation and
report time axes keep the old Narayana (from the Lagna, always zodiacal) until
the Rath trial is decided; every user-visible Narayana now says so.
narayana_legacy_label adds profile=legacy_reference_only and the note (zh/en)
at the consumers (consultation modules, full reading Step 4.13, CLI), not in
the frozen narayana_dasha.py (ERR-110/115). The card's timing.narayana carries
'algorithm'; the projection allowlist passes algorithm_note; the reference
report's Narayana section and the dasha-family table show '算法:…' (English
twin in the phrase table). The unused narayana-dasha --variant-profile flag,
the one place offering a Chara Dasha author's profile for Narayana, is removed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 16:42:15 +08:00
Jesse_ChenandClaude Opus 5.5 7cb332bce6 feat(narayana): Sanjay Rath profile replayed against the book tables; not wired (BUG-1215)
Round-4 ruling Q4. scripts/narayana_rath.py builds the Rath sequence from the
rule ledger and book rows ported verbatim from upstream yinduzhanxing c7117f92
(sanjay_rath_narayana_book_ledger JSON + md, chara_narayana_book_golden_cases):
Table 10 order (Saturn -> Table 11, Ketu -> reversed), years by
jaimini_odd_footed_dignity_v2 with jaimini_dual_lord_source_v1, ADs twelve
equal parts from the MD sign (Table 13 / 11 / 14), start sign by the existing
select_narayana_seed_sign, ties reported as parameter_sensitive with both
sequences.

Given the book's start sign, Tables 15 / 17 / 18 match 36/36 MD signs and
years. The start sign does not: Table 17 picks Virgo (book Pisces), Table 18
ties (book Cancer). Task red line 2: the profile stays out of every
user-visible surface and out of scoring; T5 trial not run. A test pins that no
script imports it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 16:36:31 +08:00
Jesse_ChenandClaude Opus 5.5 0afcc2d9a3 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
2026-10-03 16:30:28 +08:00
Jesse_ChenandClaude Opus 5.5 bc03bba26b fix(yoga): D9 debilitation only weakens Pancha Mahapurusha (BUG-1213)
Round-4 astrologer ruling 2026-10-03 Q1: the yoga stays formed with
d9_dignity_modifier='weakened' and the reason 'D9 落陷,兑现减弱'; only a failed
D1 condition is not_formed. The D9 sign is derived from the longitude when the
caller does not pass navamsa_sign, so the card, report and /api/pancha_mahapurusha
paths all check it. None of the nine public celebrity charts change.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 16:18:06 +08:00
Jesse_ChenandClaude Opus 5.5 9392f0601b chore(rectification): re-freeze research records for astrologer rulings batch 1 (ERR-110); scores unchanged, no version bump
scripts/jaimini.py (BPHS 8-karaka order), scripts/ashtakavarga.py (calc_sodhita_av
removed) and scripts/shadbala.py (local house score renamed and dropped from the
result) are in the frozen production identity. Records re-frozen under the label
astrologer_rulings_batch1_2026_10_03 (--freeze, then replay; PYTHONHASHSEED=0,
chart cache TTL 0); the upstream_sync5 records become 'previous', byte-for-byte
preserved. Replays identical to upstream_sync5: reported offset 0 of 900 trials
changed, sealed holdout 20 trials and metrics identical. v5 77-case evaluation
unchanged (see PROGRESS). ALGORITHM_VERSION stays rectification-v5-matrix-scoring-10.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 15:00:46 +08:00
Jesse_ChenandClaude Opus 5.5 b1185c63ac fix(yoga): full-reading yoga re-run passes the retrograde flag (T1 follow-up, BUG-1207)
Nine-figure check: Judy Garland's report said Bhadra 'combust within 14°' while
the card said 12° (retrograde Mercury). The full reading builds cmd_yoga's
planets string without retrograde; an optional 5th field 'R' now carries it.
Test pins report vs consultation reductions on that public chart.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 14:56:05 +08:00
Jesse_ChenandClaude Opus 5.5 eb00b0f70f feat(tajika): label the year lord as a Muntha-lord stand-in for Panchavargiya (T9, BUG-1212)
Astrologer ruling 甲11. Muntha stays natal Lagna + completed years (test pins it on
the main path; muntha.calc_muntha_from_sun_sign is imported nowhere). Panchavargiya
is not implemented (native producer blocked). Consultation annual layer gains
varshesha_basis '暂用 Muntha 主星;占星师口径为 Panchavargiya,待接入' (card keys and
the workflow allowlist carry it); reader report 'Selection basis' row says the
same in both annual sections (zh/en).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 12:50:21 +08:00
Jesse_ChenandClaude Opus 5.5 b0329ef03e fix(dignity): Rahu/Ketu have no own sign; yoga main path uses fixed Scorpio/Aquarius lords (T5, BUG-1211)
Astrologer ruling 甲12. jyotish_engine._get_dignity_level drops the Rahu-Virgo /
Ketu-Pisces OWN_SIGN clause (fed the D1 status column, Vimsopaka and
varga_dignity); no node exaltation/debilitation added. yoga_engine.YogaContext
resolves Scorpio -> Mars and Aquarius -> Saturn by default (as the lord chain,
functional roles and frontend SIGN_LORDS do); _stronger_co_lord and
RAHU_KETU_OWNED_SIGN_INDEX stay for Jaimini variants (dynamic_co_lords=True) only.
narayana_dasha co-lord rules unchanged. Separate commit so it can be reverted alone;
v5 / reported-offset results in PROGRESS.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 12:47:12 +08:00
Jesse_ChenandClaude Opus 5.5 6feb1a4aaa feat(bhava-bala): reports use the formal three components; local +2/-1.5 score hidden (T4, BUG-1210)
Astrologer ruling 甲13. shadbala.calc_bhava_bala renamed calc_local_bhava_score and
removed from calc_shadbala's result (it fed the report's Bhava Bala table). New
bhava_bala.bhava_bala_from_chart (Bhavadhipati = lord's Shadbala virupas, Bhava
Dig, Bhava Drishti; equal houses as /api/bhava_bala; total and total_rupas; the
module's invented level bands not shown) drives modules.bhava_bala in the full
reading. Reader table: Bhavadhipati | Dig | Drishti | Total (Virupa) | Total
(Rupa); reference edition table and wealth/summary lines read the formal totals.
Other users of the local score: none outside shadbala.py (remedies and health
narrative read Shadbala rupas only).

Changed assertions (three columns in PROGRESS): test_shadbala_complete local-score
tests renamed; test_report_longform_gaps2 fixture rows and heading.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 12:45:58 +08:00
Jesse_ChenandClaude Opus 5.5 ea78804b78 feat(ashtakavarga): standard Sodhita chain on reports and cards, raw values beside (T7, BUG-1209)
Astrologer ruling 乙8. New scripts/ashtakavarga_shodhana.py: per BAV row Trikona then
Ekadhipatya (the two existing ashtakavarga functions, previously only called by
tests), Sodhita SAV = sum of reduced rows; occupied signs = seven grahas. Removed
calc_sodhita_av (Sun/Mars/Saturn contribution removal labelled 'BPHS标准').
Wired into /api/ashtakavarga (result.sodhita, house_scores[*].sav_sodhita) and the
full reading. Reader: SAV table 'Sodhita SAV | Raw SAV', house table gains
Sodhita column, Sodhita BAV table before raw BAV; reference edition section
rewritten. Card: sav_sodhita before sav_score plus sav_columns label. Personal
report facts: score = Sodhita, rawScore/savRawTotal beside (optional schema
fields). Fact tables: Sodhita column and Sodhita BAV subtable. Transit scoring
unchanged (raw bindus).

Golden: report-density-fictional-engine.json leaf worksheets.strengths_and_scores
.ashtakavarga recaptured from the real engine (scripts/research/refresh_density_
fixture_ashtakavarga.py); bav/sav identical, every other leaf byte-equal.
Changed assertions (three columns in PROGRESS): BUG-1200 house-table tests,
report-fact-tables ashtakavarga columns/subtables, run_all t1/t57.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 12:41:26 +08:00
Jesse_ChenandClaude Opus 5.5 5fdf2f7498 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
2026-10-03 12:30:19 +08:00
Jesse_ChenandClaude Opus 5.5 de79390175 fix(yoga): Pancha Mahapurusha has one main detector; combust/afflicted only reduced (T1, BUG-1207)
Astrologer ruling 甲5. scripts/pancha_mahapurusha.py is the only detector: kendras from
the Lagna; retrograde no longer cancels; combustion (shared orb table), malefic
conjunction and malefic graha drishti (Sun 7, Mars 4/7/8, Saturn 3/7/10) mark the
yoga reduced with reasons; D9 debilitation still cancels when navamsa_sign is given
(current behaviour, ruling silent, asked next round). _detect_yogas now passes the
Sun's longitude (combustion was never checked). mahapurusha_*, *_own, moolatrikona_*,
hamsa_trikona (Jupiter 1/5/9, not classical) and bvr_maalavya_yoga are reference_only;
yogas_doshas.calc_pancha_mahapurusha_yoga is kept as reference_yogas only. The rule
engine appends main-detector rows; cmd_yoga rows now carry lon + retrograde so the
report and card get the same combustion verdict. Card label lists 部分减弱 reasons.

Changed assertions (three columns in PROGRESS): self-conjunction tests (malefic in
same sign: invalid -> reduced), run_all t31/t32 (combust/retro: invalid -> reduced /
full), run_all t54 (evaluated rules >= 400 -> evaluated + reference_only >= 400).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 12:26:22 +08:00
Jesse_ChenandClaude Opus 5.5 6916bbaecc fix(yoga): Kemadruma has one main detector; lunar/solar neighbour yogas count five planets (T2, BUG-1206)
Astrologer ruling 甲7: yoga_expansion.detect_kemadruma is the main detector (2nd/12th
from the Moon count only Mars..Saturn, no kendra cancellation, nodes in kendras do
not cancel). kemadruma_yoga (ky2 kendra cancellation) and kemadruma_variant (nodes as
neighbours) are reference_only; YogaEngine.detect appends the main row.

BUG-1187 omission: the algorithmic _detect_solar_lunar_yogas block still counted the
Sun, Moon and nodes, so Ketu next to the Moon gave 'Anapha Yoga' beside Kemadruma
(Taylor) and Sun/nodes gave Durudhura beside Sunaphaa. Both blocks now count the
five true planets. divisional_yoga compared a 'house' key vargas never carry (always
'isolated') and counted the Sun; it now uses sign adjacency and the same five.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 11:40:54 +08:00
Jesse_ChenandClaude Opus 5.5 df21e591e8 fix(yoga): Neecha Bhanga lists the conditions that hold, never Raja Yoga (T8, BUG-1205)
Astrologer ruling 乙14. One condition source, yogas_doshas.calc_nicha_bhanga_raj_yoga
(conditions A-F, now also structured). New scripts/main_yoga_detectors.py turns it
into yoga_engine-shaped rows (zh + en twins) that YogaEngine.detect appends; the
four neechabhanga_* rules are reference_only (kept, renamed, not evaluated).
Card: traditional_yogas canonical 落陷取消(Neecha Bhanga) with 成立条件; compact
yoga entries keep conditions/reductions. Report: category 落陷取消, mixed group,
not raja; personal-report alias neecha_bhanga -> special.

Changed assertion (test_consultation_yoga_detection_merge): canonical name
'Neecha Bhanga Raja Yoga' -> '落陷取消(Neecha Bhanga)' (ruling 乙14).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 11:38:52 +08:00
Jesse_ChenandClaude Opus 5.5 0cf2249e6b fix(jaimini): 8-karaka order follows BPHS ch. 32 (PiK 5th, DK 8th) (T6, BUG-1204)
KARAKA_8 put Putrakaraka 5th, Darakaraka 7th and Pitrukaraka 8th. BPHS ch. 32
order with Rahu counted is AK, AmK, BK, MK, PiK, PK, GK, DK. Test pins the
table and a public AA chart (Steve Jobs, Raman, mean nodes) plus the reader
report's live 8-karaka rows. jaimini.py is in the frozen rectification identity;
re-freeze follows in a separate commit (rectification does not read karakas).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 11:33:16 +08:00
Jesse_ChenandClaude Opus 5.5 ae18952e51 fix(report,chart): blank columns — drop Kranti, split Ashtakavarga house SAV, ascendant nakshatra, engine varga dignity, no duplicate charts (BUG-1199..1203)
Independent Staging Quality Gate / validate (push) Successful in 15m27s
Independent Staging Quality Gate / publish (push) Successful in 3m42s
- Report p33 table: no Kranti column (no producer; materials.kranti stays blocked).
- Report p53 table: the "SAV" column was the with-Lagna total (386). Split in the
  reader into SAV / Lagna BAV / SAV + Lagna with a totals row; ashtakavarga.py is
  untouched (frozen rectification identity, ERR-115).
- /api/chart ascendant carries nakshatra / pada / lord (_nakshatra_fields shared with
  the nine bodies); chart cache schema 4 -> 5.
- /api/varga_full bodies carry dignity_level from varga_dignity_level, the function
  the Vimsopaka path now shares (A/B identical); the chart page shows the D1 status
  wording and no longer derives a three-level dignity itself.
- Report page draws each chart once: the trailing block skips charts the body already
  fenced (same rule as the export); the birth-time caveat moves under the body's
  chart heading.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-03 09:11:15 +08:00
Jesse_ChenandClaude Opus 5.5 90dcafe71d test(rectification): keep reviewed privacy-collision lines in place (BUG-1193 follow-up)
test_repo_privacy_markers pins two reviewed numeric collisions in
test_rectification_v5_services.py by line number; the R1 three-column note
replaced the now-stale C2 comment on the same line instead of adding one.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 00:36:56 +08:00