Methodology — The Crypto Times India USDT Premium Index
This page is generated from the running index engine. Back to the index page.
Methodology
In one sentence: the daily USDT/INR reference price is the unweighted median of all valid exchange midpoints collected during the fixing window — it is calculated, not taken from any single exchange.
The Crypto Times Premium Index (CTPI) family’s first series. Permanent series ID: CTPI-USDT-SPOT-INR (renamed from CTPI-SPOT-INR at v0.4.1, before any external citation existed, to namespace the asset ahead of the USDC series, now live as CTPI-USDC-SPOT-INR). Version history: changelog · restatements: corrections.
1. What the index measures
A daily, transparent measure of how expensive USDT (Tether) is in Indian rupees on India-facing crypto exchanges, relative to the USD/INR reference exchange rate. It is a journalistic crypto-market-structure metric. It is not a forex rate, not an official benchmark, not a trading signal, and not intended for contract settlement.
2. Definitions and formulas
For each eligible exchange i at sample time t:
mid(i,t) = (best_bid + best_ask) / 2
spread(i,t) = (best_ask − best_bid) / mid
Reference values:
USDT_INR_daily = median of ALL eligible mids sampled during 11:30–12:30 IST
Raw premium % = (USDT_INR_daily ÷ USD_INR − 1) × 100
Peg-adjusted premium % = (USDT_INR_daily ÷ (USD_INR × USDT_USD_global) − 1) × 100
Implied crypto-dollar rate = USDT_INR_daily (in ₹)
Both premiums are always published together. The peg-adjusted premium is the headline figure on every surface (since 2 September 2026): it divides out the global USDT/USD price and isolates the India-specific gap, so it is the number on which this index is compared with its sister index and with itself over time. The raw premium — what a buyer effectively pays versus the USD/INR reference — is always shown beneath it, labelled. On any day USDT itself trades more than 1% off its dollar peg globally, an explanatory banner states the size of the deviation; the headline keeps its basis. In the payload the two travel as clean_premium_pct and raw_premium_pct; the field name clean_premium_pct is retained so archive consumers are not broken by the reader-facing rename.
3. Sampling, the daily window, weekends, and the Tracker layer
Prices are sampled every ~60 seconds inside the fixing window (11:30–12:30 IST) and every ~5 minutes outside it. The daily fix is computed after the window closes (12:35 IST) on Mumbai business days from all in-window samples (internally this series is stored as kind: "official"; see §7). Every raw sample is retained permanently.
Late publication. If the scheduled computation does not run (host or scheduler failure), the fix is computed as soon as the engine recovers, from the same retained in-window samples and the same strictly-before USD/INR rate (§6). By construction the result is identical to an on-time computation — nothing in the inputs depends on when the computation runs — and it is reproduced from raw data before publication (§8). The fix carries its actual computation time in computed_at_utc, and the late publication is recorded in the corrections log as a publication-timing entry, not a revision (§7).
On weekends and Mumbai bank holidays no daily fix is produced. Instead an Indicative value is computed with the same window mathematics against the last business day's stored USD/INR, displayed with that rate's date and age, stored as a separate series, and excluded from the daily fix CSV default view and all statistics. In one sentence: crypto trades every day but the rupee's onshore FX market doesn't, so weekend numbers are estimates against the last trading day's dollar rate and only business-day fixes enter the daily fix series.
The Tracker layer (indicative). The index is the daily fix and only the daily fix. All intraday and live values — the live premium, the 5-minute intraday series, and the 24/7 day range — are indicative: computed from the same archive under the same eligibility filters, divided by the most recent USD/INR reference under the same strictly-before rule as the fix (§6), and never entering the daily fix series, its CSV, or its statistics. Buckets with fewer than the minimum number of venues are dropped, never estimated. The live premium is labelled STALE on every surface once the newest sample that entered it is more than 15 minutes old — the same threshold the sister USDC index publishes — and no figure is shown in its place; the daily fix is unaffected. The nightly range completion (00:05 IST) updates only the day's high/low metadata; published fix values are deterministic over their closed window and are never revised by it.
4. Universe and constituency policy
Constituents are governed by a versioned registry with four statuses:
- active — collected and eligible for the fix (still subject to per-observation filters). An active venue may carry the provisional sub-state: applied to a venue with limited or recently interrupted operating history (currently WazirX, post-relaunch). A provisional venue is fully eligible for the fix and gated by every filter like any other active venue, but it is barred from carrying the page's "lowest ask" marker until it records 90 consecutive days above the volume floor, after which the sub-state lapses.
- shadow — collected and archived but never enters the fix; promotion to active requires 30 consecutive clean days and a methodology version bump;
- watchlist — not collected; re-evaluated when data access changes;
- excluded — not collected; reason recorded.
Policy: log wide, publish narrow. Only exchange-style spot markets with an executable INR-quoted USDT order book, accessed via a documented public or licensed API, may be active. Converters, app-displayed prices and derived rates are never inputs. Aggregators/routing layers are excluded unless independent liquidity is demonstrated (double-counting rule). Any constituency change bumps the methodology minor version and is recorded in the changelog.
Current active set: CoinDCX, Giottus, ZebPay, WazirX (provisional), KoinBX — each still gated daily by the filters below. Shadow: SunCrypto (demoted v0.3.2: its public ticker publishes a crossed book — the "ask" is the last trade price and the bid sits above it — so no executable two-sided market is observable), Bitcoiva, Unocoin, Bitbns.
History: the v0.1.0 initial set was CoinDCX, Giottus, ZebPay, WazirX (provisional), KoinBX, SunCrypto; every change since is in the changelog.
5. Eligibility filters (an observation is excluded if ANY apply)
| Filter | Current value | Reason recorded |
|---|---|---|
| Missing bid or ask | — | missing_bid_or_ask |
| Crossed/inverted book (bid above ask) | — | inverted_book |
| Synthetic quote (bid exactly equals ask) | — | synthetic_quote |
| Implausible quote (near-zero spread at an off-market price) | spread < 5 bps and > 1% from the cross-venue median | implausible_quote |
| Cross-venue median outlier (per time bucket) | > 3% | outlier |
| Stale venue feed (venue timestamp lags our capture) | > 120 s | stale_venue_feed |
| Stale sample (live/indicative surfaces only) | > 2 sampling intervals — 120 s inside the fix window, 600 s off-peak | stale |
| Abnormally wide spread | > 2% | wide_spread |
| 24h volume below floor | < ₹50 lakh (₹50,00,000 ≈ ₹5.0M) | low_volume |
| Window coverage below floor | < 50% of the window's buckets | insufficient_coverage |
| Order-book depth below floor (armed per venue when book data is collected) | configurable | low_depth |
| Venue error / maintenance | — | venue_error |
| Shadow status | — | shadow_status |
| Persistent deviation (>1% from index, 3 consecutive fixes) | review alert | manual review, never auto-exclusion |
Window coverage. A venue must survive at least 50% of the buckets in which the index has data to be treated as a constituent for that fix. A venue whose observations are rejected through most of the window is not participating in the market for that window; the few that survive are a residue, not a price. Those observations are dropped as insufficient_coverage and the venue is not counted in the fix's venue count. This matters most under a two-stage median, where every venue carries one vote regardless of sample counts: without a coverage floor, a venue surviving 3 of 57 observations would weigh exactly as much as one surviving all 57.
Why an unweighted median, not VWAP. Indian exchanges publish top-of-book quotes and self-reported 24-hour volume; none publishes a verifiable trade tape. Volume-weighting would therefore hand index influence to whichever venue inflates its self-reported volume most aggressively — the most gameable number in crypto. The unweighted median of valid midpoints is deliberately robust instead: a single venue quoting nonsense cannot move it, and the spread, outlier, implausible-quote and coverage rules remove broken books before the median is taken. Depth-weighting is a candidate successor once order-book depth is collected and verified per venue (see §9). The sister index CTPI-USDC-SPOT-INR already weights by resting depth: with only two eligible venues there, an unweighted median would let a single thin book move the fix. CTPI-USDT's wider venue set does not carry that vulnerability, so it stays unweighted until per-venue depth is verified here.
Minimum-venue rule: if fewer than 2 distinct venues contribute eligible observations, the fix is written with status INVALID and displayed flagged — never as a normal value.
6. Reference rates
USD/INR (ECB-derived, D-1). The denominator is derived from ECB euro foreign exchange reference rates: USD/INR = EUR/INR ÷ EUR/USD, both legs taken from the same ECB document, computed in decimal arithmetic and stored with the legs as provenance. ECB rates are struck at the daily concertation, ≈14:15 Europe/Berlin (17:45 IST in summer, 18:45 IST in winter) and published ≈16:00 CET — so the same-day rate does not yet exist at the 12:35 IST fix. The fix therefore uses the most recent rate struck strictly before the fix date: normally the prior TARGET business day's (≈19 h before window close Tue–Fri; Monday uses Friday's, ≈67 h). The rate's own date is stored with every fix and shown on every surface — the date is the disclosure. When TARGET holidays stretch the gap, the most recent rate is carried up to a ceiling of 5 calendar days; beyond that no fix is published (status INVALID, fx_missing). The strictly-before rule is what makes every fix reproducible forever: by evening the fix date's own rate exists, but a recomputation must — and does — ignore it. USD/INR derived this way is not India's official reference rate and every display says so. The FBIL reference remains the intended benchmark if redistribution licensing is ever confirmed (gated). History: v0.1.0–v0.4.x used a market USD/INR (median of open.er-api.com and Frankfurter); retired in v0.5.0 for licensing and provenance reasons — see the changelog — with the archive restatement disclosed in the corrections log. Attribution, carried on every surface that displays the denominator: "USD/INR derived from ECB euro reference rates. Source: ECB statistics."
Global USDT/USD. Median of USDT/USD mid-quotes from large global venues (currently Kraken and Coinbase Exchange), sampled in-window.
7. Data quality, terminology, INVALID fixes and revisions
Every fix stores: eligible venue count, per-venue exclusion reasons with observation counts, data-quality flags (e.g. missing global USDT/USD), the FX source and rate date, and the methodology version. Fixes are final on publication; a recomputation that corrects a fix is marked revised and disclosed in the corrections log. A fix published later than its scheduled time is also disclosed there, as a publication-timing entry: no published value moves, so it is not a revision (§3).
Terminology. The daily value is the daily fix, never described as official. CTPI is an editorial index, not a regulated benchmark: it is not an official FX rate, not administered under any benchmark regulation, and not intended for contract settlement. kind: "official" remains the internal series identifier in the database, API and CSV — renaming a published field would break every archive consumer — but no reader-facing surface describes the index as official.
8. Reproducibility
All raw snapshots (including error rows during venue outages) are retained. Any published fix can be recomputed from stored raw data plus the versioned configuration; the engine self-checks every publication against that recomputation.
9. Parallel computation (v1.0 candidate)
Since v0.3.0 every fix also records a two-stage median (the median of per-venue window medians), which equalises venue influence regardless of per-venue sample counts. It is published inside each fix's data-quality block for an open comparison; any cutover to it as the headline formula will be announced 7 days in advance and versioned as v1.0.0. Depth-weighting is a further candidate for the same evaluation path once order-book depth is captured and verified per venue.
10. Changelog, corrections, and the rules for changing the rules
Every methodology version from v0.1.0 to the one running now is recorded in the public changelog, and every restatement of a published value in the public corrections log — both served by the engine itself and linked from the index page. The change-control rule, stated here and only here: formula changes (anything that alters how the published number is computed from the same inputs) require 7 days' advance public notice with a parallel run; constituency and threshold changes take effect with a methodology version bump and a same-day changelog entry, and if they move any already-published value, the restatement is disclosed line-by-line in the corrections log.
Changelog
One entry per methodology version: what changed for the published number or the rules, and its effect on published values. A change to the documents that does not change how a fix is computed is recorded as a dated note, without a version — the version travels with every published number and means "the rules that computed this". The rules for changing the rules — what needs advance notice versus a version bump — are stated once, in the methodology, §10. Restatements are disclosed line-by-line in the corrections log.
Documentation note — 2026-09-29 (family naming, downloads, statistics basis, data licence, page facts)
No change to any number, formula, threshold or constituency, and no version change: the methodology stays v0.5.6. This is a software release of the engine (release 2026-09-29) that changes how existing values are presented.
Naming. The disclaimer, the citation line, the methodology heading and its opening line now read "The Crypto Times India USDT Premium Index", completing the family naming decision of 15 September 2026.
Citation. The citation line now carries the number: USDT premium in India: +3.92% (peg-adjusted) at the 23 Sep 2026 daily fix — The Crypto Times India USDT Premium Index (CTPI-USDT-SPOT-INR), https://www.cryptotimes.io/data/india-usdt-premium-index/. The same format is published as a template so every surface fills it the same way. A day without a peg-adjusted value is cited by name and date only.
Statistics. The week-on-week change and the 30-day range are now computed on the peg-adjusted premium, the headline figure, and the payload names that basis. Until now they were computed on the raw premium beneath a peg-adjusted headline, so a reader could quote a range from the other series.
Downloads and payloads. Every official fix now publishes the ECB rate
date it divided by (fx_date); it was stored with every fix but published
only on weekend readings. Numbers are published to four decimal places; the
global USDT/USD peg keeps its six-place display value and its exact value
beside it, which is what makes the peg-adjusted premium reproducible. The CSV
export appends the series identifier and the rate date as its last two
columns; no existing column changes. Payloads name the methodology's address
and the series identifier. Weekend and holiday readings are described as "not
part of the daily fix series"; no reader-facing text calls the series
official (methodology §7). Dates are written "23 Sep 2026".
Data licence, not yet live. The engine can publish the address of the
Data Usage and Licensing Policy (a license field beside the citation, and a
Link: …; rel="license" header on the latest, series and export responses).
It does so only once the licence page is published and its address is set
on the server; until then nothing about the licence appears.
Facts for the page's new layout. The payload now carries what the index page's reference layout needs so the page can be built from the engine's figures alone: what ₹1,00,000 buys and what it is worth at the global rates (the same arithmetic as the page's calculator); the previous fix and the fix a week earlier; the 30-day average and the dates of the 30-day low and high; the series high and low with their dates; how long the premium has stayed above its current whole-percent level; the number of changelog versions and corrections; every weekend, holiday or missed day in a history window with its reason; a reader-facing reason on a day without a fix; each exchange's premium on the same basis as the "right now" reading; and a "stale" verdict for the live reading once its newest sample is older than 15 minutes, a threshold now shared with the USDC index and stated in the methodology (§3, the Tracker layer). Two documents join the methodology, changelog and corrections: the full daily-fix history, month by month, with every gap explained, and the daily chart as an image, so the chart exists for readers without JavaScript. The methodology, changelog, corrections and history are addressed at their own pages under the index page's address.
Documentation note — 2026-09-02 (headline figure, late-publication rule)
No change to any number, formula, threshold or constituency, and no version change: the methodology stays v0.5.6.
Headline figure. The peg-adjusted premium is now the headline on every
surface — the index page, the family hub, the page title and description —
with the raw premium shown beneath it, labelled. Until now the raw figure led
and the page switched to peg-adjusted only on a depeg day. Comparing the two
indices, or the index with itself over time, is only meaningful once each
coin's own drift from its dollar peg is removed, so that basis leads
everywhere; the depeg banner stays. The payload is unchanged:
clean_premium_pct and raw_premium_pct continue to travel together, and the
methodology's formula label "Clean premium" is now "Peg-adjusted premium", the
term every page uses.
Late publication. The methodology now states what happens when the scheduled computation does not run: the fix is computed on recovery from the same retained samples and the same prior-day USD/INR, is identical to an on-time computation by construction, carries its real computation time, and is recorded in the corrections log as a publication-timing entry rather than a revision. That is how the fix of 2026-08-25 was handled — published at 18:45 IST after a host memory incident — and the corrections log's scope line now says so.
v0.5.6 — 2026-08-14 (WordPress packaging)
No change to any number, formula, threshold or constituency — and no change to what readers see. The WordPress plugin now ships as a complete, conventional package: declared WordPress/PHP requirements, a readme documenting every dependency (there are none beyond WordPress core and outbound HTTPS to the engine), and plugin-registered page templates so the pages can be published from a dropdown without typing shortcodes.
v0.5.5 — 2026-08-13 (fix-window shading on the live chart)
Display only. No number, formula, threshold or constituency change. On the live (indicative) chart the shaded daily-fix window rendered as one continuous shadow spanning the whole range, instead of a separate band for each day's 11:30–12:30 IST window. The shading is now drawn as discrete columns, so each day's window is distinct and the shading's height carries no meaning — it marks when the window was open, nothing more.
Self-hosted chart library. The charting library was fetched from a public
CDN (unpkg.com) on every page view — a third-party availability and
supply-chain dependency on the index's most-viewed surface. It now ships
pinned inside the release (v4.1.3, Apache-2.0, copyright notice intact,
checksummed) and is served from the index's own origin everywhere: the page,
the embeds, and the WordPress plugin. The stale preview.html demo snapshot —
the last file still pointing at the CDN — was retired.
v0.5.4 — 2026-08-13 (chart times in IST)
Display only. No number, formula, threshold or constituency change. The intraday chart's time axis was drawn in UTC — the charting library's default for timestamps — so the shaded daily-fix band appeared at 06:00–07:00 while its own label read 11:30–12:30 IST. The axis and the crosshair readout now render in IST, and the chart legend states it. Every other time on the page was already IST; this brings the chart into line with them.
v0.5.3 — 2026-08-12 (sister-index links)
Display only. No number, formula, threshold or constituency change. The cross-links to the sister USDC index now point at its page on cryptotimes.io rather than at its engine subdomain — on the index page, in the plugin, and in the methodology's series-ID note. The engine subdomains serve the data; the pages on cryptotimes.io are where readers and citations go.
v0.5.2 — 2026-08-11 (terminology, family cross-reference, layout, disclosure)
No change to any number, formula, threshold or constituency.
Terminology. The remaining reader-facing uses of "official" are gone from the index page, the FAQ and methodology §3 — "the official dollar rate" is now "the USD/INR reference rate", and "the rupee's official market" is "the rupee's onshore FX market" — completing the rule stated in methodology §7.
The family. The methodology now records why this index uses an unweighted median while its sister index CTPI-USDC-SPOT-INR weights by resting depth (two eligible venues there, where an unweighted median would let a single thin book move the fix), and the series-ID note reflects that the USDC series is live. The index page links to it.
Disclosure. Per-exchange deviation is disclosed as computed from unrounded mid-quotes (±0.01 pp versus a recomputation from the displayed figures), and the footer risk wording is aligned across the family.
Footer parity. The WordPress plugin's disclaimer was missing the ECB attribution line the engine carries ("USD/INR derived from ECB euro reference rates. Source: ECB statistics."), so the main-domain page — the indexed surface — displayed the denominator without the attribution its licence requires. Both surfaces are now pinned to the same text.
Layout. On narrow screens the widget did not centre (it had a maximum width but no centring margins), and the venue table — which cannot shrink below the width its columns need — pushed the whole page wider than the phone screen, so the layout scrolled sideways and appeared misaligned. The widget now centres, and both tables scroll within their own frame with every column intact.
v0.5.1 — 2026-08-07 (documentation and disclosure corrections)
No change to any number, formula, threshold or constituency. Pre-launch audit of the public documents: corrections-log formatting repaired, changelog rewritten as this reader-facing summary (the engineering diary moved off-surface), methodology sections consolidated, the draft watermark removed, and the provisional venue sub-state formally defined. A missing-day footnote was added to the corrections log for Sunday 2026-07-12.
v0.5.0 — 2026-07-25 (FX source: ECB-derived USD/INR)
The USD/INR denominator moved from a market blend of third-party APIs to a rate derived from ECB euro reference rates (EUR/INR ÷ EUR/USD, same document, decimal arithmetic), under a D-1 rule: each fix uses the most recent ECB rate struck strictly before the fix date, carried across TARGET holidays up to 5 calendar days, INVALID beyond. Reasons: the prior blend included a source whose terms forbid programmatic redistribution, and its values could not be independently reproduced. The full archive was restated on 2026-07-27 — 18 fixes moved by +3.9 to +20.9 bps, each disclosed in the corrections log with the pinned ECB data's checksum.
v0.4.9 — 2026-07-24 (canonical URL, citation, published methodology)
The citation line was finalised (ticker + date + page URL; the methodology version stays in machine-readable metadata). The methodology, this changelog and the corrections log became engine-served pages, generated from the deployed code so they cannot drift from it. The index page heading was restyled. No number changed.
v0.4.8 — 2026-07-24 (deployment fix)
Two read-only endpoints added in v0.4.0 were unreachable on the public domain due to a deployment configuration gap; fixed the same day. No number changed.
v0.4.7 — 2026-07-21 (systematic surface audit)
A ~100-check automated audit now gates every release: cross-surface number agreement, series integrity, terminology, payload completeness and rare states. It caught three stale wording defects in unrendered branches, fixed in this release. No number changed.
v0.4.6 — 2026-07-21 (live premium integrity)
The live indicative premium now applies the identical cross-venue integrity rules as the daily fix; previously a painted quote inside the outlier band could lift the live number (~7 bps observed on 2026-07-21). The daily fix series was never affected.
v0.4.5 — 2026-07-20 (live freshness)
The live layer's staleness limit now follows the actual sampling cadence, so healthy venues are no longer mislabelled stale off-peak. The daily fix was never affected.
v0.4.4 — 2026-07-20 (revision semantics)
"Revised" is set only when a published number moves; recomputations that reproduce the same value refresh disclosure metadata without the flag.
v0.4.3 — 2026-07-20 (venue coverage rule)
New eligibility rule: a venue must survive at least 50% of the window's buckets to count as a constituent. Restated 2026-07-10 (−0.52 bps) and 2026-07-13 (−0.08 bps); six further days had venue counts corrected with no value change. Disclosed in the corrections log.
v0.4.2 — 2026-07-20 (display corrections)
Three page-display defects fixed (series wording, chart labels, data-health counting). No published value changed.
v0.4.1 — 2026-07-19 (terminology and series ID)
Series ID renamed to CTPI-USDT-SPOT-INR (from CTPI-SPOT-INR, before any external citation existed). Reader-facing terminology standardised on "daily fix"; quote-validity displays and disclosure text tightened. No number changed.
v0.4.0 — 2026-07-15 (the Tracker)
Added the indicative layer: live premium, 5-minute intraday series and 24/7 day range — computed under the same filters, clearly labelled, and never part of the daily fix series or its statistics.
v0.3.3 — 2026-07-14 (weekend visibility)
Weekend/holiday indicative values became a stored, displayed series (against the last business day's USD/INR, labelled with that rate's date and age), still excluded from the daily fix series.
v0.3.2 — 2026-07-14 (constituency: SunCrypto to shadow)
SunCrypto demoted from active to shadow: its public ticker publishes a crossed book (no executable two-sided market observable). Fix continuity was preserved by the remaining constituents.
v0.3.1 — 2026-07-14 (implausible-quote rule)
Added the implausible-quote rule: a near-zero spread at an off-market price is the signature of a painted order book, and neither the exact bid-equals-ask test nor the 3% outlier band caught it. Introduced after a constituent quoted a 0.002%-wide book 1.7% away from every other venue on 2026-07-14. Released to readers as part of v0.3.2 the same week.
v0.3.0 — 2026-07-12 (parallel computation and exclusion accounting)
Added the two-stage-median parallel computation recorded with every fix, and per-venue exclusion accounting in the public payload.
v0.2.0 — 2026-07-10 (collection hardening)
Venue adapters and filter thresholds hardened after the first live days; volume floor and spread cap took their current defaults.
v0.1.0 — 2026-07-07 (initial methodology)
First daily fix published 2026-07-09. Initial active set: CoinDCX, Giottus, ZebPay, WazirX (provisional), KoinBX, SunCrypto. Unweighted pooled median, 11:30–12:30 IST window, minimum two venues.
Corrections log
Any published fix that is subsequently revised, any material error in
commentary, and any fix not published at its scheduled time, is recorded here
within one business day. A revised fix carries
revision_status: revised in the API and the archive permanently.
A restatement is only a revision when a published number moves. Recomputes that reproduce the same value refresh disclosure metadata (venue counts, coverage) without setting the flag: "revised" is a signal to readers, and a signal that fires on no-ops is noise.
Restatement of 2026-07-20 — venue coverage rule
The min_venue_coverage rule was introduced in methodology v0.4.3 and the
restatement was applied on 2026-07-20 with the code at v0.4.4, so the
affected rows carry methodology_version: 0.4.4. The archive had not been
published externally at that point and no value had been cited; the
restatement was carried out before launch precisely so that the published
series and a recomputation from raw data agree exactly.
| Date of entry | Affected fix | What changed | Why | Detected by |
|---|---|---|---|---|
| 2026-07-20 | 2026-07-10 (official) | Premium restated +3.0494% → +3.0442% (−0.52 bps); eligible venues 4 → 3. Marked revised. |
Venue coverage rule (min_venue_coverage, methodology v0.4.3): a venue surviving under 50% of the window's buckets is no longer treated as a constituent. |
Internal audit of the 2026-07-20 fix |
| 2026-07-20 | 2026-07-13 (official) | Premium restated +2.7258% → +2.7250% (−0.08 bps); eligible venues 3 → 2. Marked revised. Note: this day now sits at the two-venue minimum — it was genuinely a thin day. |
As above. | Internal audit |
| 2026-07-20 | 2026-07-11, 07-14, 07-15, 07-17, 07-19, 07-20 | Eligible-venue counts restated (one venue dropped per day). Published premiums unchanged, so these are not revisions. | As above. Under the pooled median a small residue of surviving observations cannot reach the median, so the number was unaffected — but the venue was still being counted as a constituent. | Internal audit |
Restatement of 2026-07-27 — FX source migration (v0.5.0)
The FX denominator moved from the retired market USD/INR to the ECB-derived
rate under the D-1 rule; the entire published archive was recomputed against
pinned ECB data (ecb-slice-2026-07-01-2026-07-24.xml, source sha256
3ae8c2902628f31cb8b771e78f238e62c0bd932ac5d401e53aed73ffa604af14). Deltas
are uniformly positive (+3.9 to +20.9 bps): the old blend at 12:31 IST ran
consistently above the ECB cross in a depreciating-INR month. The numerator —
window, filters, aggregation — was untouched. Shared cause for every row
below: FX source migration to ECB-derived USD/INR (methodology v0.5.0);
detected by internal audit. Deltas are computed from unrounded values, so
±0.01 bps versus figures recomputed from the rounded percentages is possible.
| Date of entry | Affected fix | What changed |
|---|---|---|
| 2026-07-27 | 2026-07-09 (official) | Premium restated +3.2508% → +3.2991% (+4.83 bps). Marked revised. |
| 2026-07-27 | 2026-07-10 (official) | Premium restated +3.0442% → +3.1364% (+9.22 bps). Marked revised. |
| 2026-07-27 | 2026-07-11 (indicative) | Premium restated +2.6828% → +2.8334% (+15.07 bps). Marked revised. |
| 2026-07-27 | 2026-07-13 (official) | Premium restated +2.7250% → +2.8964% (+17.13 bps). Marked revised. |
| 2026-07-27 | 2026-07-14 (official) | Premium restated +2.4386% → +2.5454% (+10.68 bps). Marked revised. |
| 2026-07-27 | 2026-07-15 (official) | Premium restated +2.9233% → +2.9627% (+3.94 bps). Marked revised. |
| 2026-07-27 | 2026-07-16 (official) | Premium restated +2.9593% → +3.0336% (+7.43 bps). Marked revised. |
| 2026-07-27 | 2026-07-17 (official) | Premium restated +2.6620% → +2.7146% (+5.27 bps). Marked revised. |
| 2026-07-27 | 2026-07-18 (indicative) | Premium restated +2.3093% → +2.4354% (+12.61 bps). Marked revised. |
| 2026-07-27 | 2026-07-19 (indicative) | Premium restated +2.4338% → +2.5600% (+12.62 bps). Marked revised. |
| 2026-07-27 | 2026-07-20 (official) | Premium restated +2.4896% → +2.6987% (+20.90 bps). Marked revised. |
| 2026-07-27 | 2026-07-21 (official) | Premium restated +2.6066% → +2.6954% (+8.88 bps). Marked revised. |
| 2026-07-27 | 2026-07-22 (official) | Premium restated +3.2196% → +3.3303% (+11.07 bps). Marked revised. |
| 2026-07-27 | 2026-07-23 (official) | Premium restated +3.1448% → +3.1894% (+4.46 bps). Marked revised. |
| 2026-07-27 | 2026-07-24 (official) | Premium restated +3.2531% → +3.4050% (+15.20 bps). Marked revised. |
| 2026-07-27 | 2026-07-25 (indicative) | Premium restated +3.6201% → +3.7874% (+16.73 bps). Marked revised. |
| 2026-07-27 | 2026-07-26 (indicative) | Premium restated +3.3513% → +3.5181% (+16.68 bps). Marked revised. |
| 2026-07-27 | 2026-07-27 (official) | Premium restated +3.5918% → +3.6450% (+5.31 bps). Marked revised. |
Sunday 2026-07-12: no indicative value was ever published — no row exists in the stored series for that date, so there was nothing to restate. The cause of the gap (the indicative series was being introduced that weekend) is recorded in the engineering log; every subsequent weekend day is present.
Publication timing — 2026-08-25
The daily fix for 2026-08-25 was not computed at its scheduled time of 12:35 IST. Memory exhaustion on the index host stalled the scheduler beyond the job's misfire tolerance and the scheduled run was skipped rather than delayed. Venue collection was unaffected and continued throughout: the 11:30–12:30 IST observation window was captured with 54 observations per venue against a recent norm of 58, and every eligible venue reported full coverage. The fix was computed from those unchanged inputs, published the same day at 18:45 IST, and independently reproduced from raw data before publication.
Window, filters, aggregation, methodology version and FX denominator are identical to a scheduled run; only the publication time differs. No published value was created outside its window, revised or withdrawn — so this is not a revision and no fix is marked revised. The archive's computed_at timestamp records the actual publication time.
| Date of entry | Affected fix | What changed | Why | Detected by |
|---|---|---|---|---|
| 2026-08-25 | 2026-08-25 (official) | No published value changed. Fix published 18:45 IST instead of 12:35 IST. Not marked revised. | Scheduler stalled past its misfire tolerance during a host memory-exhaustion incident; the scheduled run was skipped. Inputs unaffected. | Internal review |