Warconomy prerenders about 2286 static pages — 558 HTML and 1728 machine-readable. Versioned routes are 57% of the total: each of the 157 materialized versions generates 12 pages, so a release that freezes a version adds roughly 8 pages. The largest families are Versioned machine endpoints (per materialized version), Record history pages, Static machine endpoints + schemas + distributions.
- 2286 static pages; versioned routes ~57%.
- 12 pages per materialized version; ~8 added per release.
- Machine-readable at /performance/build-cost/data.json.
Pages by route family
| Family | Items | HTML | Machine | Total | Growth |
|---|---|---|---|---|---|
| Versioned machine endpoints (per materialized version) | 157 | 0 | 1256 | 1256 | per version |
| Record history pages | 139 | 139 | 139 | 278 | per record |
| Static machine endpoints + schemas + distributions | 226 | 0 | 226 | 226 | per feature train |
| Indicator detail pages | 59 | 118 | 59 | 177 | per observation |
| Static HTML pages (catalog) | 160 | 160 | 0 | 160 | per feature train |
| Source detail pages | 34 | 68 | 34 | 102 | per source |
| Versioned HTML detail pages (latest N only) | 10 | 40 | 0 | 40 | capped |
| Entity detail pages (chokepoint/commodity/conflict/sanction/dashboard/series) | 30 | 30 | 0 | 30 | per entity |
| Methodology contributor guides | 3 | 3 | 3 | 6 | fixed-ish |
| Dataset example payloads | 6 | 0 | 6 | 6 | fixed |
| Category JSON endpoints | 5 | 0 | 5 | 5 | per category |
Performance report: /performance · machine-readable: /performance/build-cost/data.json.
Static route budget ok
Soft (warn) and hard (fail) budgets per route family and for the overall page count. A warning is a nudge to consolidate; a failure only triggers on an extreme regression (e.g. the versioned-HTML cap being removed). The build fails only on a hard breach — enforced by npm run budget:check and the data audit.
| Budget line | Actual | Soft | Hard | Headroom | Status |
|---|---|---|---|---|---|
| Total static pages | 2286 | 3000 | 6000 | 3714 | ok |
| Pages per materialized version | 12 | 12 | 20 | 8 | ok |
| Pages added per new frozen version | 8 | 8 | 16 | 8 | ok |
| Versioned machine endpoints (per materialized version) | 1256 | 2400 | 4000 | 2744 | ok |
| Record history pages | 278 | 600 | 1200 | 922 | ok |
| Static machine endpoints + schemas + distributions | 226 | 400 | 900 | 674 | ok |
| Indicator detail pages | 177 | 400 | 900 | 723 | ok |
| Static HTML pages (catalog) | 160 | 300 | 700 | 540 | ok |
| Source detail pages | 102 | 300 | 700 | 598 | ok |
| Versioned HTML detail pages (latest N only) | 40 | 44 | 80 | 40 | ok |
| Entity detail pages (chokepoint/commodity/conflict/sanction/dashboard/series) | 30 | 150 | 400 | 370 | ok |
| Methodology contributor guides | 6 | 40 | 80 | 74 | ok |
| Dataset example payloads | 6 | 40 | 80 | 74 | ok |
| Category JSON endpoints | 5 | 40 | 80 | 75 | ok |
Validation performance (payload-import pass)
The frozen version payloads (~157 versions) are now lazy-loaded one shard at a time instead of eagerly imported, and metadata-only surfaces read a committed manifest rather than payload bodies. This removed the collect/transform cost that dominated every test run. Figures are representative measured benchmarks (single-worker; machine-dependent), not real-time.
| Metric | Before | After |
|---|---|---|
| Full test suite (wall) | ~1253s (20.9 min) | ~162s (2.7 min) |
| Full test suite (collect/transform) | ~1058s | ~46s |
| Data audit (audit:data, wall) | ~1235s (20.6 min) | ~134s (2.2 min) |
| validate:release (lint+test+audit+build) | ~46.7 min | ~11.7 min |
| Importing dataset.ts (collect) | ~45.9s | ~3.2s |
| test:fast / audit:fast | n/a (collect-bound) | ~12s / ~11s |
| Static build (prerender) | ~2.6–3.1 min | ~2.9 min (unchanged) |
Still loads payload bodies (by design): the versioned data.json/diff.json routes, record/provenance history, and the payload-integrity test group (npm run validate:snapshots). The remaining build cost is static prerender (route count), bounded by the route budget above. Next options: precompute record version-appearances and the provenance snapshot summary into the manifest so the record/provenance pages render body-free too.