A public, fact-checked record of AI decisions in Texas: who is deciding, by when, whether the public still has a way in, and a fetched primary source behind every fact.
Three things run off this repo:
- The docket — every AI infrastructure decision in Texas, re-verified daily, published as a page, as open data under CC BY 4.0, and as a corpus written to be read by LLMs.
- The daily carousel — one verified Texas AI story a day, planned in forensic detail and rendered as bespoke code, delivered as a post-ready email draft.
- The Texas Grid Watch — a daily numeric record of the ERCOT grid's position, built around the load factor, which is the one number here that is genuinely about AI: a data center draws at four in the morning close to what it draws at five in the afternoon, so large constant load lifts the overnight floor faster than the afternoon ceiling.
- The Texas Water Watch — daily reservoir storage for 119 Texas reservoirs, rolled up by metro. The driest metro in Texas is in the Permian, which is where much of the new load is landing. The page publishes both numbers and draws no conclusion from them.
- The ask box — a question about the record, answered in the reader's own browser from an
index that shipped with the page. Nothing is sent anywhere, and
tests/ask_engine.mjscuts the network and asks every catalogued question anyway.
Two sibling repos carry the rest: TexasAIDispatch (the narrated video engine) and
TexasAIScanner (the Bottleneck Scanner backend).
ERCOT ──► gridwatch collector ──► ledger/gridwatch/readings.jsonl ──┐
TWDB ──► waterwatch collector ──► ledger/gridwatch/water.jsonl ──┤
(both cron, never a routine) ├──► site_build ──► docs/ ──► Pages
research ──► claims ──► docket routine ──► ledger/docket.json ────────┘ │
│ ├──► ask index + catalogue
│ └──► llms.txt, feeds, JSON-LD
└──► carousel routine ──► runs/ ──► Gmail draft
docs/ is generated. It is a pure deterministic function of the ledgers, and
site_fresh_check.py proves it by rebuilding into a temp directory and requiring byte
equality. Nothing hand-edits the published site.
Numbers are computed, never generated. Every numeral published traces to a quoted source or
to code that computed it from data, and numeral_lint fails the build otherwise. It is stated
publicly on the site, because it is the reason a reader should believe a number here.
Every path has exactly one owning actor. Several unattended routines share this history and
each ends in a phase whose job is editing its own machine. Prose is not a boundary against
that; ownership.yaml is.
docs/ is generated and never hand-edited, proven by rebuilding into a temp directory and
requiring byte equality.
A gate that cannot go red proves nothing. Every checker here self-tests by reintroducing a known-bad input and requiring itself to reject it, before its real run is allowed to mean anything.
See HANDOFF.md for what has to happen outside this repo to turn it all on.
Both structural gates self-test before they run.
# No automation may write outside its lane.
python3 scripts/shared/ownership_check.py --self-test
python3 scripts/shared/ownership_check.py --actor daily --diff origin/main...HEAD
# Is the port done, and is what we moved actually wired up?
python3 scripts/shared/port_audit.py --self-test
python3 scripts/shared/port_audit.py
python3 scripts/shared/port_audit.py --summary # just the progress tableSeveral unattended routines share this one git history, and each of them ends in a phase whose
entire job is editing its own machine. ownership.yaml gives every path exactly one owning
actor, and the check runs at commit time and again in CI. An automation that wants to change
something outside its lane records a proposal in its run record and stops.
Cloning does not install hooks. Once per clone:
git config core.hooksPath .githookspre-commit enforces the ownership map. post-commit mirrors every commit to origin
immediately, because this code runs in ephemeral containers where committing is not durable
and only pushing is.
| Path | What |
|---|---|
prompts/ |
the routine prompts; each is the source of truth for its routine |
knowledge/ |
shared/ Texas research and design doctrine, carousel/ deck craft |
config/ |
brand.yaml shared voice and tokens, then per-surface config |
ledger/ |
committed state: the public docket, plus per-actor memory |
scripts/ |
namespaced by owning actor: site/, carousel/, gridwatch/, shared/ |
assets/ |
fonts, art libraries, Texas geodata, places gazetteer |
docs/ |
the published site. GENERATED, never hand-edited |
runs/ |
shipped artifacts, merged to main each run |
out/ |
per-run scratch, gitignored |
CLAUDE.md is the law: attribution, merge policy, the ownership model, the Grid Watch rules,
and the house style rules that do not bend. A run's progress across contexts lives in
out/<date>/run_state.json and in its committed run record. No routine writes a worklog.
knowledge/shared/GATE_LESSONS.md is permanent, and is the record of faults that shipped with
every check passing.
Under construction. port_audit.py --summary reports how much of the machine has landed.