Weekly forecast-ledger pipeline for the MirrorDNA public prediction ledger — and,
deliberately, the live acceptance test of the MirrorDNA long-horizon stack.
EM-007 in predictions.yaml is the pipeline betting on itself: four consecutive
clean weekly runs, zero fabricated citations, zero manual repairs.
The pipeline never publishes. Every run ends at a draft plus receipts; Paul reviews and publishes manually.
- The Electric Mind: Why India's AI boom will be built in substations before
server halls by Paul Desai.
Version 1.2 is the current public edition: an open-access, CC BY 4.0 preprint
with a permanent DOI, archived PDF,
and six dated forecasts (
EM-1201–EM-1206) for scoring through 2032. The paper archive and version history preserve the original publication and frozenEM-001–EM-006ledger calls.
Keywords: India AI infrastructure, data-centre power, power grid, substations, transformers, transmission, energy storage, investment thesis, forecast ledger.
Mirror Ledger uses a four-day evidence rhythm instead of daily commentary:
- Monday: scored forecast-ledger update.
- Wednesday: international AI infrastructure and sovereign capacity.
- Friday: crypto and digital-asset infrastructure.
- Sunday: reflective AI, agent governance, memory, identity and trust.
The three research-drop runs prepare reviewable, hash-bound drafts under
drops/. They do not publish automatically. A public release
requires review of the exact brief and its receipt, followed by an explicit
content/hash approval. This keeps cadence from outrunning evidence quality.
scripts/run_weekly.sh (called by the active Codex schedule; staged
LaunchAgent ai.mirrordna.ledger-weekly is recovery-only):
- State preflight — refresh and validate the canonical MirrorState runtime guard; fail closed before any model call if the proof cannot be written.
- Gather — one headless subscription-Claude call per
status: openprediction, with WebSearch/WebFetch, demanding{claim, url, date, quote_fragment}JSON. URLs are deduplicated before validation;india-ai-powerclaims must explicitly state their India scope. - Validate —
validate_urls.pyHTTP-fetches every URL. Non-2xx or unreachable →evidence/_rejected.log, never the ledger. - Draft —
draft_post.pydeterministically writesposts/YYYY-MM-DD.mdfrom validated evidence only. It makes no model or tool call, so it cannot invent or fetch sources it was never given. - Lint —
lint_post.pyfails the run on ticker/price/buy-sell language ("buy NTPC at ₹344" kills the run) and on any URL not in the validated set. - Attest —
attest.pywritesreceipts/<run_id>.json(sha256 ofpredictions.yaml+ evidence tree + post, host clock), then appends to the MirrorBus lane~/.mirrordna/bus/mirror_ledger_attestations.jsonl. Receipt-first, transport-second: a bus failure is flagged, never fatal. - Commit —
ledger: weekly run YYYY-MM-DD (N items, M validated). Push is off by default (PUSH_ON_RUN=0inconfig.env); flip to 1 after the first supervised run so commits get public timestamps. - Stop. Health receipt at
~/.mirrordna/health/mirror_ledger_weekly.json(ok|fail). Failures also append to the repair log inSTATE.mdand never auto-retry. Partial gather-call gaps remain visible in the post footer, attestation receipt, health receipt, andSTATE.md.
| Layer | Where | Rule |
|---|---|---|
| 1 | gather_evidence.py |
no URL → item dropped at intake; model told [] beats invention |
| 2 | validate_urls.py |
every URL fetched live; non-2xx → _rejected.log |
| 3 | draft_post.py |
deterministic renderer gets validated items only; no model/tool call |
| 4 | lint_post.py |
any URL outside the validated set fails the run |
A fabricated citation would have to defeat all four before it could even reach the draft that Paul still reviews by hand.
predictions.yaml source of truth; humans edit, pipeline only reads
evidence/ EM-XXX.yaml validated items; _rejected.log; _incoming/<run>/ raw audit
posts/ drafted updates (never auto-published)
papers/ manually approved, published long-form research
drops/ citable research-drop method, template and approved briefs
receipts/ attestation receipts per run
scripts/ pipeline (bash entry points + python workers)
tests/ pytest suite incl. poison-URL and finance-lint fixtures
deploy/ staged LaunchAgent plist, MANIFEST patch, executor runbook
STATE.md last run, blockers, repair log (EM-007 scoring input)
- LaunchAgent name
ai.mirrordna.ledger-weekly, notcom.mirrordna.ledger.weekly— the body's hardening standard names agentsai.mirrordna.*. - State integration: the handoff's
~/.mirrordna/current_state.jsonand~/.mirrordna/open_loops.mddo not exist on this body. The real conventions are used instead: a health receipt (mirror_ledger_weekly.json), the bus attestation lane, andSTATE.md. - Evidence placement: validated evidence is appended to
evidence/EM-XXX.yamlrather than intopredictions.yaml'sevidence:field, so the pipeline never rewrites the human-owned file (which would destroy comments and invite drift). - Seeding: EM-007 comes from the handoff. EM-001..006 were transcribed from the six-row forecast table in The Electric Mind — Public Edition v2 found in Downloads and are provenance-commented with source hashes. An exact-value regression test protects the statements, criteria, dates, and probabilities from transcription drift.
- Model pin: headless calls pin
claude-opus-4-6per~/.mirrordna/policy/model_registry.json, via the governed wrapper/Users/pauldesai/bin/claude, withANTHROPIC_API_KEYstripped — subscription lane only.
bash /Users/pauldesai/repos/mirror-ledger/scripts/run_weekly.shThe active schedule is a local Codex recurring task, Mondays at 12:30 IST,
which invokes the exact script above and verifies its receipt, health record,
commit, and draft. The staged LaunchAgent remains disabled so two schedulers
can never race; its plist is retained under deploy/ only as a recovery path.
/Users/pauldesai/bin/mirror-run --project /Users/pauldesai/repos/mirror-ledger deps -- uv sync
/Users/pauldesai/bin/mirror-run --project /Users/pauldesai/repos/mirror-ledger verify -- pytestUnit fixtures cover acceptance tests 2 (poison URL rejected end-to-end) and 4
(lint kills "buy NTPC at ₹344"). Acceptance tests 1, 3, 5 (live dry run, bus
fallback, single-fire schedule check) are in deploy/EXECUTOR_RUNBOOK.md.
Four green Mondays. Paul's weekly cost ≤ 15 minutes (read draft, publish, push).
EM-007 resolves confirmed on 2026-09-14. Then — and only then — v2 talk.