{
  "schema_version": 1,
  "built_at": "2026-08-21T23:25:54.904Z",
  "schema_fingerprint": "38f30e7dfc826059",
  "lanes": [
    {
      "id": "source",
      "title": "Upstream sources",
      "blurb": "Third-party endpoints. Every one is public and most need no key. We do not control any of them, which is the entire reason the next lane exists."
    },
    {
      "id": "capture",
      "title": "Capture and archive",
      "blurb": "Fetch → hash → store immutable → record the outcome. A capture record is written for every outcome including 304, 404 and network failure, because \"we looked and it was identical\" and \"we did not look\" are different facts."
    },
    {
      "id": "dataset",
      "title": "Derived datasets",
      "blurb": "What we wrote, parsed from the stored copy and never from the wire. Flat JSON in the repo: there is no request-time compute, so the day file is the store."
    },
    {
      "id": "surface",
      "title": "Published surfaces",
      "blurb": "What a reader or a model gets. Static HTML, plus one function for the MCP endpoint."
    }
  ],
  "pipelines": [
    {
      "id": "fedreg",
      "label": "Federal Register daily",
      "blurb": "The wedge. One pull each publishing morning becomes the day page, the MCP archive path, and the quote corpus."
    },
    {
      "id": "pi",
      "label": "Public inspection poll",
      "blurb": "Every 15 minutes while the desk is open. The highest-asymmetry capture in the archive: the listing disappears at publication and a withdrawn filing leaves no trace."
    },
    {
      "id": "floor",
      "label": "Floor Radar",
      "blurb": "The only forward-looking source in the project — what the House intends to take up this week, republished continuously."
    },
    {
      "id": "cards",
      "label": "Consequence Cards",
      "blurb": "Statute → claim → citation. Not published: no card has passed verification, and the deployment excludes the whole directory."
    },
    {
      "id": "quotes",
      "label": "Quotes",
      "blurb": "Hand-selected lines from the day corpus, each checked back against the archive before it renders."
    },
    {
      "id": "tier0",
      "label": "Tier-0 permanent-loss watch",
      "blurb": "Pages that get edited in place with no version history. Captured daily so the edit is visible as a diff rather than as nothing."
    },
    {
      "id": "presidential",
      "label": "Presidential memoranda",
      "blurb": "The one surface the Federal Register does not cover. 7 of the 30 memoranda published in 2026 have no Register counterpart at all, and whitehouse.gov — which does not keep history and does not survive a transition — is the only timely source for them."
    },
    {
      "id": "lexicon",
      "label": "Lexicon",
      "blurb": "The terms-of-art glossary. Hand-authored, no upstream endpoint."
    }
  ],
  "nodes": [
    {
      "id": "src.fr.documents.day",
      "lane": "source",
      "group": "Federal Register",
      "title": "FR documents.json — today",
      "subtitle": "31 curated fields · no key",
      "status": "live",
      "pipelines": [
        "fedreg"
      ],
      "what": "The day's issue, requested with an explicit field list rather than the API default. This is the one request the whole daily page is built from: effective_on, comments_close_on and cfr_references are the dated obligations, and the four *_url fields are the citation targets.",
      "why": "Real days run 90–155 documents, so per_page=1000 has about seven times the headroom it needs. A single misspelled field name is a hard 400 for the entire request, which is why the default-fields twin below exists.",
      "url": "https://www.federalregister.gov/api/v1/documents.json?per_page=1000&order=newest&conditions[publication_date][is]={{date}}&fields[]=document_number&fields[]=title&fields[]=type&fields[]=subtype&fields[]=abstract&fields[]=action&fields[]=dates&fields[]=publication_date&fields[]=effective_on&fields[]=comments_close_on&fields[]=signing_date&fields[]=agencies&fields[]=agency_names&fields[]=docket_ids&fields[]=regulation_id_numbers&fields[]=cfr_references&fields[]=significant&fields[]=citation&fields[]=start_page&fields[]=end_page&fields[]=page_length&fields[]=topics&fields[]=president&fields[]=executive_order_number&fields[]=correction_of&fields[]=html_url&fields[]=pdf_url&fields[]=public_inspection_pdf_url&fields[]=json_url&fields[]=raw_text_url&fields[]=body_html_url",
      "cadence": "daily",
      "key": null,
      "registry": [
        {
          "set": "fedreg",
          "source_id": "fr.documents.day"
        }
      ],
      "links": [
        {
          "label": "Federal Register API docs",
          "url": "https://www.federalregister.gov/developers/documentation/api/v1"
        },
        {
          "label": "Live: today’s issue",
          "url": "https://www.federalregister.gov/api/v1/documents.json?per_page=5&order=newest"
        }
      ],
      "code": [
        "tools/sources/fedreg.json",
        "tools/snapshot.mjs",
        "daily/build.mjs"
      ],
      "caveats": [
        "{{date}} is substituted with the America/New_York publication date. The Federal Register’s day boundary is Eastern and ours must match it, or the 8pm-Pacific run pulls tomorrow’s empty issue."
      ]
    },
    {
      "id": "src.fr.documents.default",
      "lane": "source",
      "group": "Federal Register",
      "title": "FR documents.json — default fields",
      "subtitle": "insurance against a 400",
      "status": "live",
      "pipelines": [
        "fedreg"
      ],
      "what": "The same day, asked for with the API’s own default field set. Cheap insurance: one bad field name 400s the curated request above and a day would otherwise be lost to a typo.",
      "url": "https://www.federalregister.gov/api/v1/documents.json?per_page=1000&order=newest&conditions[publication_date][is]={{date}}",
      "cadence": "daily",
      "key": null,
      "registry": [
        {
          "set": "fedreg",
          "source_id": "fr.documents.day.default_fields"
        }
      ],
      "links": [
        {
          "label": "Federal Register API docs",
          "url": "https://www.federalregister.gov/developers/documentation/api/v1"
        }
      ],
      "code": [
        "tools/sources/fedreg.json"
      ],
      "caveats": [
        "Registry note says delete it once the curated pull has run clean for a week."
      ]
    },
    {
      "id": "src.fr.documents.prev",
      "lane": "source",
      "group": "Federal Register",
      "title": "FR documents.json — yesterday",
      "subtitle": "re-pull for corrections",
      "status": "live",
      "pipelines": [
        "fedreg"
      ],
      "what": "Yesterday’s issue, pulled again. Corrections and withdrawals land after publication, so an issue is not final on its publication date.",
      "why": "Re-pulling is how the archive records that a document changed after the fact — a fact no single-pull crawl can ever produce.",
      "url": "https://www.federalregister.gov/api/v1/documents.json?per_page=1000&order=newest&conditions[publication_date][is]={{date_prev}}&fields[]=document_number&fields[]=title&fields[]=type&fields[]=publication_date&fields[]=effective_on&fields[]=comments_close_on&fields[]=agency_names&fields[]=citation&fields[]=html_url&fields[]=pdf_url",
      "cadence": "daily",
      "key": null,
      "registry": [
        {
          "set": "fedreg",
          "source_id": "fr.documents.day.prev"
        }
      ],
      "links": [
        {
          "label": "Federal Register API docs",
          "url": "https://www.federalregister.gov/developers/documentation/api/v1"
        }
      ],
      "code": [
        "tools/sources/fedreg.json"
      ]
    },
    {
      "id": "src.fr.pi.current",
      "lane": "source",
      "group": "Federal Register",
      "title": "Public inspection — current",
      "subtitle": "every 15 minutes",
      "status": "live",
      "pipelines": [
        "fedreg",
        "pi",
        "tier0"
      ],
      "what": "Documents filed for public inspection and not yet published. The listing disappears at publication, and a filing withdrawn before publication leaves no public record that it ever existed.",
      "why": "The highest-asymmetry item in the whole archive, and the reason the daily page can be published before the Federal Register itself publishes.",
      "url": "https://www.federalregister.gov/api/v1/public-inspection-documents/current.json",
      "cadence": "15min",
      "key": null,
      "registry": [
        {
          "set": "fedreg",
          "source_id": "fr.public_inspection.current"
        },
        {
          "set": "tier0",
          "source_id": "fr.public_inspection.current"
        }
      ],
      "links": [
        {
          "label": "Live: current PI listing",
          "url": "https://www.federalregister.gov/api/v1/public-inspection-documents/current.json"
        },
        {
          "label": "Public inspection desk",
          "url": "https://www.federalregister.gov/public-inspection"
        }
      ],
      "code": [
        "tools/sources/fedreg.json",
        "tools/sources/tier0.json",
        ".github/workflows/fedreg-public-inspection.yml"
      ],
      "caveats": [
        "Registered in two sets. Same endpoint, two reasons to watch it — that is deliberate."
      ]
    },
    {
      "id": "src.fr.pi.day",
      "lane": "source",
      "group": "Federal Register",
      "title": "Public inspection — by day",
      "subtitle": "hourly, stable key",
      "status": "live",
      "pipelines": [
        "pi"
      ],
      "what": "The day’s filings addressed by date rather than by \"current\", which gives the poll a stable per-day key to diff against.",
      "why": "A withdrawal is then visible as a document present at 10:00 and absent at 16:00 — a fact the \"current\" listing alone cannot carry.",
      "url": "https://www.federalregister.gov/api/v1/public-inspection-documents.json?per_page=1000&conditions[available_on]={{date}}",
      "cadence": "hourly",
      "key": null,
      "registry": [
        {
          "set": "fedreg",
          "source_id": "fr.public_inspection.day"
        }
      ],
      "links": [
        {
          "label": "Federal Register API docs",
          "url": "https://www.federalregister.gov/developers/documentation/api/v1"
        }
      ],
      "code": [
        "tools/sources/fedreg.json"
      ]
    },
    {
      "id": "src.fr.agencies",
      "lane": "source",
      "group": "Federal Register",
      "title": "FR agencies",
      "subtitle": "472 entries · controlled vocabulary",
      "status": "live",
      "pipelines": [
        "fedreg"
      ],
      "what": "The controlled vocabulary for agency names and slugs.",
      "why": "Agency-name spelling drift is a known Federal Register quirk. Normalising against this list rather than against free text is what keeps the daily grouping from splitting one agency into three.",
      "url": "https://www.federalregister.gov/api/v1/agencies",
      "cadence": "weekly",
      "key": null,
      "registry": [
        {
          "set": "fedreg",
          "source_id": "fr.agencies"
        }
      ],
      "links": [
        {
          "label": "Live: agencies",
          "url": "https://www.federalregister.gov/api/v1/agencies"
        }
      ],
      "code": [
        "tools/sources/fedreg.json",
        "daily/lib/agencies.mjs"
      ]
    },
    {
      "id": "src.ecfr.titles",
      "lane": "source",
      "group": "eCFR",
      "title": "eCFR titles index",
      "subtitle": "latest_amended_on per title",
      "status": "live",
      "pipelines": [
        "fedreg",
        "tier0"
      ],
      "what": "A cheap change-detection endpoint carrying latest_amended_on for each of the fifty titles.",
      "why": "The planned diff job fetches only the titles that actually moved instead of walking fifty of them. This is where a real database earns its place — nothing reads it yet.",
      "url": "https://www.ecfr.gov/api/versioner/v1/titles.json",
      "cadence": "daily",
      "key": null,
      "registry": [
        {
          "set": "fedreg",
          "source_id": "ecfr.titles"
        },
        {
          "set": "tier0",
          "source_id": "ecfr.titles"
        }
      ],
      "links": [
        {
          "label": "eCFR developer docs",
          "url": "https://www.ecfr.gov/developers/documentation/api/v1"
        },
        {
          "label": "Live: titles.json",
          "url": "https://www.ecfr.gov/api/versioner/v1/titles.json"
        }
      ],
      "code": [
        "tools/sources/fedreg.json",
        "tools/sources/tier0.json"
      ],
      "caveats": [
        "Captured daily; no dataset is built from it yet."
      ]
    },
    {
      "id": "src.govinfo.enrolled",
      "lane": "source",
      "group": "Statute and legislative record",
      "title": "GovInfo — enrolled bill USLM",
      "subtitle": "BILLS-119hr6644enr · 677,824 bytes",
      "status": "live",
      "pipelines": [
        "cards",
        "tier0"
      ],
      "what": "The enrolled text of H.R. 6644, in USLM XML. The substrate every statutory card claim is checked against.",
      "why": "Enrolled text is immutable once published, hence cadence \"once\". PLAW-119publ101 is deliberately not used: it 302s to an error page 25 days post-enactment. When the public law XML appears it is a lineage correspondence to record, not a substitute to swap in.",
      "url": "https://www.govinfo.gov/content/pkg/BILLS-119hr6644enr/xml/BILLS-119hr6644enr.xml",
      "cadence": "once",
      "key": null,
      "registry": [
        {
          "set": "tier0",
          "source_id": "govinfo.bills.119hr6644enr"
        }
      ],
      "links": [
        {
          "label": "GovInfo bulk data",
          "url": "https://www.govinfo.gov/bulkdata/BILLS"
        },
        {
          "label": "GovInfo API docs",
          "url": "https://api.govinfo.gov/docs/"
        }
      ],
      "code": [
        "tools/sources/tier0.json",
        "cards/sources.mjs",
        "cards/fidelity.mjs"
      ],
      "caveats": [
        "Not the substrate for every claim. A tally, a member’s vote and the enactment itself are not in the statute and never will be — see cards/sources.mjs CLAIM_CLASSES for the routing."
      ]
    },
    {
      "id": "src.congress.actions",
      "lane": "source",
      "group": "Statute and legislative record",
      "title": "Congress.gov — bill actions",
      "subtitle": "69 actions · API key required",
      "status": "live",
      "pipelines": [
        "cards"
      ],
      "what": "The action record for H.R. 6644: presentment, enactment, every roll call with its tally, and the actions disposed of with no recorded vote.",
      "why": "It decides an enactment claim and a tally claim, because neither is in the enrolled text. It also carries the one thing no other source does — the steps where nobody is on the record.",
      "url": "https://api.congress.gov/v3/bill/119/hr/6644/actions?format=json&limit=250",
      "cadence": "weekly",
      "key": "DATA_GOV_API_KEY",
      "registry": [
        {
          "set": "tier0",
          "source_id": "congress.bill.119hr6644.actions"
        }
      ],
      "links": [
        {
          "label": "Congress.gov API",
          "url": "https://api.congress.gov/"
        },
        {
          "label": "Request a key",
          "url": "https://api.data.gov/signup/"
        }
      ],
      "code": [
        "tools/sources/tier0.json",
        "cards/sources.mjs"
      ],
      "caveats": [
        "cards/sources.mjs currently reads a transcription of a 2026-08-05 fetch (RECORDED_VOTES) rather than a snapshot. The registry entry closes that gap; the transcription is marked as one in the code.",
        "The action record stops at the tally. It carries no member-level rows, and inventing them from a tally is the attribution failure the card rules exist to prevent."
      ]
    },
    {
      "id": "src.clerk.rollcall",
      "lane": "source",
      "group": "Statute and legislative record",
      "title": "House Clerk — roll call XML",
      "subtitle": "rolls 57 and 224 · member-level",
      "status": "live",
      "pipelines": [
        "cards"
      ],
      "what": "Per-member votes for the two recorded House votes on the bill: roll 57 (2026-02-09, 390–9, passage as amended) and roll 224 (2026-06-23, 358–32, agreeing to the Senate amendment).",
      "why": "Bioguide, state, district and party live here and nowhere else. A card naming a person cannot be decided from the action record however tempting that is.",
      "url": "https://clerk.house.gov/evs/2026/roll057.xml",
      "cadence": "once",
      "key": null,
      "registry": [
        {
          "set": "tier0",
          "source_id": "clerk.rollcall.2026.roll057"
        },
        {
          "set": "tier0",
          "source_id": "clerk.rollcall.2026.roll224"
        }
      ],
      "links": [
        {
          "label": "House Clerk roll calls, 2026",
          "url": "https://clerk.house.gov/Votes"
        }
      ],
      "code": [
        "tools/sources/tier0.json",
        "cards/sources.mjs"
      ],
      "caveats": [
        "The House also acted on 2026-05-20 under H. Res. 1299 with no recorded vote. There is no roll file to capture for it, every member is unattributable at that step, and the absent capture is itself the finding.",
        "cards/sources.mjs marks this source capture: \"none\" — registered, not yet snapshotted."
      ]
    },
    {
      "id": "src.senate.rollcall",
      "lane": "source",
      "group": "Statute and legislative record",
      "title": "Senate LIS — roll call XML",
      "subtitle": "7 votes · 2 substantive, 5 procedural",
      "status": "live",
      "pipelines": [
        "cards"
      ],
      "what": "Per-member votes for the seven Senate roll calls: 44, 45, 52, 175 and 180 procedural; 53 (passage, 89–10) and 182 (concurring, 85–5) substantive.",
      "why": "A member who votes for cloture and against passage has done an ordinary thing. Pooling the two tiers misattributes a position to a named person, so both have to be on hand to be told apart.",
      "url": "https://www.senate.gov/legislative/LIS/roll_call_votes/vote1192/vote_119_2_00053.xml",
      "cadence": "once",
      "key": null,
      "registry": [
        {
          "set": "tier0",
          "source_id": "senate.lis.rollcall.119.2.00044"
        },
        {
          "set": "tier0",
          "source_id": "senate.lis.rollcall.119.2.00045"
        },
        {
          "set": "tier0",
          "source_id": "senate.lis.rollcall.119.2.00052"
        },
        {
          "set": "tier0",
          "source_id": "senate.lis.rollcall.119.2.00053"
        },
        {
          "set": "tier0",
          "source_id": "senate.lis.rollcall.119.2.00175"
        },
        {
          "set": "tier0",
          "source_id": "senate.lis.rollcall.119.2.00180"
        },
        {
          "set": "tier0",
          "source_id": "senate.lis.rollcall.119.2.00182"
        }
      ],
      "links": [
        {
          "label": "Senate roll call votes",
          "url": "https://www.senate.gov/legislative/votes_new.htm"
        }
      ],
      "code": [
        "tools/sources/tier0.json",
        "cards/sources.mjs"
      ],
      "caveats": [
        "Vote 53 is the one that has actually been fetched: 200 at 28,737 bytes, identical to curl and to a browser user-agent. That answered whether senate.gov serves plain clients — it does, so no fallback source and no provenance downgrade on a card."
      ]
    },
    {
      "id": "src.legislators",
      "lane": "source",
      "group": "Statute and legislative record",
      "title": "congress-legislators",
      "subtitle": "current + historical · 13.5 MB",
      "status": "live",
      "pipelines": [
        "floor",
        "cards"
      ],
      "what": "The bioguide ↔ state/district crosswalk, plus terms with dates. Two files: members serving as of the fetch, and members no longer serving.",
      "why": "The join that turns a scheduled measure into a claim about a named state’s delegation. A bioguide lives in exactly one of the two files, never both — without the historical file an as_of before the most recent departure under-seats the roster (the 98-of-100-senators gap).",
      "url": "https://unitedstates.github.io/congress-legislators/legislators-current.json",
      "cadence": "weekly",
      "key": null,
      "registry": [
        {
          "set": "floor",
          "source_id": "congress.legislators.current"
        },
        {
          "set": "floor",
          "source_id": "congress.legislators.historical"
        }
      ],
      "links": [
        {
          "label": "congress-legislators on GitHub",
          "url": "https://github.com/unitedstates/congress-legislators"
        },
        {
          "label": "Live: legislators-current.json",
          "url": "https://unitedstates.github.io/congress-legislators/legislators-current.json"
        }
      ],
      "code": [
        "tools/sources/floor.json",
        "floor/delegation.mjs"
      ],
      "caveats": [
        "Community-maintained rather than official — a provenance step down from a .gov endpoint, recorded on anything built from it rather than hidden.",
        "13.5 MB uncompressed. A real run caches it rather than refetching daily."
      ]
    },
    {
      "id": "src.house.floor",
      "lane": "source",
      "group": "House floor",
      "title": "docs.house.gov — bills this week",
      "subtitle": "this week + last week",
      "status": "live",
      "pipelines": [
        "floor"
      ],
      "what": "The House’s own forward schedule: every measure queued for floor consideration this week, its procedural posture, the text as it will be considered, and an add/remove/republish history per item. Last week is re-pulled too.",
      "why": "The only source in the project that says what is about to happen. The document is republished continuously — 26 times in the week of 2026-07-20 — so a poll captures a state, not the week.",
      "url": "https://docs.house.gov/billsthisweek/{{week_monday_compact}}/{{week_monday_compact}}.xml",
      "cadence": "daily",
      "key": null,
      "registry": [
        {
          "set": "floor",
          "source_id": "house.floor.billsthisweek"
        },
        {
          "set": "floor",
          "source_id": "house.floor.billsthisweek.prev"
        }
      ],
      "links": [
        {
          "label": "docs.house.gov floor",
          "url": "https://docs.house.gov/floor/"
        }
      ],
      "code": [
        "tools/sources/floor.json",
        "floor/parse.mjs",
        "floor/build.mjs"
      ],
      "caveats": [
        "A 404 is the normal state of a recess week, not a fault. The capture floor and the dead-crawler alarm are told, or they cry wolf every recess and get muted.",
        "The House amends the document after the week is over — the 2026-07-20 file was last updated 2026-07-22 — which is why last week is re-pulled."
      ]
    },
    {
      "id": "src.house.index",
      "lane": "source",
      "group": "House floor",
      "title": "docs.house.gov — floor index",
      "subtitle": "disambiguates a 404",
      "status": "live",
      "pipelines": [
        "floor"
      ],
      "what": "The index page, which is the only thing that says which weeks exist.",
      "why": "A 404 on a week’s XML is ambiguous on its own: recess, or a URL convention that changed under us? The index is the difference between a quiet recess and a silently dead crawler.",
      "url": "https://docs.house.gov/floor/",
      "cadence": "daily",
      "key": null,
      "registry": [
        {
          "set": "floor",
          "source_id": "house.floor.index"
        }
      ],
      "code": [
        "tools/sources/floor.json"
      ]
    },
    {
      "id": "src.wh.actions",
      "lane": "source",
      "group": "Presidential actions",
      "title": "whitehouse.gov — all presidential actions",
      "subtitle": "RSS · full text · no key",
      "status": "live",
      "pipelines": [
        "presidential"
      ],
      "what": "Every presidential action — memoranda, executive orders, proclamations, nominations — newest 30, each with the entire document in content:encoded and category elements stating the White House’s own classification.",
      "why": "The fastest public surface. A memorandum appears here the day it is signed, a median of 5 days before the Federal Register prints it, and for the ones the Register never prints it is the only surface there is.",
      "url": "https://www.whitehouse.gov/presidential-actions/feed/",
      "cadence": "hourly",
      "key": null,
      "registry": [
        {
          "set": "presidential",
          "source_id": "wh.presidential_actions.feed"
        }
      ],
      "links": [
        {
          "label": "Presidential Actions",
          "url": "https://www.whitehouse.gov/presidential-actions/"
        }
      ],
      "code": [
        "tools/sources/presidential.json",
        "specs/presidential-memoranda.md"
      ],
      "caveats": [
        "Rewritten in place with no version history, and removed wholesale to a NARA subdomain at an administration transition. This is the permanent-loss surface, not a convenience.",
        "content:encoded is the rendered page: a fixed navigation preamble precedes the text and a \"The post … appeared first on\" suffix follows it. The document runs from \"MEMORANDUM FOR\" to the signature, and an extractor that cannot find that anchor must fail rather than store a page of navigation."
      ]
    },
    {
      "id": "src.wh.memoranda",
      "lane": "source",
      "group": "Presidential actions",
      "title": "whitehouse.gov — memoranda category",
      "subtitle": "the classification itself",
      "status": "live",
      "pipelines": [
        "presidential"
      ],
      "what": "The memoranda-only slice of the same feed, captured separately rather than filtered out of the row above.",
      "why": "The White House’s own categorisation is the fact worth archiving — it is the only place anything asserts that a document is a memorandum rather than a determination or a permit, and the Register disagrees often enough to matter: of the 21 documents in this category in 2026 that reached the Register, 19 were printed as Determination, Other or Presidential Order. Deriving our own classification would throw the disagreement away, and the disagreement is a finding.",
      "url": "https://www.whitehouse.gov/presidential-actions/presidential-memoranda/feed/",
      "cadence": "hourly",
      "key": null,
      "registry": [
        {
          "set": "presidential",
          "source_id": "wh.presidential_memoranda.feed"
        }
      ],
      "code": [
        "tools/sources/presidential.json",
        "specs/presidential-memoranda.md"
      ]
    },
    {
      "id": "src.wh.memoranda.backfill",
      "lane": "source",
      "group": "Presidential actions",
      "title": "whitehouse.gov — memoranda backfill",
      "subtitle": "pages 2–3 of 3",
      "status": "live",
      "pipelines": [
        "presidential"
      ],
      "what": "The rest of the category feed. Three pages return 30 + 30 + 15 = 75 memoranda with full text, back to 2025-03-21 — the complete category for this term.",
      "why": "?paged=4 answers 404, which is the terminator: the backfill is complete when a page 404s, not when a count is reached. Weekly rather than once because a page’s contents shift as new items push older ones down, and because a body edited after publication is exactly the change this archive exists to catch.",
      "url": "https://www.whitehouse.gov/presidential-actions/presidential-memoranda/feed/?paged=2",
      "cadence": "weekly",
      "key": null,
      "registry": [
        {
          "set": "presidential",
          "source_id": "wh.presidential_memoranda.feed.p2"
        },
        {
          "set": "presidential",
          "source_id": "wh.presidential_memoranda.feed.p3"
        }
      ],
      "code": [
        "tools/sources/presidential.json"
      ],
      "caveats": [
        "If page 4 ever answers 200 the category has outgrown three pages and the registry needs another row. Nothing detects that except a run that checks.",
        "The feed stops at 2025-03-21. Memoranda from the term’s first two months are on the site but out of reach of these three requests."
      ]
    },
    {
      "id": "src.fr.presdocu",
      "lane": "source",
      "group": "Presidential actions",
      "title": "FR documents.json — presidential documents",
      "subtitle": "the reconciliation side",
      "status": "live",
      "pipelines": [
        "presidential"
      ],
      "what": "Every presidential document the Register has printed this year, with the subtype that says which kind. 173 on 2026-08-19: 57 Proclamation, 50 Executive Order, 30 Notice, 17 Determination, 12 Other, 6 Memorandum, 1 Presidential Order.",
      "why": "Partly redundant with the daily issue, which already captures these — but that capture is sliced by publication date and this one is sliced by the question, so reconciling the White House feed against the Register is one request instead of a scan across every day held.",
      "url": "https://www.federalregister.gov/api/v1/documents.json?per_page=1000&order=newest&conditions[type][]=PRESDOCU&conditions[publication_date][gte]=2026-01-01&fields[]=document_number&fields[]=title&fields[]=subtype&fields[]=publication_date&fields[]=signing_date&fields[]=president&fields[]=citation&fields[]=executive_order_number&fields[]=html_url&fields[]=pdf_url&fields[]=raw_text_url",
      "cadence": "daily",
      "key": null,
      "registry": [
        {
          "set": "presidential",
          "source_id": "fr.presidential_documents.memoranda"
        }
      ],
      "links": [
        {
          "label": "Federal Register API docs",
          "url": "https://www.federalregister.gov/developers/documentation/api/v1"
        }
      ],
      "code": [
        "tools/sources/presidential.json",
        "specs/presidential-memoranda.md"
      ],
      "caveats": [
        "The Register is not a complete record of memoranda and is not close. Publication is ordered by the President rather than required, so absence here is a discretionary act and not a filing lapse — which is itself the fact worth recording.",
        "subtype is the join’s whole point, and daily/build.mjs requests it and then drops it before writing the day file. See specs/presidential-memoranda.md §5."
      ]
    },
    {
      "id": "src.govinfo.dcpd",
      "lane": "source",
      "group": "Presidential actions",
      "title": "govinfo — Daily Compilation",
      "subtitle": "1,681 packages · ~6 weeks behind",
      "status": "live",
      "pipelines": [
        "presidential"
      ],
      "what": "GPO’s Daily Compilation of Presidential Documents for 2026, enumerated by sitemap. The complete and permanent record: it carries the memoranda the Register omits, confirmed by DCPD-202600435, \"Memorandum on Lowering the Cost of Living by Promoting the Freedom To Fix\", which has no Register counterpart 51 days after signing. Two sitemaps — 2026 and 2025, because 45 of the 75 memoranda on record were posted in 2025 — enumerate the packages; presidential/fetch-dcpd.mjs turns each into a title, an issue date and a permanent citation.",
      "why": "The backstop that makes a whitehouse.gov capture citable months later. It is not, and cannot be, the thing that tells you a memorandum was signed.",
      "url": "https://www.govinfo.gov/sitemap/DCPD_2026_sitemap.xml",
      "cadence": "weekly",
      "key": null,
      "registry": [
        {
          "set": "presidential",
          "source_id": "govinfo.dcpd.sitemap.2026"
        },
        {
          "set": "presidential",
          "source_id": "govinfo.dcpd.sitemap.2025"
        }
      ],
      "links": [
        {
          "label": "Compilation of Presidential Documents",
          "url": "https://www.govinfo.gov/app/collection/CPD"
        }
      ],
      "code": [
        "tools/sources/presidential.json",
        "presidential/fetch-dcpd.mjs",
        "specs/presidential-memoranda.md"
      ],
      "caveats": [
        "The newest package on 2026-08-19 was DCPD-202600450, dated 2026-07-08 — about six weeks behind. Latency is the whole reason this cannot be the primary source, and the corpus recomputes it on every build rather than repeating this number.",
        "Most of the compilation is not documents. The majority of packages are \"Remarks at…\" or \"Statement on…\", and text is fetched only for the titles that name an instrument — a prefix test, because the compilation publishes the speech about a memorandum as its own package right beside the memorandum.",
        "Per-package title and text are at /metadata/pkg/{id}/mods.xml and /content/pkg/{id}/html/{id}.htm, both keyless. The REST API at api.govinfo.gov needs a key and DEMO_KEY rate-limits at once per few minutes, which is why the sitemap is the registered surface."
      ]
    },
    {
      "id": "src.regulations",
      "lane": "source",
      "group": "Dockets and agenda",
      "title": "Regulations.gov v4",
      "subtitle": "API key · ~1000 req/hr",
      "status": "live",
      "pipelines": [
        "tier0"
      ],
      "what": "Docket state: comment counts change, comments are withdrawn, attachments disappear.",
      "why": "The rate limit is the binding constraint on the whole plan, not the data volume.",
      "url": "https://api.regulations.gov/v4/documents?filter[postedDate][ge]=2026-07-11&page[size]=250",
      "cadence": "daily",
      "key": "DATA_GOV_API_KEY",
      "registry": [
        {
          "set": "tier0",
          "source_id": "regulations.gov.recent"
        }
      ],
      "links": [
        {
          "label": "Regulations.gov API docs",
          "url": "https://open.gsa.gov/api/regulationsgov/"
        },
        {
          "label": "Request a key",
          "url": "https://api.data.gov/signup/"
        }
      ],
      "code": [
        "tools/sources/tier0.json"
      ],
      "caveats": [
        "Skipped by the runner when the key is absent, and reported as skipped rather than failed."
      ]
    },
    {
      "id": "src.reginfo",
      "lane": "source",
      "group": "Dockets and agenda",
      "title": "reginfo.gov — Unified Agenda",
      "subtitle": "intent, never fact",
      "status": "live",
      "pipelines": [
        "tier0"
      ],
      "what": "The regulatory agenda. Editions supersede each other.",
      "why": "Aspirational content. Treat as intent, never as fact — an agenda entry is not an obligation.",
      "url": "https://www.reginfo.gov/public/do/eAgendaMain",
      "cadence": "weekly",
      "key": null,
      "registry": [
        {
          "set": "tier0",
          "source_id": "reginfo.unified_agenda"
        }
      ],
      "code": [
        "tools/sources/tier0.json"
      ]
    },
    {
      "id": "src.agency.pages",
      "lane": "source",
      "group": "Agency pages watched for edits",
      "title": "HUD, Treasury, FHFA",
      "subtitle": "4 pages edited in place",
      "status": "live",
      "pipelines": [
        "tier0"
      ],
      "what": "HUD’s CDBG program surface and press page, Treasury press releases, and FHFA advisory bulletins.",
      "why": "Guidance pages here are edited in place with no version history, and agency announcements are pulled and rewritten without notice. Treasury enforces the section 901 institutional-investor prohibition; FHFA is a named consultee on that rulemaking.",
      "url": "https://www.hud.gov/program_offices/comm_planning/cdbg",
      "cadence": "daily",
      "key": null,
      "registry": [
        {
          "set": "tier0",
          "source_id": "hud.cdbg.entitlement"
        },
        {
          "set": "tier0",
          "source_id": "hud.press"
        },
        {
          "set": "tier0",
          "source_id": "treasury.press"
        },
        {
          "set": "tier0",
          "source_id": "fhfa.advisory"
        }
      ],
      "links": [
        {
          "label": "HUD CDBG",
          "url": "https://www.hud.gov/program_offices/comm_planning/cdbg"
        },
        {
          "label": "Treasury press",
          "url": "https://home.treasury.gov/news/press-releases"
        },
        {
          "label": "FHFA advisory bulletins",
          "url": "https://www.fhfa.gov/supervision/advisory-bulletins"
        }
      ],
      "code": [
        "tools/sources/tier0.json"
      ],
      "caveats": [
        "cards/sources.mjs routes jurisdiction_roster claims at hud.cdbg.entitlement and marks it capture: \"none\". Until the roster is captured a card may state a program criterion and may not state that a named jurisdiction meets it."
      ]
    },
    {
      "id": "src.sxs",
      "lane": "source",
      "group": "Committee and analysis documents",
      "title": "Section-by-sections and CRS",
      "subtitle": "6 documents · PDFs with no permanent id",
      "status": "live",
      "pipelines": [
        "tier0"
      ],
      "what": "Four section-by-section PDFs (House Financial Services majority and minority, Senate Banking final and 2025), two CRS products, and the BPC implementation tracker.",
      "why": "CRS reports are revised in place under the same product number, so a weekly re-fetch and diff builds a revision history that exists nowhere else. Committee PDFs sit on web servers with no permanent identifier and die when the site reorganizes.",
      "url": "https://www.congress.gov/crs-product/R48732",
      "cadence": "weekly",
      "key": null,
      "registry": [
        {
          "set": "tier0",
          "source_id": "hfsc.road.sxs"
        },
        {
          "set": "tier0",
          "source_id": "hfsc.minority.road.sxs"
        },
        {
          "set": "tier0",
          "source_id": "banking.road.sxs.final"
        },
        {
          "set": "tier0",
          "source_id": "banking.road.sxs.2025"
        },
        {
          "set": "tier0",
          "source_id": "crs.R48732"
        },
        {
          "set": "tier0",
          "source_id": "crs.R48849"
        },
        {
          "set": "tier0",
          "source_id": "bpc.road_tracker"
        }
      ],
      "links": [
        {
          "label": "CRS R48732",
          "url": "https://www.congress.gov/crs-product/R48732"
        },
        {
          "label": "BPC implementation tracker",
          "url": "https://bipartisanpolicy.org/hub/21st-century-road-to-housing-act-implementation-tracker/"
        }
      ],
      "code": [
        "tools/sources/tier0.json"
      ],
      "caveats": [
        "Secondary sources. A claim sourced here is secondary_source_unverified and cannot be published as a card until it is checked against the enrolled text."
      ]
    },
    {
      "id": "src.state.law",
      "lane": "source",
      "group": "Named, uncaptured",
      "title": "State law corpora",
      "subtitle": "no endpoint · 56 jurisdictions",
      "status": "uncaptured",
      "pipelines": [
        "cards"
      ],
      "what": "The jurisdiction’s own law, which decides whether a preemptive provision actually reaches it. Fifty-six corpora, no federal endpoint, and no plausible one.",
      "why": "Listed here — uncaptured, named — rather than left out, because a source nothing is watching and a source nobody thought of look identical from inside the pipeline, and only one of them is a plan.",
      "cadence": "none",
      "key": null,
      "code": [
        "cards/sources.mjs",
        "cards/state.mjs"
      ],
      "caveats": [
        "A card whose reach is \"preemptive\" can say the act reaches a category of state law and can never say, from federal sources alone, what any given state’s law does."
      ]
    },
    {
      "id": "src.anthropic",
      "lane": "source",
      "group": "Model provider",
      "title": "Anthropic Messages API",
      "subtitle": "one narrow job · not a record source",
      "status": "external",
      "pipelines": [
        "fedreg"
      ],
      "what": "Writes one sentence per agency for the daily page, from evidence assembled out of the day file. Moved here from OpenRouter on 2026-08-12, after the account it routed through was never funded and the summariser had been failing silently.",
      "why": "The only generative step in the pipeline. Every sentence it writes carries the prompt hash, the evidence hash and the model id, and a sentence can be withheld — so the output is auditable and refusable rather than trusted.",
      "url": "https://api.anthropic.com/v1/messages",
      "cadence": "daily",
      "key": "ANTHROPIC_API_KEY",
      "links": [
        {
          "label": "Anthropic API docs",
          "url": "https://docs.claude.com/en/api/messages"
        }
      ],
      "code": [
        "daily/summarize.mjs",
        ".github/workflows/fedreg-daily.yml"
      ],
      "caveats": [
        "Not a record source and not in the capture registry. Nothing it produces is a citation; the citation is always the document the sentence was written from."
      ]
    },
    {
      "id": "cap.runner",
      "lane": "capture",
      "group": "The runner",
      "title": "tools/snapshot.mjs",
      "subtitle": "one set per invocation",
      "status": "live",
      "pipelines": [
        "fedreg",
        "pi",
        "floor",
        "tier0",
        "cards"
      ],
      "what": "Reads a source set, fetches each entry conditionally, writes the body as a blob, appends one capture record per outcome, and seals the day’s digest. Three sets exist — tier0, fedreg, floor — on three different clocks.",
      "why": "Conditional requests (If-None-Match / If-Modified-Since) mean polling an unchanged page every day is nearly free. Redirects are followed hop by hop and recorded, because a 200 that becomes a 301 to a stub is a deletion event and following it silently destroys the evidence.",
      "path": "tools/snapshot.mjs",
      "cadence": "cron, per set",
      "code": [
        "tools/snapshot.mjs",
        "tools/lib/fetcher.mjs",
        "tools/lib/store.mjs",
        "tools/lib/dates.mjs",
        ".github/workflows/fedreg-daily.yml",
        ".github/workflows/fedreg-public-inspection.yml",
        ".github/workflows/floor-daily.yml"
      ],
      "caveats": [
        "Zero runtime dependencies, deliberately. Node 22 gives fetch, crypto and zlib in core, which is all this needs, and a dependency tree is the most likely thing to rot underneath a job whose whole value is running unattended for 24 months."
      ]
    },
    {
      "id": "cap.record",
      "lane": "capture",
      "group": "The store",
      "title": "Capture record",
      "subtitle": "manifests/dt=YYYY-MM-DD/captures.jsonl",
      "status": "live",
      "pipelines": [
        "fedreg",
        "pi",
        "floor",
        "tier0",
        "presidential"
      ],
      "what": "One append-only JSON line per fetch attempt. This is the closest thing the project has to a fact table, and everything downstream is joined to it by capture_id and content_sha256.",
      "why": "A record is written for every outcome — 200, 304, 404, 403, network failure. A 304 is a positive observation of non-change; without it the archive cannot tell \"we looked and it was identical\" from \"we did not look\".",
      "path": "manifests/dt=YYYY-MM-DD/captures.jsonl",
      "code": [
        "tools/lib/fetcher.mjs",
        "tools/lib/store.mjs"
      ],
      "fields": [
        {
          "name": "schema_version",
          "type": "number",
          "note": "CAPTURE_SCHEMA_VERSION, currently 1"
        },
        {
          "name": "capture_id",
          "type": "string",
          "note": "cap_<utc-timestamp>_<8 hex> — sortable, and the join key downstream"
        },
        {
          "name": "source_id",
          "type": "string",
          "note": "the registry entry in tools/sources/*.json"
        },
        {
          "name": "url",
          "type": "string",
          "note": "as requested, before redirects"
        },
        {
          "name": "final_url",
          "type": "string|null",
          "note": "null when no redirect happened"
        },
        {
          "name": "method",
          "type": "string",
          "note": "'GET'"
        },
        {
          "name": "request_headers",
          "type": "object",
          "note": "including the conditional headers actually sent"
        },
        {
          "name": "fetched_at",
          "type": "string",
          "note": "ISO 8601, UTC"
        },
        {
          "name": "duration_ms",
          "type": "number"
        },
        {
          "name": "http_status",
          "type": "number|null",
          "note": "null when the request never completed"
        },
        {
          "name": "response_headers",
          "type": "object|null"
        },
        {
          "name": "redirect_chain",
          "type": "array",
          "note": "{url, status, location} per hop"
        },
        {
          "name": "content_sha256",
          "type": "string|null",
          "note": "the blob key; null for 304, 404 and errors"
        },
        {
          "name": "content_length",
          "type": "number|null"
        },
        {
          "name": "content_type",
          "type": "string|null"
        },
        {
          "name": "etag",
          "type": "string|null",
          "note": "fed back as If-None-Match on the next run"
        },
        {
          "name": "last_modified",
          "type": "string|null",
          "note": "fed back as If-Modified-Since"
        },
        {
          "name": "tool_version",
          "type": "string"
        },
        {
          "name": "config_sha256",
          "type": "string|null",
          "note": "hash of the source set that produced this run"
        },
        {
          "name": "error",
          "type": "object|null",
          "note": "{name, message} — a network failure is an observation, not a crash"
        }
      ],
      "sampleWithheld": "The store lives in R2 and in a gitignored local root, not in the repository. Restore it with the workflow’s rclone step, or run `npm run archive:dry` to see records for a live set without writing anything.",
      "caveats": [
        "Blob first, then the manifest line. A blob with no manifest line is collectable garbage; a manifest line with no blob is unrepairable corruption."
      ]
    },
    {
      "id": "cap.blob",
      "lane": "capture",
      "group": "The store",
      "title": "Blob",
      "subtitle": "blobs/sha256/aa/bb/<sha256>.gz",
      "status": "live",
      "pipelines": [
        "fedreg",
        "pi",
        "floor",
        "tier0",
        "presidential"
      ],
      "what": "The response body, gzipped at level 9, content-addressed by SHA-256 and sharded two levels so no directory gets pathological.",
      "why": "Content-addressed means a repeat write is a no-op, which is what makes polling an unchanged page every day free. Written to a temp name and renamed, so a partial blob is never visible under its hash — the hash is the integrity claim.",
      "path": "blobs/sha256/<aa>/<bb>/<sha256>.gz",
      "code": [
        "tools/lib/store.mjs"
      ],
      "fields": [
        {
          "name": "<body>",
          "type": "bytes",
          "note": "exactly what the wire delivered, gzipped. Never reformatted."
        }
      ],
      "sampleWithheld": "Immutable captured bytes; not in the repository."
    },
    {
      "id": "cap.digest",
      "lane": "capture",
      "group": "The store",
      "title": "Day digest",
      "subtitle": "manifests/dt=YYYY-MM-DD/digest.json",
      "status": "live",
      "pipelines": [
        "fedreg",
        "pi",
        "floor",
        "tier0",
        "presidential"
      ],
      "what": "A merkle root over every capture record for the day, plus the hash of the previous day’s digest. That link is the chain.",
      "why": "The root is computed over records sorted by capture_id, so it is independent of write order — two runs that captured the same things in a different sequence must produce the same root, or the chain proves nothing.",
      "path": "manifests/dt=YYYY-MM-DD/digest.json",
      "code": [
        "tools/lib/store.mjs",
        "tools/snapshot.mjs",
        "tools/verify.mjs"
      ],
      "fields": [
        {
          "name": "schema_version",
          "type": "number"
        },
        {
          "name": "date",
          "type": "string"
        },
        {
          "name": "n_captures",
          "type": "number"
        },
        {
          "name": "n_ok",
          "type": "number",
          "note": "200 with a body"
        },
        {
          "name": "n_unchanged",
          "type": "number",
          "note": "304 — looked, identical"
        },
        {
          "name": "n_error",
          "type": "number"
        },
        {
          "name": "merkle_root",
          "type": "string"
        },
        {
          "name": "prev_date",
          "type": "string|null"
        },
        {
          "name": "prev_digest_sha256",
          "type": "string|null"
        },
        {
          "name": "sealed_at",
          "type": "string"
        }
      ],
      "sample": {
        "file": "anchor/2026-08-17.json",
        "text": "{\n  \"schema_version\": 1,\n  \"date\": \"2026-08-17\",\n  \"n_captures\": 82,\n  \"n_ok\": 44,\n  \"n_unchanged\": 30,\n  \"n_error\": 0,\n  \"merkle_root\": \"136320032b661c8c05f84f7bfaef1400bf1cc165e9acebbabe2e3f1cc2883ca2\",\n  \"prev_date\": \"2026-08-16\",\n  \"prev_digest_sha256\": null,\n  \"sealed_at\": \"2026-08-17T22:48:41.793Z\"\n}",
        "truncated": false
      },
      "caveats": [
        "The record shown is the copy committed to anchor/, because the store itself is not in the repository. It is the same object — the workflow commits the sealed digest verbatim."
      ],
      "bytes": "308 bytes on disk"
    },
    {
      "id": "cap.run",
      "lane": "capture",
      "group": "The store",
      "title": "Run metadata",
      "subtitle": "runs/<run_id>.json",
      "status": "live",
      "pipelines": [
        "fedreg",
        "pi",
        "floor",
        "tier0",
        "presidential"
      ],
      "what": "One file per invocation: which set ran, when, against what config, and what it did.",
      "path": "runs/<run_id>.json",
      "code": [
        "tools/snapshot.mjs",
        "tools/lib/store.mjs"
      ],
      "sampleWithheld": "Written into the store root, not the repository."
    },
    {
      "id": "cap.r2",
      "lane": "capture",
      "group": "Where it lives",
      "title": "Cloudflare R2",
      "subtitle": "bucket downstream-snapshots · WNAM",
      "status": "live",
      "pipelines": [
        "fedreg",
        "pi",
        "floor",
        "tier0",
        "presidential"
      ],
      "what": "The durable home of blobs, manifests and runs. Each scheduled job restores manifests before writing and pushes afterwards.",
      "why": "Zero egress, which matters for an archive that only grows. Blobs are deliberately not restored on a normal run — they are the bulk, and pulling a year of them every morning to render a page would be absurd.",
      "code": [
        ".github/workflows/fedreg-daily.yml",
        ".github/workflows/archive-restore-test.yml",
        "specs/stack.md"
      ],
      "caveats": [
        "A weekly restore test rebuilds the manifest history from the bucket, re-verifies the chain and re-hashes a sample of blobs. An untested backup is not a backup."
      ]
    },
    {
      "id": "cap.anchor",
      "lane": "capture",
      "group": "Where it lives",
      "title": "anchor/*.json",
      "subtitle": "the digest chain, committed",
      "status": "live",
      "pipelines": [
        "fedreg"
      ],
      "what": "Yesterday’s sealed digest, committed to the repository once a day. Hashes and counts only — no captured content, no URLs.",
      "why": "The archive lives in a bucket we control, so \"we have a hash\" proves nothing on its own. Git is itself a hash chain and the host timestamps each commit, so altering a past day means altering a commit a third party already recorded.",
      "path": "anchor/",
      "code": [
        "anchor/README.md",
        ".github/workflows/fedreg-daily.yml"
      ],
      "fields": [
        {
          "name": "date",
          "type": "string"
        },
        {
          "name": "n_captures / n_ok / n_unchanged / n_error",
          "type": "number"
        },
        {
          "name": "merkle_root",
          "type": "string"
        },
        {
          "name": "prev_date",
          "type": "string|null"
        },
        {
          "name": "prev_digest_sha256",
          "type": "string|null",
          "note": "the link. Null on a day whose predecessor was not sealed."
        },
        {
          "name": "sealed_at",
          "type": "string"
        }
      ],
      "omits": [
        {
          "name": "schema_version",
          "why": "a real field on this file — see cap.digest, the same record read for its schema — but not part of what this node calls \"the anchor\": the merkle root, the hashes and the link to the prior day."
        }
      ],
      "sample": {
        "file": "anchor/2026-08-17.json",
        "text": "{\n  \"schema_version\": 1,\n  \"date\": \"2026-08-17\",\n  \"n_captures\": 82,\n  \"n_ok\": 44,\n  \"n_unchanged\": 30,\n  \"n_error\": 0,\n  \"merkle_root\": \"136320032b661c8c05f84f7bfaef1400bf1cc165e9acebbabe2e3f1cc2883ca2\",\n  \"prev_date\": \"2026-08-16\",\n  \"prev_digest_sha256\": null,\n  \"sealed_at\": \"2026-08-17T22:48:41.793Z\"\n}",
        "truncated": false
      },
      "caveats": [
        "This repository is ours, so the anchor is weaker than one held somewhere else. Moving it to a separate public repository is a five-minute change to the workflow’s last step."
      ],
      "bytes": "308 bytes on disk"
    },
    {
      "id": "cap.turso",
      "lane": "capture",
      "group": "Where it lives",
      "title": "Turso (libSQL)",
      "subtitle": "provisioned · nothing reads it yet",
      "status": "planned",
      "pipelines": [],
      "what": "A SQLite-compatible store in aws-us-west-2, provisioned 2026-08-05 and empty. The site reads flat files; the day JSON is the store.",
      "why": "It becomes load-bearing at point-in-time eCFR diffs, where bitemporal queries are the whole job. Chosen over Postgres because the workload is small, read-mostly, single-writer and batch-only — at the cost that SQLite cannot enforce non-overlapping validity windows, so that check moves into application code.",
      "code": [
        "specs/stack.md",
        "specs/the-new-plan.md",
        ".github/workflows/smoke-secrets.yml"
      ],
      "fields": [
        {
          "name": "source_url",
          "type": "text",
          "note": "planned: on every fact table, non-negotiable"
        },
        {
          "name": "retrieved_at",
          "type": "text",
          "note": "planned"
        },
        {
          "name": "sha256",
          "type": "text",
          "note": "planned"
        },
        {
          "name": "recorded_at",
          "type": "text",
          "note": "planned"
        },
        {
          "name": "valid_from / valid_to",
          "type": "text",
          "note": "planned: on every fact with a real-world validity window"
        }
      ],
      "caveats": [
        "Drawn dashed because it is real infrastructure with no rows in it. If you are debugging today’s data, it is not here — it is in the JSON files in the next lane.",
        "Every write path that sets valid_from/valid_to must go through one overlap-checking function. That is the condition the Postgres trade-off was accepted under."
      ]
    },
    {
      "id": "ds.presidential",
      "lane": "dataset",
      "group": "Presidential actions",
      "title": "Presidential corpus",
      "subtitle": "presidential/data/documents.json · schema 1",
      "status": "live",
      "pipelines": [
        "presidential"
      ],
      "what": "One record per document rather than per day: a content-derived doc_uid, the identity that minted it, and every publisher’s rendering of it — whitehouse.gov, the Federal Register, and eventually the GPO compilation — each with that publisher’s own identifier kept verbatim.",
      "why": "A presidential memorandum has no number and no single publisher, so it cannot be keyed the way a bill or a Federal Register document can. Identity comes from the text, and every cross-publisher link carries the method that produced it: identical bytes and \"the titles look alike\" are both recorded, and they are not the same claim.",
      "path": "presidential/data/documents.json",
      "cadence": "daily (12:45 UTC, weekdays)",
      "code": [
        "presidential/build.mjs",
        "presidential/parse.mjs",
        "presidential/fetch-text.mjs",
        "presidential/lib/archive.mjs",
        "tools/lib/docid.mjs"
      ],
      "fields": [
        {
          "name": "schema_version",
          "type": "number",
          "note": "currently 1"
        },
        {
          "name": "identity.normalizer_version / identity.incipit_chars",
          "type": "number",
          "note": "change either and every doc_uid changes, so both travel with the data"
        },
        {
          "name": "documents[].doc_uid",
          "type": "string",
          "note": "pd-<sha256(incipit)[0:16]> — the document, stable across publishers and edits"
        },
        {
          "name": "documents[].identity.text_sha256",
          "type": "string",
          "note": "the rendering. Same doc_uid, different text_sha256 = printed differently, or edited"
        },
        {
          "name": "documents[].identity.head_anchor",
          "type": "string",
          "note": "which rule found the start of the operative text; after_title and after_breadcrumb are the weak ones"
        },
        {
          "name": "documents[].register_state",
          "type": "string",
          "note": "published | undetermined_within_lag_window | absent_from_federal_register"
        },
        {
          "name": "documents[].renderings[].link_method",
          "type": "string",
          "note": "text_sha256 | incipit_sha256 | shingle_jaccard | title_jaccard — never a bare boolean"
        },
        {
          "name": "documents[].renderings[].text_identical",
          "type": "boolean",
          "note": "false with a link present means two publishers print the same document differently"
        },
        {
          "name": "reconciliation.wh_to_fr_lag_days",
          "type": "object",
          "note": "recomputed every run from content-tier links only"
        },
        {
          "name": "reconciliation.rejected_weak_links",
          "type": "array",
          "note": "title matches the dates refused"
        },
        {
          "name": "unidentified",
          "type": "array",
          "note": "documents that minted no identity, kept rather than dropped"
        }
      ],
      "caveats": [
        "register_state is decided against the maximum lag observed in the same run, never a constant. A document younger than that is undetermined, not absent.",
        "The compilation half is enumeration only. The sitemap says which DCPD packages exist and nothing about their contents, so nothing there joins to a document yet.",
        "A doc_uid collision fails the build rather than warning. Two different documents minting one identity means the incipit window has fallen below the longest prefix they share, and every consumer downstream would silently treat them as one."
      ]
    },
    {
      "id": "ds.daily.day",
      "lane": "dataset",
      "group": "Federal Register",
      "title": "Day file",
      "subtitle": "daily/data/YYYY-MM-DD.json · schema 2",
      "status": "live",
      "pipelines": [
        "fedreg"
      ],
      "what": "One file per publishing day, written from the hashed capture. Counts by type, the dated obligations the day created, every document in the issue, and the provenance block that ties all of it back to a capture_id and a merkle root.",
      "why": "This is the store. The ingest step writes it from the archive and every page is then rendered from the JSON — which means the whole site can be rebuilt with no archive at all, and a template change propagates to every historical page.",
      "path": "daily/data/2026-08-17.json",
      "cadence": "daily, twice (11:15 and 20:15 UTC, weekdays)",
      "code": [
        "daily/build.mjs",
        "daily/lib/corpus.mjs",
        "daily/lib/render.mjs"
      ],
      "fields": [
        {
          "name": "schema_version",
          "type": "number",
          "note": "currently 2"
        },
        {
          "name": "publication_date",
          "type": "string",
          "note": "Eastern-time publication date — the primary key"
        },
        {
          "name": "built_at",
          "type": "string"
        },
        {
          "name": "n_documents / n_agencies",
          "type": "number"
        },
        {
          "name": "counts_by_type",
          "type": "object",
          "note": "Rule / Proposed Rule / Notice / Presidential Document"
        },
        {
          "name": "truncated",
          "type": "boolean",
          "note": "true if the API capped the page and documents are missing"
        },
        {
          "name": "provenance.source_id",
          "type": "string",
          "note": "fr.documents.day"
        },
        {
          "name": "provenance.url",
          "type": "string",
          "note": "the exact request, field list and all"
        },
        {
          "name": "provenance.retrieved_at",
          "type": "string"
        },
        {
          "name": "provenance.http_status",
          "type": "number"
        },
        {
          "name": "provenance.content_sha256",
          "type": "string",
          "note": "the blob this was parsed from"
        },
        {
          "name": "provenance.capture_id",
          "type": "string",
          "note": "joins to the capture record"
        },
        {
          "name": "provenance.day_merkle_root",
          "type": "string",
          "note": "joins to the digest chain"
        },
        {
          "name": "obligations[].type",
          "type": "string",
          "note": "'comment_close' | 'effective_date'"
        },
        {
          "name": "obligations[].date",
          "type": "string",
          "note": "a date the government printed, never a projection"
        },
        {
          "name": "obligations[].days_from_publication",
          "type": "number",
          "note": "negative for a date already past"
        },
        {
          "name": "obligations[].certainty",
          "type": "string",
          "note": "hard enum 'statutory'. Never a probability."
        },
        {
          "name": "obligations[].label",
          "type": "string",
          "note": "'Takes effect' / 'Comments close'"
        },
        {
          "name": "obligations[].document_number",
          "type": "string",
          "note": "joins to documents[]"
        },
        {
          "name": "obligations[].title",
          "type": "string"
        },
        {
          "name": "obligations[].agencies",
          "type": "array"
        },
        {
          "name": "obligations[].html_url / obligations[].pdf_url",
          "type": "string"
        },
        {
          "name": "documents[].document_number",
          "type": "string",
          "note": "the Federal Register’s own id — the join key everywhere"
        },
        {
          "name": "documents[].type",
          "type": "string"
        },
        {
          "name": "documents[].title",
          "type": "string"
        },
        {
          "name": "documents[].abstract",
          "type": "string|null"
        },
        {
          "name": "documents[].agencies",
          "type": "array",
          "note": "names as published"
        },
        {
          "name": "documents[].agency_slugs",
          "type": "array",
          "note": "normalised against the FR agencies vocabulary"
        },
        {
          "name": "documents[].significant",
          "type": "boolean|null",
          "note": "the FR’s own flag, not ours"
        },
        {
          "name": "documents[].citation",
          "type": "string",
          "note": "e.g. \"91 FR 53355\""
        },
        {
          "name": "documents[].effective_on",
          "type": "string|null"
        },
        {
          "name": "documents[].comments_close_on",
          "type": "string|null"
        },
        {
          "name": "documents[].docket_ids",
          "type": "array"
        },
        {
          "name": "documents[].regulation_id_numbers",
          "type": "array",
          "note": "RINs"
        },
        {
          "name": "documents[].cfr_references",
          "type": "array"
        },
        {
          "name": "documents[].html_url / documents[].pdf_url",
          "type": "string",
          "note": "the citation targets"
        },
        {
          "name": "documents[].salient",
          "type": "boolean",
          "note": "ours, computed. See the rule below."
        },
        {
          "name": "public_inspection.retrieved_at",
          "type": "string"
        },
        {
          "name": "public_inspection.n",
          "type": "number",
          "note": "documents on the desk at that moment"
        }
      ],
      "sample": {
        "file": "daily/data/2026-08-17.json",
        "text": "{\n  \"schema_version\": 2,\n  \"publication_date\": \"2026-08-17\",\n  \"built_at\": \"2026-08-17T20:45:37.858Z\",\n  \"n_documents\": 84,\n  \"n_agencies\": 43,\n  \"counts_by_type\": {\n    \"Presidential Document\": 1,\n    \"Proposed Rule\": 8,\n    \"Notice\": 70,\n    \"Rule\": 5\n  },\n  \"truncated\": false,\n  \"provenance\": {\n    \"source_id\": \"fr.documents.day\",\n    \"url\": \"https://www.federalregister.gov/api/v1/documents.json?per_page=1000&order=newest&conditions[publication_date][is]=2026-08-17&fields[]=document_number&fields[]=title&fields[]=type&fields[]=subtype&fiel… (+577 chars)\",\n    \"retrieved_at\": \"2026-08-17T20:44:41.151Z\",\n    \"http_status\": 200,\n    \"content_sha256\": \"82b5f4c8c2d3688778ca9a3f0372e1141fc6016f88ac4402acdaebf5b24c2eed\",\n    \"capture_id\": \"cap_20260817204441151_b972232f\",\n    \"day_merkle_root\": \"2d607d76aa0fc648b5bc6838c13bb0aea30a70e9353b4c08507e9baa9c4faa75\"\n  },\n  \"obligations\": [\n    {\n      \"type\": \"effective_date\",\n      \"date\": \"2026-06-24\",\n      \"days_from_publication\": -54,\n      \"certainty\": \"statutory\",\n      \"label\": \"Takes effect\",\n      \"document_number\": \"2026-16760\",\n      \"title\": \"Supplemental Nutrition Assistance Program: Changes in Federal-State Administrative Cost Sharing; Extension of Comment Period\",\n      \"agencies\": [\n        \"Agriculture Department\",\n        \"Food and Nutrition Administration\"\n      ],\n      \"html_url\": \"https://www.federalregister.gov/documents/2026/08/17/2026-16760/supplemental-nutrition-assistance-program-changes-in-federal-state-administrative-cost-sharing\",\n      \"pdf_url\": \"https://www.govinfo.gov/content/pkg/FR-2026-08-17/pdf/2026-16760.pdf\"\n    },\n    {\n      \"type\": \"effective_date\",\n      \"date\": \"2026-08-12\",\n      \"days_from_publication\": -5,\n      \"certainty\": \"statutory\",\n      \"label\": \"Takes effect\",\n      \"document_number\": \"2026-16706\",\n      \"title\": \"Order Under Sections 362 and 365 of the Public Health Service Act Continuing the Suspension of the Right To Introduce Certain Persons From Countries Where a Quarantinable Communicable Disease Exists\",\n      \"agencies\": [\n        \"Health and Human Services Department\",\n        \"Centers for Disease Control and Prevention\"\n      ],\n      \"html_url\": \"https://www.federalregister.gov/documents/2026/08/17/2026-16706/order-under-sections-362-and-365-of-the-public-health-service-act-continuing-the-suspension-of-the\",\n      \"pdf_url\": \"https://www.govinfo.gov/content/pkg/FR-2026-08-17/pdf/2026-16706.pdf\"\n    },\n    \"… 39 more of 41\"\n  ],\n  \"documents\": [\n    {\n      \"document_number\": \"2026-16799\",\n      \"type\": \"Presidential Document\",\n      \"title\": \"National Substance Use Primary Prevention Month, 2026\",\n      \"abstract\": null,\n      \"agencies\": [\n        \"Executive Office of the President\"\n      ],\n      \"agency_slugs\": [\n        \"executive-office-of-the-president\"\n      ],\n      \"significant\": null,\n      \"citation\": \"91 FR 53355\",\n      \"effective_on\": null,\n      \"comments_close_on\": null,\n      \"docket_ids\": [],\n      \"regulation_id_numbers\": [],\n      \"cfr_references\": [],\n      \"html_url\": \"https://www.federalregister.gov/documents/2026/08/17/2026-16799/national-substance-use-primary-prevention-month-2026\",\n      \"pdf_url\": \"https://www.govinfo.gov/content/pkg/FR-2026-08-17/pdf/2026-16799.pdf\",\n      \"salient\": true\n    },\n    {\n      \"document_number\": \"2026-16774\",\n      \"type\": \"Proposed Rule\",\n      \"title\": \"Revocation of Class E Airspace; Santa Elena, TX\",\n      \"abstract\": \"This action proposes to revoke the Class E airspace at Diamond \\\"O\\\" Ranch Airport, Santa Elena, TX. The FAA is proposing this action due to the instr\n… trimmed",
        "truncated": true
      },
      "caveats": [
        "The salience rule is three disjunctive tests, not a model and not a ranking score: a Presidential Document is salient; a document the FR itself marks significant is salient; a Rule or Proposed Rule carrying a dated obligation is salient. Everything else is still listed in full further down the page.",
        "An obligation is only ever comments_close_on or effective_on — a date printed in the document. Nothing here is inferred."
      ],
      "bytes": "145,510 bytes on disk"
    },
    {
      "id": "ds.daily.index",
      "lane": "dataset",
      "group": "Federal Register",
      "title": "Day index",
      "subtitle": "daily/data/index.json",
      "status": "live",
      "pipelines": [
        "fedreg"
      ],
      "what": "Which days the archive holds, and which one is latest.",
      "why": "The MCP server answers \"the latest day held\" from this rather than from today’s date, so a missed run reads as a missing day instead of an empty one.",
      "path": "daily/data/index.json",
      "code": [
        "daily/build.mjs",
        "api/mcp.js"
      ],
      "fields": [
        {
          "name": "schema_version",
          "type": "number"
        },
        {
          "name": "latest",
          "type": "string"
        },
        {
          "name": "days",
          "type": "string[]",
          "note": "ascending YYYY-MM-DD"
        },
        {
          "name": "built_at",
          "type": "string"
        }
      ],
      "sample": {
        "file": "daily/data/index.json",
        "text": "{\n  \"schema_version\": 1,\n  \"latest\": \"2026-08-21\",\n  \"days\": [\n    \"2026-08-10\",\n    \"2026-08-11\",\n    \"… 8 more of 10\"\n  ],\n  \"built_at\": \"2026-08-21T20:43:44.753Z\"\n}",
        "truncated": true
      },
      "bytes": "290 bytes on disk"
    },
    {
      "id": "ds.daily.summaries",
      "lane": "dataset",
      "group": "Federal Register",
      "title": "Agency sentences",
      "subtitle": "daily/data/summaries/YYYY-MM-DD.json",
      "status": "live",
      "pipelines": [
        "fedreg"
      ],
      "what": "One sentence per agency for the day, generated from evidence assembled out of the day file. Each carries the model id, the prompt hash, the evidence hash, and whether it was withheld.",
      "why": "A withheld sentence carries reasons and no text. That is the gate working: the generator is allowed to decline, and a decline is recorded rather than silently replaced with prose.",
      "path": "daily/data/summaries/2026-08-17.json",
      "code": [
        "daily/summarize.mjs",
        "daily/lib/render.mjs"
      ],
      "fields": [
        {
          "name": "schema_version",
          "type": "number"
        },
        {
          "name": "publication_date",
          "type": "string"
        },
        {
          "name": "gate",
          "type": "string",
          "note": "which gate version passed this file"
        },
        {
          "name": "summaries.<agency-slug>.agency",
          "type": "string"
        },
        {
          "name": "summaries.<agency-slug>.text",
          "type": "string",
          "note": "absent when withheld"
        },
        {
          "name": "summaries.<agency-slug>.withheld",
          "type": "boolean"
        },
        {
          "name": "summaries.<agency-slug>.reasons",
          "type": "array",
          "note": "present only when withheld"
        },
        {
          "name": "summaries.<agency-slug>.model",
          "type": "string"
        },
        {
          "name": "summaries.<agency-slug>.prompt_sha256",
          "type": "string"
        },
        {
          "name": "summaries.<agency-slug>.evidence_sha256",
          "type": "string",
          "note": "hash of exactly what the model was shown"
        },
        {
          "name": "summaries.<agency-slug>.generated_at",
          "type": "string"
        }
      ],
      "sample": {
        "file": "daily/data/summaries/2026-08-17.json",
        "text": "{\n  \"schema_version\": 1,\n  \"publication_date\": \"2026-08-17\",\n  \"gate\": \"cards/fidelity.mjs\",\n  \"summaries\": {\n    \"executive-office-of-the-president\": {\n      \"agency\": \"Executive Office of the President\",\n      \"text\": \"The Executive Office of the President published a proclamation designating August 2026 as National Substance Use Primary Prevention Month.\",\n      \"withheld\": false,\n      \"model\": \"claude-haiku-4-5-20251001\",\n      \"prompt_sha256\": \"b221c3e11b4ddf52536395e736db89b98527f192ab35e4d1ab4b329f7a6c099c\",\n      \"evidence_sha256\": \"aba49b3f2a75414f1ef680a0474dbe1709355384593d0a64a6d00862e47410e9\",\n      \"generated_at\": \"2026-08-17T11:44:59.221Z\"\n    },\n    \"transportation-department\": {\n      \"agency\": \"Transportation Department\",\n      \"text\": \"The Transportation Department published three proposed rules and five notices on August 17, 2026.\",\n      \"withheld\": false,\n      \"model\": \"claude-haiku-4-5-20251001\",\n      \"prompt_sha256\": \"b221c3e11b4ddf52536395e736db89b98527f192ab35e4d1ab4b329f7a6c099c\",\n      \"evidence_sha256\": \"1d71294be46de1e62bdaf597d5e47fa70ec917b1ee182f4a0029bf0dbafc179e\",\n      \"generated_at\": \"2026-08-17T11:45:00.708Z\"\n    },\n    \"federal-aviation-administration\": {\n      \"agency\": \"Federal Aviation Administration\",\n      \"text\": \"The Federal Aviation Administration published three proposed rules on airspace revocation and establishment, engine airworthiness directives, and one notice regarding privacy ICAO address information … (+19 chars)\",\n      \"withheld\": false,\n      \"model\": \"claude-haiku-4-5-20251001\",\n      \"prompt_sha256\": \"b221c3e11b4ddf52536395e736db89b98527f192ab35e4d1ab4b329f7a6c099c\",\n      \"evidence_sha256\": \"82bb226cbe1992480efb51154325f742721d897fe167fda4895c01e616f7596c\",\n      \"generated_at\": \"2026-08-17T11:45:01.831Z\"\n    },\n    \"treasury-department\": {\n      \"agency\": \"Treasury Department\",\n      \"withheld\": true,\n      \"reasons\": [\n        \"241 characters, cap is 240\"\n      ],\n      \"model\": \"claude-haiku-4-5-20251001\",\n      \"prompt_sha256\": \"b221c3e11b4ddf52536395e736db89b98527f192ab35e4d1ab4b329f7a6c099c\",\n      \"evidence_sha256\": \"4710f5439994b01a09011da9975034fa02ae1228f11b6b4007be003ab4c8f44a\",\n      \"generated_at\": \"2026-08-17T20:45:39.174Z\"\n    },\n    \"internal-revenue-service\": {\n      \"agency\": \"Internal Revenue Service\",\n      \"text\": \"The Internal Revenue Service published a proposed rule removing reporting requirements for certain trusts on charitable contributions from passthrough entities.\",\n      \"withheld\": false,\n      \"model\": \"claude-haiku-4-5-20251001\",\n      \"prompt_sha256\": \"b221c3e11b4ddf52536395e736db89b98527f192ab35e4d1ab4b329f7a6c099c\",\n      \"evidence_sha256\": \"dcfc0bf3822ebd82414a0f1b120ba24a63dbfcf81bb27899490ad034ba1b7d4d\",\n      \"generated_at\": \"2026-08-17T20:45:40.039Z\"\n    },\n    \"securities-and-exchange-commission\": {\n      \"agency\": \"Securities and Exchange Commission\",\n      \"text\": \"The Securities and Exchange Commission published 17 notices on August 17, 2026, concerning fund filings, exchange fee schedules, and information collection activities.\",\n      \"withheld\": false,\n      \"model\": \"claude-haiku-4-5-20251001\",\n      \"prompt_sha256\": \"b221c3e11b4ddf52536395e736db89b98527f192ab35e4d1ab4b329f7a6c099c\",\n      \"evidence_sha256\": \"99c5298822e5a1bb15052e13c9f39c722dadc64454eb5edb43a89d5b74e21f86\",\n      \"generated_at\": \"2026-08-17T11:45:07.552Z\"\n    },\n    \"health-and-human-services-department\": {\n      \"agency\": \"Health and Human Services Department\",\n      \"text\": \"The Department of Health and Human Services published 17 documents on August 1\n… trimmed",
        "truncated": true
      },
      "caveats": [
        "The only model-written text in the project. It is never a citation — the citation is the document underneath it."
      ],
      "bytes": "25,034 bytes on disk"
    },
    {
      "id": "ds.floor.week",
      "lane": "dataset",
      "group": "House floor",
      "title": "Week file",
      "subtitle": "floor/data/YYYY-MM-DD.json",
      "status": "live",
      "pipelines": [
        "floor"
      ],
      "what": "One file per week-of-Monday: every measure queued, its posture, the documents attached to it, and the add/remove/republish history the House itself records.",
      "why": "revision_count and publish_dates are what make \"this bill was added Thursday afternoon\" a citable claim rather than something we noticed.",
      "path": "floor/data/2026-07-20.json",
      "cadence": "daily while in session",
      "code": [
        "floor/build.mjs",
        "floor/parse.mjs",
        "floor/render.mjs"
      ],
      "fields": [
        {
          "name": "ok",
          "type": "boolean",
          "note": "false for a week with no document — see the miss record below"
        },
        {
          "name": "week.week_of",
          "type": "string",
          "note": "the Monday. Primary key."
        },
        {
          "name": "week.congress",
          "type": "number"
        },
        {
          "name": "week.current_status",
          "type": "string",
          "note": "the House’s own status letter"
        },
        {
          "name": "week.created_at / week.first_published_at / week.last_updated_at",
          "type": "string",
          "note": "House-local timestamps, no zone"
        },
        {
          "name": "week.revision_count",
          "type": "number",
          "note": "26 in the week of 2026-07-20"
        },
        {
          "name": "week.publish_dates",
          "type": "string[]"
        },
        {
          "name": "week.unknown_categories",
          "type": "array",
          "note": "anything the parser did not recognise — empty is the expected state"
        },
        {
          "name": "week.items[].item_id",
          "type": "string",
          "note": "the House’s id"
        },
        {
          "name": "week.items[].posture",
          "type": "string",
          "note": "'suspension' | 'rule' | 'other'"
        },
        {
          "name": "week.items[].legis_num_raw",
          "type": "string|null",
          "note": "as printed, e.g. \"H.R. 2715\""
        },
        {
          "name": "week.items[].measure",
          "type": "object|null",
          "note": "{measure_id, type, number, display, chamber, kind, congress}"
        },
        {
          "name": "week.items[].unnumbered",
          "type": "boolean",
          "note": "true for a Rules Committee print with no bill number"
        },
        {
          "name": "week.items[].floor_text",
          "type": "string"
        },
        {
          "name": "week.items[].added_at / week.items[].removed_at / week.items[].removed",
          "type": "string|null|boolean"
        },
        {
          "name": "week.items[].published_at / week.items[].sort_order",
          "type": "string|number"
        },
        {
          "name": "week.items[].updates[]",
          "type": "array",
          "note": "{updated_at, published_at, doc_modified}"
        },
        {
          "name": "week.items[].files[]",
          "type": "array",
          "note": "{url, doc_type, added_at, published_at}"
        },
        {
          "name": "week.items[].subitems[]",
          "type": "array",
          "note": "same shape as an item, one level deep"
        },
        {
          "name": "week.provenance.source_url / week.provenance.retrieved_at / week.provenance.sha256",
          "type": "string"
        }
      ],
      "sample": {
        "file": "floor/data/2026-07-20.json",
        "text": "{\n  \"ok\": true,\n  \"week\": {\n    \"week_of\": \"2026-07-20\",\n    \"congress\": 119,\n    \"current_status\": \"R\",\n    \"created_at\": \"2026-07-14T10:34:56.250\",\n    \"first_published_at\": \"2026-07-14T18:43:21.660\",\n    \"last_updated_at\": \"2026-07-22T11:18:24.900\",\n    \"revision_count\": 26,\n    \"publish_dates\": [\n      \"2026-07-14T18:43:21.660\",\n      \"2026-07-14T18:48:50.997\",\n      \"… 24 more of 26\"\n    ],\n    \"unknown_categories\": [],\n    \"items\": [\n      {\n        \"item_id\": \"409675\",\n        \"posture\": \"suspension\",\n        \"legis_num_raw\": \"H.R. 2715\",\n        \"measure\": \"{…}\",\n        \"unnumbered\": false,\n        \"floor_text\": \"Destruction of Hazardous Imports Act, as amended\",\n        \"added_at\": \"2026-07-14T10:35:26.150\",\n        \"removed_at\": null,\n        \"removed\": false,\n        \"published_at\": \"2026-07-14T18:43:21.660\",\n        \"sort_order\": 1,\n        \"updates\": \"[… 0 items]\",\n        \"files\": \"[… 1 items]\",\n        \"subitems\": \"[… 0 items]\"\n      },\n      {\n        \"item_id\": \"409676\",\n        \"posture\": \"suspension\",\n        \"legis_num_raw\": \"H.R. 2821\",\n        \"measure\": \"{…}\",\n        \"unnumbered\": false,\n        \"floor_text\": \"FDA Modernization Act 3.0\",\n        \"added_at\": \"2026-07-14T10:35:41.207\",\n        \"removed_at\": null,\n        \"removed\": false,\n        \"published_at\": \"2026-07-14T18:43:21.660\",\n        \"sort_order\": 2,\n        \"updates\": \"[… 0 items]\",\n        \"files\": \"[… 1 items]\",\n        \"subitems\": \"[… 0 items]\"\n      },\n      \"… 29 more of 31\"\n    ],\n    \"provenance\": {\n      \"source_url\": \"https://docs.house.gov/billsthisweek/20260720/20260720.xml\",\n      \"retrieved_at\": \"2026-08-15T11:00:00.000Z\",\n      \"sha256\": \"fe475988bfd1f406534fd42707e676d915ee4dc6cd0befa8ea8941d980e7678f\"\n    }\n  }\n}",
        "truncated": true
      },
      "caveats": [
        "Measure ids are constructed (119-hr-2715), not supplied by the House. They are the join to anything bill-scoped."
      ],
      "bytes": "56,126 bytes on disk"
    },
    {
      "id": "ds.floor.miss",
      "lane": "dataset",
      "group": "House floor",
      "title": "Recess record",
      "subtitle": "the same path, ok: false",
      "status": "live",
      "pipelines": [
        "floor"
      ],
      "what": "What a week file contains when the House is out: the check happened, the URL 404ed, and that is the finding.",
      "why": "A missing file and a captured absence look identical from a directory listing and are not the same fact. Writing the miss is how a recess stops looking like a dead crawler.",
      "path": "floor/data/2026-08-17.json",
      "code": [
        "floor/build.mjs"
      ],
      "fields": [
        {
          "name": "ok",
          "type": "boolean",
          "note": "false"
        },
        {
          "name": "reason",
          "type": "string"
        },
        {
          "name": "weekOf",
          "type": "string"
        },
        {
          "name": "checkedAt",
          "type": "string"
        },
        {
          "name": "httpStatus",
          "type": "number",
          "note": "404, with a 1,245-byte error page behind it"
        }
      ],
      "sample": {
        "file": "floor/data/2026-08-17.json",
        "text": "{\n  \"ok\": false,\n  \"reason\": \"not_found\",\n  \"weekOf\": \"2026-08-17\",\n  \"checkedAt\": \"2026-08-21T13:09:57.821Z\",\n  \"httpStatus\": 404\n}",
        "truncated": false
      },
      "bytes": "133 bytes on disk"
    },
    {
      "id": "ds.quotes.input",
      "lane": "dataset",
      "group": "Quotes",
      "title": "Quote input",
      "subtitle": "quotes/data/quotes.json · hand-authored",
      "status": "gated",
      "pipelines": [
        "quotes"
      ],
      "what": "The hand-selected lines, each naming the corpus and record it was taken from, one of five closed bases for why it reaches a sector, and the query that would reproduce the find.",
      "why": "A term hit is a prompt to a human to read the record, never a publish decision. The publish decision is the basis enum, closed by design so a sixth unstated route cannot slip a quote onto the page.",
      "path": "quotes/data/quotes.json",
      "code": [
        "quotes/build.mjs",
        "quotes/schema.mjs",
        "quotes/lib/select.mjs",
        "quotes/lib/corpora.mjs"
      ],
      "fields": [
        {
          "name": "quotes[].quote_id",
          "type": "string"
        },
        {
          "name": "quotes[].layer",
          "type": "number",
          "note": "1 — a fact on the record"
        },
        {
          "name": "quotes[].text",
          "type": "string",
          "note": "verbatim; the gate re-checks it against the archive"
        },
        {
          "name": "quotes[].source.corpus",
          "type": "string",
          "note": "closed — 'federal-register' | 'presidential' | 'house-floor', quotes/lib/corpora.mjs's CORPORA; absent means federal-register"
        },
        {
          "name": "quotes[].source.date",
          "type": "string",
          "note": "federal-register only — joins to a day file"
        },
        {
          "name": "quotes[].source.document_number",
          "type": "string",
          "note": "federal-register only — joins to documents[]"
        },
        {
          "name": "quotes[].source.doc_uid",
          "type": "string",
          "note": "presidential only — joins to presidential/data/documents.json documents[]"
        },
        {
          "name": "quotes[].source.measure_id",
          "type": "string",
          "note": "house-floor only — joins to floor/data/measures.json measures[]"
        },
        {
          "name": "quotes[].source.week_of",
          "type": "string",
          "note": "house-floor only — which listed week the quote cites; absent takes the earliest"
        },
        {
          "name": "quotes[].source.field",
          "type": "string",
          "note": "which field of that record the text came from — the legal set differs per corpus"
        },
        {
          "name": "quotes[].action",
          "type": "object",
          "note": "only ever {kind, evidence} and only for kind attend — every other action is derived from the capture, and there is nowhere here to type a deadline or a link"
        },
        {
          "name": "quotes[].bridge",
          "type": "string",
          "note": "one sentence stating the mechanism; required whenever basis is not names_sector"
        },
        {
          "name": "quotes[].sectors",
          "type": "string[]",
          "note": "closed: 'venture-capital' | 'ai' | 'big-tech'"
        },
        {
          "name": "quotes[].basis",
          "type": "string",
          "note": "closed enum — the honesty gate"
        },
        {
          "name": "quotes[].so_what",
          "type": "string"
        },
        {
          "name": "quotes[].anchors",
          "type": "string[]",
          "note": "substrings that must appear in the source"
        },
        {
          "name": "quotes[].query",
          "type": "string",
          "note": "how to reproduce the selection"
        }
      ],
      "sampleWithheld": "quotes/data/ is excluded from the deployment — it is the hand-authored input the gate checks, not the checked output. The published file next door is the artefact."
    },
    {
      "id": "ds.quotes.built",
      "lane": "dataset",
      "group": "Quotes",
      "title": "Published quotes",
      "subtitle": "quotes/quotes.json · CORS",
      "status": "live",
      "pipelines": [
        "quotes"
      ],
      "what": "What the builder emits after every quote has been checked back against the archive. Carries a per-corpus coverage block that says which units were read and which were not.",
      "why": "Stating the unread units is the cheapest honesty in the project: it makes the page’s silence about a day or a week mean \"nobody has read it\" rather than \"nothing happened\". Per corpus rather than overall, because \"9 days held\" was never the whole archive — 98 presidential documents and 146 floor measures were held the entire time and had no way onto the page.",
      "path": "quotes/quotes.json",
      "code": [
        "quotes/build.mjs",
        "quotes/lib/render.mjs",
        "quotes/lib/corpora.mjs"
      ],
      "fields": [
        {
          "name": "schema_version",
          "type": "number"
        },
        {
          "name": "coverage[].corpus",
          "type": "string",
          "note": "closed — 'federal-register' | 'presidential' | 'house-floor'"
        },
        {
          "name": "coverage[].label",
          "type": "string",
          "note": "the corpus as the page names it"
        },
        {
          "name": "coverage[].branch",
          "type": "string",
          "note": "which branch published it — 'executive' | 'presidential' | 'legislative'"
        },
        {
          "name": "coverage[].branch_label",
          "type": "string"
        },
        {
          "name": "coverage[].unit_noun",
          "type": "string",
          "note": "what a unit of coverage is here — \"day\" for the two dated corpora, \"week\" for the House floor"
        },
        {
          "name": "coverage[].held_units[]",
          "type": "string[]",
          "note": "every unit the archive holds"
        },
        {
          "name": "coverage[].held_records",
          "type": "number"
        },
        {
          "name": "coverage[].read_units[]",
          "type": "string[]",
          "note": "the units read against the sector rule by hand — a unit read in full that yielded nothing is still read"
        },
        {
          "name": "coverage[].unread_units[]",
          "type": "string[]",
          "note": "held minus read — the gap the page prints"
        },
        {
          "name": "coverage[].unread_records",
          "type": "number"
        },
        {
          "name": "quotes_by_corpus.federal-register",
          "type": "number",
          "note": "how many published quotes came from each corpus"
        },
        {
          "name": "quotes_by_corpus.presidential",
          "type": "number"
        },
        {
          "name": "quotes_by_corpus.house-floor",
          "type": "number"
        },
        {
          "name": "source_sha256",
          "type": "string",
          "note": "hash of the input file this was built from"
        },
        {
          "name": "quotes[].quote_id",
          "type": "string",
          "note": "unique, slug-safe — quotes/schema.mjs rule 9"
        },
        {
          "name": "quotes[].corpus",
          "type": "string",
          "note": "which archive the quote was checked against — quotes/lib/corpora.mjs's CORPORA"
        },
        {
          "name": "quotes[].text",
          "type": "string",
          "note": "verbatim, after whitespace normalization only, in the exact field of the exact record the citation names — the anti-fabrication gate, quotes/schema.mjs rule 1"
        },
        {
          "name": "quotes[].sectors",
          "type": "string[]",
          "note": "closed list — venture-capital | ai | big-tech, quotes/lib/select.mjs's SECTORS"
        },
        {
          "name": "quotes[].basis",
          "type": "string",
          "note": "one of five closed values in quotes/lib/select.mjs's BASES — the honesty gate for why the sector is implicated, and branch-neutral: the same route reaches a sector from an agency rule, a proclamation or a bill"
        },
        {
          "name": "quotes[].bridge",
          "type": "string|null",
          "note": "one sentence stating the mechanism; required whenever basis is not names_sector, forecast and recommendation language banned, no number absent from the capture"
        },
        {
          "name": "quotes[].so_what",
          "type": "string",
          "note": "one sentence, who is on the hook for what — the only prose on the page that is neither quoted nor definitional, checked against anchors and against the capture for invented numbers"
        },
        {
          "name": "quotes[].anchors",
          "type": "string[]",
          "note": "at least 2 phrases, 6+ characters, each occurring both in so_what and in the cited document’s own captured text"
        },
        {
          "name": "quotes[].action",
          "type": "object",
          "note": "assembled from the capture, never typed — {kind, label, certainty, deadline, days_after_publication, evidence, docket_ids, href} — what a reader can do about it. certainty is \"statutory\" for a printed deadline and \"scheduled\" for a week the House can still revise"
        },
        {
          "name": "quotes[].query",
          "type": "string",
          "note": "how the quote was found — non-empty, quotes/schema.mjs rule 7"
        },
        {
          "name": "quotes[].permalink",
          "type": "string",
          "note": "root-relative — /quotes/q/<quote_id>.html"
        },
        {
          "name": "quotes[].citation",
          "type": "object",
          "note": "assembled from the capture, never typed — {corpus, branch, authority[], reference, record_id, record_label, dated, date_kind, certainty, links[], effective_on, comments_close_on, register_state, sponsorship, provenance{retrieved_at, capture_id, content_sha256, day_merkle_root, method}} — provenance.content_sha256 is what lets a reader check the quote back against the archive. register_state is presidential-only and absent_from_federal_register there is a choice, not a lapse; sponsorship is house-floor-only and null means not yet retrieved, never no sponsor. house-floor citations also carry postures[] and week_of"
        }
      ],
      "sample": {
        "file": "quotes/quotes.json",
        "text": "{\n  \"schema_version\": 2,\n  \"coverage\": [\n    {\n      \"corpus\": \"federal-register\",\n      \"label\": \"Federal Register\",\n      \"branch\": \"executive\",\n      \"branch_label\": \"Agencies\",\n      \"unit_noun\": \"day\",\n      \"held_units\": [\n        \"2026-08-10\",\n        \"2026-08-11\",\n        \"… 8 more of 10\"\n      ],\n      \"held_records\": 949,\n      \"read_units\": [\n        \"2026-08-10\",\n        \"2026-08-11\",\n        \"… 7 more of 9\"\n      ],\n      \"unread_units\": [\n        \"2026-08-21\"\n      ],\n      \"unread_records\": 116\n    },\n    {\n      \"corpus\": \"presidential\",\n      \"label\": \"Presidential actions\",\n      \"branch\": \"presidential\",\n      \"branch_label\": \"The President\",\n      \"unit_noun\": \"day\",\n      \"held_units\": [\n        \"2025-03-21\",\n        \"2025-03-22\",\n        \"… 60 more of 62\"\n      ],\n      \"held_records\": 98,\n      \"read_units\": [\n        \"2025-03-21\",\n        \"2025-03-22\",\n        \"… 60 more of 62\"\n      ],\n      \"unread_units\": [],\n      \"unread_records\": 0\n    },\n    \"… 1 more of 3\"\n  ],\n  \"quotes_by_corpus\": {\n    \"federal-register\": 16,\n    \"presidential\": 4,\n    \"house-floor\": 6\n  },\n  \"source_sha256\": \"2a1f6d2a90379f95\",\n  \"quotes\": [\n    {\n      \"quote_id\": \"nist-nvd-ai-era\",\n      \"text\": \"Request for Information (RFI) on Modernizing the National Vulnerability Database in the Age of Artificial Intelligence\",\n      \"corpus\": \"federal-register\",\n      \"sectors\": [\n        \"ai\"\n      ],\n      \"basis\": \"names_sector\",\n      \"bridge\": null,\n      \"so_what\": \"The U.S. government repository of standards-based vulnerability management data is being rebuilt, and NIST has opened a stakeholder input window on what it becomes — so anyone whose security tooling r… (+73 chars)\",\n      \"anchors\": [\n        \"U.S. government repository of standards-based vulnerability management data\",\n        \"stakeholder input\"\n      ],\n      \"action\": {\n        \"kind\": \"comment\",\n        \"label\": \"Open for comment\",\n        \"certainty\": \"statutory\",\n        \"deadline\": \"2026-10-13\",\n        \"days_after_publication\": 62,\n        \"evidence\": null,\n        \"docket_ids\": \"[… 1 items]\",\n        \"href\": \"https://www.federalregister.gov/documents/2026/08/12/2026-16371/request-for-information-rfi-on-modernizing-the-national-vulnerability-database-in-the-age-of\"\n      },\n      \"query\": \"Matched on \\\"artificial intelligence\\\" in the title, in the Federal Register issue of 2026-08-12.\",\n      \"permalink\": \"/quotes/q/nist-nvd-ai-era.html\",\n      \"citation\": {\n        \"corpus\": \"federal-register\",\n        \"branch\": \"executive\",\n        \"authority\": \"[… 2 items]\",\n        \"reference\": \"91 FR 52042\",\n        \"record_id\": \"2026-16371\",\n        \"record_label\": \"FR Doc. 2026-16371\",\n        \"dated\": \"2026-08-12\",\n        \"date_kind\": \"published\",\n        \"certainty\": \"statutory\",\n        \"links\": \"[… 2 items]\",\n        \"effective_on\": null,\n        \"comments_close_on\": \"2026-10-13\",\n        \"register_state\": null,\n        \"sponsorship\": null,\n        \"provenance\": \"{…}\"\n      }\n    },\n    {\n      \"quote_id\": \"nist-nvd-ai-shaped-landscape\",\n      \"text\": \"NIST seeks stakeholder input on opportunities, challenges, and priorities for modernizing the NVD in an evolving cybersecurity landscape increasingly shaped by artificial intelligence (AI) and machine… (+26 chars)\",\n      \"corpus\": \"federal-register\",\n      \"sectors\": [\n        \"ai\"\n      ],\n      \"basis\": \"names_sector\",\n      \"bridge\": null,\n      \"so_what\": \"The agency itself puts machine-consumable security data at the center of what the vulnerability feed turns into — a database read by software rather than by analys\n… trimmed",
        "truncated": true
      },
      "bytes": "79,799 bytes on disk"
    },
    {
      "id": "ds.cards.provision",
      "lane": "dataset",
      "group": "Consequence Cards",
      "title": "Provision cards",
      "subtitle": "cards/data/119-hr-6644.cards.json · 21 cards",
      "status": "gated",
      "pipelines": [
        "cards"
      ],
      "what": "One card per claim about the act: a headline, the mechanism, the provision it points at, and the citation that decides it. Twelve types, from prohibition and deadline through to unrecorded_disposition.",
      "why": "Every card is a Layer 1 fact or a formula output, never a forecast. Fields named confidence, probability, forecast, prediction, likelihood, expected_value, recommendation or model_score are banned at any depth — the build fails rather than warns.",
      "path": "cards/data/119-hr-6644.cards.json",
      "code": [
        "cards/schema.mjs",
        "cards/build.mjs",
        "cards/sources.mjs",
        "cards/fidelity.mjs"
      ],
      "fields": [
        {
          "name": "bill.bill_id / public_law / congress / version / enacted_date / as_of",
          "type": "string|number"
        },
        {
          "name": "cards[].card_id",
          "type": "string"
        },
        {
          "name": "cards[].type",
          "type": "string",
          "note": "12 types, closed list in cards/schema.mjs"
        },
        {
          "name": "cards[].headline",
          "type": "string",
          "note": "one citable sentence, two lines maximum"
        },
        {
          "name": "cards[].detail",
          "type": "string"
        },
        {
          "name": "cards[].provision_id",
          "type": "string",
          "note": "us/119-hr-6644-enr/sec1001 — the join to the statute"
        },
        {
          "name": "cards[].provision_id_status",
          "type": "string",
          "note": "'confirmed' | otherwise — located against the USLM tree"
        },
        {
          "name": "cards[].mechanism",
          "type": "object",
          "note": "{type, threshold, …} — the machine-readable claim"
        },
        {
          "name": "cards[].query",
          "type": "string",
          "note": "the call that would reproduce the claim"
        },
        {
          "name": "cards[].layer",
          "type": "number",
          "note": "1"
        },
        {
          "name": "cards[].verification",
          "type": "string",
          "note": "'primary_source_verified' | 'secondary_source_unverified'"
        },
        {
          "name": "cards[].citation.source / url / retrieved_at",
          "type": "string"
        }
      ],
      "sampleWithheld": "Not one card has passed verification. cards/ is excluded from the deployment, every rendered card carries a PROTOTYPE — DO NOT SHARE banner, and `cards:build --publish` exits non-zero rather than emit them. Read the file in the repo; it is not served here.",
      "caveats": [
        "Claims are routed to a source by class, not by convenience: statutory text to the enrolled bill, a tally to the action record, a named member’s vote to the roll call XML, a computed date to arithmetic on enactment. A claim routed to the wrong source is the failure mode cards/sources.mjs exists to stop."
      ]
    },
    {
      "id": "ds.cards.deadlines",
      "lane": "dataset",
      "group": "Consequence Cards",
      "title": "Deadline extraction",
      "subtitle": "cards/data/deadlines.json · 133 rows",
      "status": "gated",
      "pipelines": [
        "cards"
      ],
      "what": "Every duty the act imposes with a date attached, extracted from the enrolled text: who is obligated, what the duty is, how strong the verb is, and where the date came from.",
      "why": "date_status distinguishes a date the statute states from one computed from an interval from one merely inferred from the enactment default. Collapsing those three is how a deadline tracker starts inventing deadlines.",
      "path": "cards/data/deadlines.json",
      "code": [
        "cards/data/deadlines.json",
        "cards/locate.mjs"
      ],
      "fields": [
        {
          "name": "deadlines[].id / cite / title / section / subdivision",
          "type": "string"
        },
        {
          "name": "deadlines[].quoted",
          "type": "boolean",
          "note": "true when the duty text is quoted verbatim"
        },
        {
          "name": "deadlines[].amends",
          "type": "string",
          "note": "the U.S. Code section touched, where there is one"
        },
        {
          "name": "deadlines[].obligated",
          "type": "string[]",
          "note": "who owes it — empty is a real answer"
        },
        {
          "name": "deadlines[].obligated_basis",
          "type": "string",
          "note": "why that list, e.g. \"a repeal obligates nobody\""
        },
        {
          "name": "deadlines[].duty / duty_type / strength",
          "type": "string"
        },
        {
          "name": "deadlines[].interval_text / text",
          "type": "string"
        },
        {
          "name": "deadlines[].basis",
          "type": "string",
          "note": "e.g. 'enactment_default'"
        },
        {
          "name": "deadlines[].date",
          "type": "string|null"
        },
        {
          "name": "deadlines[].date_status",
          "type": "string",
          "note": "'stated' | 'computed' | 'inferred' | 'not_determinable'"
        },
        {
          "name": "deadlines[].computation",
          "type": "string",
          "note": "the arithmetic, written out"
        },
        {
          "name": "deadlines[].recurrence",
          "type": "object",
          "note": "{recurs, …}"
        },
        {
          "name": "deadlines[].provision_id",
          "type": "string"
        },
        {
          "name": "counts.*",
          "type": "number",
          "note": "totals by date_status, reconcilable against the rows"
        }
      ],
      "sampleWithheld": "cards/ is excluded from the deployment. Read the file in the repo."
    },
    {
      "id": "ds.cards.state",
      "lane": "dataset",
      "group": "Consequence Cards",
      "title": "State cards",
      "subtitle": "cards/data/wa-119-hr-6644.state-cards.json",
      "status": "gated",
      "pipelines": [
        "cards"
      ],
      "what": "The join between a provision and a jurisdiction — a claim the statute alone cannot close, so it carries a second block of rules.",
      "why": "reach and reach_basis are the whole point: an act that names no state still binds buyers in it. The reach class says which of those routes applies and what would have to be captured to say more.",
      "path": "cards/data/wa-119-hr-6644.state-cards.json",
      "code": [
        "cards/state.mjs",
        "cards/schema.mjs"
      ],
      "fields": [
        {
          "name": "cards[].subject_type",
          "type": "string",
          "note": "'state'"
        },
        {
          "name": "cards[].points",
          "type": "string[]",
          "note": "Who / What / Kept / Here / Penalty"
        },
        {
          "name": "cards[].note",
          "type": "string"
        },
        {
          "name": "cards[].state.jurisdiction / name",
          "type": "string"
        },
        {
          "name": "cards[].state.reach",
          "type": "string",
          "note": "closed enum in cards/state.mjs REACH_CLASSES"
        },
        {
          "name": "cards[].state.reach_basis",
          "type": "string",
          "note": "why this provision reaches this state at all"
        },
        {
          "name": "cards[].state.bearers",
          "type": "array",
          "note": "who carries the effect here"
        },
        {
          "name": "cards[].state.direction",
          "type": "string"
        }
      ],
      "sampleWithheld": "cards/ is excluded from the deployment. Read the file in the repo."
    },
    {
      "id": "ds.cards.site",
      "lane": "dataset",
      "group": "Consequence Cards",
      "title": "Built card set",
      "subtitle": "cards/site/cards.json",
      "status": "gated",
      "pipelines": [
        "cards"
      ],
      "what": "What the builder emits: the cards plus the hash of the input they were built from, the draft flag, and the list of card ids that have not passed verification.",
      "why": "draft: true and a populated unverified_card_ids is the publish gate in data form. CI rebuilds this and diffs it against the commit, so the checked-in output cannot drift from the generator.",
      "path": "cards/site/cards.json",
      "code": [
        "cards/build.mjs",
        "cards/audit.mjs"
      ],
      "fields": [
        {
          "name": "source_sha256",
          "type": "string"
        },
        {
          "name": "draft",
          "type": "boolean"
        },
        {
          "name": "unverified_card_ids",
          "type": "string[]"
        },
        {
          "name": "layer",
          "type": "number"
        },
        {
          "name": "cards[]",
          "type": "array",
          "note": "as above"
        }
      ],
      "sampleWithheld": "cards/ is excluded from the deployment."
    },
    {
      "id": "ds.lexicon",
      "lane": "dataset",
      "group": "Lexicon",
      "title": "Domain language",
      "subtitle": "lexicon/domain-language.json · 206 entries",
      "status": "live",
      "pipelines": [
        "lexicon"
      ],
      "what": "The terms-of-art glossary, in ten categories, with aliases so \"218 signatures\" resolves to discharge-petition.",
      "why": "Deliberately published as JSON: downstream.sh is a developer surface, and a machine-readable glossary is the artefact there, not a leak.",
      "path": "lexicon/domain-language.json",
      "code": [
        "lexicon/build-lexicon.py",
        "lexicon/domain-language.md"
      ],
      "fields": [
        {
          "name": "schema_version / as_of / count",
          "type": "number|string"
        },
        {
          "name": "categories[]",
          "type": "array",
          "note": "{id, title}"
        },
        {
          "name": "aliases",
          "type": "object",
          "note": "alias → entry id"
        },
        {
          "name": "entries[].id / entries[].term / entries[].category",
          "type": "string"
        },
        {
          "name": "entries[].cite",
          "type": "string",
          "note": "the authority, e.g. \"2 U.S.C. § 641\""
        },
        {
          "name": "entries[].aliases",
          "type": "string[]"
        },
        {
          "name": "entries[].short / entries[].text / entries[].note",
          "type": "string"
        },
        {
          "name": "entries[].see_also",
          "type": "string[]"
        },
        {
          "name": "entries[].url",
          "type": "string"
        }
      ],
      "sample": {
        "file": "lexicon/domain-language.json",
        "text": "{\n  \"schema_version\": 1,\n  \"as_of\": \"2026-08-21\",\n  \"count\": 209,\n  \"categories\": [\n    {\n      \"id\": \"proc\",\n      \"title\": \"Floor procedure\"\n    },\n    {\n      \"id\": \"ident\",\n      \"title\": \"Bills, versions, and identifiers\"\n    },\n    \"… 8 more of 10\"\n  ],\n  \"aliases\": {\n    \"218 signatures\": \"discharge-petition\",\n    \"21st century road to housing act\": \"road-to-housing-act\",\n    \"30% ami\": \"ami\",\n    \"302(a)\": \"302-b\",\n    \"302(b) allocation\": \"302-b\",\n    \"60 legislative days\": \"lookback-window\",\n    \"60% ami\": \"ami\",\n    \"60-vote threshold\": \"filibuster\",\n    \"a&c\": \"arbitrary-and-capricious\",\n    \"ada violation\": \"antideficiency-act\",\n    \"additional referral\": \"sequential-referral\",\n    \"administrative procedure act\": \"apa\",\n    \"advance notice of proposed rulemaking\": \"anprm\",\n    \"advisory committee\": \"federal-advisory-committee\",\n    \"agency acronyms\": \"agency-acronyms\",\n    \"airdrop\": \"scope-of-conference\",\n    \"amendment between houses\": \"amendment-between-houses\",\n    \"amends the definition of\": \"definitional-amendment\",\n    \"ami\": \"ami\",\n    \"amici\": \"amicus-brief\",\n    \"amicus\": \"amicus-brief\",\n    \"amicus brief\": \"amicus-brief\",\n    \"amicus curiae\": \"amicus-brief\",\n    \"anomaly\": \"anomaly\",\n    \"…\": \"626 more keys\"\n  },\n  \"entries\": [\n    {\n      \"id\": \"reconciliation\",\n      \"term\": \"Reconciliation\",\n      \"category\": \"proc\",\n      \"cite\": \"2 U.S.C. § 641\",\n      \"aliases\": [\n        \"budget reconciliation\",\n        \"reconciliation bill\"\n      ],\n      \"short\": \"An expedited procedure that lets a bill implementing a budget resolution's instructions pass the Senate on a simple majority with debate capped at 20 hours, immune to filibuster.\",\n      \"text\": \"An expedited procedure that lets a bill implementing a budget resolution's instructions pass the Senate on a simple majority with debate capped at 20 hours, immune to filibuster. The price is the Byrd… (+53 chars)\",\n      \"note\": \"Reconciliation bills are the highest-yield corpus in the system. They are large, they pass on party lines, and the Byrd rule guarantees a documented set of provisions that were dropped for procedural … (+111 chars)\",\n      \"see_also\": [\n        \"byrd-rule\",\n        \"budget-resolution\",\n        \"… 1 more of 3\"\n      ],\n      \"url\": \"https://downstream.sh/domain-language#reconciliation\"\n    },\n    {\n      \"id\": \"byrd-rule\",\n      \"term\": \"Byrd rule\",\n      \"category\": \"proc\",\n      \"cite\": \"2 U.S.C. § 644\",\n      \"aliases\": [\n        \"Byrd bath\",\n        \"Byrd drop\",\n        \"… 2 more of 4\"\n      ],\n      \"short\": \"Bars extraneous matter from a reconciliation bill on a point of order that takes 60 votes to waive.\",\n      \"text\": \"Bars extraneous matter from a reconciliation bill on a point of order that takes 60 votes to waive. Six tests, the operative ones being that a provision must change outlays or revenues, and that its b… (+182 chars)\",\n      \"note\": \"A Byrd drop is the single highest-signal event in the corpus. The provision was drafted, negotiated, and adopted by a majority, and removed on a technicality — so its probability of resurfacing in the… (+120 chars)\",\n      \"see_also\": [\n        \"reconciliation\",\n        \"parliamentarian\",\n        \"… 2 more of 4\"\n      ],\n      \"url\": \"https://downstream.sh/domain-language#byrd-rule\"\n    },\n    \"… 207 more of 209\"\n  ]\n}",
        "truncated": true
      },
      "caveats": [
        "Hand-authored from the .md source. No upstream endpoint, and no capture record."
      ],
      "bytes": "184,752 bytes on disk"
    },
    {
      "id": "ds.plain",
      "lane": "dataset",
      "group": "Lexicon",
      "title": "Plain language",
      "subtitle": "plain/data/plain.json · 42 entries",
      "status": "live",
      "pipelines": [
        "lexicon"
      ],
      "what": "The same subject as the lexicon in the plain-language register: what each term means to somebody who has never met it, with the statute, chamber rule or agency page that actually defines it.",
      "why": "Published as JSON so any surface can cite a definition by slug rather than restating one it would then have to keep in sync. Carries no timestamp — `model_fingerprint` is the version marker, because what dates this file is which shape of the map it was checked against, not which minute it was written.",
      "path": "plain/data/plain.json",
      "code": [
        "plain/glossary.mjs",
        "plain/build.mjs",
        "plain/selftest.mjs"
      ],
      "fields": [
        {
          "name": "schema_version / count",
          "type": "number"
        },
        {
          "name": "model_fingerprint",
          "type": "string",
          "note": "the model this glossary was last checked against"
        },
        {
          "name": "categories[]",
          "type": "array",
          "note": "{id, title, blurb}"
        },
        {
          "name": "entries[].slug / entries[].term / entries[].category",
          "type": "string"
        },
        {
          "name": "entries[].plain",
          "type": "string",
          "note": "standalone lay definition"
        },
        {
          "name": "entries[].more",
          "type": "string|null"
        },
        {
          "name": "entries[].canonical",
          "type": "object",
          "note": "{label, url, kind} — kind is statute|rule|official|ours"
        },
        {
          "name": "entries[].lexicon",
          "type": "string|null",
          "note": "slug in domain-language.json"
        },
        {
          "name": "entries[].see_also",
          "type": "string[]"
        },
        {
          "name": "entries[].covers",
          "type": "string[]",
          "note": "node ids on this page that the entry explains"
        },
        {
          "name": "entries[].where_you_see_it",
          "type": "string|null"
        },
        {
          "name": "entries[].url",
          "type": "string",
          "note": "/plain/#<slug>"
        }
      ],
      "sample": {
        "file": "plain/data/plain.json",
        "text": "{\n  \"schema_version\": 1,\n  \"model_fingerprint\": \"93dd66173f32eaa6\",\n  \"count\": 44,\n  \"categories\": [\n    {\n      \"id\": \"publishing\",\n      \"title\": \"What the government publishes, and where\",\n      \"blurb\": \"Almost everything on this site starts as a document the government was required to publish. These are the publications themselves.\"\n    },\n    {\n      \"id\": \"agencies\",\n      \"title\": \"How agencies make rules\",\n      \"blurb\": \"Congress passes a law; an agency usually has to write the rules that make it operate. That second step is most of what the Federal Register contains.\"\n    },\n    \"… 3 more of 5\"\n  ],\n  \"entries\": [\n    {\n      \"slug\": \"federal-register\",\n      \"term\": \"The Federal Register\",\n      \"category\": \"publishing\",\n      \"plain\": \"The federal government’s daily newspaper, published every business day, in which agencies are required by law to print what they are doing before it counts.\",\n      \"more\": \"It is not a summary or a news source. It is the place a rule legally has to appear, which is why an agency publishing something there is a fact you can check rather than an announcement you have to tr… (+50 chars)\",\n      \"canonical\": {\n        \"label\": \"44 U.S.C. ch. 15\",\n        \"url\": \"https://www.law.cornell.edu/uscode/text/44/chapter-15\",\n        \"kind\": \"statute\"\n      },\n      \"lexicon\": \"federal-register\",\n      \"see_also\": [\n        \"rule\",\n        \"notice\",\n        \"… 1 more of 3\"\n      ],\n      \"covers\": [\n        \"src.fr.documents.day\",\n        \"src.fr.documents.default\",\n        \"… 2 more of 4\"\n      ],\n      \"where_you_see_it\": \"Every document on the daily issue came from here.\",\n      \"url\": \"/plain/#federal-register\"\n    },\n    {\n      \"slug\": \"public-inspection\",\n      \"term\": \"Public inspection\",\n      \"category\": \"publishing\",\n      \"plain\": \"A document that has been filed for publication but has not been published yet, made available early — usually one business day ahead.\",\n      \"more\": \"It is the same document, seen sooner. A document on public inspection can still be withdrawn before it publishes, so it is a genuine preview rather than a guarantee, and we label it as one.\",\n      \"canonical\": {\n        \"label\": \"44 U.S.C. § 1503\",\n        \"url\": \"https://www.law.cornell.edu/uscode/text/44/1503\",\n        \"kind\": \"statute\"\n      },\n      \"lexicon\": null,\n      \"see_also\": [\n        \"federal-register\"\n      ],\n      \"covers\": [\n        \"src.fr.pi.current\",\n        \"src.fr.pi.day\"\n      ],\n      \"where_you_see_it\": \"The daily issue flags documents that were on public inspection first.\",\n      \"url\": \"/plain/#public-inspection\"\n    },\n    \"… 42 more of 44\"\n  ]\n}",
        "truncated": true
      },
      "caveats": [
        "Hand-authored. No upstream endpoint and no capture record — a lay explanation is written, not fetched.",
        "plain/selftest.mjs fails if any node on this page is not claimed by exactly one entry, which is what keeps it current."
      ],
      "bytes": "38,085 bytes on disk"
    },
    {
      "id": "ds.docmodel",
      "lane": "dataset",
      "group": "Docs",
      "title": "The map itself",
      "subtitle": "docs/data-model/model.mjs",
      "status": "live",
      "pipelines": [],
      "what": "The nodes, edges, fields and caveats this page is drawn from. Hand-authored, like the lexicon, and the only dataset here that describes the others.",
      "why": "Kept as data rather than as markup so it can be tested. The selftest reads the source registry, the files on disk and a real record of each dataset, and fails if the map disagrees with any of them — which is the only reason to trust a diagram this size.",
      "path": "docs/data-model/model.mjs",
      "code": [
        "docs/data-model/model.mjs",
        "docs/data-model/selftest.mjs",
        "docs/data-model/template.html"
      ],
      "fields": [
        {
          "name": "LANES[]",
          "type": "array",
          "note": "{id, title, blurb} — the four columns"
        },
        {
          "name": "PIPELINES[]",
          "type": "array",
          "note": "{id, label, blurb} — the filter chips"
        },
        {
          "name": "NODES[].id / lane / group / title / status",
          "type": "string"
        },
        {
          "name": "NODES[].registry[]",
          "type": "array",
          "note": "{set, source_id} — checked against tools/sources/"
        },
        {
          "name": "NODES[].fields[]",
          "type": "array",
          "note": "{name, type, note} — checked against a real record"
        },
        {
          "name": "NODES[].sample",
          "type": "object",
          "note": "{file} — read and trimmed at build time"
        },
        {
          "name": "NODES[].sampleWithheld",
          "type": "string",
          "note": "checked against .vercelignore"
        },
        {
          "name": "EDGES[].from / to / via / note / status",
          "type": "string"
        }
      ],
      "caveats": [
        "Not published as a file — the .mjs sources under docs/ are excluded from the deployment, the same rule daily/, floor/ and quotes/ follow. The page ships; the generator does not."
      ]
    },
    {
      "id": "sf.presidential",
      "lane": "surface",
      "group": "Presidential actions",
      "title": "The memoranda surface",
      "subtitle": "presidential/index.html + archive.html + markdown twins",
      "status": "live",
      "pipelines": [
        "presidential"
      ],
      "what": "Two pages built from the corpus: the last five business days of memoranda, newest first, and a long-form archive holding every one. Each document shows its content-derived doc_uid, whether the Federal Register ever printed it, and — where both texts are held — whether the two published texts are identical.",
      "why": "A memorandum that was never printed has no gap in a numbered series to show up as, so absence is invisible everywhere else. This is the page where it is visible. Reached from the Executive Office block of the daily issue and from nowhere else: that is the one place the Federal Register’s record is incomplete in a way the daily page cannot say in its own body without implying the same caveat about every other agency.",
      "path": "presidential/index.html",
      "cadence": "daily (12:45 UTC, weekdays)",
      "code": [
        "presidential/render.mjs",
        "presidential/build.mjs",
        "daily/lib/render.mjs"
      ],
      "links": [
        {
          "label": "/presidential/",
          "url": "/presidential/"
        },
        {
          "label": "the archive",
          "url": "/presidential/archive.html"
        }
      ],
      "caveats": [
        "Memoranda only. The corpus also holds executive orders, proclamations and nomination lists; those are in the data and not on this page.",
        "Exactly one state is accented, and it is the not-yet-arrived one. Presence and absence in a published index are Layer 1 facts and render achromatic, per the rule at the top of daily/style.css."
      ]
    },
    {
      "id": "sf.daily",
      "lane": "surface",
      "group": "Pages",
      "title": "The daily issue",
      "subtitle": "daily/YYYY-MM-DD.html + .md + agency pages",
      "status": "live",
      "pipelines": [
        "fedreg"
      ],
      "what": "One page per publishing day, a markdown twin of each, and a page per agency built from the trailing business days of that agency’s activity.",
      "why": "Rendered entirely from the day files, so the whole site can be rebuilt with no archive at all and a template change reaches every historical page.",
      "path": "daily/2026-08-17.html",
      "code": [
        "daily/build.mjs",
        "daily/lib/render.mjs",
        "daily/lib/markdown.mjs",
        "daily/lib/charts.mjs"
      ],
      "links": [
        {
          "label": "/daily/",
          "url": "/daily/"
        }
      ]
    },
    {
      "id": "sf.floor",
      "lane": "surface",
      "group": "Pages",
      "title": "Floor Radar",
      "subtitle": "floor/YYYY-MM-DD.html + index",
      "status": "live",
      "pipelines": [
        "floor"
      ],
      "what": "One page per week of the House schedule, plus an index across every week on record.",
      "path": "floor/2026-07-20.html",
      "code": [
        "floor/build.mjs",
        "floor/render.mjs",
        "floor/build-index.mjs"
      ],
      "links": [
        {
          "label": "/floor/",
          "url": "/floor/"
        }
      ]
    },
    {
      "id": "sf.quotes",
      "lane": "surface",
      "group": "Pages",
      "title": "Quotes",
      "subtitle": "quotes/index.html + q/<id> + share SVGs",
      "status": "live",
      "pipelines": [
        "quotes"
      ],
      "what": "A permalink page and a share image per quote, plus the machine-readable JSON with CORS.",
      "path": "quotes/index.html",
      "code": [
        "quotes/build.mjs",
        "quotes/lib/render.mjs"
      ],
      "links": [
        {
          "label": "/quotes/",
          "url": "/quotes/"
        }
      ]
    },
    {
      "id": "sf.lexicon",
      "lane": "surface",
      "group": "Pages",
      "title": "Lexicon",
      "subtitle": "lexicon/domain-language.html",
      "status": "live",
      "pipelines": [
        "lexicon"
      ],
      "what": "The glossary as a page. The .md source and the builder stay off the deployment.",
      "path": "lexicon/domain-language.html",
      "links": [
        {
          "label": "/lexicon/domain-language.html",
          "url": "/lexicon/domain-language.html"
        }
      ]
    },
    {
      "id": "sf.plain",
      "lane": "surface",
      "group": "Pages",
      "title": "Plain language",
      "subtitle": "plain/index.html + .md + data/plain.json",
      "status": "live",
      "pipelines": [
        "lexicon"
      ],
      "what": "Every term and concept on this site explained for somebody who does not work in policy, each one cited to the statute, chamber rule or agency that defines it, and cross-linked to the specialist entry in the lexicon where one exists.",
      "why": "Bound to this page: `plain/selftest.mjs` fails unless every node above is claimed by exactly one entry, so a new source cannot ship without a plain-language explanation. A promise to keep a glossary current is worth nothing; a failing build is worth something.",
      "path": "plain/index.html",
      "code": [
        "plain/build.mjs",
        "plain/glossary.mjs"
      ],
      "links": [
        {
          "label": "/plain/",
          "url": "/plain/"
        }
      ]
    },
    {
      "id": "sf.cards",
      "lane": "surface",
      "group": "Pages",
      "title": "Card site",
      "subtitle": "cards/site/ · not deployed",
      "status": "gated",
      "pipelines": [
        "cards"
      ],
      "what": "Rendered cards and their permalink pages. Built, checked in, and excluded from the deployment until a card passes verification.",
      "path": "cards/site/index.html",
      "code": [
        "cards/build.mjs",
        "cards/embed/build.mjs"
      ],
      "caveats": [
        "A static deploy never calls the publish gate, so the refusal has to exist in .vercelignore too or it is decorative."
      ]
    },
    {
      "id": "sf.mcp",
      "lane": "surface",
      "group": "Machine surfaces",
      "title": "MCP server",
      "subtitle": "api/mcp.js · 9 tools · mcp.downstream.sh",
      "status": "live",
      "pipelines": [
        "fedreg",
        "floor",
        "presidential"
      ],
      "what": "JSON-RPC over HTTP, no dependencies. Five tools read the dated archive — get_daily_digest, whats_new_since, catalyst_calendar, get_floor_week, search_measures — two read the presidential corpus — search_presidential_documents, get_presidential_document — and two pass through to the live Federal Register API — search_federal_register, get_document.",
      "why": "The archive/live split is load-bearing: a request with a past as_of cannot reach the live path at all, so it cannot see anything we had not stored by then. Every response carries citations and coverage_caveats populated from the sources actually touched. A second axis runs across that one: executive (Federal Register) and legislative (House floor). Only catalyst_calendar spans both, and it states in its first caveat that two events sharing a window is co-occurrence, never causation — the archive holds no field linking a rule to the statute it implements, so that join is not derivable, not merely unbuilt. The presidential pair sits on a third axis again: keyed by document rather than by date, because a memorandum has no number and no single publisher.",
      "path": "api/mcp.js",
      "code": [
        "api/mcp.js",
        "api/mcp.selftest.mjs",
        "specs/mcp-server.md",
        "vercel.json"
      ],
      "fields": [
        {
          "name": "data",
          "type": "object",
          "note": "the tool’s payload"
        },
        {
          "name": "meta.as_of",
          "type": "string"
        },
        {
          "name": "meta.snapshot_id",
          "type": "string|null"
        },
        {
          "name": "meta.coverage_caveats",
          "type": "string[]",
          "note": "what is missing, stated unprompted"
        },
        {
          "name": "meta.citations",
          "type": "array"
        },
        {
          "name": "meta.server",
          "type": "string"
        }
      ],
      "links": [
        {
          "label": "/api/mcp",
          "url": "/api/mcp"
        }
      ],
      "caveats": [
        "Caps are hard and stated in the tool descriptions: 50 results, 400 calendar days. A truncated answer says it is truncated.",
        "A future as_of is refused outright rather than silently clamped — a silent clamp is how a backtest quietly reads tomorrow’s newspaper.",
        "The presidential corpus is one snapshot rather than a per-day series, so its two tools refuse a historical as_of instead of slicing it. Serving today’s corpus under yesterday’s label would be the same failure the future-as_of refusal exists to prevent."
      ]
    },
    {
      "id": "sf.govgraph",
      "lane": "surface",
      "group": "Machine surfaces",
      "title": "Gov graph",
      "subtitle": "gov-graph/index.html · noindex",
      "status": "live",
      "pipelines": [],
      "what": "The three branches laid out as a hierarchy, plus a fourth column for the voters, firms and researchers who file back in, with one bill traced from statute through enforcement and back out to whoever the rule lands on.",
      "why": "Deliberately unconnected on this map: its content is hand-authored inside the page and reads no dataset. It is the institutional map; this is the data map.",
      "standalone": true,
      "path": "gov-graph/index.html",
      "links": [
        {
          "label": "/gov-graph",
          "url": "/gov-graph"
        }
      ]
    },
    {
      "id": "sf.docs",
      "lane": "surface",
      "group": "Machine surfaces",
      "title": "This page",
      "subtitle": "docs/data-model/ · noindex",
      "status": "live",
      "pipelines": [],
      "what": "The map you are reading, rendered from docs/data-model/model.mjs and checked against the repository by docs/data-model/selftest.mjs on every `npm test`.",
      "path": "docs/data-model/index.html",
      "code": [
        "docs/data-model/model.mjs",
        "docs/data-model/build.mjs",
        "docs/data-model/selftest.mjs"
      ],
      "links": [
        {
          "label": "/docs/data-model",
          "url": "/docs/data-model"
        }
      ]
    }
  ],
  "edges": [
    {
      "from": "src.fr.documents.day",
      "to": "cap.runner",
      "pipelines": [
        "fedreg"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.fr.documents.default",
      "to": "cap.runner",
      "pipelines": [
        "fedreg"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.fr.documents.prev",
      "to": "cap.runner",
      "pipelines": [
        "fedreg"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.fr.pi.current",
      "to": "cap.runner",
      "pipelines": [
        "fedreg",
        "pi",
        "tier0"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.fr.pi.day",
      "to": "cap.runner",
      "pipelines": [
        "pi"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.fr.agencies",
      "to": "cap.runner",
      "pipelines": [
        "fedreg"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.ecfr.titles",
      "to": "cap.runner",
      "pipelines": [
        "fedreg",
        "tier0"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.govinfo.enrolled",
      "to": "cap.runner",
      "pipelines": [
        "cards",
        "tier0"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.congress.actions",
      "to": "cap.runner",
      "pipelines": [
        "cards"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.clerk.rollcall",
      "to": "cap.runner",
      "pipelines": [
        "cards"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.senate.rollcall",
      "to": "cap.runner",
      "pipelines": [
        "cards"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.legislators",
      "to": "cap.runner",
      "pipelines": [
        "floor",
        "cards"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.house.floor",
      "to": "cap.runner",
      "pipelines": [
        "floor"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.house.index",
      "to": "cap.runner",
      "pipelines": [
        "floor"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.wh.actions",
      "to": "cap.runner",
      "pipelines": [
        "presidential"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.wh.memoranda",
      "to": "cap.runner",
      "pipelines": [
        "presidential"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.wh.memoranda.backfill",
      "to": "cap.runner",
      "pipelines": [
        "presidential"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.fr.presdocu",
      "to": "cap.runner",
      "pipelines": [
        "presidential"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.govinfo.dcpd",
      "to": "cap.runner",
      "pipelines": [
        "presidential"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.regulations",
      "to": "cap.runner",
      "pipelines": [
        "tier0"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.reginfo",
      "to": "cap.runner",
      "pipelines": [
        "tier0"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.agency.pages",
      "to": "cap.runner",
      "pipelines": [
        "tier0"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "src.sxs",
      "to": "cap.runner",
      "pipelines": [
        "tier0"
      ],
      "via": "tools/snapshot.mjs",
      "note": "Conditional GET. Redirects followed hop by hop and recorded."
    },
    {
      "from": "ds.presidential",
      "to": "sf.presidential",
      "pipelines": [
        "presidential"
      ],
      "via": "presidential/render.mjs",
      "note": "A pure function over the dataset. --render-only touches no archive at all."
    },
    {
      "from": "ds.presidential",
      "to": "sf.mcp",
      "pipelines": [
        "presidential"
      ],
      "via": "api/mcp.js",
      "note": "search_presidential_documents and get_presidential_document read the same file the pages do."
    },
    {
      "from": "cap.blob",
      "to": "ds.presidential",
      "pipelines": [
        "presidential"
      ],
      "via": "presidential/build.mjs",
      "note": "Parsed from the stored copy. Identity is minted by tools/lib/docid.mjs, never by the fetcher."
    },
    {
      "from": "cap.runner",
      "to": "cap.blob",
      "pipelines": [
        "fedreg",
        "pi",
        "floor",
        "tier0",
        "presidential"
      ],
      "via": "tools/lib/store.mjs putBlob()",
      "note": "Body first, gzipped and content-addressed. A repeat write is a no-op."
    },
    {
      "from": "cap.runner",
      "to": "cap.record",
      "pipelines": [
        "fedreg",
        "pi",
        "floor",
        "tier0",
        "presidential"
      ],
      "via": "tools/lib/store.mjs appendManifest()",
      "note": "One line per outcome, written after the blob."
    },
    {
      "from": "cap.record",
      "to": "cap.digest",
      "pipelines": [
        "fedreg",
        "pi",
        "floor",
        "tier0",
        "presidential"
      ],
      "via": "tools/lib/store.mjs merkleRoot()",
      "note": "Sorted by capture_id, so write order cannot change the root."
    },
    {
      "from": "cap.runner",
      "to": "cap.run",
      "pipelines": [
        "fedreg",
        "pi",
        "floor",
        "tier0",
        "presidential"
      ],
      "via": "tools/lib/store.mjs writeRun()"
    },
    {
      "from": "cap.blob",
      "to": "cap.r2",
      "pipelines": [
        "fedreg",
        "pi",
        "floor",
        "tier0",
        "presidential"
      ],
      "via": "rclone, in the workflow"
    },
    {
      "from": "cap.record",
      "to": "cap.r2",
      "pipelines": [
        "fedreg",
        "pi",
        "floor",
        "tier0",
        "presidential"
      ],
      "via": "rclone, in the workflow",
      "note": "Manifests are restored before each run and pushed after; blobs are pushed only."
    },
    {
      "from": "cap.digest",
      "to": "cap.anchor",
      "pipelines": [
        "fedreg"
      ],
      "via": ".github/workflows/fedreg-daily.yml",
      "note": "Yesterday’s sealed digest, committed. Tamper-evidence for the price of one commit a day."
    },
    {
      "from": "cap.record",
      "to": "ds.daily.day",
      "pipelines": [
        "fedreg"
      ],
      "via": "daily/build.mjs --ingest-only",
      "note": "Takes the latest capture of fr.documents.day, reads the blob by its hash, and copies the capture_id and merkle root into provenance. Parsed from the stored copy, never from the wire."
    },
    {
      "from": "cap.record",
      "to": "ds.floor.week",
      "pipelines": [
        "floor"
      ],
      "via": "floor/build.mjs",
      "note": "Same \"positive evidence that we looked\" discipline: a week with no capture and a week that 404ed are told apart and both are written."
    },
    {
      "from": "cap.record",
      "to": "ds.floor.miss",
      "pipelines": [
        "floor"
      ],
      "via": "floor/build.mjs"
    },
    {
      "from": "ds.daily.day",
      "to": "ds.daily.index",
      "pipelines": [
        "fedreg"
      ],
      "via": "daily/build.mjs",
      "note": "Rebuilt from the directory listing, so it cannot claim a day whose file is absent."
    },
    {
      "from": "ds.daily.day",
      "to": "ds.daily.summaries",
      "pipelines": [
        "fedreg"
      ],
      "via": "daily/summarize.mjs",
      "note": "Evidence is assembled from the day file and hashed before the model sees it."
    },
    {
      "from": "src.anthropic",
      "to": "ds.daily.summaries",
      "pipelines": [
        "fedreg"
      ],
      "via": "daily/summarize.mjs",
      "note": "The one generative step, and the only edge on this map that does not pass through the capture lane. Nothing it writes is a citation."
    },
    {
      "from": "ds.daily.day",
      "to": "ds.quotes.input",
      "pipelines": [
        "quotes"
      ],
      "via": "quotes/build.mjs --candidates",
      "note": "A worklist for a human, not a publish path. Keyword hits never accept a quote."
    },
    {
      "from": "ds.quotes.input",
      "to": "ds.quotes.built",
      "pipelines": [
        "quotes"
      ],
      "via": "quotes/build.mjs + quotes/schema.mjs",
      "note": "Every quote is re-checked against the day file it names before it renders."
    },
    {
      "from": "ds.daily.day",
      "to": "ds.quotes.built",
      "pipelines": [
        "quotes"
      ],
      "via": "quotes/build.mjs",
      "note": "The gate reads the corpus directly to compute coverage — days held versus days read."
    },
    {
      "from": "src.govinfo.enrolled",
      "to": "ds.cards.provision",
      "pipelines": [
        "cards"
      ],
      "via": "cards/sources.mjs + cards/fidelity.mjs",
      "note": "Routed by claim class: statutory text is checked against the enrolled XML at the provision’s scope, and a match found only at act scope is reported as exactly that."
    },
    {
      "from": "src.congress.actions",
      "to": "ds.cards.provision",
      "pipelines": [
        "cards"
      ],
      "via": "cards/sources.mjs",
      "note": "Tallies, the enactment fact, unrecorded dispositions, and computed dates."
    },
    {
      "from": "src.clerk.rollcall",
      "to": "ds.cards.provision",
      "pipelines": [
        "cards"
      ],
      "status": "uncaptured",
      "via": "cards/sources.mjs",
      "note": "Registered, not yet snapshotted. Member-level claims cannot be decided until it is."
    },
    {
      "from": "src.senate.rollcall",
      "to": "ds.cards.provision",
      "pipelines": [
        "cards"
      ],
      "status": "uncaptured",
      "via": "cards/sources.mjs"
    },
    {
      "from": "src.govinfo.enrolled",
      "to": "ds.cards.deadlines",
      "pipelines": [
        "cards"
      ],
      "via": "hand extraction, recorded in $provenance",
      "note": "Every row carries the section it came from and how its date was arrived at."
    },
    {
      "from": "ds.cards.provision",
      "to": "ds.cards.state",
      "pipelines": [
        "cards"
      ],
      "via": "cards/state.mjs",
      "note": "A state card inherits the provision claim and adds the reach class."
    },
    {
      "from": "src.agency.pages",
      "to": "ds.cards.state",
      "pipelines": [
        "cards"
      ],
      "status": "uncaptured",
      "via": "cards/sources.mjs jurisdiction_roster",
      "note": "Until the roster is captured, a card may state the criterion and not the membership."
    },
    {
      "from": "src.state.law",
      "to": "ds.cards.state",
      "pipelines": [
        "cards"
      ],
      "status": "uncaptured",
      "via": "cards/state.mjs REACH_CLASSES",
      "note": "No endpoint exists. A preemptive reach can never be closed from federal sources alone."
    },
    {
      "from": "ds.cards.provision",
      "to": "ds.cards.site",
      "pipelines": [
        "cards"
      ],
      "via": "cards/build.mjs",
      "note": "CI rebuilds this and diffs it against the commit."
    },
    {
      "from": "ds.cards.deadlines",
      "to": "ds.cards.site",
      "pipelines": [
        "cards"
      ],
      "via": "cards/build.mjs"
    },
    {
      "from": "ds.cards.state",
      "to": "ds.cards.site",
      "pipelines": [
        "cards"
      ],
      "via": "cards/build.mjs"
    },
    {
      "from": "ds.daily.day",
      "to": "sf.daily",
      "pipelines": [
        "fedreg"
      ],
      "via": "daily/build.mjs --render-only",
      "note": "Every page, historical ones included, re-renders from the JSON."
    },
    {
      "from": "ds.daily.summaries",
      "to": "sf.daily",
      "pipelines": [
        "fedreg"
      ],
      "via": "daily/lib/render.mjs"
    },
    {
      "from": "ds.daily.day",
      "to": "sf.mcp",
      "pipelines": [
        "fedreg"
      ],
      "via": "api/mcp.js",
      "note": "The archive path. Historical as_of is answered from here and nowhere else."
    },
    {
      "from": "ds.daily.index",
      "to": "sf.mcp",
      "pipelines": [
        "fedreg"
      ],
      "via": "api/mcp.js"
    },
    {
      "from": "src.fr.documents.day",
      "to": "sf.mcp",
      "pipelines": [
        "fedreg"
      ],
      "via": "api/mcp.js live path",
      "note": "search_federal_register and get_document call the API directly. Marked live on every response, carry no content hash, and are unreachable from a request with a past as_of."
    },
    {
      "from": "ds.floor.week",
      "to": "sf.floor",
      "pipelines": [
        "floor"
      ],
      "via": "floor/render.mjs"
    },
    {
      "from": "ds.floor.miss",
      "to": "sf.floor",
      "pipelines": [
        "floor"
      ],
      "via": "floor/render.mjs",
      "note": "A recess week renders as a recess week."
    },
    {
      "from": "src.legislators",
      "to": "sf.floor",
      "pipelines": [
        "floor"
      ],
      "status": "planned",
      "via": "floor/delegation.mjs",
      "note": "Written and tested, not yet wired into the week build. When it is, this is the join that turns a scheduled measure into a claim about a named state’s delegation."
    },
    {
      "from": "ds.quotes.built",
      "to": "sf.quotes",
      "pipelines": [
        "quotes"
      ],
      "via": "quotes/lib/render.mjs"
    },
    {
      "from": "ds.lexicon",
      "to": "sf.lexicon",
      "pipelines": [
        "lexicon"
      ],
      "via": "lexicon/build-lexicon.py"
    },
    {
      "from": "ds.plain",
      "to": "sf.plain",
      "pipelines": [
        "lexicon"
      ],
      "via": "plain/build.mjs"
    },
    {
      "from": "ds.docmodel",
      "to": "ds.plain",
      "pipelines": [
        "lexicon"
      ],
      "via": "plain/selftest.mjs",
      "note": "Coverage, not data: every node in the map must be claimed by exactly one plain-language entry or the build fails."
    },
    {
      "from": "ds.lexicon",
      "to": "ds.plain",
      "pipelines": [
        "lexicon"
      ],
      "via": "plain/glossary.mjs",
      "note": "Cross-reference only. Each plain entry names the specialist entry it corresponds to; the two registers stay separate files."
    },
    {
      "from": "ds.cards.site",
      "to": "sf.cards",
      "pipelines": [
        "cards"
      ],
      "via": "cards/build.mjs",
      "note": "Gated: --publish exits non-zero while any card is unverified."
    },
    {
      "from": "ds.docmodel",
      "to": "sf.docs",
      "pipelines": [],
      "via": "docs/data-model/build.mjs",
      "note": "Rendered into one self-contained file, with the sample records trimmed and inlined."
    },
    {
      "from": "ds.daily.day",
      "to": "cap.turso",
      "pipelines": [],
      "status": "planned",
      "note": "Where the bitemporal store lands when eCFR diffs need real as_of queries. Empty today."
    }
  ]
}
