Commit Graph
920 Commits
Author SHA1 Message Date
Claude 995a723bbb merge codex/up-books-1107 into upstream-full integration 2026-11-07 14:44:04 +08:00
ClaudeandClaude Opus 5.5 96be1174df feat(consult): sentence-level book citation index + search_jyotish_books tool
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
2026-11-07 14:43:43 +08:00
Claude 60560ed0f0 merge codex/up-engine-1107 into upstream-full integration 2026-11-07 14:43:36 +08:00
Claude 619316e667 merge codex/up-annual-1107 into upstream-full integration 2026-11-07 14:43:00 +08:00
ClaudeandClaude Opus 5.5 8ed5b5f3c9 feat(engine): port upstream skill calculation fixes into the engine (BUG-1699)
- affliction_evidence / career_semantic_profile / career_analysis (functional
  roles, affliction signals, user-industry gate)
- sade_sati.build_saturn_cycle_timeline with bisected ingress moments
  (FLG_SIDEREAL frame, BUG-1275)
- Chesta profile candidates and PL9 AV cell profile as sidecars
  (shadbala.py / ashtakavarga.py stay frozen, ERR-110)
- Raman Sahams in the annual pack; book rule packets + admission gate
- consultation_native_layers: affliction_evidence, career_analysis,
  sade_sati_timeline, shadbala_chesta_profiles, book_rules,
  annual_tajika.raman_sahams

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 14:42:54 +08:00
ClaudeandClaude Opus 5.5 0f8c0508bc feat(annual,synastry): run the astrologer's tajika-annual and full-synastry skills in full
Annual (产品 2026-11-07 占星师方案 item 9):
- package: optional current-city return location (default birth place, disclosed);
  annual Shadbala; Varsha Narayana (PVR ch.30.4 port of the upstream entry on the
  product's Rath Narayana); transit_context with Sade Sati phase, natal
  Ashtakavarga of each slow ingress and slow-body Vedha; not_included updated
- report_facts: year overview carries Sahams by domain, Panchavargiya/Harsha,
  annual Shadbala, Tajika aspects, Varsha Narayana; phases carry Varsha MD/AD and
  Sade Sati; ingress events carry BAV/SAV; audit rows split (Transits, Sade Sati,
  Transit AV, Vedha, Sahams, Annual Shadbala, Varsha Narayana) and consistent
- writer: full layer (both natal tracks per domain, Mudda/Patyayini four layers,
  year chart) instead of the plain layer; professional rules: evidence first,
  terms explained, dual-track timing, A/B/C confidence capped by the program,
  parameter_sensitive/blocked kept; Tajika yogas stay non-factors (3509ccd7)
- page: current-city picker, evidence/timing/confidence lines

Synastry:
- writer gets relationship_promise and pair_promise_links; four event classes
  with both-person activation (Vimshottari, Narayana, transits); calendar
  overlap is not resonance; English timeline carries parallel timing and the
  resonance gate; profile_gate/delivery_readiness enforced; same ayanamsa for
  both; sections follow customer-report-shape.md; source_modules not truncated

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 14:42:26 +08:00
Claude 89bcafa5e6 merge codex/up-card-1107 into upstream-full integration 2026-11-07 14:32:17 +08:00
Claude 91d2aca3c1 merge codex/up-rectify-1107 into upstream-full integration 2026-11-07 14:32:16 +08:00
Claude 2fff56704b merge codex/upstream-skill-full-1107 into upstream-full integration 2026-11-07 14:32:16 +08:00
ClaudeandClaude Opus 5.5 27838f6969 feat(consult): put the astrologer's full data on the evidence card
产品 2026-11-07 占星师方案:回答模型拿到完整数据 (plan items 4-6, 8 and
second-half 3-8).

Engine (scripts/consultation_native_layers.py), new native layers read from
existing producers only:
- kp_placidus: jyotish_engine.cmd_kp (KP ayanamsa, Placidus, cusp-to-cusp),
  cusp sign/star/sub/sub-sub lords, ABCD significators, whole-sign comparison,
  houses the running Vimshottari lords signify
- dasha_systems: running MD/AD/PD + applicability for Vimshottari, Narayana
  (with dates from engine ages), Chara/Sthira/Drig/Shoola/Niryaana
  Shoola/Navamsha/Lagna Kendradi, Yogini, Kalachakra, Ashtottari (strict
  gate), Tribhagi (MD only), the conditional set; others not_available_yet
- special_points (compute_chart_points), transit_detail (Tara/Chandra Bala,
  Sade Sati), yoga_conditions, strength_detail (Avastha, Bhava Bala),
  card_parameters

Card: base.parameters, base.timing.dasha_systems / transits_detail,
base.natal yogas_detail / strength / jaimini / functional_afflictions;
per domain route table, KP, special points, wealth D10/A10/Bhava Bala,
career AK, parents D4. Lookup gains kp_placidus and special_points.
Size budgets raised with 原值/新值/原因 comments; golden fixture recaptured.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 14:27:46 +08:00
ClaudeandClaude Opus 5.5 a09037c668 feat(rectification): run the astrologer's own method beside chart choice
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
2026-11-07 14:24:01 +08:00
ClaudeandClaude Opus 5.5 9cfc823e2e fix(dasha): astrologer second ruling — Drig uses Narayana years, Ashtottari decided by the Rahu gate, Sthira variants kept apart (BUG-1676, BUG-1677, BUG-1678)
Independent Staging Quality Gate / validate-frontend (push) Successful in 5m9s
Independent Staging Quality Gate / validate-python (push) Successful in 5m49s
Independent Staging Quality Gate / publish (push) Successful in 2m50s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-07 14:05:06 +08:00
ClaudeandClaude Opus 5.5 6a57faacdb feat(consult): run the astrologer's upstream skill in full (BUG-1696, BUG-1697, BUG-1698)
- 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
2026-11-07 14:02:26 +08:00
ClaudeandClaude Opus 5.5 16457906f9 fix(dasha): astrologer rulings — strict Ashtottari gate, Sthira full Brahma, Drig years pending (BUG-1676, BUG-1677, BUG-1678)
Independent Staging Quality Gate / validate-frontend (push) Successful in 5m18s
Independent Staging Quality Gate / validate-python (push) Successful in 5m52s
Independent Staging Quality Gate / publish (push) Successful in 2m49s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-07 13:10:31 +08:00
ClaudeandClaude Opus 5.5 9bce1d6b1f feat(synastry): symmetric Rajju / Vedha flags and cross-chart relationship-point links (BUG-1681)
Independent Staging Quality Gate / validate-frontend (push) Successful in 4m58s
Independent Staging Quality Gate / validate-python (push) Successful in 5m45s
Independent Staging Quality Gate / publish (push) Successful in 2m46s
- 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
2026-11-07 12:48:36 +08:00
ClaudeandClaude Opus 5.5 e66b4dec5f feat(synastry): each person's relationship promise in the dossier and appendix (BUG-1680)
Independent Staging Quality Gate / validate-frontend (push) Successful in 5m20s
Independent Staging Quality Gate / validate-python (push) Successful in 5m52s
Independent Staging Quality Gate / publish (push) Successful in 2m48s
`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
2026-11-07 12:38:18 +08:00
ClaudeandClaude Opus 5.5 c081fbe00d fix(report): R/C column and Vimshottari balance start (BUG-1674, BUG-1675)
Independent Staging Quality Gate / validate-frontend (push) Successful in 5m14s
Independent Staging Quality Gate / validate-python (push) Successful in 5m48s
Independent Staging Quality Gate / publish (push) Successful in 2m45s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-07 12:00:13 +08:00
ClaudeandClaude Opus 5.5 228df0f7fb feat(ephemeris): personal month calendar on 星历 (BUG-1666, BUG-1667)
Independent Staging Quality Gate / validate-frontend (push) Successful in 5m12s
Independent Staging Quality Gate / validate-python (push) Successful in 5m48s
Independent Staging Quality Gate / publish (push) Successful in 3m27s
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
2026-11-07 00:44:37 +08:00
ClaudeandClaude Opus 5.5 2028d7fdf7 feat(report): 「大运传统参考」 from the astrologer's bilingual nine-lord text (yinduzhanxing 058c4f5f)
Independent Staging Quality Gate / validate-frontend (push) Successful in 5m8s
Independent Staging Quality Gate / validate-python (push) Successful in 5m55s
Independent Staging Quality Gate / publish (push) Successful in 3m9s
- 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
2026-11-06 21:48:09 +08:00
ClaudeandClaude Opus 5.5 fd3737359f test(report): coverage contract against the upstream export; Shattrimshatsama reference table; keep an empty Tajika presence section
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
2026-11-06 21:48:09 +08:00
ClaudeandClaude Opus 5.5 163b139f5a feat(report): annual chart numeric data with return time, ascendant, Muntha, year lord and houses (upstream parity)
Independent Staging Quality Gate / validate-frontend (push) Successful in 5m11s
Independent Staging Quality Gate / validate-python (push) Successful in 5m52s
Independent Staging Quality Gate / publish (push) Successful in 3m1s
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
2026-11-06 18:28:12 +08:00
ClaudeandClaude Opus 5.5 6f10cce7ae fix(report): Avastha state names follow the calculator; nakshatra dasha context as in the upstream export (BUG-1661)
- 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
2026-11-06 18:25:02 +08:00
ClaudeandClaude Opus 5.5 2d03842765 feat(report): Prastara, Avastha and Goel Jaimini detail in the appendix (upstream parity)
Independent Staging Quality Gate / validate-frontend (push) Successful in 5m16s
Independent Staging Quality Gate / validate-python (push) Successful in 5m44s
Independent Staging Quality Gate / publish (push) Successful in 2m49s
- 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
2026-11-06 17:55:14 +08:00
ClaudeandClaude Opus 5.5 4a937ff0e4 fix(report): name the Shadbala components; add Vimsopaka and varga-ruler detail (BUG-1660)
- 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
2026-11-06 17:50:54 +08:00
ClaudeandClaude Opus 5.5 9351b0b633 feat(report): Lagna Kendradi, Niryaana Shoola sub-periods and non-applicable conditional dashas, as in the upstream export
Independent Staging Quality Gate / validate-frontend (push) Successful in 5m20s
Independent Staging Quality Gate / validate-python (push) Successful in 6m3s
Independent Staging Quality Gate / publish (push) Successful in 3m28s
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
2026-11-06 17:39:39 +08:00
ClaudeandClaude Opus 5.5 81f1ab45d6 fix(report): yoga participants, nine-body transits, four restored sections; opening and appendix parity (BUG-1657..1659)
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
2026-11-06 17:23:21 +08:00
ClaudeandClaude Opus 5.5 8f83eb2c25 fix(report): Kalachakra uses the classical sign periods from the Moon longitude (BUG-1656)
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
2026-11-06 17:23:21 +08:00
ClaudeandClaude Opus 5.5 8de8f3d45c fix(tajika): sync the astrologer's 3509ccd7: oppositions, no factor promotion, annual cases back to template (BUG-1655)
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
2026-11-06 16:26:46 +08:00
ClaudeandClaude Opus 5.5 3a6f09815d feat(rectification): history, current result first, mini charts, all cards open (BUG-1654)
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
2026-11-06 15:58:19 +08:00
ClaudeandClaude Opus 5.5 4e9430c48b feat(annual): exact Jupiter / Saturn aspect instants as a fact table, no orb, not in windows (BUG-1653)
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
2026-11-06 15:23:17 +08:00
ClaudeandClaude Opus 5.5 2bbf984017 fix(tajika): port the nine-yoga Tajika authority and instantaneous applying test from yinduzhanxing (BUG-1652)
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
2026-11-06 15:23:17 +08:00
ClaudeandClaude Opus 5.5 a8548673f6 feat(annual): read each phase per domain and per track, and use the user's declared birth range (BUG-1650)
Independent Staging Quality Gate / validate-frontend (push) Successful in 4m58s
Independent Staging Quality Gate / validate-python (push) Successful in 5m41s
Independent Staging Quality Gate / publish (push) Successful in 2m40s
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
2026-11-06 14:14:41 +08:00
ClaudeandClaude Opus 5.5 ba6aa2413b fix(rectification): ask for a range only when the profile has none, and save it back (BUG-1649)
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
2026-11-06 13:36:32 +08:00
ClaudeandClaude Opus 5.5 c1a69445b5 refactor: retire event-scored rectification backend (BUG-1644)
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
2026-11-06 02:40:28 +08:00
ClaudeandClaude Opus 5.5 97afd1716a feat: chart choice replaces event-scored rectification page
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
2026-11-06 02:06:17 +08:00
ClaudeandClaude Opus 5.5 e2c61f1a9a fix(consult): carry the next dasha periods on the card for long-range questions (BUG-1643)
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
2026-11-05 23:59:05 +08:00
ClaudeandClaude Opus 5.5 2d65773c06 fix(annual): no 顺/紧 verdicts, wording slips no longer stop a report, a waiting card shows the step (BUG-1640)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXozbkyFNqbu8pVEtZ7W
2026-11-05 22:07:01 +08:00
ClaudeandClaude Opus 5.5 f4f38f1a54 fix(annual): no more 有顺有紧; windows and 年尾 get the program's lean (BUG-1635)
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
2026-11-05 17:45:38 +08:00
ClaudeandClaude Opus 5.5 7827d9aff0 chore(rectification): re-freeze after the BUG-1622..1626 renumber (ERR-110)
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
2026-11-05 15:35:31 +08:00
ClaudeandClaude Opus 5.5 093da4468d docs: renumber this branch's records BUG-1613..1617 -> BUG-1622..1626
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
2026-11-05 15:32:05 +08:00
ClaudeandClaude Opus 5.5 7174fda7a9 refactor(arudha): move the PVR dual-lord selector into scripts/arudha_reference/ (BUG-1617)
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
2026-11-05 15:31:51 +08:00
ClaudeandClaude Opus 5.5 3c81ebf3cf chore(rectification): re-freeze sealed holdout and offset sweep for the #166 2026-11-05 labels (ERR-110, BUG-1613..1617)
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
2026-11-05 15:31:43 +08:00
ClaudeandClaude Opus 5.5 008201aec1 feat(arudha): opt-in PVR §15.5.1 dual-lord selector for Scorpio / Aquarius Arudha (BUG-1617)
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
2026-11-05 15:31:43 +08:00
ClaudeandClaude Opus 5.5 6e10c7242e docs(moolatrikona): label the in-varga D9 Moolatrikona as pending; correct the V.P. Jain provenance (BUG-1613)
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
2026-11-05 15:31:43 +08:00
ClaudeandClaude Opus 5.5 1c298c7257 fix(yoga): strict Gajakesari no longer counts a natural-malefic Mercury as a supporter (BUG-1615)
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
2026-11-05 15:31:43 +08:00
ClaudeandClaude Opus 5.5 8eeac79ad2 feat(shadbala): label provisional / pending #166 conventions, share the Mercury rule (BUG-1613, BUG-1614)
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
2026-11-05 15:31:43 +08:00
ClaudeandClaude Opus 5.5 3e7388c37f feat(narayana): default to Sanjay Rath, keep the legacy algorithm as a labelled comparison (BUG-1601, #166 Q9)
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
2026-11-05 04:32:07 +08:00
ClaudeandClaude Opus 5.5 013f889529 chore(rectification): re-freeze sealed holdout and offset sweep for #166 batch 2 at scoring-15 (ERR-110, BUG-1590..1598)
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m25s
Independent Staging Quality Gate / validate-python (push) Successful in 6m30s
Independent Staging Quality Gate / publish (push) Successful in 3m3s
FREEZE / REPORT constants first, --freeze, then replay:
astrologer_166b_2026_11_04 (frozen after 7ff447ac); contract rotated with
previous = astrologer_166_2026_11_04 (kept byte-for-byte).

Versus astrologer_166_2026_11_04 (no tuning):
- sealed 20: all identical, metrics unchanged.
- reported offset 900: 114 changed; top-1 hits at +-15/30/60 stay 4/3/0;
  top-3 30/34/29 -> 31/34/30; delivery coverage at +-15 220 -> 219; mean
  top-1 minute error 20.87 -> 20.52.

BUG-1590..1598 recorded; ledger and CHANGELOG lines added.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-04 22:42:41 +08:00
ClaudeandClaude Opus 5.5 7ff447ac67 fix(engine): keep the Chinese report free of English glue from #166 triggers and cell notes (BUG-1596, BUG-1597, BUG-1590)
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
2026-11-04 22:39:15 +08:00
ClaudeandClaude Opus 5.5 f61d279aec fix(rectification): bump scoring identity to scoring-15 for #166 batch 2 (BUG-1590)
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
2026-11-04 22:29:06 +08:00