test_python_hygiene_budget forbids new root-level scripts/*.py; the brief named
scripts/muhurta_search_api.py. Same code at scripts/ondemand_calc/muhurta_search.py;
route, CLI import and tests follow.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
transit_date counted house_from_moon from the transit Moon when the caller gave
no natal Moon; the natal reference is now only what the caller supplied.
resolve_profile now refuses an unsupported ayanamsa name instead of passing it
to the engine.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
- career layer gets the D1 longitudes, so the paksha has one source (Obama
base vs career mismatch fixed)
- card carries movable_lagna_moon.reason, Narayana ad_status / ad_reason and
the mahadasha cycle_index; running line says "sub-period undecided"
- engine keeps the MD when the AD is undecided; timingFollowing skips
zero_duration rows explicitly
- timingKeys allowlist: adstatus / adreason / cycleindex / zeroduration
- fixtures + capture script, 16 engine tests, 7 card tests, PROGRESS, BUG-1812
Co-Authored-By: Grok (agent loop)
Owner 2026-11-09: the R2 widening is on hold until the astrologer rules on it.
STRENGTH_SCOPE_DEFAULT returns to seed_only_v0. All R2 code stays: local
propagation, the selected / equal / unresolved statuses, and
seed_ad_start_p43d_v1 as a named non-default profile. profile_config and the
cache keys record strength_scope = seed_only_v0. R1 and R3 are unchanged.
Tests that pinned the widened scope now pass it explicitly, with
原值 / 新值 / 原因 notes. Evidence-card golden recaptured (TTL=0; only the
profile labels changed).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Found in the round-7 cross-branch check: on public charts (Zidane, Obama)
the Neecha Bhanga row never reached yogas_detail. The compact detector entry
dropped formation_evidence, and the row sat past the 30-row cap. Keep the
witness fields when compacting and never cut a row that carries them (the
cap stays 30). The card's Narayana method_status also dropped the engine's
profile_config (timing key allowlist); carry it through.
Evidence-card golden recaptured with TTL=0 (Obama: row 30 is now Neecha
Bhanga); the load-dependent VedAstro closure reason is kept as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
The high-rigor path overwrote can_apply with the technique contract's
confirmation_allowed, so a passing external validation could turn a
low-confidence or provisional engine result into an applicable one.
Both must now agree; otherwise the contract continues rectification
with local_engine_cannot_apply.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Raw totals are only compared when every candidate computed the same
(event, layer) evidence units. Otherwise winning_segment stays the raw
leader (provisional_leader) and comparable_leader re-ranks over the
units all candidates share; a missing unit is dropped for everyone,
never scored 0. The live stage Python engine now skips an event whose
Narayana is unavailable instead of scoring it 0, repeated facts count
once, and the stage labels an unequal-coverage leader as provisional.
占星师 2026-11-08 验收清单 §6 / §9 / §10.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
- R1: default AD direction rath_p50_md_parity_v1 (start parity kept as a research
profile); full profile config + algorithm version on every Narayana output, cache
keys (consult, api chart, probes, long report, synastry) and the rectification run.
- R2: one strength profile at the seed, AD start and p.43 (d); selected / equal /
unresolved kept apart; unresolved nodes block only what depends on them (seed
candidates kept, dated MDs before an unresolved length kept, AD-only loss in
rectification keeps the MD).
- R3: Neecha Bhanga witness fields (reference, relative_house, self_reference,
independent_confirmation_allowed, self_reference_only) from the main detector to
the evidence card yogas_detail rows; self-reference-only never counts as support.
- Sync her b54812c3 KP clock validation; port her round-5 / round-6 tests.
- BUG-1783..1787; golden recaptured with TTL 0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
- seed rath_highest_occupant_dignity_v1 (named convention; equal tier below own sign blocks the seed)
- AD direction profiles rath_p50_md_parity_v1 / rath_stronger_lord_start_parity_v1 (default, pending choice)
- Saturn+Ketu in seed / MD sign blocked; PyJHora Ketu priority only as named reference profile
- 0-year MD rows flagged, never current, skipped on the annual timeline; years profile rath_table8_phalita_dignity_v1
- KP DBA year_days 365.25 default, parent/AD/full/visible fields, boundaries equal main Vimshottari
- functional profile pvr_table30_v1 (aliases), Moon-only blocked without paksha; profile through API,
cache keys, audit; rectification asserts one profile per run
- golden recaptured with TTL=0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
The first exact-boundary format printed local clock times; a generated
hour:minute collided with a private marker the repo scan forbids. Boundaries
are now start_ts / end_ts (UTC epoch seconds) beside the engine's local days;
no time string is printed. Goldens recaptured (evidence card TTL=0).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
- BUG-1758: the card's affliction layer is a source ledger: one entry per fact
with its input, effect (conflicts / not_executed) and every house it bears
on; a fact shared by two houses is one source, never two votes.
- BUG-1763: output acceptance after the one repair: a professional answer
without the Technique Audit Table, or any answer without the engine audit
rows (plain mode's evidence entry), fails as incomplete (kept text, no charge).
- BUG-1752: engine rows carry exact local start/end with UTC offset, parent
start, cycle, and a meta block (365.25-day years, zone, [start, end)); the
chart page copies them. Tests: midnight crossing, birth balance, second
cycle, zero-length rows and 0-year Narayana / Chara MDs never current.
- Goldens recaptured (evidence card TTL=0; chart-view dasha from the engine).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
- BUG-1758: the model card drops affliction_evidence.houses.*.signal_count
(backend field kept); S-09, the pressure basis line and the professional
voice name the sources and never a count.
- BUG-1763: a professional answer that stopped on its own without the
Technique Audit Table gets one table-only continuation.
- BUG-1764: the backtest harness passes the answer mode (agent context,
user-turn shape, length continuation); CONSULT_BACKTEST_ANSWER_MODE=plain.
- BUG-1752: /api/chart carries dasha.antardasha_timeline from
chart_dasha.birth_moment.sub_period_timeline; the chart page copies the
engine AD/PD rows and no longer cuts periods by year proportions.
- Goldens: chart-view golden dasha recomputed from birth_moment; evidence-card
golden recaptured with TTL=0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Product approved 2026-11-08 (astrologer round-5 rulings 1, 3; same basis as
the report and the chat card):
- functional roles: drop the bphs_exception_profile pin at the three scoring
call sites (+ research mirror); default pvr_table_30 with Moon paksha.
- Narayana: narayana_rath.calc_narayana_rath (two cycles) / antardasha, ages
via narayana_age from the candidate birth moment; probes date from the birth
moment. A blocked source step makes the layer unavailable, never the old
algorithm. Blocked count on all three datasets: 0.
- Reseal: sealed 20, offset 900, live v5 231 under the new tag; identical to
measurement variant (c) trial by trial. float_split / 166d kept.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Combines BUG-1741..1743 (Narayana named profiles) with BUG-1746..1752
(PVR functional table, Shadbala, KP first segment, Mudda wording).
BUG_HISTORY entries kept in number order; runtime contract keeps the
round-5 Mudda sentence and the profile-based Narayana rule; evidence-card
golden recaptured with TTL 0 / PYTHONHASHSEED=0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
- Functional default = PVR Table 30 (functional_profile=pvr_table_30); the former
product table is bphs_exception_profile, scored only when named (rectification
names it, scores unchanged). profile_divergence shows both roles side by side;
movable-lagna Moon by the table's paksha note; dual-lordship note; prior rulings
BUG-1570/1590/#166 Q4 checked against Table 30.
- Shadbala: six open items labelled parameter_sensitive; every option combination
computed; only planets whose pass/fail flips get minimum_check=parameter_sensitive.
- Vimshottari AD/PD rows carry parent_period_start / visible_period_start; the
consult card cuts the balance MD from its full parent and clips at birth.
- KP DBA: full first parent, clipped at birth (no balance rescale).
- Mudda: balance fields + balance_method (angle default, time comparison apart),
nominal_year_days, her crossing wording; Harsha combined blocked reason lists items.
- D30 _meta describes the unequal parts (as her r40).
- Golden recaptured with TTL=0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Astrologer round-5 ruling 1 (2026-11-08, B3/B4): seed, years, dual lord,
AD direction and start are separate named profiles (Sanjay Rath source
version). Each comparison profile is recomputed with one step swapped; the
step is disputed when the running MD/AD changes, blocked when the source
cannot decide. method_status names exactly those steps with her round-5
sentence; B3/B4 open item removed. Undecided years now block the layer.
The narayana-dasha CLI passes the birth moment. Engine values on the three
public charts are unchanged; Drig and rectification scoring unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
The r2 re-eval showed 14/70 answers naming 起运/年数 as this chart's
undetermined step, copied from the open-item sentence, while the card said
unknown or ad_direction. The sentence now names no step and says not to
infer one. Golden recaptured with TTL=0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
- BUG-1729 (P0): the execution receipt capped methodologySections at 12 while
the loader allows 32; a wealth turn delivers 14 and every receipt failed.
The cap now lives in consultation-methodology-limits.ts and both read it;
a sweep of all 2509 domain combinations x 3 questions passes the receipt.
- BUG-1730 (tooling): the offline model-input manifest moves to
tests/helpers (scripts must not import tests, BUG-1140); the fact-checker
reads the timing route's nested slow_transits.
- BUG-1731: the card carries the engine's calendar_year (both Tajika years
and the splitting return); runtime contract rule A-08 (her Q2).
- BUG-1732: narayana_method_status names the undetermined / disputed step
(seed, years, dual_lord, ad_direction) from the engine, "unknown" when it
cannot; B3/B4 recorded as open; chat_use single_system_candidate /
no_judgment; her Q1 sentence in the contract; B-02 rewritten.
- BUG-1733: the conclusion's first sentence answers the question; the
frozen time range follows it (her Q5).
- Golden recaptured with TTL=0 (method_status; VedAstro offline reason is
environment-dependent).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Sealed 20 and reported-offset 900 rerun with the protocol's own scripts
(exported from c1a69445^, baseline reproduced 166d 20/20 and 900/900),
overlay recorded in the .patch. Old 166d records kept. Live astrologer
stage v5 77x3 sensitivity script added. Sensitivity numbers, not accuracy.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Product approved 2026-11-08. _active_vimshottari, the candidate context
timeline, chart_choice astrologer and every event_probes Vimshottari start
now use birth_moment.mahadashas from the candidate birth moment and
birth_moment.split_period for AD/PD, replacing build_dasha_timeline
(00:00 of the birth date) and the integer-day build_antardasha. Frozen
dasha_analyzer.py / domain_calculation_service.py unchanged. Research
mirrors follow. A bare date string now raises TypeError.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
8th part lordless; night starts from the lord of the 5th weekday; Gulika at
the start of Saturn's part; weekday from the period start. PVR Table 10 /
PyJHora order kept as a named alternative profile; Maandi midpoint marked a
separate method not approved by the ruling. Kaala / Mrityu / Artha Praharaka /
Yama Ghantaka move on 12 of 14 rows; Saturn's part unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
(a) raw_periods / raw_antardasha_periods untruncated (ten groups);
(b) nominal_year 365.25 d and its end; (c) coverage_interval = actual solar
return -> next actual return. periods is the view over (c) (原值: cut at the
365.25-day end, 5-15 min before the next return). Annual package, report facts
and consult card carry the view label and the astrologer's crossing-segment
wording; consult layer adds the calendar-year span over two Tajika years.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Tables unchanged in value (equal to PyJHora const and PVR Table 10); the
lordless-share position (BPHS 8th vs PVR after Saturn) is recorded as an open
ruling; 14 weekday x day/night cases tested.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
reference_transparency_contract: birth-moment MDs + birth_moment.antardashas
instead of the date-anchored frozen service + integer-day build_antardasha.
KP monthly: elapsed years from the full-precision MD start (total_seconds).
birth_moment.split_period: generic float split, last end pinned to parent.
Frozen dasha_analyzer / domain_calculation_service untouched; rectification
scoring keeps the integer split pending a product decision.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
jyotish_engine applicable-yoga filter: equivalent (diagnostic rows never enter detected_yogas).
report_source_translation: ported into pl9_full_data_export EN sanitizer.
yoga_engine category: ported to not_implemented and evaluation_failure rows.
Kalachakra appendix patch: not applicable (her local renderer only).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
- _consultation_dasha_sub_periods rebuilds mahadashas from the birth moment
(only when they reproduce the chart's shown periods) and cuts antardashas with
chart_dasha.birth_moment.antardashas instead of the frozen
dasha_analyzer.build_antardasha (integer days from midnight starts).
- Pratyantar cut from the antardasha's full-precision clock; the merged-field
bridge keeps that ready timeline. Output shape unchanged.
- Regression test against cmd_dasha for two public charts; golden recaptured.
- BUG_HISTORY: BUG-1715..1718.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
- A1: ashtakavarga_shodhana.calc_sodhita_av (her entry; ashtakavarga.py frozen),
level=not_calibrated + prediction_scoring_allowed=False on the chain; legacy
subtraction stays removed (BUG-1209).
- A2: select_narayana_seed_sign strength_profile rath_empty_sign_lord_strength_v1,
shared by source-aware seed, MD and AD (matches her function on 6000 draws).
- A3: preflight of logical branches; placeholder not an implementation;
reference_only rules listed; 71 not_implemented; cmd_yoga not_implemented_count.
- A4: neechabhanga_kendra name/category per her handoff.
- 9e971559: Vimshottari AD record lord and native current PD in dasa convergence.
- B10: Argala equal count stays strength_comparison_required (no Narayana borrow).
- B11: full-reading bhava_bala.reference_relative_points, labelled
product_relative_points_not_traditional, no bands.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
产品 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, items 4b-4d.
- Shadbala: the ratio total rupas / minimum is labelled a sufficiency
ratio (not auspiciousness, not ishta_phala) on the card, in the annual
package (sufficiency_ratio_pct, rank_by_total_rupas), the report facts
(ranking_basis, ratio_meaning, ranking_by_ratio) and the annual report
text. Chesta reference packet rows carry values_scope on every row.
- Argala: the layer and card say supported is a structural intervention
only; ties broken by the Narayana strength selector carry
ruling_pending / tie_break_ruling_pending (behaviour unchanged).
- Tajika: each annual pack field lists what partial_verified covers
(formula / order / boundary_dates / full_chart); dates_verified is false
and the consultation layer projects it.
The consultation evidence card golden is recaptured for the new layer
fields (start_at / end_at, not_evaluated, verification scope, labels).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
Upstream ba8e36ec adds sections.transit for every route. Here the annual route
promises a "transit" label; a real but ungated section broke the evidence-gate
parity test. The section stays for finance/wealth, where the finance support
review reads it; the health override is unchanged.
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 3. timeline_boundaries
checks end == next start on full timestamps (start inclusive, end
exclusive) and lists every gap or overlap. The solar-return report and
annual pack expose the real return interval (this return to the next
actual return, computed), the Mudda 365.25-day year and the shown window
separately. The annual package checks the year chain, each year's Mudda,
Patyayini, monthly and Varsha Narayana rows, natal Vimshottari / Narayana,
and Mudda across years (a ~8-minute hole the fixed year leaves before the
next return). Consultation dasha rows gain start_at / end_at with the
birth offset and a per-system continuity check; the card carries
continuity_issue only when a table is not continuous.
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