产品 2026-11-07 同步占星师 Yoga 规则批次:
- lord(a) != lord(b) guard on ten two-lord rules (raja 1_4, 1_10, 4_9, 5_9,
7_9, 2_10, 2_7; dhana 5_11, 2_5; kalatra 7_1); Jobs raja_yoga_1_10 and
Presley dhana_yoga_2_5 no longer form, matching her output.
- 23 rules become structural_observation "(Observation)" rows; old effects
move to traditional_effects; engine rows carry claim_kind, legacy_name,
condition_evidence, strength 'observation', strength_basis.
- formation contracts + assess_yoga_formation, formation_checks /
formation_assessment / strength_factors on every JSON-rule row;
participants_expr support; natal yoga context chart_type D1.
- consultation: compact rows, sieve hits and yoga_conditions carry
claim_kind / formation / formation_checks; observation status is
structural_observation; card yogas_detail copies them plus formation_rule.
- reports: personal report never lists an observation as a formed
combination; annual facts rank observations last and the evidence lists
them under 结构观察, not 格局; PL9 tables print 结构观察 for strength /
category and group observations as mixed.
- governed rules (BUG-1207, 1205, 1187/1206, 1596/1624, 1597/1625, 1571)
untouched; Parvata stays disabled; 69 not_implemented unchanged.
- card golden recaptured.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Ported from handoff/product-parity-20261107 (28823446, 99076dad):
- Ashtottari: cycle index counts from the balance-shifted first MD (no
gap before the 108th birthday); dasha_balance_at_birth / dasha_at_birth /
timeline_basis now emitted (the report already read them).
- Bhava Chalit MC in the natal frame (_bhava_midheaven_in_natal_frame).
- Narayana current lookup: no modulo replay outside the two generated
cycles; status selected / outside_generated_timeline.
- Bhava Bala: no unvalidated absolute level; _meta.score_unit = Virupas.
- Field names lined up with hers: required_strength_pct (+ semantics
marker, via shadbala_display sidecar; shadbala.py stays frozen),
Harsha missing_inputs / score_range, cmd_yoga evaluation_error_count.
Already equivalent: yoga failures (BUG-1571), Drik determinism (BUG-1576),
standalone transit ephemeris path, Chara dignity location (BUG-1566), Harsha
max 20 / unknown day-night. Tests: tests/test_handoff_99076dad_sync.py.
Golden recaptured (Narayana status field only).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Astrologer third-round review 2026-11-07, item 2. With is_daytime unknown
the fourth Harsha component is None (status unknown), the total is
withheld and only the known three-component sum (out of 15) is given.
The annual pack, report facts, interpretation rows and the parity
strength table carry the incomplete state instead of a full score.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Three-way parity audit 2026-11-07 (U ea2a9d65 / F frozen / P f70ae94e):
- Vimsopaka: look vargas up by "D{n}_" prefix (D60 key was misspelt, every
D60 fell to Neutral) and score only the sign-owner relation (upstream
ab5b8709, BPHS 7.21-27). All 16 varga scores now equal U on 3 charts.
- Narayana: age = total_seconds / (86400 x 365.25) keeping the birth time
(upstream ab5b8709); Rath rows carry start_date / end_date from the
unrounded ages; consult layer, report facts, API and calendar read them.
- Ascendant degree_raw / lon unrounded (engine and chart API).
- position_mode label: legacy is the apparent frame since BUG-1275; the
profile and module labels now say "apparent" (legacy still accepted).
- Functional profile label v2 -> v3_166q4 (the table actually used).
- full-reading Sade Sati uses the dated transit Saturn (upstream e628118d):
Jobs 2026-11-07 peak, owner / Obama not active, as U.
Consult evidence card golden recaptured.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
- KP monthly support read the birth-balance lord every month (no current_dasha in the issue #137 timeline); now the running lords, matching upstream
- ported prediction_verdict_matrix.py and references/rectification_evidence_contract_v1.json (the contract was always blocked as file missing)
- English audit statuses run / not_run written as Ran / Not run (run is also a packet key)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
产品 2026-11-07 占星师方案 (item 4/5/6/8/10): the report reading and the export follow her skill.
- reading_facts v2 contract: birth parameters (no name/coordinates), 12 houses with KP cusps,
functional roles and natural-vs-functional conflicts, per-domain vargas (wealth D2+D11+D10,
A2/A11/A10; career D10+A10, AK/AmK; marriage D9+UL, A7/DK), special points, Jaimini, yogas as
candidates with conditions, Vimshottari to PD + Narayana with dates (birth date + age) and the
legacy variant, every dasha family's current period/status, transits from four reference points,
Sade Sati, double transit, strengths, KP, annual, technique audit, evidence paths, method
differences, blocked / parameter_sensitive / withheld states
- consult card facts: multi-varga domains, A2/A11/A10/AK/A7 participation, D1 varga resolves,
yoga path fixed, Narayana ages; KP is conditional (参数敏感) instead of 不参与
- report writer: professional prompt (evidence first, A/B/C, dual-track timing, status labels),
ninth section 依据与边界 (stored reading v2; v1 still reads), Latin allowed, longer limits
- export: technique audit chapter (Functional Benefic/Malefic, MEVG / Global Web Evidence,
Real Case Calibration rows), parameter/method differences, dasha system status, evidence
boundaries and the D1–D60 ledger (20 formal + 40 research D-N); upstream
varga_evidence_matrix / generic_varga_research_audit + registries ported so the ledger is no
longer blocked
- ordinary projection no longer deletes technique audit / MEVG / 参数敏感; parameter_sensitive
is relabelled 参数敏感
- quality gate: upstream technique_audit_table check restored, plus required-row check
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
- 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
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
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
The personal report now uses the astrologer-approved names, matching the
chart page and the consult prompts since 7a56840f (issue #163 Q5): MD 大运,
AD 小运, PD 细运. Old names replaced in code-rendered text only: 主运 / 主大运
-> 大运, 子运 / 分运 / 副运 (AD) -> 小运, 次子运 / 次小运 / 再小运 and the
fact table's PD 小运 -> 细运. PD strings were converted before AD, and AD
before MD.
Covered: the focus card and its export text, the raw fact tables, theme
claim cards, the timing interpretation pack, the PL9 full-data export
(tables, dasha prose templates, AD/PD density anchors), rashi / Narayana
second level, KP monthly focus, orchestrator texts and technique-audit
rows. English translation keys follow the new Chinese labels
(大运 = Mahadasha, 小运 = Antardasha, 细运 = Pratyantardasha), and a new test
pins that no English mapping reads 小运 as the third level.
The five-level monthly sample table used 细运 for Sookshma; it now shows
Sookshma until the astrologer names the fourth level.
Saved reports are not migrated. Focus fences render from md/ad/pd codes,
and stored fact tables validate by structure, so old and new labels both
open. Goldens were updated in place and two hash pins re-pinned; reverting
only the term swap reproduces the old hashes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
read_full_data_domain deep-copied the shared worksheets on every call; a long
report reads five domains twice, so ten copies for read-only use. The shared
part is now copied once (full_data_domain_base) and reused for every domain's
facts and their leaf check; each domain's facts are still copied out so domains
share no objects. Long reports byte-identical on four fictional charts; with
#121, -24–29% end to end.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoz1Qk3y9buDv1mkmTu
"Longevity" in the canonical yoga table broke the BUG-1210 lifespan wording
test. Sections other than the dasha boundary scan must carry a table, so a
fixed sentence cannot pass as packet data.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HwMNZEzdzmrbPhuRNmZe3C
Removing the English-to-Chinese back-translation left every BVR semantic
note and every yogas_doshas raj/dhana "H*_Lord(...) in H*" sentence as
未判定 in the Chinese yoga table and pages.
- yoga_engine: semantic conditions return BiText(Chinese, old note). The
Chinese comes from references/yoga_semantic_notes_zh.json, one sentence per
note, so dedup keeps the same equality classes. English-only custom
templates get the same lookup. combination_en is unchanged.
- yogas_doshas: raj/dhana rows add combination_zh; combination is unchanged.
- chinese_combination prefers a clean combination_zh.
Which yogas fire, their strength and category are unchanged (fictional
charts 0-19, same rows as staging; only set-iteration order differs).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HwMNZEzdzmrbPhuRNmZe3C
Eleven sections printed one-column tables of 未判定 and packet key names
(summary, p5, stats ...). They now read the nested records: KP profile and
ruling planets, Tara/Chandra combined rows, lagna vargottamamsa flags, LL/7L
P5/P8/exchange checks, Yoga Pinda planets and summary, Sodhita BAV totals and
Ekadhipatya audit, friendship method and bodies, multi-reference houses,
double-transit PAC targets, congregation houses, seven/eight karaka tables.
Argala, Birth Calendar, Tithi, Tajika candidates, Goel dignity and yoga
categories no longer print bare lower-case keys or enums either.
The six chapters are now ## and their sections ###, so the reader counts
six more chapters instead of seventy.
Tests: a section passes only with a real value outside the label column; no
table cell may be a raw key; heading counts equal the base report plus six.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HwMNZEzdzmrbPhuRNmZe3C