Releases: socraticsurge/telugu-calendar-utilities
Release list
v1.13.0
Astrological authority and Muhurtam coverage release. The daily Panchangam,
Daily Horoscope and Muhurtam surfaces now disclose criterion-level provenance
instead of treating computed output as uniform textual authority.
Release highlights
- Muhurtam coverage: 34 of 35 distinct purpose-specific profiles now have
verified rule-level source claims;Anything auspiciousremains the sole
explicit heuristic. House warming is the narrowly scoped, source-verified
Gruhapravesha election, with completed-house purchase and renovation kept
separate. - Corrected elections: wedding, Gruhapravesha, court filing, engagement,
Homahuti, deferred Pretakriya, Seemantha, borrowing, lending, inventory
purchase, service entry, capital deployment, Shantika/Paushtika and
Dharma-kriya rules now follow their inspected passages and disclose manual
chart conditions. - Panchangam and horoscope corrections: Bhadra Mukha/Puchha follows the
Tithi-specific Muhurta Chintamani Yamas; Rahu and Ketu transit houses follow
Phaladeepika rather than inheriting Shani's set. - MCP trust contract:
find_muhurtareturns the selected activity's
provenance, automated constraints and manual prerequisites. Panchangam
responses disclose authority state by output category. - Clearer recommendations: browser results remove irrelevant weekday
guidance, separate computed strengths from chart validation and practical
information, and keep specialist Dharma-kriya/Pretakriya activities out of
the general public selector while retaining them in Python and MCP. - Engineering: generated Python-to-browser activity contracts, provenance
validation, documentation-drift checks andtools/verify_project.pyprovide
one fail-fast verification path across Python, frontend tests, type checking
and production build.
Added
- Precisely scoped vehicle-acquisition profile. Raman Chapter IV, printed
page 10 (PDF page 14), now supplies a +1 preference for five movable
Nakshatras without treating every other star as rejected.
Other vehicle ranking preferences remain explicitly uncited project rules;
the citation is not presented as a complete vehicle election. Coverage is
now 10/30. - Source-backed Upanayana profile. Raman Chapter VIII, printed pages
23–24 (PDF pages 27–28), now supplies lunar months, Uttarayana solar Rasis,
exact Paksha-qualified Tithis, weekdays, Nakshatras, Lagnas and a before-noon
gate. Age, conditional Budha combustion and chart checks remain explicit.
Verified activity coverage reaches 9/30. - Source-backed Vidyarambha profile. Raman Chapter VIII, printed page 23
(PDF page 27), now supplies exact weekday, Nakshatra and movable-or-common
Lagna gates; age, forenoon/noon preference and chart checks remain explicit.
Verified activity coverage reaches 8/30. - Source-backed Mundana / Chaula profile. Raman Chapter VIII, printed
pages 22–23 (PDF pages 26–27), now supplies Shukla-Paksha, combustion,
Tithi, Nakshatra, weekday, conservative Lagna and forenoon constraints.
Python and browser share the solar-noon boundary. Coverage reaches 7/30. - Source-backed Karnavedha profile. Raman Chapter VIII, printed page 22
(PDF page 26), now supplies the never-at-night rule, weekdays and rejected
rising Rasis; its Tithi reference resolves to Chapter V. Age, transition and
election-house checks remain explicit. Coverage rises from 5/30 to 6/30. - Source-backed Annaprasana profile. Raman Chapter VIII, printed pages
21–22 (PDF pages 25–26), now supplies the admitted Nakshatras, weekdays and
rising Rasis; its general-Tithi reference is resolved to Chapter V's exact
Panchanga-Suddhi list. Child-age and election-chart checks remain explicit.
Verified activity coverage rises from 4/30 to 5/30. - Source-backed Namakarana profile. Raman Chapter VIII, printed page 21
(PDF page 25), now supplies the ceremony's admitted Nakshatras and weekdays,
rejected Tithi numbers, fixed-Lagna preference, and disclosed birth-day,
election-chart and name-selection checks. Verified activity coverage rises
from 3/30 to 4/30. - One-command project verification.
python tools/verify_project.pynow
runs provenance-link validation, generated activity-data drift checks, the
complete Python suite, frontend tests, typecheck, and production build in a
fixed fail-fast order. - Machine-checked activity provenance. Verified Muhurtam profiles now
declare their stable ledger claim beside the Python rules; MCP and the
browser consume that shared field. A CI-ready audit rejects missing,
non-Muhurtam, non-verified, or duplicate links and reports the honest
coverage baseline: 3 of 30 activity profiles have exact rule locators. - Source-backed land-purchase profile. The former generic Property / Land
option is now accurately scoped to buying land for building, following
Raman Chapter XII, printed page 53 (PDF page 57): fourteen Nakshatras, four
weekdays, hard Rikta-Tithi rejection, fixed-Lagna preference, and disclosed
manual election-chart checks. Buying a completed house is explicitly outside
this profile rather than silently conflated with land purchase. - Source-backed well-digging activity. Raman, Muhurtha, Chapter XII,
printed page 51 (PDF page 55), now supplies the eight admitted Nakshatras,
three admitted rising Rasis, the Surya-in-Lagna hard-rock caution, and
explicit manual Shukra/Chandra chart checks. The activity is now selectable
on the website and exposed through the same generated contract as Python. - Source-backed Bhumi Puja / house-foundation profile. B. V. Raman,
Muhurtha, Chapter XII, printed page 50 (PDF page 54), now governs the
activity's admitted lunar months, solar-Rasi classes, exact Tithi numbers,
Nakshatras, weekdays and fixed Lagna. Full election-chart and site-placement
conditions remain explicit manual checks. find_muhurtanow returns an additiveactivity_profilewith the automated
constraints, manual review requirements, and stable provenance claim ID.
The website consumes the same generated Python activity contract.
Changed
- Bhumi Puja / foundation candidates use the cited activity profile instead
of the former generic Bhadra-tithi/fixed-Lagna preference pair. Shared
samskara and ranking rules remain independently disclosed.
Documentation
- Corrected the Muhurtam architecture guide from the retired
Choghadiya-derived slot model to the named, indivisible 30-Muhurta pipeline;
narrowed Drik Panchang's role to external Drik-output comparison rather than
universal textual authority. - Added a criterion-level foundation-laying crosswalk and verified
muhurta.bhumi_puja.foundationprovenance claim. - CHANGELOG reconciled against the full git history. The operational-
maturity round that actually shipped inside the v1.9.0 tag is now
folded into the [1.9.0] entry — it had been stranded under a misplaced
[Unreleased]heading below newer releases. Every release back to the
project's first tag (v1.0.5) is now documented here, with
comparison links.
Housekeeping
- The 15 automated-assistant cleanup commits from the 1.9.0 round were
re-authored to the maintainer identity, so the assistant bot no longer
appears in the contributor list. Author/committer metadata only — every
tree SHA is unchanged, so released artifacts are byte-identical.
v1.12.0
Muhurta finder rebuilt on the named 30-muhurta grid. 1082 tests passing.
Changed
- Muhurta slots are now the named muhurtas, not choghadiya-derived
windows.day_slots/night_slotsiterate the 30 muhurtas of the
ahoratra — 15 daytime (sunrise→sunset ÷15) + 15 night (sunset→next
sunrise ÷15), each an indivisible ~48-min unit carrying its name,
presiding deity, and intrinsic nature. New module
telugu_panchangam/muhurtas.py; owner-verified reference table at
docs/reference/07-muhurta-table.md. - Additive, disclosed scoring. A slot's score layers: intrinsic
muhurta nature (Abhijit/Brahma +2, other auspicious +1, inauspicious −2)- dominant choghadiya (a scoring attribute — straddle disclosed, not a
gate) + weekday Durmuhurtam / hard-window exclusion + the existing
tarabalam, chandrabalam, lagna, tithi-class and special-yoga factors.
Abhijit and Brahma are now scored as the 8th-day / 14th-night muhurta
natures (the old "overlaps Abhijit/Brahma" bonuses are retired; Abhijit
is correctly absent on Wednesday). This supersedes the interim
block-iteration fix (PR #135) and fully resolves the 2026-07-21
choghadiya mislabel (a Kaal slot scored as Amrit).
- dominant choghadiya (a scoring attribute — straddle disclosed, not a
- Each slot now leads with its muhurta identity, e.g.
Vidhi (Abhijit) muhurta · Brahma · auspicious (+2). The website finder
(src/panels/tarabalam.ts) mirrors the Python source of truth. - Card wording cleaned up. User-facing muhurta reasons, skip
diagnostics and doctrinal notes now use middots and plain punctuation
instead of em-dashes; time and date ranges read "to". The redundant
"clear of all inauspicious windows" line is removed: it was a tautology
(a slot is only kept when it clears the hard windows) that also
contradicted any muhurta of inauspicious nature. An adversarial sweep
over 160 date/city/activity/profile combinations confirms zero dashes,
zero contradictions, and each score equal to the sum of its (+n)/(−n)
bonuses. - Day context on every slot card (website). Each card carries the
day's sunrise anga (Tithi, Nakshatra, Nitya Yoga) plus a timings row.
Sunrise, Abhijit and Rahu Kalam show by default; the complete Panchangam
auspicious and avoid window lists sit behind an "all timings" expand, so
a slot's day quality is legible without switching to the Panchangam tab.
Display only.
Affects tool_find_muhurta (MCP) and the website muhurta finder.
v1.11.0
The theme: muhurta scorer enhancements — cognitive split of the
scorer into three files, Siddha Yoga detection, Rikta dosha neutralization,
and activity-aware tithi-avoid scoring. No frozen-core or ICS-feed changes.
1055 tests passing.
Added
- Siddha Yoga detection (
special_yogas.py) — all five classical
Tithi×Vara combinations from Muhurta Chintamani now detected:
Nanda+Friday, Bhadra+Wednesday, Jaya+Tuesday, Rikta+Saturday,
Purna+Thursday. Scores +1 per slot. The earlier implementation was
missing Rikta+Saturday; the incorrect comment ("Rikta has no auspicious
Vara partner") is removed. - Rikta dosha neutralization — classical conditions reduce the Rikta
penalty insidescore_tithi_class(): Pushya nakshatra fully cancels
(−2 → 0); Sarvartha or Amrita Siddhi Yoga partially offsets (−2 → −1).
Both conditions surface as explicit reason notes. - Activity-aware tithi-avoid scoring —
score_tithi_class()extended
withavoid_tithi_class: activities declare tithi families whose energy
is classically mismatched, scoring −1 instead of the previous flat zero.
Jaya (combat/victory energy) avoided by: ceremony, wedding, engagement,
naming, annaprasana, karnavedha, mundana, upanayana, vidyarambha,
gruhapravesha, yajna. Purna (completion energy) avoided by: court,
litigation.
Changed
- Muhurta scorer split —
personal/muhurta.py(~1,200 lines) split
into three focused files:personal/activity_rules.py— declarative per-activity config
(ACTIVITY_RULESdict, 28 activities); pure data, no logic.personal/slot_scorers.py— atomic scoring functions +_DayContext
dataclass;score_tithi_class,score_tara,score_chandra,
score_lagna,score_special_yogas,score_nitya_yoga, etc.personal/muhurta.py— orchestrator (~530 lines); public API
(day_slots,diagnose_day,assign_tiers) unchanged.
_DayContextdataclass — bundles 21 day-constant parameters so
_evaluate_slot()takes(s, e, block, base, facts, ctx)instead of
20+ positional arguments._day_skip_reason()helper — day-skip logic extracted and shared
betweenday_slots()anddiagnose_day(), eliminating duplication.- MCP disclaimer updated —
_MUHURTA_DISCLAIMERintools.pynow
reflects Siddha Yoga +1, symmetric tithi scoring (+1/−1/−2), and
Pushya/Siddhi neutralization.
v1.10.4
The theme: ayanamsa full support across gochara, ingress, and phalalu tools.
get_graha_positions, get_gochara, get_rasi_phalalu, and
get_rashi_ingresses previously accepted an ayanamsa parameter but
always computed in Lahiri. All four now apply it end-to-end.
+9 tests (1054 → 1063 passed).
Changed
get_graha_positions—ayanamsaparameter now applied to all nine
graha longitude and ingress calculations (previously Lahiri-only with a
warning note in the response). Staleayanamsa_notefield removed.get_gochara—ayanamsaparameter added and applied; graha
positions are now computed under the requested ayanamsa.get_rasi_phalalu—ayanamsaparameter added and applied; reading
is rendered from positions under the requested ayanamsa.get_rashi_ingresses—ayanamsaparameter added and applied;
sign-boundary crossings are computed under the requested ayanamsa.gochara/positions.pyrefactored:graha_positions()owns the Swiss
Ephemeris sid mode (set once, restored infinally); internal helpers
are now mode-agnostic, avoiding redundantset_sid_modecalls on every
loop iteration of the ingress search.ingress.pyrefactored: same own-the-mode pattern inrashi_ingresses().
Documentation
- README and PyPI page updated: tool signatures show
ayanamsa="lahiri"for
all seven ayanamsa-aware tools; new Ayanamsa section lists the four
supported keys and clarifies SS/Vakya accept-but-ignore behaviour.
(PR #105)
v1.10.3
The theme: astronomical timing computations — four new MCP tools.
All-planet combustion/visibility calendar, planetary war detection,
rashi ingress + eclipse calendar, and five-limb Panchanga Shuddhi
assessment. Every tool is a new module consuming engine outputs;
the frozen core and ICS feeds are untouched. +84 tests
(991 → 1054 passed, 63 previously counted across PRs 101–103).
Added
get_combustion_calendarMCP tool — heliacal Asta (setting) and
Udaya (rising) periods for the five classical planets (Mercury, Venus,
Mars, Jupiter, Saturn) viaswe.heliacal_ut(), matching the
Drik Panchang Asta/Udaya calendar. Per-city altitude used for
sky-visibility accuracy. New moduletelugu_panchangam/maudhya_calendar.py.
(PR #101).get_graha_yuddhaMCP tool — Graha Yuddha (planetary war) periods:
two tara grahas within 1° ecliptic longitude, winner by higher ecliptic
latitude, entry/exit via binary search + ternary-search minimum.
New moduletelugu_panchangam/graha_yuddha.py.
(PR #102).get_rashi_ingressesMCP tool — all rashi (sign) ingress events
for Sun, Mercury, Venus, Mars, Jupiter, Saturn, Rahu, Ketu; Lahiri
sidereal; retrograde ingresses included; adaptive-step scan + 44-iter
bisection. New moduletelugu_panchangam/ingress.py.
(PR #103).get_eclipse_calendarMCP tool — solar and lunar eclipses in a
date range with per-city visibility and Sutak timing (12 h Solar,
9 h Lunar). Wraps the existing eclipse engine.
(PR #103).get_panchanga_shuddhiMCP tool — five-limb purity assessment
(Tithi, Vaara, Nakshatra, Yoga, Karana) with quality
(shuddha / ashuddha / mixed) and one-line reason per limb; overall
verdict from Sarva Ashuddha (0) to Sarva Shuddha (5). New module
telugu_panchangam/panchanga_shuddhi.py.
(PR #104).Location.alt— altitude (metres) added to theLocationdataclass;
all 22 bundled cities updated with real-world elevation values.
Required for heliacal visibility accuracy.
v1.9.0
The theme: classical muhurta sharpening — non-personal timing layer.
Sixteen computations from Muhurta Chintamani, Brihat Samhita,
Dharmasindhu, and standard panchangam authority — all surface as
additive properties on PanchangamDay and across the three per-day
MCP response paths (tool_get_panchangam, tool_get_muhurta,
tool_get_panchangam_range). No personal-astrology computations
(Dasha, Navamsa, Kuta match) — those are reserved for a separate
project. Engine math is additive only; the frozen core is untouched
and ICS subscriber feeds are byte-identical. +142 tests
(849 → 991 passed).
Added — Timing computations (16 features)
Foundational (Tasks 1–3):
- Ghati/vighati clock infrastructure — sunrise-anchored ghati
scale (1 ghati = 1/60 ahoratri = sunrise→next-sunrise / 60).
NewGhatiClockandGhatiWindowdataclasses;
PanchangamDay.ghati_clockexposessunrise,
next_sunrise,seconds_per_ghati. Foundation for all
ghati-precision filters below. Module:
telugu_panchangam/ghati.py. - Moon's pada on the daily nakshatra span —
PanchangamDay.nakshatra_pada
(1..4), computed from each engine's own Moon longitude at sunrise.
Drik value cross-pinned againstgochara/positions.py:81(canonical
int(nak_pos * 4) % 4 + 1formula). - Ayanamsa as engine parameter — Drik now accepts
ayanamsa: 'lahiri' | 'raman' | 'krishnamurti' | 'true_chitrapaksha'
(default'lahiri', byte-identical to prior behaviour).
Surya Siddhanta and Vakya accept the parameter for API symmetry
(their own mean-motion models drive sidereal positions; ayanamsa
is a no-op there). Newengines/utils.sidereal_longitude_with_ayanamsa
helper restores Lahiri mode after each call to keep the hot-path
@lru_cacheconsistent.
Ghati-precision filters (Tasks 4–6, ride on the ghati clock):
- Vishaghati windows —
PanchangamDay.vishaghati: list[GhatiWindow].
Per-nakshatra "poison ghatika" offsets from Muhurta Chintamani
(27-entry table inkarana_windows.VISHAGHATI_OFFSETS_GHATI);
width = 4 vighatis (VISHAGHATI_WIDTH_VIGHATIS). Treated as
inauspicious cuts in muhurta slot scoring, alongside Rahu Kalam etc.
Exposed underinauspicious.vishaghatiin MCP. - Bhadra Mukha / Puchha — Vishti karana split into Mukha
(first 5/16 of the half-tithi, hard-avoid) and Puchha
(last 3/16, auspicious for contests/litigation per Muhurta
Chintamani).PanchangamDay.bhadra_mukha/
PanchangamDay.bhadra_puchha(GhatiWindow | None). Mukha is
cut from slots; Puchha grants +2 tolitigationslots that overlap it. - Sankramana 16-ghati avoidance window —
PanchangamDay.sankramana_avoidance: Window | None. 16 ghatis
before + 16 ghatis after the Sun's exact rasi-ingress moment
(~12h 48m total). Conservative16+16rule (vs30+30for
Karkata/Makara cited in some sources) applied uniformly.
Samskaras withskip_on_sankramana: Truedrop slots overlapping
this window. New helperbase._sankramanam_name_and_jdbisects
for the exact ingress JD viafind_crossing.
Nakshatra / yoga filters (Tasks 7, 13, 15):
- 5 Panchaka Nakshatras flag —
PanchangamDay.in_panchaka_nakshatra: bool. True for Dhanishtha,
Shatabhisha, Purva Bhadrapada, Uttara Bhadrapada, Revati. New
activitiescremation,construction_roof,wood_cuttinghave
skip_on_panchaka_nakshatra: True. Distinct from Panchaka Rahita
(modular-9 dosha) below. - Anandadi 28 Yogas —
PanchangamDay.anandadi_yoga: str | None.
Vaaram × Moon's nakshatra → one of 28 named muhurta yogas
(Ananda, Kalidanda, Dhumra, Dhata, … Vardhamana) per Muhurta
Chintamani. Auspicious yogas grant +1 / inauspicious -1 in slot
scoring; classification tablesANANDADI_AUSPICIOUSand
ANANDADI_INAUSPICIOUSinspecial_yogas.py. - Adho / Urdhva / Tiryan-Mukha nakshatra classification —
PanchangamDay.nakshatra_mukha: str | None. Activity-conditioned
bonus: Adho (construction_foundation,well_digging), Urdhva
(coronation), Tiryan (travel). Table in
nakshatra_filters.NAKSHATRA_MUKHA.
Solar / lunar maasa filters (Tasks 8, 11, 12):
- Khar-Maasa flag —
PanchangamDay.is_khar_maasa: booland
PanchangamDay.khar_maasa_name: str | None('Dhanur'when Sun
in Dhanu rasi;'Meena'when Sun in Meena). Samskara activities
gainskip_on_khar_maasa: True. Note: codebase rasi spelling is
'Dhanu'(not'Dhanus'). - Adhika Maasa muhurta consumption — engine data was already
in place since 1.0 (engines/base.py:121-143names months as
'Adhika <name>'/'Nija <name>'), butfind_muhurtaignored
it. Samskaras now skip onday.maasam.startswith('Adhika ').
Behaviour change: prior versions returned slots on Adhika
days forwedding/upanayana/gruhapravesha/etc.; 1.9.0 returns
[]with diagnostic'Adhika Maasa — <activity> traditionally avoided'. - Pitru Paksha 15-day window —
PanchangamDay.is_pitru_paksha: bool.
True for Bhadrapada Krishna paksha (15 days through Mahalaya
Amavasya inclusive). Samskaras skip.
Graha-based filters — Drik only (Tasks 9, 10):
- Simha-Stha Guru / Shukra —
PanchangamDay.simha_stha_guru: bool(hard skip onwedding
viaskip_on_simha_stha_guru) and
PanchangamDay.simha_stha_shukra: bool(-2 score penalty via
penalty_on_simha_stha_shukra). Strong south Indian custom
(12-year Jupiter cycle). Surya Siddhanta and Vakya engines don't
model outer planets — both fields stayFalsethere. - Guru / Shukra Maudhya (combustion / heliacal setting) —
newMaudhyaInfodataclass withgraha,elongation_deg,
combust,threshold_degfields. Thresholds per Brihat Samhita:
Jupiter 11°, Venus 10°.PanchangamDay.guru_maudhyaand
PanchangamDay.shukra_maudhya.weddingandupanayanagain
skip_on_combust: ['Guru', 'Shukra']— universal samskara rule
across all regional traditions.
Activity-conditioned filter (Task 14):
- Disha Shoola —
PanchangamDay.disha_shoola_direction: str | None
(one of'East' | 'West' | 'North' | 'South'). Classical weekday
→ blocked-travel-direction table.tool_find_muhurtagains a
travel_directionparameter; when provided and matching the
day's Disha Shoola, thetravelactivity drops slots.
Modular-9 dosha — the headline addition (Task 16):
- Panchaka Rahita — new
PanchakaInfodataclass with
remainder(0..8),name('Rahita' | 'Mrityu' | 'Agni' | 'Raja' | 'Chora' | 'Roga'),auspicious(bool),avoid_for
(list of activity tags).PanchangamDay.panchaka_rahitapopulated
at sunrise lagna. Slot-level recompute: muhurta slot scoring
recomputes Panchaka using the slot's start-moment lagna (computed
viapersonal/lagna_hora.get_lagna_transitions, cached once per
day). Mrityu Panchaka caps slot tier (-3 to score, day-quality
reason); other doshas apply -2 when the activity matches
avoid_for. Module:telugu_panchangam/panchaka.py(sources:
Muhurta Chintamani, Dharmasindhu).
Changed
MCP surface:
- All 19 new computation fields land on
tool_get_panchangam,
tool_get_muhurta, andtool_get_panchangam_rangeper-day dicts
— consistent shape across all three tools (the
multi-tool-serialization gap caught early in this round is now
guarded by parity tests in each feature's test file). tool_get_panchangam,tool_get_panchangam_range,
tool_get_graha_positions,tool_find_muhurtagain an optional
ayanamsa: str = 'lahiri'parameter; the active ayanamsa is
surfaced in each response.tool_find_muhurtagains an optionaltravel_direction: str | None
parameter for Disha Shoola filtering on thetravelactivity.- MCP server tool docstrings (
mcp/server.py) updated to enumerate
the new outputs.
Muhurta activity rules (personal/muhurta.ACTIVITY_RULES):
- 10 samskara activities (
ceremony,wedding,engagement,
naming,annaprasana,karnavedha,mundana,upanayana,
vidyarambha,gruhapravesha) gainedskip_on_sankramana,
skip_on_khar_maasa,skip_on_adhika,skip_on_pitru_paksha
rules — these days now correctly return no slots / explanatory
diagnostic strings. - 6 new activities added:
litigation,cremation,coronation,
construction_roof,wood_cutting,well_digging. weddingadditionally gainsskip_on_simha_stha_guru,
penalty_on_simha_stha_shukra: -2,skip_on_combust: ['Guru', 'Shukra'].- The activity-count test in
tests/test_muhurta_finder.pyis
nowtest_all_30_activities_callable(was_all_24_…).
Behaviour-changing fixes caught during review:
prefer_bhadra_puchhakwarg was extracted intoACTIVITY_RULES
and declared on_evaluate_slotbut never forwarded at the call
site — the +2 Puchha bonus was a silent no-op. Now forwarded
with a scoring-path regression test (a slot'sreasonslist
must contain the bonus chip when overlap occurs).sidereal_longitude_with_ayanamsaset the global swisseph
sid-mode but didn't restore it — restored on every call so the
Lahiri@lru_cachehot-path never sees a stale mode.- Daily pada formula initially used
(moon_lon % nak_arc) / (nak_arc / 4.0)which mismatches the canonicalgochara/positions.py
form by 34 of 108 pada boundaries due to floating-point modulo
instability — aligned to the canonical single-division form. - One pre-existing
test_vara_bonus_thursday_weddingwas implicitly
relying on a date where Jupiter happened to be 9.9° from the Sun
(now correctly flagged combust); test rerouted to2026-08-20. - MCP serialization initially landed in only
tool_get_panchangam
for the first three features (Tasks 1, 2, 4); swept fix added
every field to all three per-day MCP tool responses with parity
tests baked into each subsequent task.
Notes
- Frozen-core compliance — no festival rules in
engines/base.py
touched, nogenerators/ics.pychanges, nodocs/UI ...
v1.8.0 — Janma Lagna across the panchangam
v1.8.0 — Janma Lagna across the panchangam
Twelve PRs landing together (55, 58–68). The major additions are
around the natal ascendant (janma lagna): the engine now computes
lagna transitions and planetary horas; the muhurta finder scores
slots from both janma rashi and janma lagna independently; and
per-activity lagna-class preferences (Sthira / Chara / Dvisvabhava)
round out the classical Muhurta Chintamani guidance.
New features
- Lagna transitions + planetary horas as first-class engine output;
exposed as get_daily_horas and get_lagna_transitions MCP tools. - Per-city pre-computed lagna.json data layer + monthly cron.
- Hora strip + Lagna ribbon visible on the day card.
- Lagna kendra/trikona/Ashtama scoring in find_muhurta; Ashtama-
Lagna joins Ashtama-Chandra as a tier-capping personal dosha. - Optional janma_lagna per profile — strict Lagna Shuddhi runs
alongside Chandra-Rashi mode (additive, both score). - Per-activity lagna preferences: wedding -> Sthira, travel ->
Chara, learning rites -> Dvisvabhava. Surfaces as a reason chip. - Gochara verdicts from BOTH rashi and lagna lenses side by side.
Correctness fixes
- Amavasya and unrectified-Tara doshas correctly cap tier.
- tara_dosha tier cap restored in the JS UI (silent regression).
- "Parabhava Nama Samvatsara" devotee-preferred form everywhere.
Performance
- ~30% on Tarabalam multi-day searches via lru_cache on engine
utils + a new calculate_bulk engine method.
Security
- DOM-XSS hardening at 7 user-name sinks in docs/index.html.
Infrastructure
- Pure muhurta scorer extracted into a Node-importable module with
27 unit tests + CI parity job to prevent future Py/JS drift.
Engine surface change (owner sign-off recorded): minimal additive
touch in engines/utils.py (lru_cache on 4 pure swisseph wrappers)
and engines/base.py (default calculate_bulk that loops calculate).
PyPI: mcp-server-panchangam==1.8.0
Static site: panchangam.astrochaganti.com