Scrutica
Facility-side substrate aggregates Epoch AI's Frontier Data Center catalog (Tier 2), IM3 OpenStreetMap data-center bulk corpus (Tier 3), PeeringDB facility participation tables (Tier 2), a licensed corporate-ownership database (Tier 2), SEC EDGAR primary filings (Tier 1), gridstatus.io interconnection-queue data (Tier 2), and operator press releases (Tier 3). Supply-chain edges come from licensed supply-chain databases (Tier 2), SEC Exhibit 21 subsidiary filings (Tier 1), and CSET entity classification (Tier 2). Regulatory-event substrate is Federal Register-anchored (Tier 1). The licensed databases are held under academic subscription and are not redistributed; only the resulting tier-2 facts (who owns or supplies whom) appear, and a public filing is preferred wherever one covers the same relationship. Per-source URLs, authority tiers, and record counts are surfaced on every page's colophon via the ProvenanceSummary component.
Every facility and supply-chain relationship Scrutica surfaces is traceable back to a primary source wherever one exists. Facility records come from Epoch AI's frontier-DC catalog, OpenStreetMap, PeeringDB, SEC filings, and operator disclosures. Supply-chain relationships are sourced from licensed supply-chain databases (held under academic subscription, not redistributed), SEC Exhibit 21 subsidiary filings, and CSET research classifications. Regulatory events are pinned to Federal Register documents. Every page footer carries the source manifest with authority tiers (1 = primary filing, 2 = research database, 3 = press / analyst, 4 = inferred).
A subset of the supply-chain and ownership edges that originally entered Scrutica through a licensed database have been independently re-sourced to a public primary document, and now carry that primary's URL in place of the vendor pointer. Each re-derived edge had its underlying relationship (and its direction) confirmed against the public filing — a verbatim quote naming both parties is required before the edge is re-tagged; edges whose relationship is disclosed nowhere public remain on their licensed provenance (and are gated off anonymous surfaces) rather than being asserted without a source. Three families result, by where the primary lives: sec-edgar-rederived (a filing on sec.gov — Tier 1), public-registry-disclosure-rederived (a foreign primary registry: SIRENE, the Handelsregister, Companies House, HKEX, DART, MOPS, and equivalents — Tier 1), and company-disclosure-rederived (a company's own press release, IR page, or current report — Tier 1). A re-derived edge is provenance-equivalent to a natively-public one: it classifies as a public-filing source, ranks at primary-source authority in the chain-of-title walk, and renders its real source URL. Live per-family counts appear in the source breakdown on /supply-chain and /cascade.
Where a relationship that first reached Scrutica through a licensed database is also documented in a public filing, we re-source the edge to that filing — an SEC EDGAR document, a foreign company registry, or a company's own disclosure — and confirm the relationship against the primary text before re-labeling it. The result is an edge any reader can audit without a subscription. Relationships disclosed only in licensed data are not published on public surfaces unverified; they are held back rather than asserted without a citation. Re-derived edges are counted as primary-source (Tier 1) and carry the public document's link in their colophon.
Normalized pricing in $/petaFLOP-day, derived from published hourly rates and Epoch AI hardware specs (dense BF16 TFLOP/s, no 2:4 structured sparsity; 989.5 per H100 SXM, matches Epoch AI ml_hardware). Four sub-indices cover cloud spot, cloud reserved, on-premises TCO, and sovereign procurement. All prices land in the same unit, so a CoreWeave rate is comparable to an Azure rate to a hyperscaler-sovereign rate.
The same unit of AI training compute prices 3–10x apart across providers, regions, and procurement models. That spread, more than the absolute level, shapes which actors can afford frontier training and which are priced out; the index converts every published rate to a single comparable unit so the spread is visible at a glance.
One petaFLOP-day is 1015 FLOP/s sustained for 86,400 seconds. The unit normalizes cost across hardware generations, cloud providers, and procurement models; the Cost Index reports all prices as $/SCU.
The SCU is a standardized measure of AI computing power sustained for one day. Once every quoted rate is in $/SCU, a hyperscaler $2.50/hr GPU instance and a neocloud $1.80/hr configuration become comparable; the cheaper sticker price is not the same as cheaper training compute, and the conversion is what makes the difference visible.
BF16 TFLOP/s dense, no 2:4 structured sparsity (source: Epoch AI ML Hardware dataset). On-prem defaults: MFU , PUE , $5K networking + $3K facility share per GPU (editorial estimates, tier 4).
Both the FLOP Capacity Engine and the Cost Index quote dense BF16 Tensor Core throughput without 2:4 structured sparsity (989.5 TFLOP/s per H100 SXM, 312 per A100, 2,250 per B200), which matches the Epoch AI ml_hardware reference and the throughput real training jobs achieve; most production workloads do not enable sparsity, and the MFU parameter is calibrated against this dense baseline. NVIDIA marketing and cloud-provider cut sheets sometimes quote the 2:4-sparsity figure (1,979 TFLOP/s for H100); a $/petaFLOP-day computed against those sparsity-inclusive specs will land roughly half the value the index reports, and that gap is unit mismatch rather than pricing disagreement.
On-demand / spot pricing for GPU compute from major cloud providers (AWS, GCP, Azure, Lambda, CoreWeave).
1-year and 3-year reserved instance pricing. Committed-use discounts.
Total cost of ownership for self-operated GPU clusters including hardware, power, cooling, facility, and labor.
Effective cost for government-funded sovereign AI compute including subsidies, grants, and below-market financing.
| Data Source | Cadence | Method |
|---|---|---|
| Cloud Provider APIs (Azure, OCI; AWS spot) | Daily | Vercel cron (/api/cron/cloud-pricing) |
| AWS Pricing Bulk API (on-demand) | Daily | GitHub Actions (.github/workflows/aws-pricing-canonical.yml) |
| Cloud Provider Pricing Pages (GCP, CoreWeave, Lambda) | Manual refresh | Playwright-verified, ingested via refresh-cloud-pricing.ts + ingest-cloud-enrichment.ts |
| Enterprise Contract Disclosures | Quarterly | SEC filing extraction |
| Hardware Vendor ASPs | Quarterly | Earnings transcript parsing |
| Electricity Tariff Data | Annually | EIA / regional utility databases |
Cite the Compute Cost Index dataset (v2026.2, released 2026-05-19): scrutica.com/datasets/compute-cost-index (Zenodo DOI minting pending — see /datasets/compute-cost-index for the canonical bundle).
BFS propagation over a weighted directed graph of supply chain relationships. The propagation formula at each hop is parentImpact × flowShare × (criticality / 10) × propagationDecay. flowShare is the fraction of customer input from this supplier (defaulting to 30% when unspecified); criticality for licensed supply-chain database edges is rank-derived from the source’s relationship-rank field (a 3/4/6/8 bucket) and editorial for curated-seed edges; propagationDecay is a per-scenario substitutability assessment. annual_value_usd(licensed-database relationship value) is preserved on each edge for provenance but is not consumed in the propagation formula. Optional market-correlation weighting (off by default) blends editorial criticality with the 3-month supplier–customer stock-price correlation to reflect market-revealed economic coupling. Configurable shock severity, propagation delay, and threshold cutoff.
A disruption at one supplier propagates outward through the AI supply chain; the simulation traces the shock hop by hop and surfaces who loses access, to what, and for how long. Some inputs (ASML EUV lithography) have no substitute; others (power delivery, construction) source from many vendors. The decay rate at each hop reflects the asymmetry.
Scenario source attributions in cascade-dynamics.tsreference primary filings (ASML annual reports, TSMC quarterly management reports, NVIDIA 10-Q, SK Hynix investor relations, USGS Mineral Commodity Summaries, MOFCOM/USITC regulatory notices). Each citation names the filing it reads from; paragraph-level cross-check was completed for five of six load-bearing Tier-1 citations on 2026-05-15 (ASML 44/48 EUV via the ASML 2025 Annual Report; TSMC Q4 2025 67.86 days inventory via GuruFocus calculation matching TSMC’s reported figures; SK Hynix 2026 HBM sold-out across TechSpot/Notebookcheck/ITdaily/TweakTown; the three historical-backtest citations defensibly Tier-1 at source). One narrow item remains open: NVIDIA Q3 FY2026 $6.8B finished-goods sub-breakdown (SEC EDGAR returns 403 and macrotrends paywall blocks direct access; the $19.8B total inventory figure is verified). Resolution targeted by 2026-06-30 once an alternate primary-source path lands.
The model starts at the disrupted company and traces outward through the supply chain one step at a time, with severity decaying at each hop by how easy it is to source the input from an alternate supplier. Equipment with no substitute (ASML’s EUV lithography) passes nearly full severity downstream; categories with many vendors (construction, power delivery) absorb most of the shock. The walk terminates when severity falls below a 5% threshold or after six hops from origin, whichever lands first.
| Parameter | Default | Range | Description |
|---|---|---|---|
| propagation_delay | 30 days | 1–365 | Time for a disruption to propagate from one supply chain node to the next. |
| initial_shock_severity | 1 | 0.1–1 | Severity of the initial disruption at the source node (1.0 = complete disruption). |
These per-scenario propagationDecay constants are editorial tier-4: hand-authored by domain judgment per scenario, calibrated against market-share data, sole-source status, and substitution-path qualification. They are not empirically calibrated against historical decay observations — no public dataset exists for semiconductor cascade propagation. The values encode relative substitutability judgments (0.95 = near-monopoly; 0.65 = meaningful alternatives exist) and should be interpreted as ordinal rankings, not cardinal measurements. Source of truth: PREBUILT_SCENARIOS in src/lib/compute/cascade-simulator.ts. A future revision will derive these from category_substitutability × scenario_spreadwith both inputs auditable; until then, this table is the simulator’s ground truth.
Each scenario carries a per-hop propagation decay — how much of the disruption’s severity passes from one supply-chain link to the next. Higher values mean the disruption spreads further; lower values mean alternatives or buffers dampen the impact. These are domain-expert judgments, not measured rates — no historical dataset of semiconductor cascade decay exists to calibrate against. A future revision will split each value into a category-substitutability factor and a scenario-spread factor so the reasoning is explicit at both layers.
| Scenario | Decay | Rationale |
|---|---|---|
| TSMC Taiwan Disruption | 0.90 | TSMC is deeply embedded in advanced-node logic, but some customers maintain Samsung Foundry and Intel Foundry relationships at lower nodes — a non-trivial fraction of impact is absorbed at the first hop. |
This table is a domain-knowledge snapshot of how replaceable each supply-chain layer is at the category level. It is not consumed by the cascade simulator. The simulator’s per-scenario propagationDecay constants (table above) are independent editorial assessments per scenario; the two are conceptually related but not formulaically derived. Updating values here does not change cascade outputs. The category numbers are kept as a domain reference because they encode standalone substitutability claims with their own provenance (market shares, sole-source status, capacity data). A future revision will refactor the simulator to derive per-scenario decay from this category-level layer plus a per-scenario spread factor, at which point this table becomes a live input.
Category-level reference: how replaceable is each part of the supply chain? ASML’s EUV lithography has no second supplier (low replaceability); construction firms have many vendors (high replaceability). This table is documentation of those domain claims; the cascade simulator does not use these numbers directly.The simulator’s per-scenario decays (above) are independent editorial assessments. A future revision will tie them together explicitly.
Each supply chain layer holds a different amount of inventory that delays disruption propagation. Buffer data sourced from 10-K/annual report inventory line items (Tier 1), TrendForce/SemiAnalysis (Tier 2), and analyst estimates (Tier 3).
Real supply chains have stockpiles: chip makers hold weeks of inventory, memory suppliers pre-sell their output. These buffers determine how long downstream companies can operate before a disruption reaches them.
| Layer | Buffer | Range | Shape | Tier |
|---|---|---|---|---|
| EUV Lithography | None | 0–0 wk | cliff | T1 |
| Advanced Wafers (N3/N5) | 10 wk | 8–16 wk | linear | T1 |
When a supplier is disrupted, how fast can alternatives absorb demand? Qualification time is the lag before any substitute output appears; capacity ceiling is the maximum fraction absorbable. Ramp follows an S-curve from qualification to ceiling.
Not every supply-chain link is equally fragile. Micron HBM can be replaced in months; ASML EUV lithography cannot be replaced at all. The table reports replacement timelines and absorption ceilings for the alternatives where they exist.
TSMC Advanced Node
ASML EUVNo viable substitute
SK Hynix HBM
Temporal parameters calibrated against three observed disruption events. Observed propagation delays and buffer absorption patterns validate the model's depletion and substitution functions.
The temporal parameters are calibrated against three observed disruptions spanning distinct archetypes (sudden shutdown; commodity shock absorbed by buffers; sustained capacity bottleneck). The model’s predicted timelines match the observed delays where the historical record is detailed enough to compare.
Source: TrendForce March 2021; Samsung Q1 2021 earnings ($268-357M loss) (T1)
Source: USITC Executive Briefing (DeCarlo & Goodman, Apr 2022); CSIS March 2022; Reuters (T1)
Edge weights draw on three signals. Supply share (% of customer input from this supplier) is available on ~3.2% of edges; the remaining use a default of 30%. Criticality (1–10 replaceability) comes from three paths: licensed supply-chain database edges (~58% of the graph) derive it from the source’s relationship-rank field, bucketed 3/4/6/8; curated-seed edges (~1%) carry hand-authored editorial scores; the remaining ~41% (a second licensed supply-chain database and CSET-ETO) have no source criticality and fall back to a default of 5. Sole-source edges are upgraded to criticality ≥ 9. Optional market-correlation weighting (off by default) blends criticality with the 3-month stock-price correlation (Pearson r, available on ~78% of the licensed-database edges; ~45% of all edges) via adjustedCriticality = w × 5(1+r) + (1−w) × current, where w defaults to 0.5. For edges without correlation data (the second licensed database, CSET, unlisted companies), the unblended criticality stands alone. Sole-source edges retain criticality ≥ 9 regardless of correlation. Price correlations are from licensed market-data downloads held under subscription, not redistributed (vintage: April 2026). The structural centrality proxy — the product of flow share and criticality — follows Li et al. 2020 (PMC7546950).
The “total affected compute” metric blends two weightings: nodes with facility-level FLOP/day estimates are FLOP-weighted; nodes without FLOP data are weighted by network degree centrality (count of supply-chain connections). Read the composite as an approximation, not a measurement; the topology-weighted leg is a structural proxy for impact, not a quantity of compute.
The supply chain graph is assembled from multiple data sources; each edge carries its own provenance and authority tier.
The supplier–customer relationships feeding the simulation come from four sources of varying reliability. SEC regulatory filings (Tier 1) are the most reliable; CSET market-share-derived links (Tier 2) capture industry structure without naming the bilateral counterparty; press and analyst reports (Tier 3) fill gaps the prior two leave open.
Per-benchmark log-linear fits of score against log10(training FLOP) across 36 evaluations and 3,000+ Epoch AI model entries; closed-frontier developers without disclosed training compute are flagged so readers see what the curve omits before they read it. The page renders slope, intercept, R2, and n alongside a four-tier quality label.
Compute predicts capability with different fidelity at different benchmarks; each benchmark is fit to the published training-compute axis on its own and reported with a quality label, so a reader can tell when compute is the dominant predictor and when other factors (post-training, data, evaluation choices) outweigh it. Closed-frontier systems whose training compute is undisclosed are flagged on every chart, so the visible trend is not silently selection-biased.
The upstream pipeline emits pre-computed BenchmarkStats records on data/processed/capability_scaling.json — one slope/intercept/R2/n tuple per benchmark, fit by ordinary least squares on score vs. log10(training FLOP). The chart renders those records directly: regressionLines in src/components/capability-scaling/ScalingExplorerClient.tsx:900–922 reads stats.regression, draws a two-point line from minX to maxX across the visible scatter, and labels it with R2 rounded to two decimals. The RegressionPanel at ScalingExplorerClient.tsx:1165 surfaces slope, R2, and n. Quality buckets are encoded in the upstream pipeline: “Strong” requires R2 > 0.6 and n > 50; “Moderate” requires R2 > 0.3 and n > 20; tighter samples drop to “Weak” or “Insufficient” and the fit line is suppressed when n < 3.
For each benchmark, a single straight line is fit through the points where both the score and the training compute are known. The line’s steepness measures how fast scores rise with each additional order of magnitude of compute; the R2measures how tight the fit is. A “Strong” label means compute predicts the score reliably; “Moderate” means there is a real but loose relationship; “Weak” means other factors dominate. Benchmarks with fewer than three usable data points get no fit at all rather than a line drawn through too few points.
The frontierGap useMemo in ScalingExplorerClient.tsx:355–384scans the top 10% of scoring entries (capped between 5 and 15) for the active benchmark selection; entries with no public training-FLOP value are surfaced as the missing-from-frontier set. The detection is dynamic, not a hard-coded developer list — the same logic flags Google DeepMind, Anthropic, and OpenAI releases when their training compute is undisclosed, and falls quiet when those developers publish numbers. The banner sits above the chart so the reader sees the disclosure caveat before they read the curve, and dedupes by (benchmark, organization, score) so multi-variant releases don’t inflate the count.
The compute-vs-capability scatter can only render points where both axes are known, so closed-frontier systems disappear from the plot whenever their training compute is undisclosed. The page detects this dynamically: it looks at the top 10% of scoring entries for whichever benchmarks are selected, and if any of those top entries have no published training compute, a banner names the missing models above the chart. This keeps the visible trend honest about what it omits.
The fit’s confidence is reported on every render: slope to three decimals, R2 to three decimals, n exact. The sibling page /capabilities/autonomy-monitor applies the same uncertainty discipline at greater amplitude — its METR-time-horizon scatter ships R2 = 0.30 in the subhead alongside the explanation that “compute explains ~30% of time horizon variance” and a shaded confidence band that propagates training-FLOP measurement uncertainty into the rendered region. Both pages reject the temptation to extrapolate the fit beyond the data’s training-FLOP range; the regression lines stop at minX/maxX of the actual benchmark’s scatter, not at the EU AI Act 1025 or US EO 1026 threshold reference lines that the chart also renders.
Every fit shows its uncertainty alongside the line: how steep, how tight, and how many models it was fit on. The page does not project the line beyond the compute range that has actually been observed — it stops at the highest-compute model in the data, not at regulatory thresholds further to the right. This matters because the EU AI Act 1025 FLOP trigger and the US Executive Order 1026trigger are visible on the chart as reference lines; readers can see where each benchmark’s observed range ends and where the regulatory horizon begins.
Bilateral semiconductor trade (HS 8542 IC subheadings 854211/854219/854231/854232/854239/854290) is aggregated from 5 customs sources, then differenced pre/post each BIS rule date with the comparison window stated in plain text. Market-cycle confounds (COVID, the 2021 supercycle, the 2023 inventory correction) are surfaced as caveats on each event card; the page does not absorb them into the headline change.
When the US tightens chip-export controls, the directly targeted corridor sometimes falls and volume reroutes through Singapore, the UAE, or Malaysia instead. The page reads 15 years of bilateral semiconductor trade across five customs authorities and reports the change pre- and post-event for each BIS action, with comparison years labeled and the macro confounds (COVID crash, post-COVID supercycle, inventory correction) called out on each event card where they apply.
The substrate table semiconductor_trade_flows ingests UN Comtrade, CEPII BACI (HS92, 231 reporters), Taiwan Customs DGCAS, China General Administration of Customs (GACC), and Japan e-Stat (Ministry of Finance customs statistics). Each row carries its data_source, reporter_country/partner_country as ISO-3 codes, direction (export/import; China GACC uses “both”), value_usd, and year. The page reads via getTradeFlowImpactData() in src/lib/data/trade-flow-impact.ts:388–482; corridor-level analysis runs through analyzeCorridorImpact() at lines 218–261. Reporter-code variants across vintages (US/USA, CN/CHN/CHINA) are normalized at query time. The HS-code filter is fixed in IC_HS_CODES(line 164); HS 8486 (semiconductor manufacturing equipment) is intentionally out of scope and would require its own corridor ingestion.
Five national customs authorities each report what they ship and what they receive. Reading them together (and labeling every row with the source it came from) makes it visible when China’s GACC and Korea’s reporting agree on a corridor and when they diverge. The page covers integrated-circuit trade (HS chapter 8542) only; chip-making equipment (HS 8486) is a separate dataset and is not included.
For each BIS rule date (October 2022, August 2023, January 2025), the comparison window is the two calendar years preceding the event averaged into a single annual baseline (preYears = [eventYear - 2, eventYear - 1] at trade-flow-impact.ts:222–238) versus the calendar year following the event (postYears = [eventYear + 1]). The page does NOT silently smooth or de-trend the pre-event window — the unsmoothed difference is what the corridor cards display. Where a comparison window straddles a known macro shock, the page surfaces the confound verbatim on the event card. The construction in trade-flow-impact.ts:437–466 prepends one or more of: “2020 COVID crash depresses pre-event baseline,” “2021 semiconductor supercycle inflates pre-event baseline,” “2022 inventory correction onset in pre-event baseline,” “2023 cyclical trough in pre-event baseline,” or post-period equivalents; if the post-event year is 2020, 2021, or 2023 it is flagged in the same string. Same-year events (siblings sharing the comparison window) are listed under shared_window_events so a reader can see when a corridor change is being attributed to the wrong rule.
Each BIS rule is compared to a baseline of the two prior calendar years against a post-event year of the year right after. The comparison is not adjusted for macro effects; instead, when one of those years was a major macro event (the 2020 COVID crash, the 2021 post-COVID supercycle, the 2023 inventory correction), the page flags it on the event card. If two policy actions land in the same year, both are listed rather than one being picked to carry the corridor change.
Featured corridors per event are hand-curated in EVENT_CORRIDORS at trade-flow-impact.ts:143–158 and rendered first; on-demand discovery via discoverTopCorridors() at lines 267–378 returns the largest-magnitude changes outside the featured set, filtered to corridors with pre-event annual flow > $100M to suppress noise. The third-party-redirection hypothesis (Singapore, UAE, Malaysia, and other intermediaries absorbing what the US-to-China corridor shed) is the analytical question the page is built for: by surfacing both the named corridors that BIS scoped (Netherlands → China, Japan → China, Korea → China for the October 2023 expansion) and the auto-discovered corridors that share the same time window, the page lets a reader see whether the policy bound the named corridor or whether the volume routed through one of the unnamed ones. Result rendering uses ISO-3 with a fallback English-name normalizer (normalizePartnerName() at lines 87–96) for sources whose original-language names would otherwise read as encoding bugs (China GACC ships 韩国 for Korea).
For each rule, the page shows two layers of corridor data: the corridors the policy was designed to target (named directly in the BIS rule), and the corridors that show the largest changes overall in that time window. If the policy bound the targeted corridor, the first layer changes; if volume rerouted, the second layer reveals the substitute path. Corridors below $100M of annual pre-event trade are excluded as noise.
The bis_license_actions substrate ingests the BIS Office of Technology Evaluation per-country “Annual Country Licensing and Trade Analysis” PDFs (bis.gov · OTE ↗). 2,587 rows × 33 jurisdictions × calendar years 2018-2022. Statutory authority Section 1765 of ECRA (50 USC §4824 / Pub. L. 115-232). Authority tier 1 (primary government measurement). Per-country ground-truth extraction pass-rate at substrate-build time was 88/88 = 100%.
Why the substrate ends at CY2022. The CY2022 country PDFs were published in early 2023 — historically a 2-4 month lag from calendar year-end. CY2023 country data has not been released by BIS as of 2026-06-12, putting the next vintage approximately 27 months past the historical cadence. No suppression, delay-announcement, or restructure has been publicly issued. The honest framing is “BIS has not released CY2023 OTE country-licensing data; release is overdue relative to historical cadence; no public publication timetable issued.” The platform substrate-refreshes will land on the BIS publication, not on inference — see CLAUDE.md DQP §8 (“Verify, never hedge”).
New statutory product on the horizon. The Maintaining American Superiority by Improving Export Control Transparency Act (H.R. 1316 · 119th Congress ↗, signed August 2025) mandates a separate annual report to Congress covering every license action for “covered entities” (Entity-List / Military-End-User-List firms in China, Russia, Syria, embargoed jurisdictions), with aggregate statistics releasable publicly. The first report is due no later than 2026-08-19. This will be a distinct (narrower-scope, higher-detail) data product from the historical OTE country-licensing series, and may or may not coexist with a renewed OTE series.
What we CAN answer for CY2023-2026. Bilateral semiconductor trade-flow (HS 8542 / 854231 / 854232 / 854239) runs through 2026 on UN Comtrade, CEPII BACI (231 reporters), Taiwan Customs, China GACC, and Japan e-Stat. These measure what was declared under customs classifications — not what BIS licensed. The /trade-impact and /diversion-pipeline-tracker pages render both side-by-side and never silently compose them. CRS R48642 (Sutter, updated 2025-09-19, crs · R48642 ↗) is the leading public synthesis of the CY2023+ export-control posture absent the OTE substrate; it cites press-release-conveyed CY2020-Q1-2022 license values and does not contain CY2023 OTE-grade license data.
What we CANNOT answer for CY2023-2026. The per-country, per-ECCN, per-year license-action grid (approved / denied / returned-without-action / deemed-export) does not exist publicly. Inference from trade-flow shifts to a license-vs-banned-vs-grey-market trichotomy is structurally unsound at this vintage: trade-flow reflects customs declarations and re-export routing, license-action data reflects BIS decisions. Conflating them silently is the single most common methodological error in trailing-twelve-month US-China chip-shipment analyses; we surface them separately and refuse to compute the trichotomy until the OTE data lands.
Surfaces with the vintage disclosure: /trade-impact · /diversion-pipeline-tracker. Substrate: bis_license_actions (2,587 rows; CY2018-CY2022 × 33 jurisdictions). Statutory authority: Section 1765 of ECRA. Closure of audit gap A2 (Wave-14 cross-domain coverage-gap audit, 2026-05-19).
Frontier-cost (peak reported $/run, 2023 USD) and replication-cost curves are read from per-model entries on Epoch AI’s notable_ai_models.csv; capability is anchored to Epoch’s Capabilities Index (ECI), an IRT-fit composite over 42 benchmarks. Total-cost mode applies the Cottier et al. 2024 R&D-multiplier range to compute-only training-run costs; the US/China gap decomposition compares DeepSeek-V3’s disclosed final-run cost against Epoch AI’s estimate for Grok 4’s total training compute.
Training a frontier AI model has gotten orders of magnitude more expensive over three years; matching last year’s best model has gotten cheaper every cycle. Two divergent cost curves separate the actors who can field a new frontier system from those who can operate a parity-class one; the distinction is a load-bearing input to capability-access governance. The page reads 20+ models from Epoch AI, layers in a peer-reviewed total-development-cost multiplier range, and surfaces the US/China comparison so the math is auditable, not assertion.
The 20-model corpus lives as the MODELS constant in src/components/training-cost/TrainingCostCliff.tsx:55–450; each entry carries a cost-confidence label (Confident / Likely / Speculative), an authority tier, and a citation describing the disclosure it draws from. The page renders peak reported $/run in 2023 USD on the y-axis (log scale, $50K–$1B) by date, with replication-cost framing surfaced in-line via the chart legend and per-model cards. The cost-mode toggle in effectiveCost() at lines 551–556 swaps between training-only ($/run for the actual training compute) and total-development ($/run multiplied by the midpoint of the model’s R&D-multiplier range from Cottier et al.). The Pareto frontier line, computed by computePareto()at lines 502–513, shows the cost-efficient envelope: every model is dominated unless it sits on the frontier of (lowest cost) at-or-above (its capability tier).
The chart shows two costs at once: how much each model’s training run cost when it was first built (peak), and what it would now cost to match that capability with smaller, more efficient hardware (replication). A toggle swaps between training-only cost and total-development cost (which adds R&D, staff, and pre-training experimentation through a peer-reviewed multiplier range); the frontier line traces the cost-efficient envelope so the reader can see which models extend the curve and which sit beneath it.
Capability is anchored to Epoch AI’s Capabilities Index, an IRT-fit composite over 42 benchmarks (CC BY 4.0). Each model’s eciScore on TrainingCostCliff.tsxjoins to its training cost so “ECI per dollar” is a defined per-model quantity rather than a derived ratio of two unrelated series. The 2023-USD anchor on the cost axis means Epoch’s deflator is what carries forward across vintages; values are not silently re-stated against subsequent CPI cycles. The R&D-multiplier range used in total-cost mode is from Cottier, Rahman, Fattorini, Maslej, Besiroglu, & Owen (2024). For most models the page applies the paper’s 3×–8× range; GPT-4 specifically carries the paper’s study-anchored 2.4×–5.4× range with a model-specific note.
Capability is measured on Epoch AI’s Capabilities Index, a composite score derived from 42 benchmarks that places models on a single comparable scale. Training cost is in 2023 dollars throughout, so models from different years can be compared without reflation. Total-development cost — what it actually costs to ship a frontier model when staff, R&D, and pre-training experiments are included — is estimated using a published academic range (3× to 8× the training-only cost; tighter for GPT-4, where a specific study estimate is available).
The headline efficiency-leader stat (DeepSeek-V3 at 24.7 ECI/$M; 65× gap vs. Grok 4) is rendered with an explicit caveat: the comparison places DeepSeek-V3’s disclosed final-training-run cost ($5.6M, from the DeepSeek paper’s reported H800 GPU-hours) against Epoch AI’s estimate of Grok 4’s total training cost. That is not a like-for-like comparison — DeepSeek’s number excludes pre-training experimentation, R&D, and synthetic-data generation; Epoch’s Grok 4 number is methodology-modeled rather than disclosed. The page shows both the $5.6M number and the Cottier-et-al. range that would apply if the DeepSeek figure were normalized for total development; readers can adjust the comparison by toggling between training-only and total-development cost mode.
The headline US/China efficiency comparison surfaces a ~65× gap, but the page is careful about what is being compared. DeepSeek-V3’s reported $5.6M is the cost of the final training run only, as the DeepSeek paper disclosed it; Grok 4’s figure is Epoch AI’s estimated total training cost, which is methodology-modeled rather than a disclosure. The two are at different levels in the cost stack. Toggling the page’s cost-mode switch lets the reader compare both at the same level.
effectiveCost(); the GPT-4-specific 2.4×–5.4× figure also originates here.MODELS entry on TrainingCostCliff.tsx carries its own source string naming the disclosure (Meta paper for Llama 3, DeepSeek paper for DeepSeek-V3, Epoch AI estimate for non-disclosed frontier systems); each entry’s authorityTierreflects whether the underlying figure is disclosed (tier 1–2) or estimated (tier 3–4).The Compute Visibility Index measures, per country, what fraction of in-country compute capacity is attributable to a public-filing-grade ultimate beneficial owner. Four tiers plus an explicit coverage state: Tier 1 — UBO identified through SEC / FCA / equivalent securities-regulator filings; Tier 2 — UBO through corporate-registry filings (Companies House, Bundesanzeiger, METI EDINET, NRA registries); Tier 3 — UBO through licensed analyst-database research (held under subscription, not redistributed) where primary filings are not available; Tier 4 — the operator is named in Scrutica's records but the upward ownership walk found no documented ancestors. Data Gap is a separate state: the facility itself has no operator or owner organisation linked, and the chain-walk has not yet reached it.
The Tier 4 / Data Gap distinction is intentional. Tier 4 is a finding about the records (the chain has been looked at, and it is opaque); Data Gap is a finding about Scrutica's coverage (the chain has not yet been looked at). Comparing two countries on opacity without separating these two states is structurally unfair to both — /compute-visibility renders the gap percentage in its own column rather than collapsing it into Tier 4.
Capacity-weighted aggregation. Tier distributions are reported in capacity-weighted form: a country's tier-1 percentage is the sum of power_capacity_mwacross tier-1-classified facilities divided by the country's total documented capacity, not the count of tier-1 facilities over the total count. A 1 GW Tier 1 facility carries more weight than fifty 1 MW Tier 4 ones; the weighting follows where governance leverage actually lives. Per-country detail surfaces the facility-count distribution alongside for completeness.
What this index does not measure.It measures transparency of compute-asset ownership records, not the quality of a country's regulatory regime, the cleanness of its corporate-disclosure law, or the rigour of its export-control posture. A country with mostly Tier 1 capacity has more legible compute records; that is structurally different from being “more transparent overall.” Tier 4 capacity is not an allegation of wrongdoing — private holding structures and family-trust ownership are common, legal, and unrelated to compute-governance posture. The classifier surfaces structural opacity; what to do with that observation is a downstream governance question.
Hosted vs Controlled. A facility that physically sits in country A but whose ultimate beneficial owner sits in country B counts toward country A on the “hosted” view and country B on the “controlled” view. The two diverge where jurisdictional arbitrage applies (e.g., AWS facilities in Ireland controlled from the US; G42-controlled facilities hosted in the UAE). /coordination-gapssurfaces the divergence as the policy-relevant signal — export-control authority follows controlled-jurisdiction, not hosted-jurisdiction.
Surface: /compute-visibility (top-30 dashboard + per-country drill-down). In-page methodology: /compute-visibility#methodology (chain-walk algorithm + Tier 4 vs Data Gap worked example + Inspur cross-listing case). Substrate: organizations + ownership_chain_edges + facilities.operator_org_id.
The Compute Under Control metric is the jurisdictional-attribution counterpart to the Compute Visibility Index. It answers a strict question: of the compute physically hosted inside country C, what fraction is operated by a C-incorporated firm whose ultimate corporate parent is also C-incorporated? Each facility falls into one of five named classes: Domestic — host country, operator country, and ultimate parent country all equal C; Foreign-concentrated — operator and ultimate parent agree on a non-host jurisdiction (the textbook hyperscaler-region pattern: Microsoft Azure Frankfurt operated by Microsoft Deutschland, ultimately Microsoft US); Bifurcated — operator and ultimate parent jurisdictions disagree (the 21Vianet-Azure-China pattern: China-incorporated operator, US-incorporated ultimate parent); Opaque — ultimate parent country unresolved (chain terminates without a country-attributable node); Data gap— no operator org linked.
Why “strict” matters. A single-jurisdiction-pick classifier (the existing Hosted-vs-Controlled tab's approach: owner_org.country_hq, one hop) smooths bifurcated cases into whichever side the picker chose. The strict criterion refuses that smoothing: when operator and ultimate parent are in different jurisdictions, the facility appears in the drill-down for bothcountries as a jurisdictional-axis contributor, and in neither's “Under control” column. The bifurcated bucket is a first-class line item, not a rounding choice.
Ultimate-parent resolver. The classifier reads from mv_ownership_chain_closure(the transitive closure of the upward-walk view, bounded at six hops; the same substrate the Compute Visibility Index reads). For each facility's operating organisation, the ultimate parent is the deepest reachable ancestor in the closure; ties at the same hop depth are broken alphabetically (deterministic). When no documented ancestor exists, the operator itself serves as its own ultimate parent. The resolver is conservative: it does not infer beneficial ownership from indirect signals.
Where the operational definition matters.A Cayman-domiciled holding company is treated as Cayman-domiciled, not as the jurisdiction of its top operating subsidiary. A reader who prefers the “substantive economic control” reading reads the drill-down (operator and ultimate parent are surfaced side-by-side) and forms the alternate judgement explicitly — the classifier never silently picks a winner. Multinational holding parents with no clear-majority jurisdiction are reported by country of incorporation; the editorial choice is documented inline so a Luxembourg-controlled row reads as the SPV's incorporation, not its controlling shareholder's.
Relationship to peer work.Public country-level compute attribution is sparse. Hawkins, Lehdonvirta & Wu (SSRN, June 2025, “AI Compute Sovereignty”) frame a three-tier single-jurisdiction-pick across 225 cloud regions — a different decomposition than the bifurcated-vs-opaque split. Epoch AI's April 2026 hyperscaler-concentration post estimates 71% of cumulative AI compute is held by five US-headquartered firms as of Q4 2025 (company-level, not country-level). CNAS's Sovereign AI Index attributes program-level capacity to sovereign jurisdictions but does not decompose the operator-vs-ultimate-parent gap. The Scrutica framework closes that gap explicitly: every row carries operator country and ultimate-parent country side-by-side, every residual class is named, and the drill-down is at facility granularity. The framework is a Scrutica editorial choice and is positioned as such; the underlying classifications are reproducible from the substrate.
Surface: /compute-visibility#under-control (top-30 dashboard + facility-level drill-down). In-page methodology: /compute-visibility#under-control-methodology (per-class definitions + ultimate-parent resolver + definitional caveats). Substrate: v_facility_control_attribution + mv_compute_under_control_by_country (materialized views fed by mv_ownership_chain_closure).
The Sovereign AI Reality Dashboard at /sovereign-ai renders two complementary inflation decompositions per program. The first — financing-type decomposition — was the original ornament: per-program, the headline announced figure splits into government / private / FDI / credit components. The second — gap-shape decomposition, shipped 2026-05-20 as the cross-program scorecard — reads the announced-vs-deployed gap through a Scrutica editorial taxonomy of six named patterns: Aspirational (future-target capacity announcement without operational deployment yet), Phased rollout (Phase 1+ operational, Phase N forward-scheduled), Financing-stalled (intent + counterparties exist, capital closure does not), Chip-allocation-conditional (deployment authorization-gated by BIS / chip-supplier / foundry-capacity), Vaporware (announcement without substantive substrate), Other (catch-all documented inline).
Why two decompositions, not one.Financing-type and gap-shape answer different questions. Financing-type answers “how is this program’s announced figure assembled?”; gap-shape answers “why is the announced figure outrunning the deployed figure?”. A program can be 100% government-financed (financing-type) and 80% aspirational (gap-shape) at the same time. Both are surfaced on the page so a reader can choose the lens that fits the analytical question.
Per-attribution provenance. Every pattern attribution carries source URL, accessed-at date, and a confidence rating: 1 = announcement-text-explicit or primary-source-anchored (a government disclosure, a primary procurement record, a substrate-verified data-quality flag); 2 = analyst-inferred from public evidence (a step of judgement above the substrate, but the underlying signal is public); 3= Scrutica-editorial attribution where substrate is sparse (used only when the program-level financial substrate is too thin to support a confident pattern call but the gap-shape is still analytically informative; marked explicitly so a reader doesn’t mistake it for a primary-source-anchored claim).
Framework is editorial.The 6-pattern taxonomy is a Scrutica editorial framework, not an industry standard. Closest peer attempts: CNAS’s Sovereign AI Index (announced-vs-disbursed pairs, single ratio per program); Brookings sovereign-AI capacity assessments (qualitative narrative); IDC sovereign-AI tracker (announced-vs-operational pairs); CSIS sovereign-technology programs (jurisdictional-leverage framing). None publish a per-program decomposition along Scrutica’s 6 patterns. A reader who would classify a row differently can read the per-row notes and re-classify inline; the framework is positioned as one operational definition among several.
Where the literature is silent.Programs with sparse financial substrate (Sweden, Poland, parts of the Africa regional aggregate, the NATO/AUKUS coordination wrapper) carry an explicit “Other” attribution with confidence 3 + a rationale — the taxonomy does not force a pattern call when the substrate does not support one. War-time programs (Ukraine) carry “Other” with confidence 2 + a note that political-instability is the binding constraint, qualitatively distinct from vaporware. The framework refuses to invent a pattern attribution to fill the row.
Surface: /sovereign-ai#gap-pattern-methodology (cross-program scorecard + inline framework definition). Substrate: data/sovereign/gap_pattern_decomposition.json (editorial overlay; per CLAUDE.md DQP §16). Per-program financing-type decomposition lives in data/processed/sovereign_programs.json as the inflation_decomposition field (financing-type breakdown, not gap-shape).
The PJM grid-context indicator on the US sovereign program at /sovereign-ai renders a county-aggregated capacity rollup of PJM Interconnection's territory (13 Eastern-US states + DC). It exists because the US program's major US-located resources (NAIRR Pilot at Purdue Anvil + SDSC Expanse; CHIPS Act recipient fabs in PA / OH / NY) sit inside PJM's footprint and the planned data-center load against that grid is the operative pre-emption signal for new procurement. The indicator renders only on the US program (program.country_code === 'us') because non-US programs route their host facilities through home grids (CAISO, ERCOT, ENTSO-E, K-EPCO, etc.) and the PJM substrate cannot speak to those.
Substrate currently populated: the GENERATOR queue, not the load queue. The pjm_interconnection_queuetable indexes PJM's multi-decade Generator Interconnection Queue archive (~7,000+ rows; ~70% historically withdrawn before energization, the structural baseline for any interconnection-queue analysis). Generator-queue rows model new generation seeking to interconnect — gas turbines, solar farms, storage, wind — not data-center loads requesting service. Per-facility resolution against a specific data center is structurally infeasible from the generator queue alone; the indicator therefore aggregates to county-level capacity totals.
What the data-center load queue would add. PJM operates a separate Network Service / Large Load Interconnection process that handles megawatt-scale loads (data centers, electric-arc steel, hydrogen electrolyzers). That substrate is not yet ingested into Scrutica; it would resolve the per-facility pre-emption question (which specific data center is queued behind which generator, on which timeline). The current county-rollup is the closest defensible substitute — aggregate generator-side capacity per county across the multi-decade archive is informative about grid headroom even when the per-facility load mapping is missing. The indicator is consumed via getPJMTerritorySummary() at src/lib/data/pjm-county-exposure.ts and labels its withdrawal-rate caveat verbatim on the surface (“{withdrawn_pct}% withdrawn over the multi-decade rolling archive”).
Why this matters for the US sovereign program.NAIRR Pilot pre-procurement decisions and CHIPS Act facility-siting both ride on PJM grid headroom in PA / OH / VA / NY counties — the indicator surfaces the structural grid-side context that a per-facility power-availability claim cannot show on its own. When the load-queue substrate lands, the indicator upgrades from county-rollup to per-facility queued-load disclosure; until then, the surface is honest about which queue is rendered and which question it cannot yet answer.
Surface: /sovereign-ai (US program detail card — PJM grid-context affordance). Substrate: pjm_interconnection_queue (generator queue, multi-decade archive). Source: PJM Interconnection Queue archive (pjm.com; authority tier 1).
Four authority tiers (T1: primary measurement, T2: research database, T3: press/analyst, T4: estimated/inferred) assigned by original source authority, not intermediary. A CRS report citing a Goldman Sachs estimate remains T3. Aggregate confidence for derived values takes the weakest input tier.
A number from an SEC filing is more reliable than one from a press report, and a press report is more reliable than an analyst estimate. Every value on Scrutica carries a confidence label (T1 through T4) so the reader can weight it accordingly. When a derived value combines sources of different quality, the composite confidence reflects the weakest input, not the strongest.
Value from a primary authoritative source with direct measurement or legal disclosure obligation.
Value from academic publication or research organization with documented methodology.
Value derived from proxy methods, industry analyst estimates, or press reports. Methodology documented.
Value from secondary inference, expert opinion, or interpolation. Widest estimation bounds.
When a derived value combines inputs from multiple tiers, the aggregate confidence is the lowesttier among all inputs. A GPU count estimate (Tier 3) combined with a verified power capacity (Tier 1) yields a Tier 3 aggregate, because the weakest link determines the chain's strength.
When Scrutica derives a number from multiple inputs, the aggregate confidence is the floor of its inputs. A value combining a manufacturer's SEC filing (highly reliable) with a press estimate (less reliable) inherits the lower label; the rule prevents derived values from rendering more certain than the weakest ingredient they were built from.
When sources disagree on a factual value, Scrutica surfaces both with source attribution rather than silently picking a winner. The protocol:
is_estimated FlagThis boolean means "this value was derived via a model or proxy method." It does notmean "this value might be null" or "this value has uncertainty."
Five derivation chains underpin the Investigator. The chain-of-title walk traces the upward parent graph through the ownership_upward_edges view, terminating at four documented classes (reached UBO / opacity / cycle detected / depth capped); the BIS designation closures chain runs a downward affiliate walk from each Federal-Register-anchored designation and reconciles per-org cross-reference rows, framed today as a heightened-due-diligence trigger because the BIS Affiliates Rule is suspended through Nov 9, 2026; the sovereign-LP attributions chain resolves multi-firm composite LP names via a database-backed alias index and surfaces fund-level commitments without imputing entity-attributable share; the ownership-change events chain reads M&A-shaped deals from pe_investments with stub-aware acquirer rendering; and the licensed-database substrate is the canonical refresh path that backs the other four, with an auto-stub-all design and a column-population parity gate. Each chain’s confidence is honest about the source class (primary filings, licensed corporate-ownership databases, inferred edges) and renders distinct authority tiers per claim.
The Investigator answers five questions about an entity: who owns it (chain-of-title); is it reached by an export-control designation (BIS closures); do sovereign wealth funds have indirect exposure to it through private-equity commitments (LP attributions); which M&A events have touched it (ownership-change events); what substrate backs the prior four (the licensed-database substrate). Each chain reports both what it found and what it could not. Chain endings, designation suspensions, undisclosed dollar amounts, and stage-of-execution truncations surface as findings, not papered-over gaps.
Iterative parent walk over the ownership_upward_edges view, one Supabase round-trip per hop, capped at OWNERSHIP_WALK_MAX_HOPS = 8. Backing function: walkOwnership() at src/lib/data/ownership-investigator.ts:206. Returns a typed WalkResult with one of four terminal classes; alternates per hop are first-class so analysts see the conflict rather than a silent winner.
For any entity the Investigator can resolve, this chain walks upward through the corporate parent graph and reports where the walk terminated: reached a public-company top, hit a structurally opaque shell, detected a cycle, or ran out of hops. When two sources disagree on a parent at the same step, both surface; the analyst decides which to cite.
ownership_upward_edges — SQL view fronting ownership_chain_edges with PARENT and SUBSIDIARY rows normalized to a uniform child → parent shape. Columns consumed: child_org_id, parent_org_id, data_source, confidence, as_of_date.ownership_chain_edges — source table joined per hop for source_url, the licensed-database relation id, and authority_tier (the upward-edges view drops these for breadth).organizations — canonical entity registry; per-hop parent display reads name, country_hq, cik, ticker, org_type for the public-company-vs-government terminal check.organization_aliases — name-resolution side table consumed by resolveEntity() at line 94 (the resolver runs before this walk).canonical_org_slim.json + a per-hop variant-set bridge expansion that joins through the licensed-database company-id column on organizations to surface stub-orphan rows the slim canonical map does not list.filterPhantomSelfEdges()). Multi-source ingest periodically registers the same firm under two IDs and writes a parent edge between them; the canonical-org map merges them into one variant set, so the edge becomes a self-loop. Without the filter the walker would terminate cycle_detectedon hop 1 for entities whose chains should walk cleanly. The 2026-05-02 sweep removed 13 such edges (Equinix, Broadcom, Lam Research, Amazon, Microsoft, Alphabet, Oracle, Digital Realty, NEC, Vornado, Credo, Kulicke & Soffa, SolarEdge); this filter is defense-in-depth for the next ingest.looksOpaque()). When parent rows run out, the walker checks whether the tail’s name or country matches an opaque-structure pattern (Cayman, BVI, Bahamas, Jersey, Guernsey, “HoldCo”, “SPV”, “nominees”, “blind trust”). Hits classify as opacity with the tail’s name as detail; misses classify as reached_ubo. The page renders these distinctly — never as fact (“Y is the ultimate parent”).organizations to surface them so substrate edges that reference only the synthetic form are not silently missed at the IN-clause.compareEdgeStrength()) is the primary; the rest land in hop.alternates with full data_source, source_url, as_of_date, confidence, and authority_tier. The walker does not arbitrate between contradicting sources.LOW at enrichEdges() line 1064 — not MEDIUM. The default is currently dormant (the licensed-database ingest sets all 4,374 rows to HIGH as of 2026-04-24) but flips to honest the moment a source without confidence metadata enters the substrate.src/lib/data/stub-detection.ts. The cid remains as the canonical id so deep-links work; the human-readable name is not synthesized.HUMAIN, the Saudi sovereign-anchored AI infrastructure company launched May 13, 2025, walks upward through the substrate to PIF (Saudi Arabia’s Public Investment Fund) within the hop budget. Both edges in the walk carry a licensed corporate-ownership database data_source and the most recent as_of_date on file. The walk terminates on PIF as a state-linked sovereign vehicle — the public-company terminal predicate (CIK + ticker both populated) does not fire on PIF, so the chain rendering surfaces “reached UBO; sovereign vehicle” rather than implying a listed-equity terminus. The HUMAIN → PIF chain is the canonical cross-link to the sovereign-LP attributions section — PIF appears there as an LP across multiple PE funds whose portfolios touch other compute orgs.
Cross-check: the page’s end-to-end render exercises the same walker that backs the side-rail panels at /ownership/<entity>; chains rendered there match the walker’s output one-for-one because both call getOwnershipInvestigation() at line 382.
HIGH by construction.HIGH but may be MEDIUM when the underlying disclosure is partial.HIGH; the walker honors that signal but the consumer should read the data_source as the more durable provenance signal.Two-stage match: a direct lookup on export_control_designations against the entity’s alias-expanded canonical id set, plus a downward affiliate-closure walk against designation_closures with three matching routes (direct entry / canonical-alias / one-edge extension into the compute universe). Backing function: getDesignationReachForEntity() at src/lib/data/ownership-investigator.ts:440; closure-walker at scripts/cascade-bis-designations.ts.
For any entity, this chain reports two distinct findings: whether the entity itself appears on a BIS Entity List or equivalent designation, and whether a BIS-designated entity reaches the entity through a documented affiliate chain. Each finding renders with its hop-by-hop chain and Federal-Register citation; direct designation and affiliate reach are never collapsed onto a single label.
Resolves an entity to LP-fund commitments where the LP is a sovereign or state-linked vehicle and the fund’s portfolio touches the entity. Backing function: getSovereignAttributionsForEntity() at src/lib/data/ownership-investigator.ts:593; LP-name resolver at scripts/lib/sovereign_lp_resolver.py; fund-manager resolver at scripts/lib/fund_manager_resolver.py (the canonical multi-firm composite-string handler).
Sovereign wealth funds (Saudi PIF, UAE Mubadala, Singapore GIC, Abu Dhabi ADIA, and the rest) commit capital to private-equity funds that own portfolio companies. This chain surfaces those LP-to-fund commitments without claiming they constitute direct ownership of the entity. A fund-level commitment is spread across the fund’s entire portfolio; the entity is one position. Presence does not imply control.
M&A-shaped deals from pe_investments joined to pe_deal_investors for parties, ordered by deal_date desc. Backing function: getOwnershipChangeEventsForEntity() at src/lib/data/ownership-investigator.ts:620. Capital raises without ownership transfer are excluded at substrate ingestion; the deal-type filter retains buyouts, corporate divestitures, asset sales, joint ventures, and spin-offs.
For any entity, this chain reports the M&A events that touched it (acquisitions, divestitures, joint ventures, take-private transactions, IPOs, delistings). Capital raises (Series A/B/C funding rounds without ownership transfer) are excluded by design; this view is about who controls whom across time, not about every cap-table tick.
pe_investments — the M&A deal table. Columns: the licensed-database deal id, deal_date, announced_date, deal_type, deal_subtype, deal_status, deal_size_usd_m, is_majority_control_transfer, data_source, source_url, authority_tier.pe_deal_investors — per-deal counterparties. Columns: pe_investment_id, party_role, canonical_party_org_id, fund_name, fund_id.canonical_org_map.json — resolves canonical_party_org_id to display names; the same map other chains consume.The four chains above all read tables populated from the licensed-database substrate refresh. Refresh sequence: v2 ingest → BIS closure compute → v3 ingest → parity check, run by the licensed-substrate ingest orchestrator with a paired column-population parity check. v2 alone wipes v3 rows by design (DELETE-by-data-source on five tables); the ingest orchestrator restores 5 v2-unique designation closures that v3’s broader walks don’t reach.
The licensed corporate-ownership database is a curated commercial source, not a primary filing. Scrutica treats it as authority tier 2 for direct extractions and tier 3 for derived chains, holds it under academic subscription, and does not redistribute it — only the resulting facts appear. The substrate refresh is run manually by Scrutica, never as a black-box vendor feed. The orchestrator and the parity check exist because v2 and v3 of the ingest interact in a way that requires explicit reconciliation, not because the data is unstable.
Scrutica estimates cross-check against independently published figures from Epoch AI, CSET, TrendForce, and MLPerf. Where the estimates diverge, the gap traces back to different assumptions on one of three axes: GPU utilization rate, hardware configuration, or facility-level power draw.
| Validation Source | Data Type | Coverage | Methodology Difference |
|---|---|---|---|
| Epoch AI GPU Clusters | Facility PFLOP/s estimates | ~786 clusters, ~26 with PFLOP estimates | Epoch uses disclosed GPU counts; Scrutica uses three estimation paths (hardware, power, cost) and reports estimation bounds for each |
| CSET AI Indicators | Company-level AI investment | ~691 companies | CSET aggregates financial disclosures; Scrutica adds licensed supply-chain database edges for interdependence analysis |
| TrendForce / Counterpoint | Semiconductor market share | Quarterly updates | Analyst estimates vs. Scrutica concentration scoring derived from supply chain topology |
| MLPerf Inference | Hardware specifications (accelerator type, memory, count) | 92 datacenter system submissions (v4.1) | MLPerf publishes verified hardware configurations per submission; Scrutica cross-checks accelerator types and memory specs against its chip catalog |
MLPerf Hardware Cross-Check
20 unique system configurations from MLPerf Inference v4.1 submissions provide independent verification of accelerator specifications. Accelerator families represented: AMD Instinct MI300X, NVIDIA H100, NVIDIA L40S, NVIDIA Jetson AGX Orin 64G, NVIDIA H200, AMD MI300X, NVIDIA L4, NVIDIA B200, NVIDIA A100, NVIDIA GH200, TPU v5e, TPU v6, NVIDIA GH200 Grace Hopper Superchip 144GB, NVIDIA GH200 Grace Hopper Superchip 96GB, UntetherAI speedAI240 Preview, UntetherAI speedAI240 Slim.
Per-facility PFLOP/s cross-validation against Epoch's estimates is paused; the previous matching heuristic joined entries by (owner, country)and picked closest-by-PFLOP, which matched single Scrutica rollup rows against multiple Epoch per-cluster entries and produced structurally meaningless per-phase comparisons. A follow-up investigation found that Scrutica's per-phase rows are ingested directly from Epoch's CSV, so a per-row Scrutica-vs-Epoch table is circular by construction. Three structural rollup mismatches and one units anomaly are flagged in-place on the affected facility detail pages; methodology-level cross-validation lives at External Validation. To reproduce per-facility estimates, adjust all parameters in the Interactive Methodology Explorer above.
The Query Engine at /query is the natural-language interface to Scrutica's data + analytical surface. Architecture: a user's free-text query passes through an injection-defense sanitiser, gets wrapped in <user_query> delimiters, and reaches a Claude Opus 4.7 (1M context) instance routed via OpenRouter. The model first calls a thinkmeta-tool to produce a query plan (visualised live in the UI), then executes data tools in parallel where independent, sequentially where one tool's output feeds another. After up to five rounds of tool execution it streams a synthesis response with every numerical claim wrapped in a citation tag.
The tool surface is 55 tools across 14 layers (facilities, organizations, supply-chain edges, investments, export-control designations, compute deployments, hardware catalog, compute pricing, trade flows, the PJM interconnection queue, capacity snapshots, regulatory thresholds, compute-visibility tiers, ownership chains, sovereign-execution procurement, regulatory-impact pre-scorer, cascade dynamics, scenario models — Tokyo earthquake, Iran threat, SCS cable, Taiwan strait, Abqaiq — BIS license actions, HBM market share, EU grid, recent developments, and per-model training evidence). Each tool wraps a documented data module under src/lib/data/; the full per-tool reference lives at /query/tools.
Citation discipline. Every numerical or factual claim in the model's synthesis wraps in <cite tool record_id tier>tags. The frontend parses these tags during streaming and renders a Citations Panel below the response with per-citation authority-tier badges (Tier 1 primary measurement → Tier 4 inferred/estimated), source URLs, and a per-citation tool-result drill-down. After synthesis completes, a server-side citation verifier parses the tags and verifies each cited record_id appears in the function_call_output history — citations referencing record IDs not in the tool history are flagged in the panel as “unverified provenance.”
Failure modes by design. The Query Engine refuses rather than fabricates when the question requires data Scrutica does not have. Three explicit refusal classes: forecasting (no forecasting layer exists; revenue projections, demand forecasts, capacity-growth projections are unanswerable); opinions (subjective valuations, policy preferences); intraday pricing (the pricing substrate has 24-hour freshness, not real-time quotes). Off-scope questions (medical advice, legal advice, open-ended LLM chat) hit a refusal pointing back to what the platform actually does.
Provider + reliability. Primary model: anthropic/claude-opus-4.7. Fallback chain on upstream 5xx or quota-exhaustion: anthropic/claude-sonnet-4.6 → openai/gpt-5.5. User-side rate limit is 20 requests / minute / IP (Upstash sliding window). Per-IP daily cost budget is $5 (≈50 typical Opus queries), reset at UTC midnight. The route emits Server-Sent Events for live plan visualisation, per-step status, streaming synthesis, and post-synthesis citation warnings.
The frontier-model comparison genre splits along three methodological seams. Epoch's ECI (a composite over standardized benchmarks — GPQA Diamond, FrontierMath, SWE-bench Verified, MATH Level 5, MMLU-Pro, others — projected onto a single capability axis); Artificial Analysis's Intelligence Index (a 0–100 composite of measured benchmark performance under their own published weights); LMArena's Arena Score (a Bradley-Terry Elo over crowdsourced head-to-head human-preference battles). Each measures something different (task-bench composite, vs. preference Elo, vs. intelligence-vibes composite), and the three correlate without collapsing onto a single ordering. Scrutica renders all three with a toggleable Y-axis, layers a consensus rank (mean rank, ECI-tiebroken), and adds the dimension the source-three don't carry: which export-controlled chip class trained the model.
Per-index provenance. ECI is sourced from Epoch's AI Models database (joined via the capability_scaling.json ingest at benchmark_id = epoch_capabilities_index); a ECI ≥ 132 editorial cutoff produces the frontier-relevant set (~50 distinct base models post-dedup of context-length / effort-level variants). AA Index is curated from artificialanalysis.ai/leaderboards/models at access vintage; max-effort variant taken per model per the methodology note (xhigh / high effort regimes reflect the model's apex capability, not its production-API default). Arena Score is curated from arena.ai/leaderboard/text paginated through positions 1–150; thinking / max-effort variant preferred when multiple variants exist for the same base model. Models post-dating the Epoch snapshot (e.g., GPT-5.5, Claude Opus 4.7 at 2026-05-17 access) appear as supplements with ECI = NULL + a notes annotation per DQP §1.
Typology operationalization. The four-bucket model class (allied closed, non-allied closed, contested closed, open) is computed from trainer country plus open-weights designation. Allied = AUKUS + Five Eyes (US, UK, AU, CA, NZ) + EU + Japan + Korea + Israel + Taiwan. Non-allied = China + Russia + Iran + North Korea per BIS Entity List jurisdictional anchoring. Contested = UAE + Saudi Arabia (G42, HUMAIN, TII); operationally these get non-allied accounting for export-control purposes, but the partnership architecture (Microsoft–G42, NVIDIA–HUMAIN, Microsoft–TII) puts contested-bucket trainers in a distinct posture from China-bucket trainers, and Scrutica preserves the distinction rather than collapsing onto non-allied. Open = weights publicly downloadable irrespective of trainer country (Llama 4, Qwen3, DeepSeek-OS, GLM, Kimi K2, GPT-OSS); downloadable-weights beats trainer-country in the typology because the policy lever the typology exists to inform (export-control of model weights) is moot once the weights are public.
Chip-class attribution — the Scrutica differentiator. Training chip class is the supply-chain seam that Epoch / AA / LMArena don't render. The cell is populated from three tiers of disclosure, each tagged with a per-cell training_chip_authority_tier:
Export-control taxonomy. Per-chip-class status is anchored to BIS rulemaking dates: October 2022 — initial A100 / H100 controls (ECCN 3A090 + 4A090); October 2023 — H800 / A800 added (the Oct-2022 controls' loophole closed); January 2025 — AI Diffusion Framework adds country-level tier system (later partially rescinded under the Trump administration in 2025-Q2; Scrutica tracks the rescission status separately on /export-controls). Status string mapping: restricted-to-non-allied (any NVIDIA datacenter GPU since the Oct-22 cut), unrestricted (Google TPU — never sold as a chip, only as cloud TPU-VM access; A100 pre-Oct-22 training runs), unknown (chip class NULL → cannot attribute).
Pareto frontier algorithm. A model other strictly dominates model m on (release_date, metric) iff other.date ≥ m.date AND other.metric > m.metric OR other.date > m.date AND other.metric ≥ m.metric. The Pareto frontier is the set of non-dominated models; rendered as outlined dots in the scatter. The set is re-computed per (metric, subset) combination — the “Allied-only Pareto frontier on AA Index” is a different set than the “All-models Pareto frontier on Arena Elo.”
Consensus rank. Mean of (ECI rank, AA rank, Arena rank) over the subset where each metric is non-null. A model with only AA + Arena cells gets a 2-metric mean. Ties break by ECI rank (the index with the most-disclosed methodology), then alphabetically by model_id for full determinism. The consensus is advisory — when ECI / AA / Arena disagree (e.g., a model strong on ECI but weak on Arena Elo), the disagreement is the signal, not the consensus. Per DQP §7 (contradiction surfacing), the ModelDetailPanel shows all three values explicitly, not just the consensus rank.
Honest caveats. (1) Closed-source compute estimates carry ±0.5 OOM. Lab-reported FLOP figures (where reported) are unaudited; analyst-derived estimates (Epoch, SemiAnalysis) anchor to publicly verifiable signals (parameter count × tokens × 6 for dense transformers; cluster size × wall-clock × MFU for known clusters). (2) Tier-4 chip-class inference is not measurement. Family-lineage chip class is an assumption the lab has not switched chip families between releases; the assumption holds until a disclosure contradicts. (3) AA and Arena cells reflect leaderboard snapshots at access date, not the model's lifetime peak; quarterly re-curation per the curator script. (4) The ECI cutoff at 132 is editorial, adjustable in scripts/curate-capability-frontier-models.ts; widening the cutoff admits more models at the cost of diluting the “frontier” framing.
Surface: /threshold-atlas → Capability Frontier tab. Substrate: data/processed/capability-frontier/models.json (62 models, regenerated by scripts/curate-capability-frontier-models.ts). Per-cell authority tier surfaced in the ModelDetailPanel.
For a specific estimate, include the methodology version and the estimation path (e.g., "Hardware Path, v1.3.2") so the calculation reproduces against the same parameter set.
Cite the Compute Cost Index dataset (v2026.2, released 2026-05-19): scrutica.com/datasets/compute-cost-index (Zenodo DOI minting pending — see /datasets/compute-cost-index for the canonical bundle).
Cite the Sovereign AI Program Index dataset (v2026.2, released 2026-05-19): scrutica.com/datasets/sovereign-ai-index (Zenodo DOI minting pending — see /datasets/sovereign-ai-index for the canonical bundle).
| Construction Cost Indices | Annually | Turner / RSMeans indices |
Two attenuators apply at each hop. The edge multiplier flowShare × (criticality / 10) weights the propagated impact by how much of the customer's input comes from this supplier and how replaceable that input is. The scenario decay propagationDecay (per-scenario constant in the 0.65–0.95 range) further attenuates based on category-level substitutability: ASML EUV at 0.95 propagates almost full impact downstream because no alternative exists; the gallium/germanium scenario at 0.65 attenuates faster because recycling and alternative sourcing dampen each hop. The reverse / upstream BFS uses an analogous formula with approximateRevenueShare in place of flowShare to model customer-to-supplier demand-loss propagation.
| ASML Export Halt | 0.95 | EUV lithography is irreplaceable — no alternative supplier exists at any node ≤7nm, so impact propagates almost fully downstream. |
| US–China Full Decouple: Revenue Impact | 0.70 | Domestic substitution (Huawei Ascend, SMIC at advanced nodes, domestic EDA pilots) dampens each upstream hop as US revenue loss propagates back through the supply chain. |
| US–China Full Decouple: Access Denial | 0.80 | Upstream dependency on US tools (EDA, advanced equipment, foundry access) is structural for Chinese AI compute consumers — domestic substitutes exist but cover narrow node ranges, so impact propagates with little dampening per hop. |
| CoWoS Advanced Packaging Bottleneck | 0.70 | Multi-source packaging via OSAT partners (Amkor, SPIL handling 240–270K wafers/year overflow) now dampens downstream propagation; CoWoS capacity tripled to ~75K wafers/month by end-2025 per TrendForce. |
| SK Hynix HBM Disruption | 0.80 | HBM is required for every AI accelerator and SK Hynix carries ~57% market share, but Samsung and Micron are pre-qualified for HBM3E and can ramp without re-qualification — multi-sourcing dampens propagation modestly per hop. |
| EDA Export Restriction | 0.80 | Synopsys and Cadence jointly control ~75% of the global EDA market; open-source alternatives (qflow, OpenROAD) exist at trailing nodes but not at production scale for advanced logic, so most downstream chip-design work cannot continue without them. |
| Chiplet Assembly Disruption | 0.75 | Compound packaging + EDA disruption hits chiplet-architecture chips (AMD MI300X, NVIDIA Blackwell) disproportionately; some single-die monolithic designs and trailing-node products are insulated, providing modest per-hop attenuation relative to the blanket scenarios. |
| Helium Supply Crisis (Hormuz) | 0.75 | US strategic helium reserve and alternative shipping routes (Australian, Algerian, US domestic LNG-byproduct streams) provide some buffer; helium boil-off limits stockpiling beyond ~45 days, so the buffer is real but bounded. |
| InP/EML Laser Shortage | 0.80 | Silicon photonics provides a partial alternative path for some 800G+ transceiver designs, but InP epitaxy is the binding bottleneck — Coherent / Lumentum / Source Photonics dominate the production base and pre-allocations push other buyers past 2027. |
| ABF Substrate Monopoly (Ajinomoto) | 0.95 | Ajinomoto holds 95–98% of global ABF substrate market with no meaningful second source; glass substrates are 2028–2030 at earliest, so impact propagates almost fully through every AI accelerator package. |
| Gallium/Germanium Restriction (Nov 2026) | 0.65 | Recycling, stockpiling, and alternative sourcing (allied gallium production restarts, germanium recovery from zinc smelting) dampen downstream impact; this is a binary deadline scenario, not a current disruption, so the per-hop attenuation reflects optionality rather than realized substitution. |
| CoWoS 2026 Allocation Constraint | 0.85 | Structural shortfall with no alternative CoWoS-L packaging at volume; OSATs cannot replicate Blackwell-class packaging at scale, and NVIDIA holds >60% of TSMC CoWoS allocation, so non-NVIDIA AI GPU production absorbs the constraint with limited dampening. |
| Allied Coordination: TSMC Advanced Node Restriction | 0.90 | Substitutability is unchanged from the blanket TSMC disruption (Samsung Foundry / Intel Foundry absorption capacity is identical regardless of who is restricted); the policy-vs-blanket distinction is carried by edgeFilter, not by per-hop decay. |
| EDA License Restriction: China Entity List Expansion | 0.80 | Substitutability is unchanged from the blanket EDA scenario; ~75% market concentration of Synopsys + Cadence holds whether the restriction targets China specifically or all customers, so per-hop attenuation tracks the underlying tool dependency rather than the policy framing. |
| Netherlands DUV Export Restriction to China | 0.85 | DUV is replaceable at mature nodes (Nikon and Canon retain ArF and KrF capacity for nodes ≥28nm), so per-hop attenuation is meaningfully greater than for EUV — but advanced-DUV ArF immersion remains effectively sole-source ASML for 7nm-class multi-patterning work. |
| China Critical Minerals Retaliatory Restriction | 0.65 | Substitutability tracks the gallium-germanium-deadline scenario (recycling, stockpiling, allied gallium production restarts dampen each hop); only the directional framing differs — China restricting allies vs. allies anticipating a deadline lapse. |
| Multilateral Cloud Compute Access Restriction | 0.75 | Restricted-jurisdiction customers retain some domestic cloud alternatives (Alibaba Cloud, Tencent Cloud, Yandex, regional sovereign clouds) but the GPU-density and frontier-model-availability gap with US hyperscalers is structural — partial substitution dampens propagation without closing it. |
| Netherlands EUV Restriction: Allied Countries Only | 0.95 | Substitutability is unchanged from the blanket asml-export-halt scenario — EUV remains zero-alternative-supplier regardless of which jurisdictions retain access; the allied-only carve-out is captured in edgeFilter, not in per-hop decay. |
| Packaged Chips (GPU) |
| 3 wk |
| 2–5 wk |
| cliff |
| T2 |
| Server Assembly | 14 wk | 8–26 wk | exponential | T3 |
| HBM Memory | 3 wk | 0–8 wk | cliff | T2 |
| ABF Substrates | 12 wk | 4–30 wk | linear | T2 |
NVIDIA Training GPUs
TSMC CoWoS Packaging
Source: TSMC Chairman Mark Liu (Sep 2023); TrendForce Aug 2024 (SPIL order); UBS analyst estimates (T1)
OWNERSHIP_WALK_MAX_HOPS = 8; one Supabase round-trip per hop; per-hop bridge expansion fetches both the next-hop frontier and parent display row in a single query.compareEdgeStrength() at line 1108 ranks HIGH > MEDIUM > LOW on confidence, breaks ties on authority_tier (lower number = primary filing), and finally on as_of_date recency. pickStrongestEdge() at line 1076 reduces a per-canonical-parent group to a single representative; the rest become hop.alternates with full citation metadata so the page renders both.
export_control_designations — Federal-Register-anchored designation registry (3,425 active rows as of the latest substrate refresh; 4,408 closure rows in designation_closures).designation_closures — precomputed downward affiliate walks per designation, hop-stamped, with closure_chain JSONB carrying ordered {from_org_id, to_org_id, relation, hop} tuples.bis_crossref_matches — per-org cross-reference matches keyed on (designation_id, canonical_target_org_id), with match_type in {NAME_SIMILARITY, AFFILIATE_CLOSURE} and a confidence_scorecolumn. Direct designations surface from this table when the score is ≥ 0.9.data/processed/bis_crossref_matches.json — the precomputed crossref bundle the data layer reads at request time, keyed by canonical org. Belt-and-suspenders ILIKE on entity_name backstops the precomputed bundle for entities the crossref pipeline missed.BISCascadeHop interface (src/lib/data/export-controls.ts) carries the per-hop hop_is_stub flag for downstream stub-aware rendering.designation_closures rows runs offline (scripts/cascade-bis-designations.ts) with three matching routes:Direct rows carry authority_tier = 1 by construction (Federal Register primary). Closure rows carry the row-stored authority tier (typically 2 for the licensed-database-anchored ownership graph; downgraded to 3 for edge-extension hops). Reconciliation against existing NAME_SIMILARITY matches: when both routes hit the same (designation_id, canonical_target_org_id), the name-match row stays canonical and a closure_coincides_with_name_match flag is set; cascade rows that no longer reproduce on a refresh get deprecated_at = now() with reason CHAIN_EDGE_DROPPED.
hop_is_stub = true. The renderer surfaces these as a cid-only stub entity rather than the bare placeholder string — the cid stays inspectable for cross-reference, the opaque label does not pose as a curated firm name. Mirrors the structural prefix check in src/lib/data/stub-detection.ts.org-bis-{slug} row; cascading a designation back to its own synthetic org is a tautology, not a discovery. The closure walker excludes these (scripts/cascade-bis-designations.ts:262, isCascadable()). The crossref pipeline does the same.removal_date is populated (Federal Register removal action) get all their bis_crossref_matches rows updated with deprecated_at + deprecation_reason = DESIGNATION_REMOVED. The active read path filters on deprecated_at IS NULL; historical coverage stays accessible at the substrate layer.is_directboolean separates “this entity IS the designated entity” from “this entity is in an affiliate closure of a designated entity.” The page renders each with a distinct chip; direct designations carry the “Direct” badge and authority tier 1, closure designations show their hop count and the first three relation labels.The cascade firing rate (designations producing at least one AFFILIATE_CLOSURE row reaching a compute-universe org) is 1.90% of active designations — 65 designations out of 3,425. This is structurally constrained by the upstream licensed-database company-id resolution: 699 of 3,425 designations (20.41%) have an ownership-graph anchor (at least one closure entry in designation_closures) for the BFS to start from, and of those only 65 produce a closure walk that lands on a compute-universe org. Cascade silence does not equal no structural reach. The remaining 79.59% of active designations are silent because the upstream resolution failed, not because the entity has no compute-relevant affiliates.
ecd-3330): zero cross-reference matches because the NAME_SIMILARITY Jaccard score is 0.5 against canonical “HiSilicon,” below the 0.7 threshold — a discriminative-token-collapse step would reach it. Resolver enhancement queued.organizations at all; substrate ingest gap. Cascade-side fix is gated on substrate completion.Huawei Technologies (added to the Entity List May 16, 2019, FR 84 FR 22961; expanded Aug 2019 in 84 FR 43495; Aug 2020 in 85 FR 51602) reaches HiSilicon (the canonical compute-universe match) via a documented closure walk. The closure rows carry per-hop chains, the precomputed crossref bundle pins the match at HIGH confidence, and the page renders the chain end-to-end with FR citations on each hop. The Huawei→HiSilicon match is the most-fired single cross-reference in the bundle.
Cross-check: CRS R47012(“U.S. Restrictions on Huawei Technologies”) names HiSilicon as Huawei’s wholly-owned semiconductor design subsidiary; the closure walk reproduces the relationship from the licensed-database ownership graph, not from the CRS narrative.
federal_register_citation renders inline with the chip.src/lib/data/designation-closures.ts:151.sovereign_investment_chains — LP-to-fund-to-portfolio rows resolved through canonical IDs. Columns: sovereign_lp_name, intermediate_fund_name, commitment_date, commitment_usd_m, is_dollar_disclosed, commitment_status, data_source, data_vintage, authority_tier.sovereign_lp_aliases — the canonical LP-name alias index loaded by load_alias_index() at session start. The mapping lives in SQL with a UNIQUE constraint, not in a hand-curated Python dict.pe_deal_investors — the LP-fund-portfolio commitment table. Resolves investor_canonical_id through the alias index at write time (write-time resolution over post-hoc backfill).fund_id_to_manager_v3.csv.gz + v1_fundid_to_manager.json— the fund-manager mapping sources consumed by the FM resolver.sovereign_investment_chains resolves multi-firm composite LP names via:“SoftBank Group, SoftBank Investment Advisers”) split via the canonical pattern in _split_composite_name(): stable de-dup on lowercased form preserves first-seen order; single-firm names return as a one-element list. An earlier ingest pass found that ~50% of the fund-manager resolver gap was driven by multi-firm composite strings; the parser is now the canonical resolver template.sovereign_lp_aliases ∪ organizations.name. New mappings are SQL inserts, never code edits.SovereignProgram. Adding a derivation_chain field would surface it; queued for the schema-level enhancement.unique_fund_managers ≤ unique_funds holds (a manager can run multiple funds, but not the inverse).fundlpcommitmentrelation source table.parties: party_name ?? fund_name ?? "— name not recorded".data_source labels.canonical_party_org_id resolves to a placeholder-named licensed-database stub org, the placeholder-name suppressor at src/lib/data/stub-detection.ts returns null. The UI fallback chain (party_name ?? fund_name ?? “— name not recorded”) cascades past the opaque cid string. The canonical id remains populated so deep-links still work; the operator does not see the placeholder posing as a curated firm name. Rationale at src/lib/data/ownership-investigator.ts:649-658.pe_investments on deal types that imply ownership transfer (Buyout, Corporate Divestiture, Asset Sale, Joint Venture, Spin-off). Series-funding rounds without majority-control transfer are not retained at this surface; the empty-state copy on the Investigator panel says so explicitly.deal_size_usd_mcan be null; the page renders “size undisclosed” in italics rather than computing a placeholder. Per the project’s no-false-precision rule, null is preserved upstream rather than imputed.deal_date column carries the announce date, not the close date; there is no separate close-date column. A merger-arbitrage analyst reading this surface would need to triangulate close-date through SEC 8-K filings independently.Microsoft → Activision Blizzard (close date October 13, 2023; SEC 8-K): the pe_investments row carries deal_type = Buyout, is_majority_control_transfer = true, deal_size_usd_m = 68700. The chain-of-title walk for Activision Blizzard before the deal terminates at the Activision public-company terminus; after the deal, the walk passes through Microsoft as parent. The page surfaces both the event and the chain transition; the chain rendering reads “ownership transferred 2023-10-13.”
source_url resolves to the SEC EDGAR document.scripts/lib/sovereign_lp_resolver.py, scripts/lib/fund_manager_resolver.py, scripts/lib/ownership_edge_guard.py— the in-line resolvers that close NULLable FK gaps at write time.load_alias_index pattern). Adding a new mapping is a SQL insert, not a code edit.investor, name, description), sample the tokenization shape — multi-value strings, embedded delimiters, encoding variants — before declaring atomic-name lookup sufficient. _split_composite_name() at scripts/lib/fund_manager_resolver.py:115 is the canonical pattern.pe_deal_investors.canonical_party_org_id gate.Every unresolved investor / seller cid in pe_deal_investors gets a licensed-database org stub at write time — a stable synthetic id keyed to the licensed fund/LP universe’s company id. 4,063 stubs exist in production; 89.9% (3,653 / 4,063) carry a generic placeholder label (a cid-keyed string, never a curated firm name) because no human-readable name is available from the licensed fund/LP universe table. Two predicates and one suppressor at src/lib/data/stub-detection.ts govern downstream rendering:
party_name ?? fund_name ?? "—") cascade past the opaque id string.deprecated_at + deprecation_reason); no row is hard-deleted.data_quality_flags array entry should have its OWN source_url in the sourcesarray, not a generic “X covers this” attribution. Fix is per-record curation; tracked across the sovereign-program backlog.The most recent canonical refresh (2026-04-27) produced parity-green across all column-population gates: sovereign_lp_canonical_id (28.2% gap closed), intermediate_fund_manager_canonical_id (100% gap closed), pe_deal_investors.canonical_party_org_id (closed via 4,063 auto-stubs). The parity check returns RESULT: PARITY when all gates are green; downstream chains read confidently from substrate that has just been verified internally consistent.