Data to 23 October 2026
About

Methods

India’s position with the world

The External dimension asks whether India’s position with the world is sound. It describes the reserve cushion, goods trade and the current account, the rupee against trading partners, and foreign financing. It does not estimate a crisis probability, fair exchange rate or future return.

Code: compute/economy_external.py, publish/economy_external.py, steps/economy_external.py. Step economy_external follows rbi. Bundles: economy/external/facts, trade, reserves, debt, bop, intervention, rupee, fpi, bis_eer, dollar_credit. Tests: pipeline/tests/test_economy_external.py.

Inputs and units

Only held inputs are read. The step makes no network requests and adds no ingestion or datasets. RBI’s rbi_* derived tables supply reserves and composition, external debt, quarterly balance of payments, monthly effective exchange rates and FX operations. Monthly merchandise trade comes from the latest rbi_dbie_foreign_trade_monthly snapshot, resolving duplicate retrievals before pivoting. Dollars are divided by a billion. NSDL custodian totals come from fpi_totals, INR rows only, kept in rupees crore. BIS effective rates and global dollar credit come from bis_eer_m and bis_gli_q. The economy registry’s external rows come from economy_scorecard.json; this older computation is dated separately and is never silently refreshed or substituted for the dimension’s readings.

No FBIL, FIMMDA, CCIL or AMFI figures enter this step. Charts of RBI’s own levels hide table, CSV and JSON controls using the site’s no-download convention; derived ratios and growth rates retain downloads. This convention hides controls, rather than imposing access control on the underlying chart JSON. Every figure names its publisher.

Calculations

Dates, absence and historical comparison

Dates label month-start and quarter-start for period data; weekly dates are actual observations. Only completed periods at the explicit as_of enter. Each fact retains its own last non-null date, preceding observation date and change. The preceding observation may be separated by a gap, which is why the page calls it the previous observation rather than last month. Missing periods break charts and rolling windows. Absent optional tables produce an explicit missing-data note; obsolete optional bundles are removed from the manifest on republish.

Every prose number comes from the facts bundle. Historical rulers use economy_common.history_place: the middle half of observed history, min/max and the latest reading’s rank. Quarterly histories shorter than twenty observations and monthly histories shorter than sixty are flagged short. Reserve and import-cover rulers use the month’s actual last weekly observation, including a partial latest month, labelled in the row note. These are full-history descriptive summaries, never available-at-the-time trading signals. The decade horizon uses the median import cover within the preceding ten calendar years and says so.

The answer uses explicit descriptive yardsticks: at least six months of merchandise import cover and reserves at least equal to original-maturity short-term debt. These are editorial rules, not fitted or official safety thresholds. The verdict gives priority to incomplete or old evidence. Readings are flagged old after twenty-one days for weekly reserves, ninety days after month-end for monthly data, and 180 days after quarter-end for quarterly data. Import-cover age also requires checking its separately disclosed imports date. A cushion computed using old debt still produces a dated verdict. The page does not call that proof of present safety.

The default as_of is the run’s date in India. Tests can pass a fixed date. Identical held inputs and as_of yield identical table contents, facts and content-hashed bundles; external bundles omit wall-clock generation timestamps. Historical values are latest-vintage and can be revised. The assumed import release lag prevents same-period future alignment but does not reconstruct archived vintages. No historical predictive test is run. Reserved C90–C94 are unused.

Verification

Run cd pipeline && uv run python -m tipsheet.run --only rbi,economy_external, then uv run python -m pytest -q tests -k "economy or rbi". Sync site data and inspect all five pages at desktop and phone widths, scrolling before screenshots to render lazy charts. Session evidence and commands are recorded in docs/plans/economy_portal/status/codex-external.md.

Repeatable browser checks: from apps/site, run node scripts/verify-economy-external.mjs against the dev server at http://127.0.0.2:4425 (override with EXTERNAL_BASE_URL). It saves full-page screenshots and a report in .cache/economy-external-verification. From the repository root, uv run python scripts/economy/verify_external.py independently checks source values, accounting identities, import timing, ratios, historical ranks and all numeric tokens extracted from the rendered prose. This token check is supplemented by reading the screenshots for units and interpretation.

For a missing-input browser canary, stop this worktree’s normal dev server and run node scripts/verify-economy-external-missing.mjs from apps/site. It temporarily substitutes an empty External facts bundle and removes optional External bundles from this worktree’s ignored public manifest, uses 127.0.0.3:4425, then restores the original manifest in a finally block. It leaves evidence in .cache/economy-external-missing. Sync data and restart the normal server afterwards. No other worktree is changed.

Monthly portfolio and spot-operation bar charts show a trailing window of three years so the bars remain readable on phones. The published bundles retain the full held history; the annual portfolio line and the forward-position chart provide the longer view.

This note is the repository file docs/methods/economy_external.md, rendered as-is.