diff --git a/.gitignore b/.gitignore index 2d52304..2ac80ae 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ out/ tsconfig.tsbuildinfo *.tsbuildinfo .env*.local +slideshows/*/*.pdf diff --git a/lib/slideshows.ts b/lib/slideshows.ts index 2e7e02c..292fb5b 100644 --- a/lib/slideshows.ts +++ b/lib/slideshows.ts @@ -19,8 +19,10 @@ import { civicBuilders2026Config } from "@/slideshows/civic-builders-2026/config import { policybenchWebinarConfig } from "@/slideshows/policybench-webinar/config"; import { aspenBenefits2026Config } from "@/slideshows/aspen-benefits-2026/config"; import { l0Ima2026Config } from "@/slideshows/l0-ima-2026/config"; +import { iariw2026Config } from "@/slideshows/iariw-2026/config"; export const slideshows: SlideshowConfig[] = [ + iariw2026Config, l0Ima2026Config, aspenBenefits2026Config, policybenchWebinarConfig, diff --git a/public/images/iariw-2026/forecast-disagreement.png b/public/images/iariw-2026/forecast-disagreement.png new file mode 100644 index 0000000..5804a83 Binary files /dev/null and b/public/images/iariw-2026/forecast-disagreement.png differ diff --git a/public/images/iariw-2026/qr-axiom.png b/public/images/iariw-2026/qr-axiom.png new file mode 100644 index 0000000..a285585 Binary files /dev/null and b/public/images/iariw-2026/qr-axiom.png differ diff --git a/public/logos/iariw/beamm.png b/public/logos/iariw/beamm.png new file mode 100644 index 0000000..65391bf Binary files /dev/null and b/public/logos/iariw/beamm.png differ diff --git a/public/logos/iariw/cape.png b/public/logos/iariw/cape.png new file mode 100644 index 0000000..1a157f0 Binary files /dev/null and b/public/logos/iariw/cape.png differ diff --git a/public/logos/iariw/uclouvain-saint-louis.jpg b/public/logos/iariw/uclouvain-saint-louis.jpg new file mode 100644 index 0000000..4a0475c Binary files /dev/null and b/public/logos/iariw/uclouvain-saint-louis.jpg differ diff --git a/public/screenshots/iariw-2026/axiom-browse.png b/public/screenshots/iariw-2026/axiom-browse.png new file mode 100644 index 0000000..2fbb4be Binary files /dev/null and b/public/screenshots/iariw-2026/axiom-browse.png differ diff --git a/public/screenshots/iariw-2026/axiom-graph.png b/public/screenshots/iariw-2026/axiom-graph.png new file mode 100644 index 0000000..ef8e22a Binary files /dev/null and b/public/screenshots/iariw-2026/axiom-graph.png differ diff --git a/public/screenshots/iariw-2026/axiom-home.png b/public/screenshots/iariw-2026/axiom-home.png new file mode 100644 index 0000000..a8f44ae Binary files /dev/null and b/public/screenshots/iariw-2026/axiom-home.png differ diff --git a/public/screenshots/iariw-2026/axiom-provision.png b/public/screenshots/iariw-2026/axiom-provision.png new file mode 100644 index 0000000..0fbe01b Binary files /dev/null and b/public/screenshots/iariw-2026/axiom-provision.png differ diff --git a/public/screenshots/iariw-2026/axiom-rulespec.png b/public/screenshots/iariw-2026/axiom-rulespec.png new file mode 100644 index 0000000..4a50491 Binary files /dev/null and b/public/screenshots/iariw-2026/axiom-rulespec.png differ diff --git a/public/screenshots/iariw-2026/axiom-validation.png b/public/screenshots/iariw-2026/axiom-validation.png new file mode 100644 index 0000000..32cc11a Binary files /dev/null and b/public/screenshots/iariw-2026/axiom-validation.png differ diff --git a/public/screenshots/iariw-2026/calibration-dashboard-be.png b/public/screenshots/iariw-2026/calibration-dashboard-be.png new file mode 100644 index 0000000..eb098d9 Binary files /dev/null and b/public/screenshots/iariw-2026/calibration-dashboard-be.png differ diff --git a/public/screenshots/iariw-2026/pe-be-demo.png b/public/screenshots/iariw-2026/pe-be-demo.png new file mode 100644 index 0000000..1a54293 Binary files /dev/null and b/public/screenshots/iariw-2026/pe-be-demo.png differ diff --git a/public/screenshots/iariw-2026/pe-be-household.png b/public/screenshots/iariw-2026/pe-be-household.png new file mode 100644 index 0000000..42c0a41 Binary files /dev/null and b/public/screenshots/iariw-2026/pe-be-household.png differ diff --git a/public/screenshots/iariw-2026/pe-be-results.png b/public/screenshots/iariw-2026/pe-be-results.png new file mode 100644 index 0000000..90a9b7a Binary files /dev/null and b/public/screenshots/iariw-2026/pe-be-results.png differ diff --git a/public/screenshots/iariw-2026/pe-household.png b/public/screenshots/iariw-2026/pe-household.png new file mode 100644 index 0000000..eceedee Binary files /dev/null and b/public/screenshots/iariw-2026/pe-household.png differ diff --git a/slideshows/cbo-2026/slides/CalibrationSlide.tsx b/slideshows/cbo-2026/slides/CalibrationSlide.tsx index 8773b30..e364425 100644 --- a/slideshows/cbo-2026/slides/CalibrationSlide.tsx +++ b/slideshows/cbo-2026/slides/CalibrationSlide.tsx @@ -14,7 +14,7 @@ export default function CalibrationSlide() {
The method

- Gradient descent over + Gradient descent{' '}over household weights, optimizing simultaneously against thousands of published administrative targets — SOI tables, BLS series, Census tabulations, agency program totals. diff --git a/slideshows/cbo-2026/slides/Evo4ValidationSlide.tsx b/slideshows/cbo-2026/slides/Evo4ValidationSlide.tsx index c3d7388..3b9dd87 100644 --- a/slideshows/cbo-2026/slides/Evo4ValidationSlide.tsx +++ b/slideshows/cbo-2026/slides/Evo4ValidationSlide.tsx @@ -70,7 +70,7 @@ export default function Evo4ValidationSlide() {

- We added edge-case-generator, reference-validator, and ci-fixer to automatically iterate on failures. The workflow now loops—when tests fail, ci-fixer analyzes the error and retries. + We added edge-case-generator, reference-validator, and ci-fixer{' '}to automatically iterate on failures. The workflow now loops—when tests fail, ci-fixer analyzes the error and retries.

diff --git a/slideshows/cbo-2026/slides/Evo6FullWorkflowSlide.tsx b/slideshows/cbo-2026/slides/Evo6FullWorkflowSlide.tsx index d7e5871..8f42c7c 100644 --- a/slideshows/cbo-2026/slides/Evo6FullWorkflowSlide.tsx +++ b/slideshows/cbo-2026/slides/Evo6FullWorkflowSlide.tsx @@ -131,7 +131,7 @@ export default function Evo6FullWorkflowSlide() {

- The complete pipeline: 12 agents and 6 skills working together. One command triggers the entire workflow—from issue creation to a draft PR ready for human review. + The complete pipeline: 12 agents and 6 skills{' '}working together. One command triggers the entire workflow—from issue creation to a draft PR ready for human review.

diff --git a/slideshows/iariw-2026/DEMO-SCRIPT.md b/slideshows/iariw-2026/DEMO-SCRIPT.md new file mode 100644 index 0000000..ba727f3 --- /dev/null +++ b/slideshows/iariw-2026/DEMO-SCRIPT.md @@ -0,0 +1,70 @@ +# Live demo script — IARIW 2026 (~8 min inside the 14:40–15:30 talk) + +The deck embeds the LIVE apps directly: slide 21 (Axiom App, Belgium), slide 35 (calibration +dashboard), and slide 41 (policyengine.org/be) are live iframes with an Expand button — you +can drive the whole demo without leaving the deck. Preloaded browser tabs remain the smoother +option for deep interaction; use whichever feels better in the moment. Every beat also has +static screenshot slides right after it (22–25, 36, 42). If the network dies mid-beat, +advance and keep talking. + +## Before the talk (10 min, on venue wifi or hotspot) + +1. Open these tabs, in order, and let each fully load: + - https://axiom.org + - https://axiom.org/axiom?country=be (Belgium field view) + - https://axiom.org/axiom/graph?compose=be (composition graph) + - https://axiom.org/validation + - https://policyengine.org/be + - https://microcosm.institute/calibration/dashboard/microcosm?country=be +2. On policyengine.org/be: confirm the yellow provenance banner renders and the + "Society-wide impacts" tab shows €0.00B at baseline. +3. Phone hotspot ready as backup. If neither works, the deck carries every beat. +4. ⚠️ Do NOT quote per-suite numbers from axiom.org/oracles live — the deployed scoreboard + is serving a pre-Aug-22 snapshot (two newest Belgian suites 404 there). The slide numbers + come from origin/main and are correct. Redeploy the oracles dashboard before the talk if + you want it live; otherwise skip that page. + +## Beat 1 — the Axiom App, Belgium (≈3 min) + +| Step | Do | Say | +|---|---|---| +| 1.1 | Switch to the tab at axiom.org/axiom?country=be | "This is Belgium in the Axiom App — 107 provisions, clustered federal, Flanders, Wallonia, Brussels, German-speaking community." | +| 1.2 | Hover the middle cluster; click a highlighted provision (e.g. "Income tax — benefits — company car (Belgium)") | "Each node is a rule encoded from the statute." | +| 1.3 | In the side panel, click "Read the law →" | "The CIR 92 text sits beside the RuleSpec rule that computes it — name, entity, unit, effective-from date. The interpretation is the published artifact, not something buried in an engine." | +| 1.4 | Close the modal; open the tab at axiom.org/axiom/graph?compose=be; click the final-result node | "And the computation graph: every result traces to its parameters and inputs. The dependency structure of the law becomes data you can analyze." | + +Fallback slides: "Browse the encoded law" → "The law at the node" → "The computation graph". + +## Beat 2 — policyengine.org/be (≈3 min) + +| Step | Do | Say | +|---|---|---| +| 2.1 | Switch to policyengine.org/be; point at the banner | "Everything here is labeled: Axiom rules engine, Microcosm-BE v0.5, 2025 law — and the provenance line states the US donor pool and the planned Belgian upgrade." | +| 2.2 | Drag "Top bracket rate" 50% → 55% | "One statute parameter — art. 130 CIR 92. Budget impact, Gini, poverty recompute from 155 precomputed cells across 28 encoded parameters." | +| 2.3 | Click "Reset to current law" | — | +| 2.4 | Scroll to "The population, checked" | "The same population, computed by both engines against administrative truth. The misses are shown in red, not hidden — each carries a named mechanism in the cross-engine ledger." | + +Fallback slide: "A Belgian reform, computed". + +## Beat 3 — policyengine.py (≈1 min, works offline) + +Stay on the code slide in the deck (no network needed). Walk the two calls: +a UK household in four lines; the same call for the US with a reform attached. +"This is the interface the Belgian work targets — the apps and the notebook run the same package." + +## Beat 4 — if time allows (≈1 min) + +| Step | Do | Say | +|---|---|---| +| 4.1 | microcosm.institute dashboard tab | "Every one of the 254 Belgian calibration targets published with its error — 96.1% within 10%." | +| 4.2 | axiom.org/validation tab | "And the standing rule: the model that wrote the rules never grades its own work." | + +Fallback slides: "The data, anchored in public" → "Validation, in the open". + +## Hard rules during the demo + +- Never say "certified" about any program. The honest line: "conformant, and the certificate + registry says certified = no — that honesty is the design." +- The 15 July 2026 Belgian PIT reform estimates are held — do not compute or mention them live. +- If someone asks to try an arbitrary household in the BE prototype: it is a precomputed-cell + prototype, not a free calculator — say so and offer the US/UK household calculator instead. diff --git a/slideshows/iariw-2026/SPEAKER-NOTES.md b/slideshows/iariw-2026/SPEAKER-NOTES.md new file mode 100644 index 0000000..f79557f --- /dev/null +++ b/slideshows/iariw-2026/SPEAKER-NOTES.md @@ -0,0 +1,272 @@ +# Speaker notes — From open models to executable law + +IARIW–CAPE workshop "New technologies for evidence-based policy making" +Thursday 27 August 2026 · 14:40–15:30 · Room P02, UCLouvain Saint-Louis, Brussels +Deck: policyengine.org/slides/iariw-2026 (local: /slides/iariw-2026) · 48 slides, ~42 presented + +**Room:** IARIW measurement economists; Koen Algoed (Director General, Budget and Finance, +Flemish Region) and Jean-Baptiste Traversa (head of microsimulation modelling, FPS Finance) +up front; Hélène Latzer (moderates the 16:00 roundtable); CAPE researchers; possibly EC/JRC. +Tom Truyts has just finished the BEAMM talk and demo (13:45–14:35). + +**The arc:** the CBO questions, generalized → in an era where conditions may change fast, +you'd need AI for all of it → but AI alone fails (PolicyBench) → so what do we arm it with? +Five primitives, each with a feedback loop → brief history (six years under one roof) → walk +the five, demoing each → the loop that matters most → roundtable hand-off. + +**⚠️ Numbers that changed from the CBO deck, verified 2026-08-26:** +1. PolicyBench: "1 in 3 to 1 in 7" is stale. Published v1.1 board (32 models): best 88.7% + exact ≈ 1 in 9 wrong; weakest 62.3%. +2. Certification: NOTHING is certified today — not Denmark, not the US tariff arc. + Denmark conformant-everywhere with certified = no (81 open dependencies) IS the story. + Never say "certified" as a positive claim about any program. +3. Facts register rows moved: 103 programs, 332 repos, 133 contributors, 4,693 test files, + team of 8. Chronicle: 148 source packages, 40 publishers (verified on main 2026-08-27). + +**Held — never say aloud:** the 15 July 2026 Belgian PIT reform cross-engine estimates +(Tom sees them first; Max's gate). Statistics Belgium conversations. Anything about other +modeling groups' publication records. + +--- + +## Timing map (45 min) + +| Clock | Section | Slides | Minutes | +|---|---|---|---| +| 14:40 | Opening | 1–3 | 3 | +| 14:43 | The question sequence | 4–8 | 6 | +| 14:49 | Five primitives + history + roadmap | 9–11 | 4 | +| 14:53 | 1 · Axiom | 12–27 (skip 22–25 if live demo works) | 13 | +| 15:06 | 2 · Chronicle | 28–29 | 2 | +| 15:08 | 3 · Microcosm | 30–37 (skip 36 if live) | 6.5 | +| 15:14 | 4 · PolicyEngine | 38–43 (skip 42 if live) | 6 | +| 15:20 | 5 · Together | 44–48 | 5.5 | +| 15:26 | Buffer + questions | — | 4 | + +Cut-first if long: Microplex (37), WhoUsesIt (40), and skim Evo3/Evo5. Static screenshot +slides (22–25, 36, 42) are presented ONLY if the network dies. + +--- + +## Slide-by-slide track + +### 1 · Title (30s) +Thank Tom. One sentence: "Tom showed you Belgium's platform; I want to show you where I think +all of our stacks are heading." + +### 2 · Tom just showed you the platform (1.5m) +BEAMM, EUROMOD, FPS Finance's models, PolicyEngine — same craft: encoded rules, a +representative population, validation against what the state publishes. No microsim 101 — +Tom did that. This talk: what changes when AI joins each layer. + +### 3 · The craft, scaled (1m) +Personal: "I love building models." The four elements of the craft. What changes: thousands +of agents poking at every piece at once. Tee the questions: "so here is the question I put to +the Congressional Budget Office in May — and any organization here can translate it to its own." + +### 4 · What if every bill had a score? (1.5m) +~10k bills per US Congress × 10 years × 3 budget categories = >300k cells as the FLOOR — an +order of magnitude more proposals than ever get a formal public score. One legislature; +Belgium alone legislates through six parliaments. [Scale check, stated on-slide.] + +### 5 · What if every outcome had an estimate? (1m) +A fiscal score is one number. Policy also moves poverty, inequality, regions, take-up — and +this room publishes the cells: 1m public statistical cells × 10-year horizon = >10m, before +uncertainty bands. + +### 6 · What if you cross them? (1m) +>100 billion bill-statistic-year cells. The hard question is not writing down more numbers — +it is which cells deserve estimates, which deserve bands, and which are out of domain. + +### 7 · And the baseline itself may be moving (1.5m) +The chart: professional 10-year consensus has never been tighter (SPF IQR 0.2pp, half its +1990s level) while published AI-era growth estimates span +0.07pp to +30pp per year +[Philadelphia Fed SPF; AI Frontiers compilation]. If you assign any real probability to rapid +change, analysis has to recompute the present, not defend one number. "So — you would need AI +to help with all of these pieces." + +### 8 · PolicyBench: AI alone can't do it (2m) +Ask a frontier model a basic tax-benefit question, check against the computed answer: +best model 88.7% exact ≈ 1 in 9 wrong; weakest of 32 more than 1 in 3. On SNAP cases where a +family is owed benefits, no model gets more than 1 in 20 right [policybench.org, v1.1]. +Landing: AI is impressive at code, search, summarization. It is not a substitute for a model. +"So what would the AI need? What do we arm it with?" + +### 9 · What do we arm the AI with? (2m — the thesis slide) +Five primitives, each a project, each with a feedback loop: +1 rules → Axiom (loop: oracles, zero unexplained mismatches) · 2 official statistics → +Chronicle (loop: completeness + lineage) · 3 the world at micro level → Microcosm (loop: +published calibration error, surveys held out) · 4 a model → PolicyEngine (loop: cross-engine +agreement + users) · 5 judgment — expertise, discretion, uncertainty (loop: forecasts that +resolve — the most important). Landing: the same primitives norm AIs AND human researchers. + +### 10 · Six years under one roof (1.5m) +The history: PolicyEngine since 2021 built the first four together — encoded US/UK rules (by +hand, increasingly AI), microdata imputed + calibrated to official statistics, the simulation +engine, the web app (still there, no longer the center). The realization behind the split: +each layer deserves its own name, users, and feedback loop — Axiom, Chronicle, Microcosm, +with PolicyEngine as the model that composes them. + +### 11 · Five primitives, five demos (30s) +The roadmap. "Let's walk them." + +### 12–19 · Axiom divider → encoder evolution (30s + ~40s each Evo, ~5m) +Divider, then the pivot: AI can't compute policy, it can help build the substrate that does. +The encoder history [our own project history, from the CBO deck]: single prompt (70% error) → +pipeline → parallel agents → validation gates → skills → full workflow (12 agents, ~90 min to +a draft PR). Tell it as adding verification, not adding intelligence. + +### 20 · The Axiom Foundation: encode, verify, publish (1.5m) +Why a foundation: the rules layer should be a public good. Encode (statute → RuleSpec, every +value cites its authority, effective dates) → verify (deterministic gauntlet + oracles: +PolicyEngine, TAXSIM, EUROMOD, SNAP quality-control data — the model that wrote the rules +never grades its own work) → publish (statute, encoding, validation record, computation graph +in one place). axiom.org. + +### 21 · DEMO — the Axiom App, Belgium, live (~3m; slides 22–25 are the fallback) +Live iframe in-deck (Expand button), or the preloaded tab. Beats: field view (107 Belgian +provisions, five clusters) → open a provision → "Read the law" (CIR 92 text beside the +RuleSpec rule, effective dates) → the computation graph. See DEMO-SCRIPT.md. + +### 26 · Belgian income tax, validated against EUROMOD (2m — the rules feedback loop) +23/23 in-scope BE_2025 policies conformant; 33 suites, 156 household comparisons; zero +unexplained mismatches. All 40 raw disagreements dispositioned: 33 filed as findings for the +EUROMOD team's review on the public EC-JRC tracker, 7 explained residuals on our side +[axiom-oracles origin/main, verified 2026-08-26]. Tone: EUROMOD is the reference we're +grateful exists; cross-checks flow both directions. PIT arc merged on main; dependants + +child benefits held at the signed-corpus release frontier. NEVER "perfect match" or +certified language. + +### 27 · Complete is not certified (2m — the honesty machinery) +Certified = computed(conformant AND exercised AND closed AND executable), no flag set by hand +[CERTIFIED.md v3]. Today: 13 programs, 10 conformant, ZERO certified. Denmark: matches +EUROMOD on every case, blockers empty — certified = no, 81 open dependencies. US tariff: +216M comparisons vs the Yale panel, 0 unexplained — still not conformant (1.59M open units). +For officials: this is the answer to "why trust an AI-built model" — you don't; you check +the certificate. + +### 28–29 · Chronicle (2m) +Divider, then: official statistics as source-backed facts — typed values with units, +geography, period, and lineage to the source artifact. 148 source packages from 40 official +publishers [chronicle main, verified 2026-08-27]. The Belgian shelf built in a week: Statbel +fiscal income by €1,000 class, SPF Finances/ONSS/ONEM totals, Eurostat national accounts, +FPB outlook, JRC EUROMOD baselines. The loop: Microcosm calibrates ONLY to sums of Chronicle +facts — every target traces to a publisher; surveys enter as validation only. + +### 30–31 · Microcosm divider → the data challenge (1m) +Comprehensive AND accurate. US: no single survey has everything. The European inversion: +Belgian registers are linked — the constraint is release, which is why BEAMM invests in +synthesis. Both directions converge on calibration targets + validation services. + +### 32 · Imputation (45s) +Quantile regression forests, full conditional distributions, tails included. AI reads survey +documentation and catches definitional mismatches. + +### 33 · Calibration (45s) +Gradient descent over household weights against thousands of published targets. AI ingests +targets, reconciles schemas; analysts decide what goes live. + +### 34 · Microcosm-BE (2m) +The recipe on Belgium [sealed v0.5 artifacts]: 57,240 household records, 254 targets (sums of +Chronicle facts), mean |error| 1.84%, 242/254 within 5%. The EUROMOD column ledger: all 182 +substantive output columns — 10 matched, 143 explained, 29 named gaps, 0 unclassified. +Provenance line said straight: US survey donor pool, reweighted; Belgian donor pool is the +planned upgrade. If SILC comes up: CAPE holds access — the acceptance test can run on their +machines. + +### 35 · DEMO — the calibration dashboard, live (1.5m; slide 36 is the fallback) +Every target published with its error; 96.1% within 10% on the live page. "You don't have to +take my word for any of this — it's a website." + +### 37 · Microplex (30s) — CUT FIRST IF LONG +Where the US data layer heads: multi-spine, automated target discovery, promote-on-review, +versioned public releases. + +### 38–39 · PolicyEngine divider → PolicyEngine today (1.5m) +The model that composes the primitives. Open source since June 2021 (AGPL-3.0); 95,000+ +parameters, 5,500+ variables, 4,693 test files, 103 programs; 133 contributors. No 10's data +science team built 10ds-microsim on it; MOUs with NBER (open source TAXSIM emulator) and the +Atlanta Fed (Policy Rules Database). For this room: an open EUROMOD-family stack for the US +and UK, built in public. + +### 40 · Who uses it (30s) — CUT IF LONG +Logo wall. One sentence and move. + +### 41 · DEMO — a Belgian reform, live (~3m; slide 42 is the fallback) +policyengine.org/be in-deck: move the top bracket rate, watch budget/Gini/poverty recompute +(155 precomputed cells, 28 CIR 92 parameters); scroll to "The population, checked" — both +engines against administrative truth, misses in red with named mechanisms. + +### 43 · policyengine.py (1m — works offline) +The same models as a Python package: a UK household in four lines; the same call for the US +with a reform attached. This is the interface the Belgian work targets. + +### 44–45 · Together divider → Conductors, not oracles (2m) +The model routes to verified tools and integrates calibrated outputs; analyst judgment lives +at every routing decision. The judgment-to-mechanism loop: intuition becomes mechanism over +time. + +### 46 · The loop that matters most (2m) +Every primitive has its gauge; the one that ranks them all is whether forecasts resolve +against reality. The measurable question: when the stack covers a new country — Belgium took +weeks because Microcosm calibrates to official statistics — do calibrated agents predict +outcomes there better? We intend to score that. And the deeper point for 16:00: policy takes +a different shape when baseline conditions change quickly; if you assign real probability to +that, how does this community arm policymakers to respond? + +### 47 · It takes all of us (1.5m) +Model-building has always been about making consequences visible before the choice. +Statistical offices, EUROMOD, BEAMM, ministries, open models — each doing what it does best. +"Which is exactly what the roundtable is about — see you at 16:00." + +### 48 · Thank you / QR (leave up) +QR → axiom.org. Links: axiom.org · policyengine.org/be · both GitHub orgs. + +--- + +## Likely questions (roundtable themes: transparency, trust, entering public administrations) + +**"How do we know the AI encoded the law correctly?"** +Same way you'd know for a human: you don't trust, you check. Every encoding compiles, passes +its tests, and is cross-checked against engines we don't control — EUROMOD here, TAXSIM and +SNAP quality-control data in the US. The certificate is computed, and today it honestly says +"not certified" for everything — the misses are published. + +**"Could FPS Finance / the Flemish administration use this?"** (Algoed, Traversa) +The on-ramp is verification, not replacement: run your existing system against the encodings +as a test oracle, catch discrepancies, keep your engine and your timeline. Everything is open +(encodings CC BY 4.0, code Apache-2.0), so there is no procurement cliff to try it. + +**"What about EUROMOD — are you competing with it?"** +We validate against it, we file what we find on the public tracker, and 33 of our 40 Belgian +disagreements were explained by differences we documented for their team's review. A shared +reference engine makes every model better, ours included. (Never comparative-negative; +never name other platforms' publication records.) + +**"Is the Belgian population real Belgian microdata?"** +No — and the label says so. A synthetic population calibrated to 254 Belgian administrative +and national-accounts targets; support records are a reweighted US donor pool; a Belgian +donor pool (e.g. SILC-based, run by partners who hold access) is the planned upgrade. +Cross-engine agreement on it is evidence about the encodings. + +**"Can it score the July 2026 PIT reform?"** (likely from officials) +The reform is encoded and a cross-engine comparison is in validation with partners — results +aren't public yet. [Numbers are HELD — do not state them.] + +**"What about data protection / can our data leave the building?"** +It doesn't need to: acceptance tests and calibration run wherever the data lives. What we +need published is aggregates: calibration targets and validation statistics, not microdata. + +**"Who pays for this / what's the business model?"** (no funding ask in the talk) +PolicyEngine is a nonprofit; the Axiom Foundation is a fiscally sponsored project of the PSL +Foundation. The encodings are a public good; paid work products fund the org. + +**"Is AI going to replace modelers?"** +Conductors, not oracles: the craft moves up a level — source interpretation, assumptions, +edge cases, sign-off. Every encoder-evolution step that worked added a check, not a bigger +model. + +**"What would a BEAMM/CAPE collaboration look like?"** +Tom and I are discussing exactly that — shared validation surfaces, a Belgian donor pool, +BEAMM's published estimates alongside ours on public scoreboards. The workshop is the public +face of that conversation. [Keep at this altitude; funding vehicle status is not public.] diff --git a/slideshows/iariw-2026/config.ts b/slideshows/iariw-2026/config.ts new file mode 100644 index 0000000..b9dec0d --- /dev/null +++ b/slideshows/iariw-2026/config.ts @@ -0,0 +1,142 @@ +import { SlideshowConfig } from '@/lib/types'; +import { speakers } from '@/lib/speakers'; +// Opening +import TitleSlide from './slides/TitleSlide'; +import BridgeSlide from './slides/BridgeSlide'; +import CraftScaledSlide from './slides/CraftScaledSlide'; +// The question sequence +import WhatIfEveryBillSlide from './slides/WhatIfEveryBillSlide'; +import WhatIfEverySeriesSlide from './slides/WhatIfEverySeriesSlide'; +import CrossScaleSlide from './slides/CrossScaleSlide'; +import ForecastUncertaintySlide from './slides/ForecastUncertaintySlide'; +import PolicyBenchSlide from './slides/PolicyBenchSlide'; +// The spine +import FivePrimitivesSlide from './slides/FivePrimitivesSlide'; +import HistorySlide from './slides/HistorySlide'; +import OutlineSlide from './slides/OutlineSlide'; +import { + AxiomDividerSlide, + ChronicleDividerSlide, + MicrocosmDividerSlide, + EngineDividerSlide, + TogetherDividerSlide, +} from './slides/SectionDivider'; +// 1 — Axiom +import BridgeToEvolutionSlide from './slides/BridgeToEvolutionSlide'; +import Evo1SinglePromptSlide from './slides/Evo1SinglePromptSlide'; +import Evo2PipelineSlide from './slides/Evo2PipelineSlide'; +import Evo3ParallelSlide from './slides/Evo3ParallelSlide'; +import Evo4ValidationSlide from './slides/Evo4ValidationSlide'; +import Evo5SkillsSlide from './slides/Evo5SkillsSlide'; +import Evo6FullWorkflowSlide from './slides/Evo6FullWorkflowSlide'; +import AxiomIntroSlide from './slides/AxiomIntroSlide'; +import BelgiumParitySlide from './slides/BelgiumParitySlide'; +import CertificationLadderSlide from './slides/CertificationLadderSlide'; +// 2 — Chronicle +import ChronicleSlide from './slides/ChronicleSlide'; +// 3 — Microcosm +import DataChallengeSlide from './slides/DataChallengeSlide'; +import ImputationSlide from './slides/ImputationSlide'; +import CalibrationSlide from './slides/CalibrationSlide'; +import MicrocosmBESlide from './slides/MicrocosmBESlide'; +import MicroplexSlide from './slides/MicroplexSlide'; +// 4 — PolicyEngine +import PEOverviewSlide from './slides/PEOverviewSlide'; +import WhoUsesItSlide from './slides/WhoUsesItSlide'; +import DemoPySlide from './slides/DemoPySlide'; +// Live embeds + static fallbacks +import { + DemoAxiomBrowseSlide, + DemoAxiomProvisionSlide, + DemoAxiomGraphSlide, + DemoAxiomValidationSlide, + DemoPeBeSlide, + MicrocosmDashboardSlide, +} from './slides/DemoSlides'; +import { + DemoAxiomLiveSlide, + DemoPeBeLiveSlide, + DemoDashboardLiveSlide, +} from './slides/DemoLiveSlides'; +// 5 — Together +import ConductorsSlide from './slides/ConductorsSlide'; +import ClosingLoopSlide from './slides/ClosingLoopSlide'; +import CommunityClosingSlide from './slides/CommunityClosingSlide'; +import QuestionsSlide from './slides/QuestionsSlide'; + +export const iariw2026Config: SlideshowConfig = { + id: 'iariw-2026', + title: 'From open models to executable law', + description: + 'PolicyEngine and Axiom — open models, simulation-ready microdata, and encoding and verifying policy rules', + date: '2026-08-27', + location: 'IARIW–CAPE workshop, UCLouvain Saint-Louis, Brussels', + footerText: 'PolicyEngine · IARIW–CAPE workshop · August 2026', + speakers: [speakers['max-ghenis']], + private: false, + slides: [ + // Opening + TitleSlide, + BridgeSlide, + CraftScaledSlide, + + // The question sequence + WhatIfEveryBillSlide, + WhatIfEverySeriesSlide, + CrossScaleSlide, + ForecastUncertaintySlide, + PolicyBenchSlide, + + // The spine: what do we arm the AI with? + FivePrimitivesSlide, + HistorySlide, + OutlineSlide, + + // 1 — Axiom (the rules) + AxiomDividerSlide, + BridgeToEvolutionSlide, + Evo1SinglePromptSlide, + Evo2PipelineSlide, + Evo3ParallelSlide, + Evo4ValidationSlide, + Evo5SkillsSlide, + Evo6FullWorkflowSlide, + AxiomIntroSlide, + DemoAxiomLiveSlide, + DemoAxiomBrowseSlide, + DemoAxiomProvisionSlide, + DemoAxiomGraphSlide, + DemoAxiomValidationSlide, + BelgiumParitySlide, + CertificationLadderSlide, + + // 2 — Chronicle (official statistics) + ChronicleDividerSlide, + ChronicleSlide, + + // 3 — Microcosm (the world at micro level) + MicrocosmDividerSlide, + DataChallengeSlide, + ImputationSlide, + CalibrationSlide, + MicrocosmBESlide, + DemoDashboardLiveSlide, + MicrocosmDashboardSlide, + MicroplexSlide, + + // 4 — PolicyEngine (the model) + EngineDividerSlide, + PEOverviewSlide, + WhoUsesItSlide, + DemoPeBeLiveSlide, + DemoPeBeSlide, + DemoPySlide, + + // 5 — Together + TogetherDividerSlide, + ConductorsSlide, + ClosingLoopSlide, + CommunityClosingSlide, + QuestionsSlide, + ], +}; diff --git a/slideshows/iariw-2026/outline.md b/slideshows/iariw-2026/outline.md new file mode 100644 index 0000000..801f0bb --- /dev/null +++ b/slideshows/iariw-2026/outline.md @@ -0,0 +1,115 @@ +# IARIW 2026 workshop talk — outline + +**From open models to executable law: PolicyEngine and Axiom** +Thursday 27 August 2026, 14:40–15:30 (~45 min + questions), Room P02, UCLouvain Saint-Louis, Brussels. +Workshop: "New technologies for evidence-based policy making" (co-located with the 39th IARIW General Conference), co-organized by Tom Truyts (CAPE, UCLouvain Saint-Louis) and Max Ghenis (PolicyEngine). + +## Context + +- Tom Truyts presents BEAMM (Belgium's open microsimulation platform) 13:45–14:35, immediately before. + Do not re-explain tax-benefit microsimulation. Build on Tom's talk explicitly: "Tom just showed you + the platform; here's where the stack is heading." +- Audience: IARIW measurement economists (DINA/national-accounts crowd), Belgian officials + (Koen Algoed — Director General, Budget and Finance, Flemish Region; Jean-Baptiste Traversa — + head of microsimulation modelling, FPS Finance), Hélène Latzer (UCLouvain, moderates the 16:00 + roundtable on AI tools entering public administrations), CAPE researchers, possibly EC/JRC people. +- EUROMOD is the shared reference point. Community-of-modelers framing throughout — never + vendor-vs-incumbent, never argue with anyone's claims. Euros where possible. +- A live demo (~8 min) sits inside the talk; every demo beat has a fallback screenshot slide. +- 16:00 roundtable follows — the closing should hand off to its themes (transparency, trust, + what it takes for these tools to enter public administrations). + +## The argument + +Model-building is a craft: structure, program rules, calibrated data, tests that try to break the +model, validation that catches when it does. That is the work BEAMM does, EUROMOD does, FPS Finance +does, PolicyEngine does. What changes with AI is not the craft — it is that agents can now poke at +every piece of it, at a scale no individual analyst can match. That scale only helps if the +verification machinery scales with it: encode → verify → publish, with the scoreboard public, +including the misses. Belgium is the live case: an AI-encoded Belgian PIT validated case-by-case +and population-wide against EUROMOD, on a Belgian population calibrated to Belgian administrative +totals — built in weeks, honestly labeled everywhere it falls short. The endgame is a shared, +open, checkable evidence layer that any ministry can recompute — which matters more as credible +forecasts of the AI era itself diverge by orders of magnitude. + +## Slide-by-slide + +> ⚠️ Superseded 2026-08-27: the deck was restructured around Max's five-primitives arc +> (questions → what do we arm the AI with? → Axiom / Chronicle / Microcosm / PolicyEngine / +> Together, each with its feedback loop and demo). SPEAKER-NOTES.md carries the current +> 48-slide structure and timing; the sections below describe the earlier format-led cut. + +### Opening + question sequence (8 slides, ~8 min) +1. **TitleSlide** — cover, partner context (IARIW–CAPE workshop). +2. **BridgeSlide** — "Tom just showed you the platform." Same craft, shared stack directions. +3. **CraftScaledSlide** — the craft, scaled: what agents change and what they don't. +4. **WhatIfEveryBillSlide** — what if every bill had a score? (>300k cells; six Belgian + parliaments beyond the one US legislature). +5. **WhatIfEverySeriesSlide** — what if every statistical series had a forecast? (>10m cells). +6. **CrossScaleSlide** — what if you cross them? (>100b bill-statistic-year cells; which cells + deserve estimates, bands, or out-of-domain marks). +7. **HowWeGetThereSlide** — two compounding tracks: build the apparatus with AI, then equip AI + to run it at scale. +8. **OutlineSlide** — Rules / Data / Live / Where this goes. + +### Section 1 — Rules (~14 min) +5. **RulesDivider** +6. **PEOverviewSlide** — PolicyEngine today: open US/UK models, who uses them (10 Downing Street, + legislative users, NBER + Atlanta Fed MOUs), all Facts-Register-sourced. +7. **PolicyBenchSlide** — where plain LLMs fail on policy computation (verified numbers). +8. **BridgeToEvolutionSlide** — so how do you get AI to do this reliably? +9–14. **Evo1–Evo6** — the encoder evolution, single prompt → full workflow (adapted from cbo-2026). +15. **AxiomIntroSlide** — the Axiom Foundation: encode → verify → publish. +16. **BelgiumParitySlide** — rulespec-be × EUROMOD: suites, comparisons, explained rate; + findings flow both directions (we file what we find upstream, we fix what the oracle catches + in ours). Verified numbers only. +17. **CertificationLadderSlide** — complete ≠ certified: the certificate is computed, not asserted; + what the registry honestly says today (per verified axiom-oracles state). + +### Section 2 — Data (~8 min) +18. **DataDivider** +19. **DataChallengeSlide** — why survey microdata alone can't answer reform questions; the EU + inversion (linkage vs release constraints). +20. **ImputationSlide** — fusing surveys with ML (US pipeline, adapted). +21. **CalibrationSlide** — reweighting to administrative truth (US pipeline, adapted). +22. **MicrocosmBESlide** — Microcosm-BE: Belgian population calibrated to Belgian admin + + national-accounts targets (sums of Chronicle facts); the EUROMOD column ledger + (matched / explained / gap); provenance line (US donor pool, Belgian donor = planned upgrade). +23. **MicroplexSlide** — where the data layer heads next (brief). + +### Section 3 — Live (~9 min; live embedded apps with Expand, static screenshots as fallbacks) +24. **DemoDivider** — the three beats. +25. **DemoAxiomLiveSlide** — LIVE iframe: the Axiom App, Belgium (app.axiom-foundation.org). +26. Static fallbacks: browse → provision → RuleSpec/graph → validation screenshots. +27. **DemoPeBeLiveSlide** — LIVE iframe: policyengine.org/be reform simulator (+ static fallback). +28. **DemoPySlide** — policyengine.py in a few lines (code slide; works offline). +(The data section also carries **DemoDashboardLiveSlide** — the live calibration dashboard — +with its static screenshot right after as the fallback.) + +### Section 4 — Where this goes (~8 min) +28. **FutureDivider** +29. **ConductorsSlide** — conductors, not oracles. +30. **ForecastUncertaintySlide** — optional closing beat: when credible AI-era growth forecasts + span orders of magnitude, evidence infrastructure's job shifts from defending one number to + letting a ministry recompute the present. (Skippable live.) +31. **CommunityClosingSlide** — it takes all of us: stat offices, EUROMOD, BEAMM, ministries, + open models. Hands off to the 16:00 roundtable themes. +32. **QuestionsSlide** — links. + +## Cut from cbo-2026 + +CBO-specific opening (CboScaleSlide, ScaleOpportunity/EverySeriesForecast/CrossScale/ScaleAccuracy/ +HowWeGetThere/ProjectionApparatus — US-forecasting agency framing), CliffWatch, Theory section +(LLMBeliefs, LLMETI), Analysis section (AnalysisLogos, PolicyAnalysis, ClaudePlugin, +ClaudeComparison, UKChatPrototype, PredictAll, MarketsMock, AIInequality), WhoUsesIt (folded into +PEOverview), ObbbaExplorer (Max presents the OBBBA paper elsewhere at IARIW), parked legacy slides. + +## Claim gates (standing) + +- Belgium is never "certified". Complete ≠ certified. Certification language quotes the computed + certificate only. +- Microcosm-BE is a product lineage, not a demo: provenance line, never a scare banner. +- "the Axiom Foundation" in full in prose; no funder names; no completeness claims; demos are demos. +- Every org number from messaging/Facts-Register.md or a named artifact verified this session. +- No policy positions. No funding asks. Sentence case. No emoji. Numbers speak for themselves. +- The 15 July 2026 Belgian PIT reform cross-engine estimates are HELD (Max's gate) — not in this deck. diff --git a/slideshows/iariw-2026/slides/AxiomIntroSlide.tsx b/slideshows/iariw-2026/slides/AxiomIntroSlide.tsx new file mode 100644 index 0000000..a2219f9 --- /dev/null +++ b/slideshows/iariw-2026/slides/AxiomIntroSlide.tsx @@ -0,0 +1,115 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +const requirements = [ + { + title: 'Accuracy at every step', + detail: + 'Every parameter, formula, citation, and test produced along the way — not only the final answer.', + }, + { + title: 'Cross-validation against other sources', + detail: + 'TAXSIM, agency tables, peer modelers — multiple ground truths beyond our own.', + }, + { + title: 'Deterministic quality gates', + detail: + 'Tests, lint, type checks, structural rules that the agents must pass — not opinions about quality.', + }, + { + title: 'Human review at the right boundary', + detail: + 'Not every prompt. The final PR, the assumptions, the edge cases worth a second pair of eyes.', + }, + { + title: 'A canvas wide enough for the work', + detail: + 'A queue that can hold thousands of policies and run them in parallel without losing context.', + }, +]; + +const verbs = [ + { + verb: 'Encode', + detail: + 'Statute to RuleSpec. Every value cites its authority; every clause carries its effective dates.', + }, + { + verb: 'Verify', + detail: + 'A deterministic gauntlet, then oracles that cross-check against external engines and datasets — PolicyEngine, TAXSIM, EUROMOD, SNAP quality-control data — so the model that wrote the rules never grades its own work.', + }, + { + verb: 'Publish', + detail: + 'Source document, encoding, validation record, and computation graph in one place.', + }, +]; + +export default function AxiomIntroSlide() { + return ( + + + + The Axiom Foundation: encode, verify, publish + + + +
+
+ {requirements.map((r, i) => ( +
+
+ {i + 1} +
+
+

+ {r.title} +

+

{r.detail}

+
+
+ ))} +
+ +
+

+ The world's rules, encoded +

+ +
+ {verbs.map((v, i) => ( +
0 ? 'pt-4 border-t border-white/15' : undefined + } + > +

+ {v.verb} +

+

+ {v.detail} +

+
+ ))} +
+ +
+

axiom.org

+
+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/BelgiumParitySlide.tsx b/slideshows/iariw-2026/slides/BelgiumParitySlide.tsx new file mode 100644 index 0000000..3586f7b --- /dev/null +++ b/slideshows/iariw-2026/slides/BelgiumParitySlide.tsx @@ -0,0 +1,66 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +const stats = [ + { value: '23/23', label: 'in-scope BE_2025 policies conformant' }, + { value: '156', label: 'household comparisons across 33 suites' }, + { value: '0', label: 'unexplained mismatches' }, +]; + +export default function BelgiumParitySlide() { + return ( + + + Belgian income tax, validated against EUROMOD + + +
+ {stats.map((s) => ( +
+
{s.value}
+

{s.label}

+
+ ))} +
+ +
+
+
Every disagreement dispositioned
+

+ The suites raised 40 raw disagreements. 33 traced to upstream + engine differences and are filed as findings for the EUROMOD + team's review on the public EC-JRC tracker; 7 are explained + residuals. +

+

+ EUROMOD is the reference we are glad exists — the + cross-checks flow both directions. +

+
+ +
+
+ Worked example +
+

+ The Belgian PIT arc — couples, pensions, self-employment, + and replacement-income pipelines — is merged on main. + Dependants and child benefits are encoded, held at the + signed-corpus release frontier. +

+
+
+ +

+ rulespec-be and the oracle harness are public at{' '} + github.com/TheAxiomFoundation{' '} + · scoreboard at{' '} + axiom.org/oracles +

+
+ ); +} diff --git a/slideshows/iariw-2026/slides/BridgeSlide.tsx b/slideshows/iariw-2026/slides/BridgeSlide.tsx new file mode 100644 index 0000000..f1db1a1 --- /dev/null +++ b/slideshows/iariw-2026/slides/BridgeSlide.tsx @@ -0,0 +1,53 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +const sharedCraft = [ + { + title: 'Encoded rules', + detail: 'Tax and benefit law, written as code that computes.', + }, + { + title: 'A representative population', + detail: 'Microdata that stands in for the country.', + }, + { + title: 'Validation', + detail: 'Checks against what the state publishes.', + }, +]; + +export default function BridgeSlide() { + return ( + + + Tom just showed you the platform + + +
+

+ BEAMM, EUROMOD, FPS Finance's models, PolicyEngine — the + same craft, built by the same kind of people: +

+ +
+ {sharedCraft.map((c) => ( +
+

{c.title}

+

{c.detail}

+
+ ))} +
+ +
+

+ This talk is about where that stack is heading as AI joins the work + — rules that carry their citations, populations calibrated to + administrative totals, and verification that scales with the + encoding. The code and the scoreboards are public. +

+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/BridgeToEvolutionSlide.tsx b/slideshows/iariw-2026/slides/BridgeToEvolutionSlide.tsx new file mode 100644 index 0000000..775beec --- /dev/null +++ b/slideshows/iariw-2026/slides/BridgeToEvolutionSlide.tsx @@ -0,0 +1,36 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +export default function BridgeToEvolutionSlide() { + return ( + + + But it can help us encode them faster + + +
+

+ AI can't accurately compute policy on its own.{' '} + + It can help us build the substrate that does. + +

+ +
+

+ Over the last three years we have evolved how AI assists with the + encoding work itself — from a single prompt that often + failed to a multi-agent pipeline that produces tested, + citation-backed PRs. +

+
+ +

+ Six stages of evolution, six lessons learned, one workflow we use + today. +

+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/CalibrationSlide.tsx b/slideshows/iariw-2026/slides/CalibrationSlide.tsx new file mode 100644 index 0000000..f6b5386 --- /dev/null +++ b/slideshows/iariw-2026/slides/CalibrationSlide.tsx @@ -0,0 +1,74 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +export default function CalibrationSlide() { + return ( + + + Calibration: matching administrative totals + + +
+
+
+
The method
+

+ Gradient descent{' '}over + household weights, optimizing simultaneously against published + administrative targets — tax authority tables, statistical + office series, census tabulations, program totals. +

+
+ +
+
Why it works
+

+ When the optimizer fits all targets at once, the resulting + weights reproduce the cross-tabulations ministries and + statistical offices already publish — while preserving the + joint distribution the microdata carries. +

+
+
+ +
+
Where AI changes this layer
+
    +
  • + · + + Target ingestion.{' '} + Agents read statistical releases, tax authority tables, and + ministry PDFs and pull numbers into a canonical target format, + keeping pace as publications land. + +
  • +
  • + · + + Schema reconciliation.{' '} + When definitions change between releases, agents surface the + diff before it silently miscalibrates the model. + +
  • +
  • + · + + Promotion decisions.{' '} + The agent proposes which targets to add; analysts decide + which ones go into the live calibration and which stay in + reserve. + +
  • +
+
+
+ +

+ Same calibration discipline. Many more targets, much faster turn, + humans on the judgment calls. +

+
+ ); +} diff --git a/slideshows/iariw-2026/slides/CertificationLadderSlide.tsx b/slideshows/iariw-2026/slides/CertificationLadderSlide.tsx new file mode 100644 index 0000000..46998f1 --- /dev/null +++ b/slideshows/iariw-2026/slides/CertificationLadderSlide.tsx @@ -0,0 +1,126 @@ +import { Fragment } from 'react'; +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; +import { IconChevronRight } from '@tabler/icons-react'; + +const rungs = [ + { + label: 'Encoded', + detail: 'The program exists as executable rules.', + }, + { + label: 'Conformant', + detail: 'Agrees with the reference engine, with zero unexplained mismatches.', + }, + { + label: 'Closed', + detail: 'Every law-derived dependency it relies on is encoded too.', + amber: true, + }, + { + label: 'Certified', + detail: 'Conformant, exercised, closed, and executable, with zero open defects.', + unreached: true, + }, +]; + +export default function CertificationLadderSlide() { + return ( + + + Complete is not certified + + +

+ Agreement with the reference engine is necessary — and nowhere + near sufficient. +

+ +
+ {rungs.map((rung, i) => ( + + {i > 0 && ( +
+ +
+ )} + {rung.unreached ? ( +
+

+ {rung.label} +

+

+ {rung.detail} +

+
+ ) : ( +
+

+ {rung.label} +

+

+ {rung.detail} +

+
+ )} +
+ ))} +
+ +
+
+
+
+ Where Denmark stops +
+

+ Denmark's child and youth benefit matches EUROMOD on every + case across three reference legs, and its blocker list is empty. + Certified still reads no — dependency closure fails, with + 81 law-derived dependencies open, among them the income basis in + personskatteloven §7. +

+
+

+ The US tariff schedule tells the same story — 216 million + row-level comparisons against the Yale Budget Lab statutory panel, + zero unexplained mismatches, and conformant still reads no with + 1.59M units open. +

+
+ +
+
0 / 13
+

programs certified today

+

10 of 13 conformant

+
+
+ +
+

+ Certified is computed, never set by hand, and the registry publishes + whatever the computation says. The scoreboard grades itself honestly + — that is the point. +

+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/ChronicleSlide.tsx b/slideshows/iariw-2026/slides/ChronicleSlide.tsx new file mode 100644 index 0000000..3b9a22d --- /dev/null +++ b/slideshows/iariw-2026/slides/ChronicleSlide.tsx @@ -0,0 +1,68 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +const belgianPackages = [ + 'Statbel — fiscal income by €1,000 class, population by region, sex, and age', + 'SPF Finances, ONSS, ONEM — tax and social security administrative totals', + 'Eurostat — national accounts for the household sector', + 'Federal Planning Bureau — the medium-term outlook, history and forecast', + 'JRC — published EUROMOD baseline statistics', +]; + +export default function ChronicleSlide() { + return ( + + + Chronicle: official statistics, as facts + + +
+
+

+ A source-backed fact store: every published value captured with its + type, unit, geography, period, and lineage back to the source + artifact. +

+ +
+
+
148
+

source packages

+
+
+
40
+

+ official publishers +

+
+
+ +
+

+ The feedback loop: Microcosm calibrates only to sums of Chronicle + facts, so every target traces to a publisher — and gaps in + the store show up as gaps in what can be calibrated. +

+
+
+ +
+
The Belgian shelf, built this summer
+
    + {belgianPackages.map((p) => ( +
  • + + + {p} +
  • + ))} +
+

+ Survey aggregates are labeled as such and enter downstream work as + validation only. +

+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/ClosingLoopSlide.tsx b/slideshows/iariw-2026/slides/ClosingLoopSlide.tsx new file mode 100644 index 0000000..f7ee8fa --- /dev/null +++ b/slideshows/iariw-2026/slides/ClosingLoopSlide.tsx @@ -0,0 +1,44 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +export default function ClosingLoopSlide() { + return ( + + + The loop that matters most + + +
+

+ Every primitive has its gauge — conformance suites, provenance, + calibration error, cross-engine agreement. The one that ranks them + all: do the forecasts + resolve against reality? +

+ +
+
The measurable question
+

+ When this stack covers a new country, do calibrated agents predict + outcomes there better? We built the Belgian prototype in weeks + because Microcosm calibrates to official statistics rather than + rebuilding a survey pipeline — the same recipe now applies + country by country. Whether that improves resolved forecasts is a + question we can score, and intend to. +

+
+ +
+

+ And policy takes a different shape when baseline conditions change + quickly. If you assign any real probability to rapid AI-driven + change, the question for this community is how policy analysis + arms policymakers to respond — a thread for the roundtable + at 16:00. +

+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/CommunityClosingSlide.tsx b/slideshows/iariw-2026/slides/CommunityClosingSlide.tsx new file mode 100644 index 0000000..7f201fa --- /dev/null +++ b/slideshows/iariw-2026/slides/CommunityClosingSlide.tsx @@ -0,0 +1,45 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +export default function CommunityClosingSlide() { + return ( + + + It takes all of us + + +
+

+ Model-building has always been about making the consequences of + policy visible before the choice is made. +

+ +

+ AI lets this community produce more evidence — at more scale, + more conditionally, more calibrated against what governments publish. +

+ +
+

+ The work is not choosing the policy. +

+

+ The work is knowing what each policy will actually do — so + the people who do choose can align outcomes with what they are + trying to achieve. +

+
+ +

+ Statistical offices, EUROMOD, BEAMM, ministries, open models — + each piece, doing what it does best. +

+ +

+ It is the work of a community, not any one institution. +

+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/ConductorsSlide.tsx b/slideshows/iariw-2026/slides/ConductorsSlide.tsx new file mode 100644 index 0000000..85e7856 --- /dev/null +++ b/slideshows/iariw-2026/slides/ConductorsSlide.tsx @@ -0,0 +1,53 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +export default function ConductorsSlide() { + return ( + + + Conductors, not oracles + + +
+
+
Oracle (the wrong frame)
+

+ An LLM absorbs text and emits text. Confidently. Without calling + the models that would actually answer the question. +

+

+ This is the failure mode PolicyBench measures. +

+
+ +
+
+ Conductor (the right frame) +
+

+ The model routes a question to the right tool — microsim, + structural model, statistical method, archival lookup — with + parameters, and integrates calibrated outputs. +

+

+ Analyst judgment lives at every routing decision. +

+
+
+ +
+

+ The judgment-to-mechanism loop:{' '} + where LLM judgment captures something current models miss, that + judgment eventually gets formalized into the next generation of + models. Analyst intuition becomes mechanism over time — not the + other way around. +

+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/CraftScaledSlide.tsx b/slideshows/iariw-2026/slides/CraftScaledSlide.tsx new file mode 100644 index 0000000..3f789b4 --- /dev/null +++ b/slideshows/iariw-2026/slides/CraftScaledSlide.tsx @@ -0,0 +1,61 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +const craft = [ + 'Program rules, encoded from the statute', + 'Data calibrated to what agencies publish', + 'Case studies that try to break the model', + 'Validation that catches when it does', +]; + +export default function CraftScaledSlide() { + return ( + + + The craft, scaled + + +
+
+

+ I love building models. The work has always been: +

+
    + {craft.map((item) => ( +
  • + + {item} +
  • + ))} +
+
+ +
+
+

+ What changes +

+

+ Thousands of AI agents can now poke at every piece of that craft + — encoding, testing, cross-checking — at a scale no + individual analyst can match. +

+
+ +
+

+ The question for the next 45 minutes: what does that scale make + possible — and what does it not change? +

+
+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/CrossScaleSlide.tsx b/slideshows/iariw-2026/slides/CrossScaleSlide.tsx new file mode 100644 index 0000000..790fceb --- /dev/null +++ b/slideshows/iariw-2026/slides/CrossScaleSlide.tsx @@ -0,0 +1,60 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +const dimensions = [ + { label: 'Bills', value: '~10k' }, + { label: 'Public cells', value: '1m+' }, + { label: 'Years', value: '10' }, + { label: 'Policy states', value: 'Many' }, +]; + +export default function CrossScaleSlide() { + return ( + + + What if you cross them? + + +
+
+
>100b
+

+ bill-statistic-year cells +

+

+ 10k bills x 1m public statistical cells x 10 years. +

+
+ +
+
+ {dimensions.map((dimension) => ( +
+
+ {dimension.value} +
+
+ {dimension.label} +
+
+ ))} +
+ +

+ The hard question is not whether we can write down more numbers. It + is which cells deserve estimates, which deserve uncertainty bands, + and which should be marked out of domain. +

+ +
+

+ This is where AI changes the shape of the work: routing, checking, + backtesting, and surfacing the cells where human judgment matters. +

+
+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/DataChallengeSlide.tsx b/slideshows/iariw-2026/slides/DataChallengeSlide.tsx new file mode 100644 index 0000000..caca41f --- /dev/null +++ b/slideshows/iariw-2026/slides/DataChallengeSlide.tsx @@ -0,0 +1,61 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +export default function DataChallengeSlide() { + return ( + + + + Building a dataset that is comprehensive and accurate + + + +
+

+ To represent every household's tax and benefit position, the + microdata needs to be{' '} + comprehensive{' '} + enough to cover the relevant variables and{' '} + accurate{' '}enough to + reproduce administrative totals. +

+ +
+
+
The US constraint
+

+ No single public survey has everything. The CPS misses capital + gains. The SCF misses program participation. Administrative data + is locked behind privacy walls we cannot link through. +

+
+ +
+
The European inversion
+

+ In Belgium the registers are already linked. The binding + constraint is release, not linkage — which is why BEAMM + works on synthesis, building populations the public can use. +

+
+
+ +

+ Whether you start from survey fragments or from locked registers, + both directions converge on the same need — calibration + targets and validation services. +

+ +
+

+ AI has accelerated both halves of this work — from + understanding what each source actually contains, to ingesting the + growing universe of administrative targets, to rethinking the + whole pipeline from scratch. +

+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/DemoLiveSlides.tsx b/slideshows/iariw-2026/slides/DemoLiveSlides.tsx new file mode 100644 index 0000000..35e2994 --- /dev/null +++ b/slideshows/iariw-2026/slides/DemoLiveSlides.tsx @@ -0,0 +1,91 @@ +'use client'; + +import LiveAppSlide from './LiveAppSlide'; + +/** + * Live demo slides — the actual apps, embedded with Expand. The static + * screenshot slides that follow each beat are the no-network fallback. + */ + +export const DemoAxiomLiveSlide = () => ( + +
+
What you are seeing
+

+ 107 Belgian provisions, clustered federal, Flanders, Wallonia, + Brussels, and German-speaking community. Each node is a rule encoded + from the statute. +

+
+ +
+
The walkthrough
+

+ Open a provision → read the law beside the RuleSpec rule that + computes it → trace the computation graph from result back to + parameters. +

+
+ +
+

+ Live walkthrough — screenshots follow if the network does not + cooperate. +

+
+
+); + +export const DemoPeBeLiveSlide = () => ( + +
+
What you are seeing
+

+ A prototype on the Axiom rules engine and Microcosm-BE v0.5 — 28 + encoded CIR 92 parameters, budget, Gini, and poverty impacts, and the + population checked against administrative truth by both engines. +

+
+ +
+
The walkthrough
+

+ Move the top bracket rate → watch the impacts recompute → + scroll to the population table, where the misses are shown in red with + named mechanisms. +

+
+
+); + +export const DemoDashboardLiveSlide = () => ( + +
+
What you are seeing
+

+ Every one of the 254 Belgian calibration targets, published with its + error. The provenance line states the US donor pool and the planned + Belgian upgrade. +

+
+ +
+

+ You do not have to take my word for any of this — it is a + website. +

+
+
+); diff --git a/slideshows/iariw-2026/slides/DemoPySlide.tsx b/slideshows/iariw-2026/slides/DemoPySlide.tsx new file mode 100644 index 0000000..158019a --- /dev/null +++ b/slideshows/iariw-2026/slides/DemoPySlide.tsx @@ -0,0 +1,69 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; +import CodeBlock from '@/components/content/CodeBlock'; + +export default function DemoPySlide() { + return ( + + + The same models, as a Python package +

+ pip install policyengine — the interface behind the apps +

+
+ +
+ +
+            {`import policyengine as pe
+
+# UK: single adult earning £50,000
+uk = pe.uk.calculate_household(
+    people=[{"age": 35, "employment_income": 50_000}],
+    year=2026,
+)
+print(uk.person[0].income_tax)
+
+# US: same call, with a reform attached
+us = pe.us.calculate_household(
+    people=[{"age": 35, "employment_income": 60_000}],
+    tax_unit={"filing_status": "SINGLE"},
+    household={"state_code": "CA"},
+    year=2026,
+    reform={"gov.irs.credits.ctc.amount.adult_dependent": 1000},
+)
+print(us.tax_unit.income_tax)`}
+          
+
+ +
+
+

+ Households and populations +

+

+ The same package runs a single household or a full calibrated + population, baseline against reform. +

+
+
+

+ Reforms are parameter changes +

+

+ Every parameter carries its legislative reference; a reform is a + dated override of the ones you name. +

+
+
+

+ This is the interface new engines plug into — the Belgian + work you just saw targets the same contract. +

+
+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/DemoSlides.tsx b/slideshows/iariw-2026/slides/DemoSlides.tsx new file mode 100644 index 0000000..d9cbedf --- /dev/null +++ b/slideshows/iariw-2026/slides/DemoSlides.tsx @@ -0,0 +1,66 @@ +import ScreenshotSlide from './ScreenshotSlide'; + +/** + * Demo fallback slides — one per live demo beat, presentable if the venue + * network fails. Screenshots captured 2026-08-26 from the live sites. + */ + +export const DemoAxiomBrowseSlide = () => ( + +); + +export const DemoAxiomProvisionSlide = () => ( + +); + +export const DemoAxiomGraphSlide = () => ( + +); + +export const DemoAxiomValidationSlide = () => ( + +); + +export const DemoPeBeSlide = () => ( + +); + +export const MicrocosmDashboardSlide = () => ( + +); diff --git a/slideshows/iariw-2026/slides/Evo1SinglePromptSlide.tsx b/slideshows/iariw-2026/slides/Evo1SinglePromptSlide.tsx new file mode 100644 index 0000000..5b27fdb --- /dev/null +++ b/slideshows/iariw-2026/slides/Evo1SinglePromptSlide.tsx @@ -0,0 +1,72 @@ +import React from 'react'; +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; +import IconDefs from '@/components/IconDefs'; + +export default function Evo1SinglePromptSlide() { + return ( + + + Evolution step 1: single prompt +

70% error rate

+
+ +
+ {/* Left: diagram */} +
+ + + + + Single Prompt + + + + + Output + + 70% + errors + +
+ + {/* Right: text */} +
+
+

+ We started with the simplest approach: a single prompt asking Claude to implement one benefit program end-to-end. One command, one output—parameters, variables, tests, everything in one shot. +

+
+ + + + + + + + + + {[ + ['Simple to start\u2014one prompt', '70% of outputs had errors'], + ['Produces accurate code on simple tasks', 'Hard-coded values'], + ['Fast iteration cycles', 'No source citations'], + ].map((row, i) => ( + + + + + ))} + +
What workedWhat didn't
{row[0] && <>{row[0]}}{row[1] && <>{row[1]}}
+ +
+

+ Key insight: Too much context for one prompt. The model couldn't hold code standards, legal requirements, and testing patterns all at once. +

+
+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/Evo2PipelineSlide.tsx b/slideshows/iariw-2026/slides/Evo2PipelineSlide.tsx new file mode 100644 index 0000000..71a8724 --- /dev/null +++ b/slideshows/iariw-2026/slides/Evo2PipelineSlide.tsx @@ -0,0 +1,86 @@ +import React from 'react'; +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; +import IconDefs from '@/components/IconDefs'; + +export default function Evo2PipelineSlide() { + return ( + + + Evolution step 2: core pipeline +

4 agents, sequential

+
+ +
+ {/* Left: diagram */} +
+ + + + + doc-collector + + + + + param-architect + + + + + rules-engineer + + + + + test-creator + + + + + output + tests created after seeing rules-engineer's work + +
+ + {/* Right: text */} +
+
+

+ We introduced agents—specialized AI workers that each focus on a single concern. A document-collector gathers sources. A parameter-architect structures data. A rules-engineer implements logic. A test-creator writes validations. +

+
+ + + + + + + + + + {[ + ['Each agent focused on one task', 'Tests run with variable logic in mind'], + ['Clearer, shorter prompts', 'Bugs are reinforced, not fixed'], + ['Easier to debug failures', 'No validation step'], + ['Improve agents independently', null], + ].map((row, i) => ( + + + + + ))} + +
What workedWhat didn't
{row[0] && <>{row[0]}}{row[1] && <>{row[1]}}
+ +
+

+ Key insight: Sequential execution means tests validate existing code patterns—not actual program document requirements. +

+
+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/Evo3ParallelSlide.tsx b/slideshows/iariw-2026/slides/Evo3ParallelSlide.tsx new file mode 100644 index 0000000..73bd651 --- /dev/null +++ b/slideshows/iariw-2026/slides/Evo3ParallelSlide.tsx @@ -0,0 +1,88 @@ +import React from 'react'; +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; +import IconDefs from '@/components/IconDefs'; + +export default function Evo3ParallelSlide() { + return ( + + + Evolution step 3: parallel execution +

5 agents, 40% error rate

+
+ +
+ {/* Left: diagram */} +
+ + + + + doc-collector + + + + + + param-architect + + + test-creator + + + rules-engineer + + + + + + impl-validator + + + + + output + +
+ + {/* Right: text */} +
+
+

+ Test-creator and rules-engineer run in parallel. Both read the same documentation. Neither sees the other's output. When tests fail, it reveals actual discrepancies between implementation and requirements. +

+
+ + + + + + + + + + {[ + ['Tests verify requirements', 'No reference validation'], + ['Catches real bugs', 'No edge case testing'], + ['Error rate dropped to 40%', 'Manual review iterations'], + ['Added impl-validator', 'Styling mismatch between params and vars'], + ].map((row, i) => ( + + + + + ))} + +
What workedWhat didn't
{row[0]}{row[1]}
+ +
+

+ Key insight: Agent isolation prevents confirmation bias but requires manual intervention on each iteration. +

+
+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/Evo4ValidationSlide.tsx b/slideshows/iariw-2026/slides/Evo4ValidationSlide.tsx new file mode 100644 index 0000000..3b9dd87 --- /dev/null +++ b/slideshows/iariw-2026/slides/Evo4ValidationSlide.tsx @@ -0,0 +1,108 @@ +import React from 'react'; +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; +import IconDefs from '@/components/IconDefs'; + +export default function Evo4ValidationSlide() { + return ( + + + Evolution step 4: validation loop +

8 agents with CI feedback

+
+ +
+ {/* Left: diagram */} +
+ + + + iterate until tests pass + + + + + + + + + + + + + + + + + + + document- + collector + + + parameter-architect + + + test-creator + + + rules-engineer + + + edge-case-gen + + + impl-validator + + + reference-validator + + + ci-fixer + + + output + +
+ + {/* Right: text */} +
+
+

+ We added edge-case-generator, reference-validator, and ci-fixer{' '}to automatically iterate on failures. The workflow now loops—when tests fail, ci-fixer analyzes the error and retries. +

+
+ + + + + + + + + + {[ + ['Automatic iteration cycles', 'Inconsistent patterns'], + ['Edge cases covered', 'Long repeated prompts'], + ['Citations validated', 'Same rules in every agent'], + ['Less manual work', null], + ].map((row, i) => ( + + + + + ))} + +
What workedWhat didn't
{row[0] && <>{row[0]}}{row[1] && <>{row[1]}}
+ +
+

+ Key insight: More agents provide more coverage, but also introduces more inconsistency. Shared knowledge is necessary at scale. +

+
+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/Evo5SkillsSlide.tsx b/slideshows/iariw-2026/slides/Evo5SkillsSlide.tsx new file mode 100644 index 0000000..65be997 --- /dev/null +++ b/slideshows/iariw-2026/slides/Evo5SkillsSlide.tsx @@ -0,0 +1,167 @@ +'use client'; + +import React, { useState } from 'react'; +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; +import IconDefs from '@/components/IconDefs'; + +const agents = { + 'doc-collector': { x: 80, y: 200, r: 35, icon: '#icon-books', label: 'document-collector', labelY: 250 }, + 'param-architect': { x: 200, y: 75, r: 35, icon: '#icon-gear', label: 'parameter-architect', labelY: 28 }, + 'test-creator': { x: 200, y: 200, r: 35, icon: '#icon-flask', label: 'test-creator', labelY: 250 }, + 'rules-engineer': { x: 200, y: 325, r: 35, icon: '#icon-lambda', label: 'rules-engineer', labelY: 375 }, + 'edge-case-gen': { x: 310, y: 260, r: 30, icon: '#icon-lightning', label: 'edge-case-gen', labelY: 305 }, + 'impl-validator': { x: 440, y: 75, r: 40, icon: '#icon-search', label: 'impl-validator', labelY: 28 }, + 'ref-validator': { x: 415, y: 345, r: 30, icon: '#icon-link', label: 'reference-validator', labelY: 390 }, + 'ci-fixer': { x: 530, y: 200, r: 40, icon: '#icon-wrench', label: 'ci-fixer', labelY: 255 }, +}; + +const skills = [ + { id: 'variable', label: 'variable', x: 100, agents: ['doc-collector', 'param-architect', 'rules-engineer'] }, + { id: 'testing', label: 'testing', x: 200, agents: ['test-creator', 'edge-case-gen', 'impl-validator'] }, + { id: 'code-style', label: 'code-style', x: 300, agents: ['param-architect', 'rules-engineer', 'ci-fixer'] }, + { id: 'parameter', label: 'parameter', x: 400, agents: ['param-architect', 'ref-validator'] }, + { id: 'vectorize', label: 'vectorize', x: 500, agents: ['impl-validator', 'ci-fixer'] }, +]; + +const skillY = 430; +const skillWidth = 80; +const skillHeight = 28; + +const agentConnections = [ + ['doc-collector', 'param-architect'], ['doc-collector', 'test-creator'], ['doc-collector', 'rules-engineer'], + ['test-creator', 'edge-case-gen'], ['rules-engineer', 'edge-case-gen'], + ['test-creator', 'impl-validator'], ['test-creator', 'ci-fixer'], + ['param-architect', 'impl-validator'], ['param-architect', 'ci-fixer'], + ['rules-engineer', 'ci-fixer'], ['param-architect', 'ref-validator'], ['rules-engineer', 'ref-validator'], + ['impl-validator', 'ci-fixer'], ['ref-validator', 'ci-fixer'], ['edge-case-gen', 'ci-fixer'], +]; + +export default function Evo5SkillsSlide() { + const [hoveredSkill, setHoveredSkill] = useState(null); + + return ( + + + Evolution step 5: modular skills +

15% error rate — reusable knowledge modules

+
+ +
+ {/* Left: interactive diagram */} +
+ + + + + {agentConnections.map(([from, to], i) => { + const a1 = agents[from as keyof typeof agents]; + const a2 = agents[to as keyof typeof agents]; + return ( + + ); + })} + + {skills.map((skill) => + skill.agents.map((agentId) => { + const agent = agents[agentId as keyof typeof agents]; + const isHighlighted = hoveredSkill === skill.id; + return ( + + ); + }) + )} + + {Object.entries(agents).map(([id, agent]) => { + const isConnected = hoveredSkill ? skills.find(s => s.id === hoveredSkill)?.agents.includes(id) : false; + const op = hoveredSkill === null ? 1 : isConnected ? 1 : 0.4; + return ( + + + + + + + {agent.label} + + + ); + })} + + Skills + {skills.map((skill) => { + const isHovered = hoveredSkill === skill.id; + return ( + setHoveredSkill(skill.id)} onMouseLeave={() => setHoveredSkill(null)} style={{ cursor: 'pointer' }}> + + + {skill.label} + + + ); + })} + ... + Hover over a skill to see which agents use it + +
+ + {/* Right: text */} +
+
+

+ We introduced skills—reusable knowledge modules that agents load on demand. Instead of repeating instructions in every prompt, we extracted shared knowledge into focused documents. +

+
+ +
+ {[ + { name: 'variable-patterns', desc: 'Proper class structure' }, + { name: 'testing-patterns', desc: 'Consistent test format' }, + { name: 'code-style', desc: 'Formatting rules' }, + { name: 'parameter-patterns', desc: 'YAML file structure' }, + { name: 'vectorization', desc: 'NumPy operations' }, + { name: 'review-patterns', desc: 'Review checklist' }, + ].map((skill, i) => ( +
+
{skill.name}
+
{skill.desc}
+
+ ))} +
+ +
+
+
70%
+
Step 1 errors
+
+
+
40%
+
Step 3 errors
+
+
+
15%
+
Step 5 errors
+
+
+ +
+

+ Key insight: Skills let us scale without redundancy. One skill, many agents—consistent patterns everywhere. +

+
+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/Evo6FullWorkflowSlide.tsx b/slideshows/iariw-2026/slides/Evo6FullWorkflowSlide.tsx new file mode 100644 index 0000000..8f42c7c --- /dev/null +++ b/slideshows/iariw-2026/slides/Evo6FullWorkflowSlide.tsx @@ -0,0 +1,172 @@ +'use client'; + +import React, { useState } from 'react'; +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; +import IconDefs from '@/components/IconDefs'; + +const agents: Record = { + 'issue-manager': { x: 55, y: 230, r: 35, icon: '#icon-clipboard', label: 'issue-manager', labelY: 280 }, + 'doc-collector': { x: 150, y: 230, r: 38, icon: '#icon-books', label: ['document-', 'collector'], labelY: 285 }, + 'param-architect': { x: 290, y: 80, r: 38, icon: '#icon-gear', label: 'param-architect', labelY: 30 }, + 'test-creator': { x: 290, y: 230, r: 38, icon: '#icon-flask', label: 'test-creator', labelY: 285 }, + 'rules-engineer': { x: 290, y: 380, r: 38, icon: '#icon-lambda', label: 'rules-engineer', labelY: 432 }, + 'edge-case-gen': { x: 410, y: 300, r: 32, icon: '#icon-lightning', label: 'edge-case-gen', labelY: 346 }, + 'impl-validator': { x: 570, y: 80, r: 44, icon: '#icon-search', label: 'impl-validator', labelY: 30 }, + 'ref-validator': { x: 545, y: 400, r: 32, icon: '#icon-link', label: 'ref-validator', labelY: 446 }, + 'ci-fixer': { x: 680, y: 230, r: 44, icon: '#icon-wrench', label: 'ci-fixer', labelY: 290 }, + 'pr-pusher': { x: 770, y: 230, r: 24, icon: '#icon-upload', label: 'pr-pusher', labelY: 268 }, + 'program-reviewer': { x: 840, y: 230, r: 24, icon: '#icon-book', label: ['program-', 'reviewer'], labelY: 268 }, + 'draft-pr': { x: 910, y: 230, r: 24, icon: '#icon-document', label: 'Draft PR', labelY: 268 }, +}; + +const skills = [ + { id: 'variable', label: 'variable', x: 160, agents: ['doc-collector', 'param-architect', 'rules-engineer'] }, + { id: 'testing', label: 'testing', x: 280, agents: ['test-creator', 'edge-case-gen', 'impl-validator'] }, + { id: 'code-style', label: 'code-style', x: 400, agents: ['param-architect', 'rules-engineer', 'ci-fixer'] }, + { id: 'parameter', label: 'parameter', x: 520, agents: ['param-architect', 'ref-validator'] }, + { id: 'vectorize', label: 'vectorize', x: 640, agents: ['impl-validator', 'ci-fixer'] }, + { id: 'review', label: 'review', x: 760, agents: ['program-reviewer', 'ci-fixer'] }, +]; + +const skillY = 490; +const skillWidth = 80; +const skillHeight = 28; + +const agentConnections = [ + ['issue-manager', 'doc-collector'], + ['doc-collector', 'param-architect'], ['doc-collector', 'test-creator'], ['doc-collector', 'rules-engineer'], + ['test-creator', 'edge-case-gen'], ['rules-engineer', 'edge-case-gen'], + ['test-creator', 'impl-validator'], ['test-creator', 'ci-fixer'], + ['param-architect', 'impl-validator'], ['param-architect', 'ci-fixer'], + ['rules-engineer', 'ci-fixer'], ['param-architect', 'ref-validator'], ['rules-engineer', 'ref-validator'], + ['impl-validator', 'ci-fixer'], ['ref-validator', 'ci-fixer'], ['edge-case-gen', 'ci-fixer'], + ['ci-fixer', 'pr-pusher'], ['pr-pusher', 'program-reviewer'], ['program-reviewer', 'draft-pr'], +]; + +export default function Evo6FullWorkflowSlide() { + const [hoveredSkill, setHoveredSkill] = useState(null); + + return ( + + + Evolution step 6: full workflow +

Complete pipeline — one command to a draft PR in ~90 minutes

+
+ +
+ {/* Left: diagram */} +
+ + + + + iterate until tests pass + + {agentConnections.map(([from, to], i) => { + const a1 = agents[from]; const a2 = agents[to]; + return ( + + ); + })} + + {skills.map((skill) => + skill.agents.map((agentId) => { + const agent = agents[agentId]; + const isHighlighted = hoveredSkill === skill.id; + return ( + + ); + }) + )} + + {Object.entries(agents).map(([id, agent]) => { + const isConnected = hoveredSkill ? skills.find(s => s.id === hoveredSkill)?.agents.includes(id) : false; + const op = hoveredSkill === null ? 1 : isConnected ? 1 : 0.4; + return ( + + + + + + {Array.isArray(agent.label) ? ( + agent.label.map((line, i) => ( + {line} + )) + ) : ( + {agent.label} + )} + + ); + })} + + Skills + {skills.map((skill) => { + const isHovered = hoveredSkill === skill.id; + return ( + setHoveredSkill(skill.id)} onMouseLeave={() => setHoveredSkill(null)} style={{ cursor: 'pointer' }}> + + {skill.label} + + ); + })} + Hover over a skill to see which agents use it + +
+ + {/* Right: text */} +
+
+

+ The complete pipeline: 12 agents and 6 skills{' '}working together. One command triggers the entire workflow—from issue creation to a draft PR ready for human review. +

+
+ +
+ What it produces: + 11 parameter files, 8 variable files, 65 test cases, 1 complete PR—all in ~90 minutes. +
+ +
+ Human role: + Review the final PR and make the merge decision. Agents handle all mechanical work. +
+ +
+
+
~90
+
minutes
+
+
+
12
+
agents
+
+
+
6
+
skills
+
+
+ +
+

+ The orchestrator never writes code—it invokes agents and checks quality gates. +

+
+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/FivePrimitivesSlide.tsx b/slideshows/iariw-2026/slides/FivePrimitivesSlide.tsx new file mode 100644 index 0000000..1e60d72 --- /dev/null +++ b/slideshows/iariw-2026/slides/FivePrimitivesSlide.tsx @@ -0,0 +1,75 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +const primitives = [ + { + n: '1', + need: 'Understand the policy rules', + project: 'Axiom', + loop: 'Loop: oracles — external engines re-run every encoding; zero unexplained mismatches.', + }, + { + n: '2', + need: 'Ready access to official statistics', + project: 'Chronicle', + loop: 'Loop: completeness against what publishers release, with lineage to every source.', + }, + { + n: '3', + need: 'The world at a micro level', + project: 'Microcosm', + loop: 'Loop: calibration error published per target; surveys held out for validation.', + }, + { + n: '4', + need: 'A model that computes reforms', + project: 'PolicyEngine', + loop: 'Loop: cross-engine agreement, and a community that uses the results.', + }, + { + n: '5', + need: 'Judgment to put it together', + project: 'Expertise, discretion, uncertainty', + loop: 'Loop: forecasts that resolve against reality — the most important one.', + }, +]; + +export default function FivePrimitivesSlide() { + return ( + + + What do we arm the AI with? +

+ Five primitives — each with a feedback loop for whether it is + getting it right +

+
+ +
+ {primitives.map((p) => ( +
+
+ {p.n} +
+

+ {p.need} +

+

{p.project}

+

+ {p.loop} +

+
+ ))} +
+ +
+

+ The same primitives norm AI agents and human researchers alike + — toward faster, more accurate, more epistemically rigorous + estimates of what policy will do. +

+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/ForecastUncertaintySlide.tsx b/slideshows/iariw-2026/slides/ForecastUncertaintySlide.tsx new file mode 100644 index 0000000..819af45 --- /dev/null +++ b/slideshows/iariw-2026/slides/ForecastUncertaintySlide.tsx @@ -0,0 +1,47 @@ +import Image from '@/components/core/BasePathImage'; +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +export default function ForecastUncertaintySlide() { + return ( + +
+ + + Forecasters agree with each other — and the AI literature + does not + + + +
+ Two-panel chart: SPF 10-year US real GDP growth forecasts 1992-2026 narrowing to a 0.2pp interquartile range, beside published AI-era growth-boost estimates spanning +0.07pp to +30pp per year on a log scale +
+ +
+

+ The professional 10-year consensus has never been tighter (IQR + 0.2pp, half its 1990s level), while published AI-era growth + estimates span +0.07pp to +30pp per year. +

+

+ Philadelphia Fed SPF; AI Frontiers compilation +

+
+ +

+ When credible forecasts of the era span orders of magnitude, evidence + infrastructure's job shifts from defending one number to letting + a ministry recompute the present. +

+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/HistorySlide.tsx b/slideshows/iariw-2026/slides/HistorySlide.tsx new file mode 100644 index 0000000..8fd4fb3 --- /dev/null +++ b/slideshows/iariw-2026/slides/HistorySlide.tsx @@ -0,0 +1,74 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +const layers = [ + { + title: 'Encoded the rules', + detail: + 'US and UK tax and benefit law — by hand at first, increasingly with AI.', + }, + { + title: 'Built the microdata', + detail: + 'Imputed across surveys and administrative sources, calibrated to official statistics.', + }, + { + title: 'Ran the simulations', + detail: 'Households to full populations, baseline against reform.', + }, + { + title: 'Shipped the web app', + detail: + 'Where people explore it — still there, no longer the center of gravity.', + }, +]; + +export default function HistorySlide() { + return ( + + + Six years under one roof + + +
+
+

+ This paradigm comes out of building PolicyEngine since 2021 — + the first four primitives, together, under one brand: +

+
+ {layers.map((l) => ( +
+

+ {l.title} +

+

{l.detail}

+
+ ))} +
+
+ +
+

+ The realization +

+

+ Each layer deserves to stand on its own — with its own name, + its own users, and its own feedback loop. +

+

+ So the rules layer became the Axiom Foundation, the fact store + became Chronicle, the population layer became Microcosm — + and PolicyEngine is the model that composes them. +

+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/HowWeGetThereSlide.tsx b/slideshows/iariw-2026/slides/HowWeGetThereSlide.tsx new file mode 100644 index 0000000..33ddf23 --- /dev/null +++ b/slideshows/iariw-2026/slides/HowWeGetThereSlide.tsx @@ -0,0 +1,62 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +export default function HowWeGetThereSlide() { + return ( + + + How do we get there? + + +
+

+ AI can't do it on its own today.{' '} + + But we can do two things that compound. + +

+ +
+
+
+ Track 1 +
+

+ Use AI to build the apparatus for projections +

+

+ AI helps us assemble what we project with — the encoded + rules, the calibrated data, the behavioral theory, the analysis + tooling. The modeling craft, accelerated. Human review at every + step. +

+
+ +
+
+ Track 2 +
+

+ Equip AI to do the projections at scale +

+

+ With the apparatus in place, AI agents can run projections with + comparable fidelity — calling the right pieces, integrating + baselines, propagating uncertainty, surfacing calibrated answers + by the thousand. +

+
+
+ +

+ The rest of this talk is the apparatus — rules, data, and the + verification that has to scale with both. +

+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/ImputationSlide.tsx b/slideshows/iariw-2026/slides/ImputationSlide.tsx new file mode 100644 index 0000000..df89b65 --- /dev/null +++ b/slideshows/iariw-2026/slides/ImputationSlide.tsx @@ -0,0 +1,70 @@ +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +const sources = [ + { code: 'CPS', name: 'Current Population Survey', role: 'Spine — demographics, income, labor force.' }, + { code: 'ACS', name: 'American Community Survey', role: 'Geography, housing, sub-state detail.' }, + { code: 'SCF', name: 'Survey of Consumer Finances', role: 'Wealth, capital income, debt.' }, + { code: 'SIPP', name: 'Survey of Income and Program Participation', role: 'Program take-up, dynamics, transitions.' }, + { code: 'PUF', name: 'IRS Public Use File', role: 'Tax-unit income detail, itemized deductions.' }, +]; + +export default function ImputationSlide() { + return ( + + + Imputation at scale: many sources, one microdata + + +
+
+

+ Sources we fuse in the US model +

+ {sources.map((s) => ( +
+
+ {s.code} +
+
+

{s.name}

+

{s.role}

+
+
+ ))} +
+ +
+
+
Technique
+

+ Quantile regression forests.{' '} + For each variable missing from the spine, learn its full + conditional distribution given many potentially non-linear + predictors — then sample from it. +

+

+ The whole distribution survives, including the tails that matter + for distributional analysis. +

+
+ +
+
Where AI helps
+

+ The hard part is knowing what each column actually means + — the same name across two surveys often hides different + definitions. AI reads the documentation, surfaces mismatches, + and proposes the apples-to-apples mapping. Get this wrong and + the imputation silently drifts. +

+
+
+
+
+ ); +} diff --git a/slideshows/iariw-2026/slides/LiveAppSlide.tsx b/slideshows/iariw-2026/slides/LiveAppSlide.tsx new file mode 100644 index 0000000..0ff0050 --- /dev/null +++ b/slideshows/iariw-2026/slides/LiveAppSlide.tsx @@ -0,0 +1,107 @@ +'use client'; + +import React, { ReactNode, useState } from 'react'; +import Slide from '@/components/core/Slide'; +import SlideHeader from '@/components/layout/SlideHeader'; +import SlideTitle from '@/components/layout/SlideTitle'; + +interface LiveAppSlideProps { + title: string; + url: string; + displayUrl?: string; + /** Side-column content (cards, notes). */ + children?: ReactNode; + /** Grid split, defaults to narrow side / wide iframe. */ + sideWidth?: string; +} + +/** + * Live embedded app with an Expand button — the cbo-2026 AxiomDemoSlide + * pattern. The screenshot fallback slides that follow in the deck cover the + * no-network case. + */ +export default function LiveAppSlide({ + title, + url, + displayUrl, + children, + sideWidth = '0.62fr', +}: LiveAppSlideProps) { + const [expanded, setExpanded] = useState(false); + + return ( + + +
+ {title} + {displayUrl && ( + + {displayUrl} + + )} +
+
+ +
+
{children}
+ +
e.stopPropagation()} + > +