What we measured, and what we still get wrong
Every figure on this page comes from a regression report generated by the test suite. Where we have not measured something, we say nothing rather than estimate.
Government / PAC reference
Panchang Accuracy & Validation
An independent comparison of our output against reference data published by the Government of India's Positional Astronomy Centre.
TathaAstu Panchang calculations have been independently compared by us with reference data published by the Government of India's Positional Astronomy Centre (PAC) — the Rashtriya Panchang (Saka 1948) and PAC's Eclipses 2026.
In our 2026–2027 comparison, tithi and nakshatra transition times matched the reference to within its published one-minute precision across the compared dates, names agreed (aside from romanization variants), and eclipse type and timing matched to the minute — with no confirmed calculation discrepancies.
This is an independent technical comparison and does not imply Government certification, approval, or endorsement.
Verification
Three tiers, three different failure modes
Each tier catches something the others cannot. Reference comparison catches a wrong rule. The determinism lock catches a rule change that moved an unrelated date. Audit replay catches a deployment that diverged from what was audited.
Tier A
42 / 42
Reference comparison
vs DrikPanchang
7 festivals × 6 years, spanning 1950–2100
Diwali, Janmashtami, Maha Shivaratri, Ganesh Chaturthi, Vijayadashami, Holi and Makar Sankranti are compared against DrikPanchang across a 150-year span. This catches rules that happen to be right for the current decade but wrong historically.
Tier B
Locked
Determinism lock
vs Itself
Every-day festival hash across 8 years
A hash of every festival on every day for eight years is stored in tier_b_lock.json. Re-running the engine must reproduce it exactly. This is the guard against silent drift: change a rule for one festival and accidentally move another, and the lock breaks immediately.
Tier C
26 / 26
Audit replay
vs Production data
22 days from the 2026–27 accuracy audit
Assertions taken from a manual accuracy audit are replayed against production. Where Tier A proves agreement with an external reference, Tier C proves the deployed system still behaves as audited.
Regression testing
152 automated tests · 91% Festival Engine V2 coverage
The regression suite runs on every build. The Festival Engine V2 coverage gate is 90%; builds below the gate do not ship.
| Test area | Tests | What is covered |
|---|---|---|
| Festival Engine V2 | 115 | Evaluators, calendars, intervals, tie-breaking, validation, database integration and materialisation |
| API plan & access controls | 16 | Plan gating and Enterprise compatibility |
| Webhooks | 21 | Signing, retries, delivery outcomes and idempotency |
| Total | 152 | 91% Festival Engine V2 coverage |
Coverage measurement
Performance
Measured on production, not a laptop
Measured production observations (10 warmed samples per endpoint through the public API on 2026-08-20), not guarantees. Latency varies with cache state, load and request parameters.
End-to-end, production
| Endpoint | Median | p95 |
|---|---|---|
| /v1/panchang | ~35 ms | ~42 ms |
| /v1/festivals | ~95 ms | ~122 ms |
| /v1/festivals/explain | ~118 ms | ~238 ms |
Cold cache — /v1/festivals/year
Engine-level
| Metric | Measured | Target |
|---|---|---|
| Festival lookup p95 | 2.4 ms | < 50 ms |
| Full year sweep | 0.8 s | < 5 s |
On the numbers you may have seen elsewhere
Coverage
What is verified, and how far
Panchang data
15 locations precomputed · worldwide on request
Festival derivation
location-aware
Historical span
1950–2100
Determinism
8 years, every day
Ayanamsa
Lahiri
Corrections shipped
Defects we found and fixed
These were real errors in production before Festival Engine V2. We list them because a platform that claims never to have been wrong is not one you should trust.
| Festival | Was | Now |
|---|---|---|
| Diwali / Lakshmi Puja | Missing entirely | Amavasya prevailing at Pradosha |
| Krishna Janmashtami | Missing entirely | Nishita-vyapini Ashtami (Smarta default) |
| Ganesh Chaturthi | One day late | Madhyahna-vyapini |
| Vijayadashami | One day late | Aparahna-vyapini |
| Maha Shivaratri | One day late | Nishita-vyapini |
| Holi | Wrong when Purnima ended before sunset | Holika Dahan + 1 day, as a series |
| Abhijit Muhurat | Suppressed by Rahu/Yamaganda overlap | Always returned; overlaps listed separately |
Known limitations
What is still wrong, in our own words
This list is the actual contents of our internal limitations document. We would rather you find a limitation here than discover it in production.
✓ Recently resolved in the 2026-08-19 GREEN regeneration: Krishna-paksha amanta_month_key labeling was corrected and validated across 128,006 days, and all 15 production locations now have complete 1700–3100 Panchang data (7,675,560 day rows).
Regional festival rule variants are largely unauthored
Seven packs are registered — North India, West India, East India, South India, Kashmir, Nepal and Sri Lanka — and the pack mechanism is implemented and tested. What is thin is the content: all but one festival rule carries no regional scope, so it applies everywhere, and only one is scoped to a specific region. Variants that genuinely differ by tradition — Gujarati, Tamil, ISKCON — are not yet authored.
Festival pre-materialisation covers location 1 only
Panchang data is complete for all 15 locations (1700–3100). This is a separate cache layer: the nightly job pre-materialises festival results for a rolling window at location 1 only. Festival requests outside that window — notably a full year via /v1/festivals/year for another location or a distant year — are derived on demand.
Webhooks are one-way and at-least-once
There are no inbound webhooks. Delivery is at-least-once, so subscribers must deduplicate on X-TathaAstu-Event-Id. Retries stop after 5 attempts; endpoints auto-disable after 20 consecutive failures.
Philosophy
How we handle being wrong
Rules are never edited in place
A correction inserts a new rule version pointing at the row it supersedes. The old row is marked DEPRECATED, not deleted. Any response we served in the past can still be reproduced from its recorded rule id and version.
Every correction is traceable to a reason
Traces record the rule, its version, the evaluator, the overlap in minutes, and the shastric authority. When a date changes, you can see precisely which rule changed and why.
Limitations are published, not buried
The list above is the actual contents of our internal KNOWN-LIMITATIONS document. We would rather you find a limitation here than discover it in production.
A number we cannot measure is not a claim we make
Every figure on this page comes from a regression report generated by the test suite. Where we have not measured something, we say nothing rather than estimate.
Report a date you believe is wrong
Send the request you made and the value you expected. Accuracy reports are triaged ahead of everything else. If you are right, the fix ships as a new rule version and appears in the changelog.