/* === Seed data for FY26 Retirement Savings tracker ===
   Wired to the spec: ODA tree (Appx B), 11 FY26 milestones (Appx C),
   plus realistic work items, jurisdictions, orgs, contracts. */

const FY = "FY 2026";
const ASOF = "May 21, 2026";

/* ============== ODA TREE — Appendix B ============== */
const ODA = [
  { id: "OBJ-1", title: "National evidence base", short: "Evidence base", deliverables: [
    { id: "D1.1", title: "State-specific reports", target: "≥ 4 reports" },
    { id: "D1.2", title: "Awareness events", target: "≥ 4 events" },
  ]},
  { id: "OBJ-2", title: "Nontraditional worker inclusion", short: "Nontraditional workers", deliverables: [
    { id: "D2.1", title: "Nontraditional-worker white paper", conditional: true },
    { id: "D2.2", title: "State-official convenings" },
  ]},
  { id: "OBJ-3", title: "Equity — people of color", short: "Equity", deliverables: [
    { id: "D3.1", title: "National survey products", target: "≥ 5 products" },
    { id: "D3.2", title: "Saver's Match research product", target: "≥ 1 product" },
  ]},
  { id: "OBJ-4", title: "Adoption in 8 additional states", short: "New adoption", deliverables: [
    { id: "D4.1", title: "New-state adoption", target: "≥ 3 states, bipartisan" },
    { id: "D4.2", title: "TA to existing programs", target: "≥ 2 states" },
    { id: "D4.3", title: "Participation-shortfall research", target: "≥ 1 product" },
  ]},
  { id: "OBJ-5", title: "8 programs open to nontraditional workers", short: "Program expansion", deliverables: [
    { id: "D5.1", title: "Public commitments — nontraditional", conditional: true, target: "≥ 8 programs" },
  ]},
  { id: "OBJ-6", title: "Sustainable handoff on Pew's exit", short: "Handoff", deliverables: [
    { id: "D6.1", title: "Committed successor organization" },
  ]},
];

/* ============== FY26 MILESTONES — Appendix C ============== */
/* Each links to one+ ODA nodes; ⊕ = numeric, ◇ = qualitative */
const MILESTONES = [
  {
    id: "M-01", kind: "numeric", glyph: "⊕",
    title: "≥6 states introduce auto-enrollment legislation; assist ≥3 enacted",
    target: 6, current: 7, secondaryTarget: 3, secondaryCurrent: 2,
    unit: "states introduced", secondaryLabel: "assist enacted", rag: "green",
    oda: ["D4.1", "D4.2"],
    rationale: null,
    workItems: 14,
  },
  {
    id: "M-02", kind: "numeric", glyph: "⊕",
    title: "≥4 convenings/webinars on auto-IRA and/or Saver's Match",
    target: 4, current: 3, unit: "convenings", rag: "yellow",
    oda: ["D1.2", "D3.2"],
    rationale: {
      label: "rationale (yellow)",
      text: "Q3 convening with NAST shifted to October at request of the state treasurers' working group; Saver's Match webinar with Treasury staff confirmed for July 8. Still expect to land on target by end of FY but no longer have float.",
    },
    workItems: 8,
  },
  {
    id: "M-03", kind: "numeric", glyph: "⊕",
    title: "≥4 web pieces from 2024 Wealth survey; ≥2 convenings on results",
    target: 4, current: 4, secondaryTarget: 2, secondaryCurrent: 1,
    unit: "web pieces", secondaryLabel: "convenings on results", rag: "green",
    oda: ["D3.1"],
    rationale: null, workItems: 9,
  },
  {
    id: "M-04", kind: "numeric", glyph: "⊕",
    title: "Dissemination: ≥10 speaking invitations + ≥4 press/policymaker citations",
    target: 10, current: 13, secondaryTarget: 4, secondaryCurrent: 9,
    unit: "speaking invitations", secondaryLabel: "press citations", rag: "green",
    oda: ["OBJ-1", "OBJ-3"],
    rationale: null, workItems: 22,
  },
  {
    id: "M-05", kind: "qualitative", glyph: "◇",
    title: "Continue exiting the field; coordinate with successor groups",
    rag: "green",
    oda: ["OBJ-6"],
    rationale: {
      label: "narrative",
      text: "On track. Lead-candidate org (Aspen FSP) signed an MOU 4/29. Three additional partner orgs in active conversation. Training pack v1 in QC. Will re-rate at FY end after fall transition workshops.",
    },
    workItems: 6,
  },
  {
    id: "M-06", kind: "numeric", glyph: "⊕",
    title: "≥3 conservative-led 'red' states introduce program legislation",
    target: 3, current: 3, unit: "red states", rag: "green",
    oda: ["D4.1"],
    note: "Sharper than the ODA node — tracked distinctly.",
    rationale: null, workItems: 6,
  },
  {
    id: "M-07", kind: "numeric", glyph: "⊕",
    title: "≥10 meetings with employer groups/providers/orgs/staff on national-standard principles",
    target: 10, current: 6, unit: "meetings", rag: "yellow",
    oda: ["OBJ-1"],
    rationale: {
      label: "rationale (yellow)",
      text: "Behind plan: Bipartisan Policy Center round-table slipped from April to June. Have 6 done; 5 more scheduled before October. Achievable but no slack remaining if any cancellations.",
    },
    workItems: 6,
  },
  {
    id: "M-08", kind: "qualitative", glyph: "◇",
    title: "Research taxpayer cost of administering individual asset limits",
    rag: "red",
    oda: ["OBJ-1"],
    note: "New this cycle — no exact ODA node.",
    rationale: {
      label: "rationale (red)",
      text: "Cannot be met as originally scoped. The state administrator survey instrument failed peer review (March) — methodology rebuild required, no fielding window remaining in FY26. Recommending milestone be reformulated for FY27 as a scoping paper rather than a costed estimate. SLT decision needed by 6/15.",
    },
    workItems: 3,
  },
  {
    id: "M-09", kind: "qualitative", glyph: "◇",
    title: "Collaborate with 5 Saver's Match working groups; feedback to Treasury/IRS",
    rag: "green",
    oda: ["D3.2"],
    rationale: {
      label: "narrative",
      text: "All five working groups engaged. Formal written feedback submitted on Notice 2024-22 (refundable credit mechanics). Two additional comment windows expected this fall.",
    },
    workItems: 11,
  },
  {
    id: "M-10", kind: "numeric", glyph: "⊕",
    title: "TA to ≥3 existing programs on participation + sustainability",
    target: 3, current: 2, unit: "programs", rag: "yellow",
    oda: ["D4.2", "D4.3"],
    rationale: {
      label: "rationale (yellow)",
      text: "CalSavers and Illinois Secure Choice TAs active and on schedule. Third (likely OregonSaves) waiting on intergovernmental agreement signature — expected mid-June; if it slips past August 1, milestone is at risk.",
    },
    workItems: 7,
  },
  {
    id: "M-11", kind: "qualitative", glyph: "◇",
    title: "Assess regulatory paths for a KYC exemption for state programs",
    rag: "yellow",
    oda: ["OBJ-2"],
    note: "New this cycle.",
    rationale: {
      label: "rationale (yellow)",
      text: "Initial scoping memo drafted, outside counsel engaged for FinCEN-pathway review. Conversation with FinCEN deputy delayed to July. Deliverable shape is firm; timing has slipped one quarter.",
    },
    workItems: 4,
  },
];

/* ============== JURISDICTIONS ==============
   Two-dim status. Hand-rated, plausible against the live US auto-IRA landscape
   and the bills observed in Appx A. Tile-grid coords + program/legislative axes. */

// Economist-style tile layout: 11 cols × 8 rows, 0-indexed
const TILE_LAYOUT = {
  // Row 0
  AK: { col: 0, row: 0 }, ME: { col: 10, row: 0 },
  // Row 1
  WI: { col: 5, row: 1 }, VT: { col: 9, row: 1 }, NH: { col: 10, row: 1 },
  // Row 2
  WA: { col: 0, row: 2 }, ID: { col: 1, row: 2 }, MT: { col: 2, row: 2 }, ND: { col: 3, row: 2 }, MN: { col: 4, row: 2 },
  IL: { col: 5, row: 2 }, MI: { col: 6, row: 2 }, NY: { col: 8, row: 2 }, MA: { col: 9, row: 2 },
  // Row 3
  OR: { col: 0, row: 3 }, NV: { col: 1, row: 3 }, WY: { col: 2, row: 3 }, SD: { col: 3, row: 3 }, IA: { col: 4, row: 3 },
  IN: { col: 5, row: 3 }, OH: { col: 6, row: 3 }, PA: { col: 7, row: 3 }, NJ: { col: 8, row: 3 }, CT: { col: 9, row: 3 }, RI: { col: 10, row: 3 },
  // Row 4
  CA: { col: 0, row: 4 }, UT: { col: 1, row: 4 }, CO: { col: 2, row: 4 }, NE: { col: 3, row: 4 }, MO: { col: 4, row: 4 },
  KY: { col: 5, row: 4 }, WV: { col: 6, row: 4 }, VA: { col: 7, row: 4 }, MD: { col: 8, row: 4 }, DE: { col: 9, row: 4 },
  // Row 5
  AZ: { col: 1, row: 5 }, NM: { col: 2, row: 5 }, KS: { col: 3, row: 5 }, AR: { col: 4, row: 5 },
  TN: { col: 5, row: 5 }, NC: { col: 6, row: 5 }, SC: { col: 7, row: 5 }, DC: { col: 8, row: 5 },
  // Row 6
  OK: { col: 3, row: 6 }, LA: { col: 4, row: 6 }, MS: { col: 5, row: 6 }, AL: { col: 6, row: 6 }, GA: { col: 7, row: 6 },
  // Row 7
  HI: { col: 0, row: 7 }, TX: { col: 3, row: 7 }, FL: { col: 8, row: 7 },
};

const STATE_NAMES = {
  AL:"Alabama",AK:"Alaska",AZ:"Arizona",AR:"Arkansas",CA:"California",CO:"Colorado",CT:"Connecticut",
  DE:"Delaware",DC:"District of Columbia",FL:"Florida",GA:"Georgia",HI:"Hawaii",ID:"Idaho",IL:"Illinois",
  IN:"Indiana",IA:"Iowa",KS:"Kansas",KY:"Kentucky",LA:"Louisiana",ME:"Maine",MD:"Maryland",
  MA:"Massachusetts",MI:"Michigan",MN:"Minnesota",MS:"Mississippi",MO:"Missouri",MT:"Montana",
  NE:"Nebraska",NV:"Nevada",NH:"New Hampshire",NJ:"New Jersey",NM:"New Mexico",NY:"New York",
  NC:"North Carolina",ND:"North Dakota",OH:"Ohio",OK:"Oklahoma",OR:"Oregon",PA:"Pennsylvania",
  RI:"Rhode Island",SC:"South Carolina",SD:"South Dakota",TN:"Tennessee",TX:"Texas",UT:"Utah",
  VT:"Vermont",VA:"Virginia",WA:"Washington",WV:"West Virginia",WI:"Wisconsin",WY:"Wyoming",
};

// Program maturity: 'none' | 'enacted' (implementation) | 'live'
// Legislative activity this session: 'none' | 'recent' | 'active' | 'enacted-session'
// trifecta: 'R' | 'D' | null (state government party control: gov+house+senate)
// govParty / houseParty / senateParty: per-branch (R/D/Split)
// (Source: current US auto-IRA landscape, hand-rated for the mock)
const JURISDICTIONS = {
  // === Live programs ===
  CA: { program: "live", legActivity: "active",          trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "CalSavers" },
  IL: { program: "live", legActivity: "none",            trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "Secure Choice" },
  OR: { program: "live", legActivity: "none",            trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "OregonSaves" },
  CT: { program: "live", legActivity: "none",            trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "MyCTSavings" },
  MD: { program: "live", legActivity: "none",            trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "MarylandSaves" },
  CO: { program: "live", legActivity: "active",          trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "Colorado SecureSavings" },
  VA: { program: "live", legActivity: "none",            trifecta: null, govParty: "R", houseParty: "D", senateParty: "D", label: "RetirePath VA" },
  MA: { program: "live", legActivity: "active",          trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "Mass CORE" },
  NJ: { program: "live", legActivity: "enacted-session", trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "RetireReady NJ" },
  NM: { program: "live", legActivity: "none",            trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "NM Work and $ave" },
  DE: { program: "live", legActivity: "none",            trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "DE EARNS" },
  ME: { program: "live", legActivity: "none",            trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "MERIT" },
  HI: { program: "live", legActivity: "recent",          trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "Hawaii Retirement Savings" },
  NV: { program: "live", legActivity: "none",            trifecta: null, govParty: "R", houseParty: "D", senateParty: "D", label: "Nevada Employee Savings Trust" },
  WA: { program: "live", legActivity: "none",            trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "Washington Saves" },

  // === Enacted / implementing ===
  MN: { program: "enacted", legActivity: "active",       trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "Secure Choice (impl.)" },
  RI: { program: "enacted", legActivity: "active",       trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "RI Secure Choice (impl.)" },
  NY: { program: "enacted", legActivity: "none",         trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "Secure Choice (impl.)" },
  VT: { program: "enacted", legActivity: "none",         trifecta: null, govParty: "R", houseParty: "D", senateParty: "D", label: "VT Saves" },
  PA: { program: "enacted", legActivity: "active",       trifecta: null, govParty: "D", houseParty: "D", senateParty: "R", label: "Keystone Saves" },
  MI: { program: "enacted", legActivity: "active",       trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "MI Retirement Savings (impl.)" },

  // === Active legislation this session (no program) ===
  AK: { program: "none", legActivity: "active",          trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: "AK Work & Save (S.B. 21)" },
  MS: { program: "none", legActivity: "enacted-session", trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: "MS Workplace Savings (S.B. 3099)" },
  UT: { program: "none", legActivity: "enacted-session", trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: "UT H.B. 250 (enacted)" },
  WI: { program: "none", legActivity: "active",          trifecta: null, govParty: "D", houseParty: "R", senateParty: "R", label: "WI A.B. 47 / S.B. 34" },
  KY: { program: "none", legActivity: "active",          trifecta: null, govParty: "D", houseParty: "R", senateParty: "R", label: "KY S.B. 21" },
  IA: { program: "none", legActivity: "active",          trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: "IA H.S.B. 12" },
  NC: { program: "none", legActivity: "active",          trifecta: null, govParty: "D", houseParty: "R", senateParty: "R", label: "NC S.B. 313" },
  AZ: { program: "none", legActivity: "active",          trifecta: null, govParty: "D", houseParty: "R", senateParty: "R", label: "AZ S.B. 1306" },
  WV: { program: "none", legActivity: "active",          trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: "WV H.B. 2400" },
  TN: { program: "none", legActivity: "active",          trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: "TN H.B. 1138" },
  IN: { program: "none", legActivity: "recent",          trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: "IN H.B. 1208" },
  KS: { program: "none", legActivity: "recent",          trifecta: null, govParty: "D", houseParty: "R", senateParty: "R", label: "KS S.B. 412" },
  FL: { program: "none", legActivity: "recent",          trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: "FL H.B. 633" },
  AL: { program: "none", legActivity: "recent",          trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: "AL H.B. 211" },

  // === DC + remaining 50 (none/none — included for full coverage) ===
  DC: { program: "enacted", legActivity: "active",       trifecta: "D", govParty: "D", houseParty: "D", senateParty: "D", label: "DC Saves (impl.)" },
  AR: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  GA: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  ID: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  LA: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  MO: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  MT: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  NE: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  ND: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  OH: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  OK: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  SC: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  SD: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  TX: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  WY: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
  NH: { program: "none", legActivity: "none",            trifecta: "R", govParty: "R", houseParty: "R", senateParty: "R", label: null },
};

// Inferred from above
const STATES_LIVE = Object.entries(JURISDICTIONS).filter(([k,v]) => v.program === "live" && k !== "DC").map(([k]) => k);
const STATES_ENACTED = Object.entries(JURISDICTIONS).filter(([k,v]) => v.program === "enacted" && k !== "DC").map(([k]) => k);
const STATES_ACTIVE_LEG = Object.entries(JURISDICTIONS).filter(([_,v]) => v.legActivity === "active" || v.legActivity === "enacted-session").map(([k]) => k);
const HAS_DC_LIVE = JURISDICTIONS.DC?.program === "live";
const HAS_DC_ENACTED = JURISDICTIONS.DC?.program === "enacted";

/* ============== BILLS (subset from Appx A, manually curated) ============== */
const BILLS = [
  { id: "AK-SB21",    state: "AK", bill: "S.B. 21",   title: "Alaska Work and Save Program", status: "Sent to Executive", statusDate: "May 14, 2026", intro: "Jan 22, 2025", party: "D", sponsors: "Kawasaki (D), Yundt (R)" },
  { id: "CA-AB2650",  state: "CA", bill: "A.B. 2650", title: "CalSavers: SAVE for All Workers Act — adds household employers", status: "Out of Committee", statusDate: "Apr 30, 2026", intro: "Feb 20, 2026", party: "D", sponsors: "Wicks (D)" },
  { id: "UT-HB250",   state: "UT", bill: "H.B. 250",  title: "Utah Retirement Savings Plan",  status: "Effective", statusDate: "Mar 24, 2026", intro: "Jan 14, 2026", party: "R", sponsors: "Hawkes (R)" },
  { id: "MS-SB3099",  state: "MS", bill: "S.B. 3099", title: "Mississippi Workplace Savings Act", status: "Enacted", statusDate: "Apr 8, 2026", intro: "Feb 17, 2026", party: "R", sponsors: "Hopson (R), McLendon (R)" },
  { id: "MS-HB4073",  state: "MS", bill: "H.B. 4073", title: "MS Workplace Savings — companion", status: "Effective", statusDate: "Apr 8, 2026", intro: "Feb 24, 2026", party: "R", sponsors: "Lamar (R)" },
  { id: "RI-HB7475",  state: "RI", bill: "H.B. 7475", title: "RI Secure Choice — expansion to nontraditional workers", status: "Passed Original Chamber", statusDate: "Apr 22, 2026", intro: "Feb 4, 2026", party: "D", sponsors: "Solomon (D)" },
  { id: "WI-AB47",    state: "WI", bill: "A.B. 47",   title: "Wisconsin Retirement Security Act", status: "Out of Committee", statusDate: "Apr 14, 2026", intro: "Feb 12, 2026", party: "D", sponsors: "Subeck (D)" },
  { id: "WI-SB34",    state: "WI", bill: "S.B. 34",   title: "Wisconsin Retirement Security Act — Senate companion", status: "Introduced or Prefiled", statusDate: "Feb 18, 2026", intro: "Feb 18, 2026", party: "D", sponsors: "Smith (D)" },
  { id: "KY-SB21",    state: "KY", bill: "S.B. 21",   title: "Kentucky Employee Retirement Savings Program", status: "Introduced or Prefiled", statusDate: "Jan 8, 2026", intro: "Jan 8, 2026", party: "R", sponsors: "Tichenor (R)" },
  { id: "MI-HB4665",  state: "MI", bill: "H.B. 4665", title: "MI Retirement Savings Program", status: "Out of Committee", statusDate: "May 6, 2026", intro: "Sep 28, 2025", party: "D", sponsors: "Hood III (D)" },
  { id: "IA-HSB12",   state: "IA", bill: "H.S.B. 12", title: "Iowa Work and $ave", status: "Introduced or Prefiled", statusDate: "Jan 22, 2026", intro: "Jan 22, 2026", party: "R", sponsors: "Wills (R)" },
  { id: "AZ-SB1306",  state: "AZ", bill: "S.B. 1306", title: "Arizona Work and Save", status: "Introduced or Prefiled", statusDate: "Feb 4, 2026", intro: "Feb 4, 2026", party: "R", sponsors: "Marsh (R)" },
  { id: "NC-SB313",   state: "NC", bill: "S.B. 313",  title: "NC Workplace Savings", status: "Introduced or Prefiled", statusDate: "Mar 12, 2026", intro: "Mar 12, 2026", party: "R", sponsors: "Daniel (R), Lazzara (R)" },
  { id: "TN-HB1138",  state: "TN", bill: "H.B. 1138", title: "TN Retirement Savings", status: "Out of Committee", statusDate: "Apr 18, 2026", intro: "Feb 6, 2026", party: "R", sponsors: "Hicks (R)" },
  { id: "WV-HB2400",  state: "WV", bill: "H.B. 2400", title: "West Virginia Work and Save", status: "Introduced or Prefiled", statusDate: "Feb 20, 2026", intro: "Feb 20, 2026", party: "R", sponsors: "Householder (R)" },
  { id: "NJ-A4543",   state: "NJ", bill: "A. 4543",   title: "RetireReady NJ — small-employer threshold", status: "Enacted", statusDate: "Mar 19, 2026", intro: "Sep 30, 2025", party: "D", sponsors: "Speight (D)" },
  { id: "PA-HB577",   state: "PA", bill: "H.B. 577",  title: "Keystone Saves implementation appropriation", status: "Passed Original Chamber", statusDate: "Apr 28, 2026", intro: "Mar 4, 2026", party: "D", sponsors: "Howard (D)" },
  { id: "US-HR2401",  state: "US", bill: "H.R. 2401", title: "Federal Auto-IRA Act (informational Hill engagement only)", status: "Introduced or Prefiled", statusDate: "Mar 25, 2025", intro: "Mar 25, 2025", party: "D", sponsors: "Neal (D)" },
];

/* ============== WORK ITEMS (typed, linked to milestones + ODA) ============== */
const WORK_ITEMS = [
  // products
  { id: "W-001", type: "product", title: "Saver's Match: distributional impact across racial/ethnic groups", milestones: ["M-09","M-03"], oda: ["D3.2"], owner: "AC", state: null,
    stages: ["development","drafting","peer review","QC","content edit","approvals","copyedit","review synthesis"],
    stageStatus: ["done","done","done","done","current","todo","todo","todo"],
    stuckSince: null, due: "Jul 12, 2026", firmness: "quoted", terminal: "published", status: "drafting" },
  { id: "W-002", type: "product", title: "2024 Wealth Survey — Brief #4: opt-out predictors by income decile", milestones: ["M-03"], oda: ["D3.1"], owner: "MR", state: null,
    stages: ["development","drafting","peer review","QC","content edit","approvals","copyedit"],
    stageStatus: ["done","done","done","done","done","done","current"],
    stuckSince: null, due: "Jun 4, 2026", firmness: "locked", terminal: "published", status: "in copyedit" },
  { id: "W-003", type: "product", title: "Fiscal-impact model — Tennessee state report", milestones: ["M-04"], oda: ["D1.1","D4.1"], owner: "JL", state: "TN",
    stages: ["development","drafting","peer review","QC","content edit","approvals","copyedit"],
    stageStatus: ["done","done","done","stuck","todo","todo","todo"],
    stuckSince: "Apr 4, 2026", due: "Jul 1, 2026", firmness: "estimated", terminal: "published", status: "stuck in QC" },
  { id: "W-004", type: "product", title: "KYC exemption scoping memo (counsel: K&L Gates)", milestones: ["M-11"], oda: ["OBJ-2"], owner: "EH", state: null,
    stages: ["development","drafting","peer review"], stageStatus: ["done","current","todo"],
    stuckSince: null, due: "Aug 15, 2026", firmness: "estimated", terminal: "published", status: "drafting" },
  { id: "W-005", type: "product", title: "Asset-limits administrative-cost paper (rescope pending)", milestones: ["M-08"], oda: ["OBJ-1"], owner: "MR", state: null,
    stages: ["development","drafting"], stageStatus: ["stuck","todo"],
    stuckSince: "Mar 11, 2026", due: "TBD", firmness: "estimated", terminal: "published", status: "blocked — methodology" },

  // events / convenings
  { id: "W-010", type: "convening", title: "NCSL Spring Forum — auto-IRA briefing", milestones: ["M-02","M-04"], oda: ["D1.2"], owner: "SK", state: null,
    stages: ["development","approvals","preparation","post-event"], stageStatus: ["done","done","done","done"],
    stuckSince: null, due: "Apr 11, 2026", firmness: "locked", terminal: "held", status: "held" },
  { id: "W-011", type: "convening", title: "Saver's Match working-group convening (with Treasury)", milestones: ["M-02","M-09"], oda: ["D3.2"], owner: "SK", state: null,
    stages: ["development","approvals","preparation"], stageStatus: ["done","done","current"],
    stuckSince: null, due: "Jul 8, 2026", firmness: "locked", terminal: "held", status: "preparing" },
  { id: "W-012", type: "convening", title: "State treasurers' working group (NAST)", milestones: ["M-02"], oda: ["D1.2"], owner: "SK", state: null,
    stages: ["development","approvals"], stageStatus: ["done","current"],
    stuckSince: null, due: "Oct 14, 2026", firmness: "quoted", terminal: "held", status: "rescheduled from Aug" },
  { id: "W-013", type: "event", title: "Mississippi business-owner roundtable (Jackson)", milestones: ["M-04","M-06"], oda: ["D4.1"], owner: "JL", state: "MS",
    stages: ["development","approvals","preparation","post-event"], stageStatus: ["done","done","done","current"],
    stuckSince: null, due: "Apr 22, 2026", firmness: "locked", terminal: "held", status: "post-event report due" },

  // surveys
  { id: "W-020", type: "survey", title: "Black households retirement readiness — wave 3 (re-field)", milestones: ["M-03"], oda: ["D3.1"], owner: "AC", state: null,
    stages: ["development","focus groups","pretesting","fielding","weighting"],
    stageStatus: ["done","done","done","current","todo"],
    stuckSince: null, due: "Aug 30, 2026", firmness: "quoted", terminal: "fielded/weighted", status: "fielding" },

  // TA engagements
  { id: "W-030", type: "TA engagement", title: "CalSavers — opt-out reduction TA", milestones: ["M-10"], oda: ["D4.2"], owner: "JL", state: "CA",
    stages: [], due: "Sep 30, 2026", firmness: "locked", terminal: "complete", status: "in flight" },
  { id: "W-031", type: "TA engagement", title: "Illinois Secure Choice — feasibility review for self-employed inclusion", milestones: ["M-10"], oda: ["D4.2"], owner: "EH", state: "IL",
    stages: [], due: "Nov 14, 2026", firmness: "quoted", terminal: "complete", status: "kicked off" },
  { id: "W-032", type: "TA engagement", title: "OregonSaves — TA agreement (intergovernmental)", milestones: ["M-10"], oda: ["D4.2"], owner: "EH", state: "OR",
    stages: [], due: "Jun 15, 2026", firmness: "estimated", terminal: "complete", status: "awaiting signature" },

  // transition / handoff
  { id: "W-040", type: "transition/handoff", title: "Aspen FSP — successor org commitment & training plan", milestones: ["M-05"], oda: ["D6.1"], owner: "DK", state: null,
    stages: [], due: "Mar 31, 2027", firmness: "estimated", terminal: "committed", status: "MOU signed Apr 29" },
  // Add completed work items so the "Show completed" toggle has something to surface
  { id: "W-101", type: "product", title: "Wealth Survey Brief #1 — savings rate by quartile", milestones: ["M-03"], oda: ["D3.1"], owner: "MR", state: null,
    stages: ["development","drafting","peer review","QC","content edit","approvals","copyedit","review synthesis"],
    stageStatus: ["done","done","done","done","done","done","done","done"],
    stuckSince: null, due: "Sep 18, 2025", firmness: "locked", terminal: "published", status: "published", completedDate: "Sep 18, 2025" },
  { id: "W-102", type: "product", title: "Wealth Survey Brief #2 — employer matching effects", milestones: ["M-03"], oda: ["D3.1"], owner: "AC", state: null,
    stages: ["development","drafting","peer review","QC","content edit","approvals","copyedit","review synthesis"],
    stageStatus: ["done","done","done","done","done","done","done","done"],
    stuckSince: null, due: "Dec 4, 2025", firmness: "locked", terminal: "published", status: "published", completedDate: "Dec 4, 2025" },
  { id: "W-103", type: "product", title: "Wealth Survey Brief #3 — withdrawal patterns by age", milestones: ["M-03"], oda: ["D3.1"], owner: "MR", state: null,
    stages: ["development","drafting","peer review","QC","content edit","approvals","copyedit","review synthesis"],
    stageStatus: ["done","done","done","done","done","done","done","done"],
    stuckSince: null, due: "Feb 26, 2026", firmness: "locked", terminal: "published", status: "published", completedDate: "Feb 26, 2026" },
  { id: "W-110", type: "convening", title: "NCSL Winter Forum — auto-IRA panel", milestones: ["M-02","M-04"], oda: ["D1.2"], owner: "SK", state: null,
    stages: ["development","approvals","preparation","post-event"], stageStatus: ["done","done","done","done"],
    stuckSince: null, due: "Dec 9, 2025", firmness: "locked", terminal: "held", status: "held", completedDate: "Dec 9, 2025" },
  { id: "W-111", type: "convening", title: "Saver's Match working-group convening #1", milestones: ["M-02","M-09"], oda: ["D3.2"], owner: "SK", state: null,
    stages: ["development","approvals","preparation","post-event"], stageStatus: ["done","done","done","done"],
    stuckSince: null, due: "Jan 22, 2026", firmness: "locked", terminal: "held", status: "held", completedDate: "Jan 22, 2026" },
  { id: "W-120", type: "TA engagement", title: "Colorado SecureSavings — small-employer outreach playbook", milestones: ["M-10"], oda: ["D4.2"], owner: "JL", state: "CO",
    stages: [], due: "Mar 31, 2026", firmness: "locked", terminal: "complete", status: "complete", completedDate: "Mar 28, 2026" },
];
const ORGS = [
  { id: "aarp",      kind: "supporter", name: "AARP",                            role: "Federation — leading state-level advocate",  states: ["CA","IL","OR","CT","MD","CO","VA","MA","NJ","NM","DE","ME","HI","NV","WA","PA","WI","MI","KY","MN","RI","NC","TN","AL"], lead: "Olivia Mitchell" },
  { id: "naup",      kind: "supporter", name: "Economic Policy Institute",       role: "Research / advocacy",        states: ["MS","TN","AL","KY","IA"], lead: "Monique Morrissey" },
  { id: "cri",       kind: "supporter", name: "Center for Retirement Initiatives", role: "Academic partner — Georgetown", states: ["national"], lead: "Angela Antonelli" },
  { id: "aspen",     kind: "supporter", name: "Aspen Financial Security Program", role: "Successor candidate (OBJ-6 — MOU signed)", states: ["national"], lead: "Karen Biddle Andres" },
  { id: "nast",      kind: "supporter", name: "NAST",                            role: "State treasurers", states: ["CA","CO","IL","OR","WA","ME","NJ","CT","MD"], lead: "Treasurer Frerichs (IL)" },
  { id: "nfib",      kind: "opposer",   name: "NFIB",                            role: "Small-business federation", states: ["MS","TN","KY","UT","IA","WV","AZ","NC","FL","AL"], lead: "Jeff Brabant" },
  { id: "chamber",   kind: "opposer",   name: "U.S. Chamber of Commerce",         role: "Federation — federal + state chapters", states: ["TN","NC","AL","KY","UT","WV"], lead: "Chantel Sheaks" },
  { id: "spark",     kind: "opposer",   name: "SPARK Institute",                  role: "Retirement industry trade group", states: ["national"], lead: "Tim Rouse" },
  { id: "afp",       kind: "opposer",   name: "Americans for Prosperity",         role: "Conservative advocacy", states: ["UT","TN","KY","WV","NC","AL","IA","KS"], lead: "Russell Coleman" },

  { id: "comm-ms-fin",  kind: "committee", name: "MS Senate Finance",  role: "Committee of jurisdiction",  states: ["MS"], chair: "Sen. Hopson (R)" },
  { id: "comm-ca-ban",  kind: "committee", name: "CA Senate Labor",    role: "Committee of jurisdiction", states: ["CA"], chair: "Sen. Smallwood-Cuevas (D)" },
  { id: "comm-tn-fin",  kind: "committee", name: "TN House Finance",   role: "Committee of jurisdiction", states: ["TN"], chair: "Rep. Hazlewood (R)" },
  { id: "comm-mi-com",  kind: "committee", name: "MI House Commerce",  role: "Committee of jurisdiction", states: ["MI"], chair: "Rep. Hood (D)" },
  { id: "comm-treas",   kind: "committee", name: "Treasury / IRS — Saver's Match",  role: "Federal rulemaker (informational)", states: ["US"], chair: "Asst. Sec. Adeyemo team" },

  { id: "fig-hopson",  kind: "figure", name: "Sen. Bart Hopson (R-MS)",   role: "Bill sponsor — S.B. 3099", states: ["MS"] },
  { id: "fig-kawasaki",kind: "figure", name: "Sen. Scott Kawasaki (D-AK)", role: "Bill sponsor — S.B. 21", states: ["AK"] },
  { id: "fig-hawkes",  kind: "figure", name: "Rep. Stewart Hawkes (R-UT)", role: "Bill sponsor — H.B. 250 (enacted)", states: ["UT"] },
  { id: "fig-wicks",   kind: "figure", name: "Asm. Buffy Wicks (D-CA)",    role: "Bill sponsor — A.B. 2650", states: ["CA"] },
  { id: "fig-hood",    kind: "figure", name: "Rep. Joe Hood III (D-MI)",   role: "Sponsor + Commerce Chair", states: ["MI"] },
  { id: "fig-neal",    kind: "figure", name: "Rep. Richard Neal (D-MA)",   role: "Federal — Auto-IRA Act", states: ["US"] },
];

/* ============== CONTRACTS — CAPS-derived (status/timing + computed %) ===
   Per §13: dollar amounts dropped at parse; we may compute a "% remaining"
   from Amount Remaining ÷ Max Amount at ingestion (still no raw amounts). */
const CONTRACTS = [
  { vendor: "Greenberg Quinlan Rosner Research",        type: "TCO", begin: "2024-07-01", expire: "2026-06-30", status: "expiring-soon", pctRemaining: 0.18, followup: "Renewal scope under review — survey wave 3 pickup" },
  { vendor: "Aspen Institute (Financial Security Program)", type: "GRT", begin: "2026-04-29", expire: "2027-04-28", status: "active", pctRemaining: 0.94, followup: "MOU executed — kickoff workshop scheduled Jun 19" },
  { vendor: "K&L Gates LLP",                            type: "TCO", begin: "2026-02-15", expire: "2026-07-31", status: "expiring-soon", pctRemaining: 0.34, followup: "KYC scoping deliverable due Jul 15" },
  { vendor: "Center for Retirement Initiatives (Georgetown)", type: "GRT", begin: "2025-09-01", expire: "2027-08-31", status: "active", pctRemaining: 0.62, followup: "Q3 narrative report due Jul 31" },
  { vendor: "Edelman Public Relations Worldwide",       type: "TCO", begin: "2024-10-01", expire: "2026-04-30", status: "expired",       pctRemaining: 0.02, followup: "URGENT — no renewal initiated; press-citation milestone exposed" },
  { vendor: "RTI International",                         type: "TCO", begin: "2023-06-01", expire: "2025-12-31", status: "expired",       pctRemaining: 0.00, followup: "Closeout report not yet received" },
  { vendor: "Mathematica Policy Research",              type: "TCO", begin: "2025-01-01", expire: "2026-09-30", status: "active",        pctRemaining: 0.48, followup: "Mid-grant check-in Aug 10" },
  { vendor: "Urban Institute",                          type: "GRT", begin: "2024-03-01", expire: "2026-08-15", status: "expiring-soon", pctRemaining: 0.21, followup: "Renewal decision needed by Jul 1" },
  { vendor: "Boston College Center for Retirement Research", type: "GRT", begin: "2025-04-01", expire: "2027-03-31", status: "active", pctRemaining: 0.71, followup: "—" },
  { vendor: "Capitol Counsel LLC",                      type: "TCO", begin: "2025-11-01", expire: "2026-10-31", status: "active",        pctRemaining: 0.55, followup: "Federal informational meetings — quarterly invoice" },
];

/* ============== PENDING CONTRACTS — moving through CAPS but not yet executed === */
const PENDING_CONTRACTS = [
  { vendor: "NORC at the University of Chicago",        type: "TCO", caps: "PR-2026-014", initiated: "2026-04-18", stage: "Awaiting SD sign-off",  daysInStage: 14, blocker: "Scope-of-work revisions returned to PI 4/28; resubmitted 5/12" },
  { vendor: "Brennan Center for Justice (KYC counsel)", type: "TCO", caps: "PR-2026-019", initiated: "2026-05-02", stage: "Legal review",         daysInStage: 9,  blocker: "Indemnity language" },
  { vendor: "Hispanic Federation",                       type: "GRT", caps: "PR-2026-021", initiated: "2026-04-30", stage: "GR sign-off",          daysInStage: 5,  blocker: "Awaiting state partner letter of support" },
];

/* ============== CHANGES (what changed surface) ============== */
/* source: "auto" = derived from a sync diff (Quorum, CAPS, stage timestamps).
           "manual" = human-written annotation, attached to an auto event or stand-alone. */
const CHANGES = {
  risks: [
    { title: "OregonSaves TA — signature slipping",  date: "2 days ago", source: "manual",
      body: "Intergovernmental agreement still unsigned. If past Aug 1, the ≥3 TA-engagements milestone (M-10) cannot be met. Owner: EH.",
      tags: ["M-10", "OR", "TA"] },
    { title: "Asset-limits cost paper unrecoverable in FY26", date: "Apr 4", source: "auto+manual",
      body: "Methodology failed peer review. Recommending milestone rescope. SLT call needed by 6/15.",
      tags: ["M-08", "RED"] },
    { title: "Edelman contract expired without renewal", date: "Apr 30", source: "auto",
      body: "Press / dissemination support lapsed; impacts speaking-invitation pipeline (M-04). Procurement notified.",
      tags: ["contract", "M-04"] },
  ],
  wins: [
    { title: "Utah H.B. 250 — enacted", date: "Mar 24", source: "auto",
      body: "First red state since Tennessee. Satisfies M-01 (assist enacted) and counts toward M-06 (≥3 red states introduced).",
      tags: ["M-01", "M-06", "UT"] },
    { title: "Mississippi S.B. 3099 + companion enacted", date: "Apr 8", source: "auto",
      body: "Two-chamber pass — counts as one enacted program. Red state.",
      tags: ["M-01", "M-06", "MS"] },
    { title: "Aspen FSP MOU signed", date: "Apr 29", source: "manual",
      body: "Successor candidate formally committed. M-05 narrative re-rated green.",
      tags: ["M-05", "OBJ-6"] },
  ],
  blocked: [
    { title: "TN fiscal-impact report stuck in QC", date: "Stuck 46 days", source: "auto",
      body: "Data-check holdup on BLS series; second QC pass needed. Owner: JL.",
      tags: ["M-04", "TN"] },
    { title: "WI Senate companion — no scheduled hearing",  date: "Stuck 92 days", source: "auto",
      body: "S.B. 34 introduced Feb 18; no Finance hearing scheduled. House version moved.",
      tags: ["WI"] },
    { title: "KYC FinCEN call rescheduled twice", date: "Now Jul", source: "manual",
      body: "Slips deliverable on M-11 by one quarter.",
      tags: ["M-11"] },
  ],
};

/* ============== POWER MAP — per-state (the primary view) ==============
   Sponsors carry: role, terms in office, passage rate, bills.
   Orgs carry per-state strength (strong/medium/weak) + lead + notes. */
const POWER_MAP_STATES = {
  MS: {
    summary: "S.B. 3099 enacted Apr 8 with a bipartisan-but-R-led coalition. AARP MS built the relationship with Hopson over 18 months; NFIB mobilized late and didn't have time. Implementation runway tight.",
    sponsors: [
      { name: "Sen. Bart Hopson",   party: "R", role: "Chair, Senate Finance",         terms: "3rd term", passRate: 0.62, bills: ["S.B. 3099"], strength: "strong",
        note: "Champion. Personal angle — daughter started a small business that needed retirement options." },
      { name: "Sen. Mike McLendon", party: "R", role: "Vice Chair, Senate Finance",    terms: "5th term", passRate: 0.71, bills: ["S.B. 3099 (co)"], strength: "medium",
        note: "Co-sponsor of convenience; not an active vote-counter." },
      { name: "Rep. Trey Lamar",    party: "R", role: "Speaker Pro Tempore",            terms: "4th term", passRate: 0.78, bills: ["H.B. 4073"], strength: "strong",
        note: "Companion sponsor. Speaker's office signaled support — major lift on the House side." },
    ],
    committees: [
      { name: "Senate Finance",       chair: "Hopson (R)", rankingMember: "Bryan (D)",   role: "Sole committee of jurisdiction — cleared 11-3 with one D yes." },
      { name: "House Ways & Means",   chair: "Lamar (R)",  rankingMember: "Summers (D)", role: "Heard companion; voice vote." },
    ],
    supporters: [
      { name: "AARP Mississippi",   strength: "strong", lead: "Jen Lechler",  note: "State director — 8 years in role. Drove the 18-month relationship-build with Hopson." },
      { name: "MS Economic Council", strength: "medium", lead: "Scott Waller", note: "Business council; provided cover for R legislators worried about small-biz pushback." },
    ],
    opposers: [
      { name: "NFIB Mississippi",           strength: "medium-late", lead: "Leah Long",      note: "Strong nationally; in MS, mobilized after the bill was already moving through Finance." },
      { name: "Americans for Prosperity MS", strength: "weak",        lead: "Russell Latino", note: "Filed comments; did not testify. Latino is a former legislator." },
    ],
  },
  CA: {
    summary: "A.B. 2650 (Wicks) expands CalSavers to household employers. Out of Sen. Labor 4/30 — cleared with two R nays. CalSavers Board provided unusually direct testimony for an admin agency.",
    sponsors: [
      { name: "Asm. Buffy Wicks", party: "D", role: "Chair, Asm. Appropriations", terms: "4th term", passRate: 0.69, bills: ["A.B. 2650"], strength: "strong",
        note: "Lead author. Strong floor record on labor; Appropriations seat gives her leverage." },
    ],
    committees: [
      { name: "Senate Labor, Public Employment & Retirement", chair: "Smallwood-Cuevas (D)", rankingMember: "Niello (R)", role: "Cleared committee — 4 D yes, 2 R no, 1 abstain." },
      { name: "Asm. Banking & Finance",                       chair: "Calderon (D)",         rankingMember: "Davies (R)",  role: "Originating committee; passed on consent." },
    ],
    supporters: [
      { name: "AARP California",            strength: "strong", lead: "Olivia Mitchell",  note: "Backbone advocate — statewide grassroots network." },
      { name: "California Labor Federation", strength: "strong", lead: "Lorena Gonzalez", note: "Former Asm.; ex-Wicks colleague. Powerful relationship." },
      { name: "CalSavers Board",            strength: "medium", lead: "Katie Selenski (consultant)", note: "Selenski is former CalSavers ED — unique insider role." },
    ],
    opposers: [
      { name: "California Chamber of Commerce", strength: "strong", lead: "Jennifer Barrera", note: "On CalChamber Job Killer list — highest-attention designation." },
      { name: "NFIB California",                 strength: "medium", lead: "John Kabateck",   note: "Coordinated with Chamber. Strong in Inland Empire R districts; weak in Bay/LA." },
    ],
  },
  TN: {
    summary: "H.B. 1138 out of House Finance 4/18, surprising the field. Hicks is sophisticated on retirement policy from prior life as a benefits-firm partner. NFIB and Chamber both opposing but uncoordinated.",
    sponsors: [
      { name: "Rep. Gary Hicks", party: "R", role: "Member, House Finance Ways & Means", terms: "6th term", passRate: 0.55, bills: ["H.B. 1138"], strength: "strong",
        note: "Career retirement-benefits attorney before legislature. Treats this as a substantive issue not a tribal one." },
    ],
    committees: [
      { name: "House Finance, Ways & Means", chair: "Hazlewood (R)", rankingMember: "Towns (D)",   role: "Voted out 14-7. Hazlewood is neutral; not an active obstacle." },
      { name: "Senate Commerce & Labor",     chair: "Yarbro (D)",    rankingMember: "Roberts (R)", role: "Not yet heard. Senate side is the question." },
    ],
    supporters: [
      { name: "AARP Tennessee",                strength: "medium", lead: "Rebecca Kelly",     note: "Active but state team is small. Working pipe-by-pipe." },
      { name: "Economic Policy Institute (TN)", strength: "medium", lead: "Monique Morrissey", note: "National staff — no in-state office. Provides cost research." },
    ],
    opposers: [
      { name: "NFIB Tennessee",         strength: "strong", lead: "Jim Brown",      note: "Brown is former TN House staff — deep relationships. Main opposition." },
      { name: "TN Chamber of Commerce", strength: "medium", lead: "Bradley Jackson", note: "Quietly opposing; not testifying. Wants to preserve relationships." },
    ],
  },
  AK: {
    summary: "S.B. 21 (Kawasaki) has unusual bipartisan support — R co-sponsor Yundt rare in retirement policy. Now \"Sent to Executive\" but Gov. Dunleavy (R) has not signaled. The squeeze.",
    sponsors: [
      { name: "Sen. Scott Kawasaki", party: "D", role: "Member, Senate Labor & Commerce", terms: "8th term (House+Senate)", passRate: 0.41, bills: ["S.B. 21"], strength: "medium",
        note: "Long-time progressive priority; finally got an R co-sponsor in Yundt." },
      { name: "Sen. Rob Yundt",      party: "R", role: "Freshman senator",                 terms: "1st term",                passRate: 0.50, bills: ["S.B. 21 (co)"], strength: "weak-strategic",
        note: "Unusual R co-sponsor. Independent streak; not a reliable repeat vote." },
    ],
    committees: [
      { name: "Senate Labor & Commerce", chair: "Kawasaki (D)", rankingMember: "Bjorkman (R)", role: "Cleared 4-1." },
      { name: "Senate Finance",          chair: "Stedman (R)",  rankingMember: "Hoffman (D)",  role: "Cleared 5-2." },
    ],
    supporters: [
      { name: "AARP Alaska",                              strength: "medium", lead: "Marge Stoneking", note: "Stoneking is well-regarded; small but credible state office." },
      { name: "Permanent Fund participants' association", strength: "weak",   lead: "(grassroots)",     note: "Useful angle: tie program to PFD direct-deposit." },
    ],
    opposers: [
      { name: "Alaska Chamber", strength: "medium", lead: "Kati Capozzi", note: "Filed testimony; not aggressively whipping votes." },
      { name: "NFIB Alaska",    strength: "weak",   lead: "(vacant)",     note: "Position vacant since 2024 — materially weakens opposition." },
    ],
  },
  UT: {
    summary: "H.B. 250 enacted Mar 24 — first R-trifecta state to enact. Hawkes (R) framed as benefits-for-small-business + free-market alternative to federal action. AFP filed late; ineffective.",
    sponsors: [
      { name: "Rep. Stewart Hawkes", party: "R", role: "Member, House Business & Labor", terms: "2nd term", passRate: 0.83, bills: ["H.B. 250"], strength: "strong",
        note: "Effective freshman class. Treasurer-track careerist." },
    ],
    committees: [
      { name: "House Business & Labor",       chair: "Pierucci (R)",   rankingMember: "Briscoe (D)",   role: "Voted out 11-2." },
      { name: "Senate Revenue & Taxation",    chair: "Cullimore (R)",  rankingMember: "Escamilla (D)", role: "Cleared on voice." },
    ],
    supporters: [
      { name: "AARP Utah",                  strength: "strong", lead: "Danny Harris",  note: "Harris is a former LDS Church government-affairs staffer — enormous local credibility." },
      { name: "Utah Foundation (research)", strength: "medium", lead: "Peter Reichard", note: "Published the cost study that anchored Hawkes' floor speech." },
    ],
    opposers: [
      { name: "Americans for Prosperity Utah", strength: "weak",         lead: "Heather Andrews", note: "Filed comments at hearing 2; never built a vote-count operation." },
      { name: "Utah Chamber",                  strength: "weak-neutral", lead: "Derek Miller",    note: "Did not testify either side. Tacit acceptance." },
    ],
  },
  MI: {
    summary: "H.B. 4665 (Hood) out of Commerce 5/6. Hood is the committee chair — strong process control. Senate version pending.",
    sponsors: [
      { name: "Rep. Joe Hood III", party: "D", role: "Chair, House Commerce & Tourism", terms: "5th term", passRate: 0.74, bills: ["H.B. 4665"], strength: "strong",
        note: "Chairs his own committee — procedural advantage. Strong relationship with Whitmer admin." },
    ],
    committees: [
      { name: "House Commerce & Tourism", chair: "Hood (D)",   rankingMember: "Bezotte (R)", role: "Cleared 12-7 on party lines." },
      { name: "Senate Labor",             chair: "Cherry (D)", rankingMember: "Albert (R)",  role: "Hearings expected June." },
    ],
    supporters: [
      { name: "AARP Michigan",                       strength: "strong", lead: "Paula Cunningham", note: "Cunningham is former Lansing mayor — deep network across the legislature." },
      { name: "Michigan League for Public Policy",   strength: "medium", lead: "Monique Stanton",  note: "Coalition partner; provides cost-of-no-action research." },
    ],
    opposers: [
      { name: "Small Business Assoc. of Michigan", strength: "medium", lead: "Brian Calley",  note: "Calley is former LG (R). Hostile but on cordial terms with Hood." },
      { name: "NFIB Michigan",                      strength: "medium", lead: "Amanda Fisher", note: "Standard NFIB playbook. Effective in outstate R districts." },
    ],
  },
};

/* ============== Wire to window ============== */
Object.assign(window, {
  FY, ASOF, ODA, MILESTONES, JURISDICTIONS, TILE_LAYOUT, STATE_NAMES,
  STATES_LIVE, STATES_ENACTED, STATES_ACTIVE_LEG, HAS_DC_LIVE, HAS_DC_ENACTED,
  BILLS, WORK_ITEMS, ORGS, CONTRACTS, PENDING_CONTRACTS, CHANGES,
  POWER_MAP_STATES,
});
