Owner order 2026-11-07 (astrologer plan item 2): metadata-only catalog and rule citations in git; full texts and passage index stay local (gitignored). POST /api/book_citations and a bounded consultation tool with chart condition check.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Product order 2026-11-07: birth-time rectification follows the astrologer's
skill (yinduzhanxing 5fb8379c) in full. The chart-choice page stays; her
method is added as a stage and both results are shown side by side.
- scripts/chart_choice/astrologer.py, POST /api/chart_choice/astrologer:
minute-by-minute scan of D1/D2/D3/D4/D7/D9/D10/D12/D20/D24/D30/D60
(D60 reference only), ascendant nakshatra/pada, KP sub-lord, A7/UL/A10;
her five stages (intake, appearance/birthmark screens, event verification
with Vimshottari MD/AD/PD + Narayana MD/AD per event and the >=5-event
gate, D9/D10 trait correction, report); her 40/35/15/10 scoring, match-rate
tiers (80/60), report confidence (90/70) and engine confidence; family
(六亲) event categories; D30 only with health-type events; Gochara blocked;
our 77-case backtest caveat on every result.
- active_rectification_questions.py synced to upstream (question_bank,
bindings, workflow_status), local adaptations marked LOCAL, accepts an
in-process minute_scan.
- Frontend: /api/chart-choice/astrologer and an AstrologerStage step,
reachable from the result, the no-line case and the current record.
- Consultation reads the other version for domains kept 「两版都读」
(provenance now records other_saved_at).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
- root SKILL.md is her upstream file (body byte-identical to the 5fb8379c mirror; description quoted so YAML parses and Mastra can load the skill)
- chat binds the whole SKILL.md plus references/product_runtime_contract.md (safety-only) instead of a ~477-character excerpt
- every turn carries her full strict-workflow-router (synced to upstream) and the domain's event-judgment file; product lists follow as an extra layer
- import her 10 sub-skills, family router, interpretation status contract, technique ontology and the 54 files her method names
- tests/test_upstream_skill_parity.py (in the quick gate) fails whenever her skill and ours drift
- 18 frontend guards that locked the excerpt design updated with 原值/新值/原因 notes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
- marriage_match keeps Rajju (same group) and Vedha (paired) as flags, which
read the same either way round; Mahendra, Stree Deergha and the in-law
star rules are recorded as not used (gender-directed / in-law risk).
- pair_promise_links lists where one person's 7th lord, UL, DK, A7 or Moon
sits in the other's ascendant, Moon or Venus sign (same sign or 1-7 axis).
- Appendix shows both.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXp2su8Vzqv3jNvkCSqt
`relationship_promise` reads both full charts: 7th lord and 7th-house
occupants, Venus and DK with sign, house, dignity and functional role; UL
with its lord, occupants and the 2nd from UL; D9 ascendant, D9 7th lord and
Venus in D9 (vargottama). Missing charts stay `not_available`. The appendix
adds one promise line per person under their structure line.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXp2su8Vzqv3jNvkCSqt
The 星历 page gets a month calendar for the chosen person: every day is
吉 / 平 / 凶 with two or three life themes from transits against their own
chart, the selected day opens to its themes and "为什么", and below it
「接下来要留心」, 「这几天」 and 「回看」 (owner, 2026-11-07: A's grid plus
C's lower half).
Engine: scripts/personal_calendar.py joins existing calculators on one
date axis (one call, <0.5 s for 45 days): Panchanga in the subject's own
ayanamsa, Tara / Chandra bala, Moon house from Lagna and Moon,
Ashtakavarga SAV + Moon BAV, transit conjunctions with natal points,
functional benefic / malefic, activity verdicts with native inputs,
ingress / station / combustion / eclipse / Vimshottari AD+PD boundaries,
and a month backdrop (Vimshottari MD/AD/PD, Narayana, Sade Sati / Kantaka,
slow-graha contacts, Jupiter+Saturn double transit). New endpoint
/api/personal_calendar.
BUG-1666: check_activity_muhurta ignored Vishti karana, Vyatipata /
Vaidhriti and an avoided Chandra bala, so a Vishti day could be 大吉.
BUG-1667 (closes BUG-703 / BUG-707): /api/panchanga_range now honours the
requested ayanamsa; the day view asks for the subject's own and drops the
Lahiri note.
Frontend: /api/ephemeris/month (own rate-limit bucket, cached),
/api/ephemeris/checks + migration 20261107010000_ephemeris_day_checks
(answers kept with the birth declaration they were made under). Copy is
life-first with the sky events folded under 为什么; draft wording pending
the astrologer. TASK-ephemeris-page decisions 4/6 and hard lines 3/7/9
superseded per the owner; DESIGN.md §16 updated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXozbkyFNqbu8pVEtZ7W
- Sync references/mahadasha_editorial_bilingual.json (9 lords x 3 paragraphs,
zh + en, per-paragraph source locators) and mahadasha_editorial_policy.md,
plus the one-line pointers in SKILL.md and vimshottari_dasha_guide.md.
- New chapter after 大运解释 in both editions: the three paragraphs side by
side (general / traditionally supportive / traditionally strained), never
picked by lord or chart, Mahadasha layer only; source labelled as secondary
study notes with the original edition pending verification; English only
in the English edition.
- Coverage contract: the topic moves from NOT_CARRIED to the checked list.
No change to the frozen exporter, dates or any scoring.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
Product: turn the upstream coverage audit into our own automated check.
- scripts/report_render/upstream_coverage.py maps 140 upstream topics to our
zh/en sections and checks presence, real content, key columns (transit
sign, yoga participants, Shadbala components, Kala Chakra signs) and
degraded markers. NOT_CARRIED records the 4 topics we do not ship and why.
It also runs as a CLI on any exported report.
- tests/test_report_upstream_coverage_contract.py runs it on two fictional
charts in both editions, checks the contract itself, and proves it flags a
bad report. The 2026-11-05 export gives 15 findings; today's gives 0.
- Fixes the contract found: Shattrimshatsama gets the opt-in reference table
like the other conditional dashas; a year without a Tajika yoga keeps its
section with one sentence instead of dropping it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
Each annual chart now opens with its local return time, annual ascendant,
Muntha and year lord; every body gets its whole-sign house from the annual
ascendant, longitude and degree in sign.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
- BUG-1661: Avastha states were translated by the general glossary, which had
Young as 青年期 and Youth as 壮年期 (the calculator says 少年期 / 青年期) and
left Old, Dina, Sabha and others in English ("Deep 睡眠"). One table taken
from the calculator's enum comments now names them in the report body, the
appendix and the frontend fact table. The Python export also uses a comma
for simultaneous Deeptadi states in English (BUG-1391 fixed only the
frontend).
- Nakshatra dasha context: natal Moon nakshatra, the current MD and AD lords'
nakshatras and Taras, and the nakshatra of each AD lord in the MD. Both
Ashtottari applicability rules are listed; when they disagree the report
says no ruling has been made.
Frontend: report-fact-tables.test.ts assertions updated with 原值/新值/原因.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
- Prastara: per-planet table of the eight contributors' bindus by sign; the
columns add up to the BAV.
- Avastha inputs: each planet's state in the five systems with its basis and
method (BPHS rule / simplified rule); Chinese state names come from the
module's own meaning text, no new glossary.
- Goel Jaimini: planet parts (Mooltrikona, Karaka, Kendriya, Kartari,
Adhipati, malefic contacts) and sign parts (permanent, Karaka, Sthana,
aspect, lord strength).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
- BUG-1660: the six Shadbala columns used generic labels (合计 / 内容 / 分数 /
年数 / 落座度数 / 容许天数). They are now Sthana, Dig, Kala, Cheshta,
Naisargika and Drik, with totals, the BPHS minimum and the ratio, plus Sthana
and Kala sub-part tables. Values are unchanged.
- Vimsopaka: per-varga dignity, points, weight and weighted score.
- Divisional mapping: per-varga sign, sign lord and sign-only dignity
(Moolatrikona inside vargas awaits BUG-1622, so it is not marked).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
Product decision 2026-11-06: follow the upstream export for these tables.
- Lagna Kendradi: upstream profile kendradi_narayana_duration_candidate_v1
(Lagna sign, then kendra / panaphara / apoklima order, Narayana sign years,
the same years Drig uses). Major periods only; labelled as not checked
against a book example.
- Niryaana Shoola: sub-periods forward from the MD sign, twelve equal parts;
the research chapter adds the third level. Labelled: PVR gives no separate
rule, comparison only.
- Conditional dashas whose classical gate fails (Satabdika, Shodashottari,
Dwadashottari, Dwisaptatisama, Panchottari, Chaturshitisama) get a separate
reference copy with the existing standard-table profile. The reading's own
modules stay not_applicable, so consultation, convergence and
rectification are unchanged; the report states the unmet condition.
Tests that locked the old omissions are updated with 原值/新值/原因.
Pre-work ledger: notes from this session (restore, CRLF files, baseline failures).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
Compared against the upstream customer export of 2026-11-05.
- BUG-1657: detected yogas carry the planets the rule bound (structured
evaluators, solar/lunar rows, loop-free custom expressions via AST; an
`or` over different planets names nobody). The report lists participants
and current-Dasha overlap instead of 未判定.
- BUG-1658: the dated transit table reads transit_positions, so all nine
bodies have sign, degree, speed and retrograde.
- BUG-1659: Navamsha AD durations, current convergence (12 houses), Pancha
Pakshi and Rashi Tulya Navamsa are put on the worksheet and rendered;
Pancha Pakshi uses the birth weekday instead of always Sunday.
- Opening: timeline (next PDs, Narayana current period) and career /
finance / relationship evidence (house lords, AmK/DK, A10/UL, D10/D9/D2/D11)
under 「重点」, then a reading guide. The focus card stays under the title
(BUG-1316).
- Traditional supportive practices are wired to the remedies module (reference
only, mistranslations fixed, duplicate table removed).
- Appendix: Argala per-source detail, nakshatra reference with lord, gana,
degree and KP sub-lord, and verified calculation notes.
tests/test_full_data_parity_chapters.py: the four "public gap" sections now
must carry real cells (原值/新值/原因 in the test).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
The full reading and the dasha registry called the Kalachakra module without
the Moon longitude, so BUG-1487's PVR ch.24 sign periods never ran in the
product. The report printed the legacy approximation (planet lords, 7..18
years) under a "simplified model" label.
Both callers now pass the Moon longitude. The dasha family carries
method_profile. Classical results keep their own AD/PD rows instead of the
rotated simplified table, and the reader and research tables list signs.
The PyJHora comparison was rerun: majors now agree, sub-period division still
differs (documented).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
From yinduzhanxing branch codex/local-web-verification-20261026 (remote SHA checked):
- kernel: a 180-degree opposition keeps its 180 target (it was matched as 0);
exact and equal-speed states are no longer called applying or separating
- named-yoga authority rows carry source_review_status and
factor_promotion_allowed: false; the annual year-chart layer honours the
flag, so no Tajika yoga (Ithasala / Easarapha included) becomes a factor
- the five annual oracle cases go back to template_only (archived text kept);
the dashboards no longer claim annual closure
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Every save keeps a record (chart_choice_records via chart_choice_adopt_v3);
the page opens on the current result with its time scale and the history
list, a past record can be adopted again while the birth declaration is
unchanged. Comparison cards are all open with a 60px mini chart per side
following the north/south board setting. Saving shows one toast.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXozbkyFNqbu8pVEtZ7W
Exact contacts are roots, not windows: the instant Jupiter (120/180/240)
or Saturn (60/180/270) stands at its Parashari aspect angle from a natal
point, by the transit scan's daily sampling and bisection. Passes of one
retrograde loop form one sequence; a station that only approaches the angle
is never listed. The report card exact_contacts carries them for review
(used_for_windows: false); no influence window until the astrologer sets one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
The product still ran the 2026-09-03 two-yoga version, so Nakta, Yamaya,
Manahoo and Kamboola showed as blocked. Port yinduzhanxing fb8fe915: the
governed draft and authority (nine yogas), the kernel's applying/separating
by instantaneous relative speed, the rule record (author corrected to
P.V.R. Narasimha Rao in this copy) and the upstream tests. In the annual
year-chart layer every Tajika connection is marked source_review: pending;
only Ithasala / Easarapha still produce factors until the rules are reviewed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Astrologer ruling 2026-11-06 (two rounds) on the annual defaults:
- no 2/2/1 weighted lean and no tie rule; mahadashas are background;
Vimshottari and Narayana are read per domain; a lord enters a domain only
through houses it owns or occupies (same rule for benefics and malefics);
the Narayana sign only marks a theme as active; summaries never reach past
the judged domains (部分领域可判断); 平稳 is not produced, a repeat of the
previous phase reads 延续前一阶段的主题
- phases are never merged in the calculation; today splits the running one;
timeline rows merge only by reading_group and keep inner dates
- windows need one shared domain; ranking by sources, date certainty and
conflict; sky events must touch a report domain; Jupiter / Saturn
Parashari sign aspects (5/7/9, 3/7/10, same sign apart) to each domain's
natal objects, as relations only
- no confirmed/unconfirmed switch (product: same method for everyone): the
range the user declared at intake is sampled and every change bisected to
the minute, through natal chart, vargas, special points, dasha dates, solar
return, year chart and Mudda / Patyayini; windows keep the whole range the
dates can fall in, never a "core date"
- year-chart factors in four layers (relation, Tajika connection, limits,
Panchavargiya capability), never a verdict; Rath method version stamped and
unresolved branches give no direction; maraka recorded, never scored
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Old 0/0 profiles show no range in the form instead of 最早 = 最晚. The page's
range question uses an even 2x2 grid with parallel labels; saving writes the
picked range to the declaration and adopts the minute in one transaction
(chart_choice_adopt_v2). A ±60 min range is compared without narrowing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXozbkyFNqbu8pVEtZ7W
Remove the V5 scoring pipeline, dynamic rectification, minute-rectification
evaluations and the research scripts built on them, plus their API routes.
Keep the upstream skill layer (gate, questionnaire, active events), the
varga-segments scan and the consult range reading (moved to
scripts/birth_window_range_reading.py).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXozbkyFNqbu8pVEtZ7W
Event scoring was measured at chance level on the 77 Rodden-AA holdout
cases (BUG-1091). The new flow finds the dividing line nearest the reported
time, describes how the flipped divisional charts read on either side, asks
up to five self-assessment questions, and saves the user's own choice
(provenance user_choice) with the domains to read in both versions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXozbkyFNqbu8pVEtZ7W
A ten-year career question got a timing section that stopped at the running
Vimshottari mahadasha and the running Narayana sign, so the answer padded the
decade with "no period available" sentences and could not compare the systems.
- API: dasha_sub_periods.next_mahadasha (next MD cut by the same
dasha_analyzer.build_antardasha); frozen engine files untouched.
- Card: every card carries the next MD and next Narayana sign; a question
that looks N years ahead also gets timing.horizon, the next MD's
antardashas, later MDs inside the horizon and two to four Narayana signs
with years, all copied from the engine.
- Goldens: only the new engine field grafted in (rest byte-identical).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
Lean v2 is a weighted sum (AD 2, Narayana AD 2, PD 1; a tie follows the
Vimshottari AD) with only 偏顺 / 偏紧 / 平稳. Phases with both sides keep a
counterweight limit. Window, domain-window, year-end and remember evidence
carry the lean; the gate rejects mixed wording and a window lean that
contradicts the program.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXozbkyFNqbu8pVEtZ7W
The renumber (093da446) changed comments in shadbala.py and both replay
scripts, so the frozen identity moved. On top of staging 849343cd:
FREEZE / REPORT constants first, --freeze, then replay:
astrologer_166d_2026_11_05; contract rotated with previous =
astrologer_166c_2026_11_05 (kept byte-for-byte).
Versus astrologer_166c_2026_11_05 and astrologer_166b_2026_11_04: sealed 20
and reported offset 900 all identical, metrics and summary identical,
historical changed_trial_count 10 / 731. Still scoring-15; no tuning.
BUG-1622 records the second re-freeze.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
Another session shipped a different BUG-1613 (loading curtain) to staging.
Mapping in order: 1613->1622, 1614->1623, 1615->1624, 1616->1625,
1617->1626, in BUG_HISTORY headings and bodies, CHANGELOG, ledger, research
notes, code comments, rule text, test notes and the holdout contract text.
Text only. shadbala.py and the two replay scripts are in the frozen identity,
so an ERR-110 re-freeze follows in the next commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
The quick gate's tests/test_python_hygiene_budget.py caps root scripts at 441
("locally written files must not increase"); the new module made it 442.
Moved to the subpackage scripts/arudha_reference/pvr_dual_lord.py; CLI
import tries both import styles; tests, BUG-1617 and the status table updated.
No frozen file touched; behaviour unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
shadbala.py (frozen identity) changed in 5ffef30a: labels, comments and the
shared mercury_malefic_companions() helper, no value change. Scoring identity
stays rectification-v5-matrix-scoring-15; no ALGORITHM_VERSION bump.
FREEZE / REPORT constants first, --freeze, then replay (after all code
commits of this branch, 09fd3a42): astrologer_166c_2026_11_05; contract
rotated with previous = astrologer_166b_2026_11_04 (kept byte-for-byte).
Versus astrologer_166b_2026_11_04, trial by trial:
- sealed 20: all identical; metrics identical (top-1 0.40, top-3 0.45, mean
minute error 6.95); historical changed_trial_count still 10.
- reported offset 900: all identical; summary identical (top-1 hits at
+-15/30/60 4/3/0, top-3 31/34/30, delivery coverage at +-15 219, mean top-1
minute error 20.52); historical changed_trial_count still 731.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
Astrologer 2026-11-05 (#166 comment 39249, item 3; Q28). New module
scripts/arudha_lord_selection_pvr.py, reference only, labelled
"PVR 双宫主比较(参考,未进默认)".
- select_pvr_arudha_lord(): PVR Vedic Astrology: An Integrated Approach
§15.5.1 (print pp. 201-203, PDF 213-215), first deciding level wins:
1 only one lord in the sign -> the other; 2 companions (nine grahas, the
Lagna excluded, nodes counted); 3 Jupiter / Mercury / dispositor support by
conjunction or rasi drishti, a planet in two roles counted twice; 4 exalted;
5 dual > fixed > movable; 6 degree, nodes as 30 - deg. Returns winner or
blocked (full tie, dual-lord dispositor loop, missing longitude), both
candidates, the deciding level and a trace; engineering choices listed.
- pvr_arudha_reference(): default fixed-lord pada next to the PVR pada for
the houses on Scorpio / Aquarius, using jaimini.calc_arudha_pada_for_house
(the one pada implementation) with the chosen lord's longitude.
- CLI `jaimini` (mode all / arudha) gains arudha_dual_lord_pvr_reference.
Default A1-A12 / AL / UL, the chart page, the consultation card and
rectification scoring do not use it; jaimini.py and the Chara co-lord
selector are untouched (byte check against the frozen identity in tests).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
Astrologer 2026-11-05 (#166 comment 39249, item 1). No calculation change.
- jyotish_engine.VARGA_MOOLATRIKONA_BASIS = in_varga_degree_band_pending_review:
a D9 Moolatrikona is decided by the in-varga degree inside the D1 band;
whether / how Moolatrikona applies in vargas is pending. Written on each
d9_navamsa_expanded row (moolatrikona_basis) and on the consultation D9
summary (not copied to the evidence card).
- "V.P. Jain example" corrected to "PyJHora test transcription"
(pvr_tests.py::shadbala_VPJainBook_tests, no edition or page) in the data
audit notes and the competitive analysis (ERR-081 recurrence).
- astrologer_questions.md: status table of the seven 2026-11-05 items.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
Astrologer 2026-11-05 (#166 comment 39249, item 6): PVR §11.6 strict
definition needs a benefic supporter; a Mercury that is malefic by
association must follow the chosen natural-nature rule.
- New sandbox helper mercury_malefic_companions() calls
shadbala.mercury_malefic_companions (the one implementation of
MERCURY_NATURE_CONVENTION: same sign as Sun / Mars / Saturn / waning Moon,
nodes excluded), imported lazily; no import cycle.
- gajakesari: Mercury is dropped from benefic_links when malefic; when Venus
still supports, a trigger names the excluded Mercury.
- gajakesari_strong_jupiter_variant: its "strict does not hold" check uses the
same rule, so the two rules stay mutually exclusive; the variant itself uses
no supporter.
- Labels: natural (not five-fold) enmity for the enemy-sign test and the Moon
excluded as a supporter are both pending astrologer review.
yoga_engine.py / yoga_rules.json are not in the frozen identity.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
Astrologer reply 2026-11-05 (#166 comment 39249). Labels, comments and one
shared helper; no value changes.
- method_variants.saptavargaja_moolatrikona = d1_degree_band_only_provisional:
BPHS 27.2-4 (Santhanam p. 265) confirms 45 and extends it to the other six
vargas; "D1 only, degree band" is a provisional implementation, not BPHS.
The "V.P. Jain example" is a PyJHora test transcription (ERR-081).
- method_variants.drik_mercury_jupiter = quarter_only_raman_pending, with the
1x / Santhanam-literal 1.25x / Raman 1/4 readings documented; no additive
variant added.
- MERCURY_NATURE_CONVENTION renamed to say the node exclusion is an
implementation choice (the base text lists Rahu / Ketu as malefics) and the
waning Moon is included; the p. 28 translator's note is not adopted.
mercury_malefic_companions() is now the one implementation of the rule
(classify_drik_planets calls it; the yoga engine will too).
- 26.11-12 special aspects: citation Santhanam p. 256 added; endpoint tests at
+/- 0.01 around 150 / 210 / 270 and the round(angle, 2) snap.
shadbala.py is in the frozen identity: ERR-110 re-freeze follows in a separate
commit after the remaining code changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
Product decision 2026-11-04 on astrologer ruling #166 Q9. One builder,
narayana_legacy_label.product_narayana, makes the product Narayana object:
the Rath view on top (label "Sanjay Rath 版(默认;…)", seed sign, 24 MDs,
running MD / AD with remaining_years, the running MD's ADs) and the whole
labelled legacy result under `legacy`. When Rath cannot decide a start sign
the object says blocked in plain words; legacy never stands in.
- Consultation card: timing.narayana is Rath; the legacy running MD rides
as a short timing.narayana_legacy; timing.narayana_rath is gone.
- Full reading / report: Rath block first, "- 对照:旧算法…" after; the
parity chapter lists Rath (default), source-aware and legacy (comparison);
dasha master pack Narayana periods are the Rath MDs.
- /api/dasha narayana: periods are Rath, legacy under `legacy`.
- Annual: Rath is the product timeline (used_by_product_timeline true),
narayana_skeleton_profile "rath", legacy is the reference and never counts.
- CLI narayana-dasha prints Rath first, legacy as comparison.
- Consult full-data cache schema v2 -> v3 so old legacy-default packets miss.
Rectification scoring is untouched and still calls calc_narayana_mahadasha
(frozen identity). Evidence-card, biography and card-facts captures were
regenerated with their scripts; annual-report-facts.json was regenerated from
its endpoint function. Tests pinning legacy-as-default are rewritten with
原值/新值/原因.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Quick gate: test_report_english_sweep_smoke counted 3 zh_han_function_glue
hits on chart #1, all new in 4b223eb8: the Matrunasa 199 trigger "Moon ->
Mercury -> Moon in house 8" (the renderer turns "house" into Chinese and
leaves "in") and the English ambiguous_cell_notes ("Lagna lord, ...").
- A custom rule's trigger item may be a (Chinese, English) pair; the Chinese
combination uses the Chinese items, combination_en and `triggers` the
English ones, `triggers_zh` the Chinese. Gajakesari, the variant and both
Matrunasa rules emit pairs (PLANET_ZH in the sandbox).
- ambiguous_cell_notes carry Chinese summary / basis plus summary_en /
basis_en, worded without the glue words.
No role or score changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
4b223eb8 makes Gemini Saturn (8, 9) and Virgo Saturn (5, 6) functionally
mixed; the *_functional_* rules read the functional layer, so the same input
scores differently for those ascendants. Per BUG-1181:
rectification-v5-matrix-scoring-14 -> -15. Policy v4, input contract v5 and
the dated window contract unchanged; the SQL guard already accepts it.
- Memoization golden v8 (source_commit 4b223eb8); v7 pinned by sha256. This
public request's candidate scores are unchanged.
- scoring-15 cross-midnight golden (independent-process A/B 3 x 7 equal);
scoring-14 golden kept as history and opens read-only with recompare.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8