Spec · v1 draft · W6 internal · for red-pen

Neuron inherits

Carry Plato’s proven truth-and-receipt machinery onto the business — the 14-site Neuron fleet. Given a change to a shared piece of the fleet, compute for each client site whether it was affected or untouched, and make every “untouched” carry a re-runnable proof. A provably-untouched site is a site you can skip with proof, not skip on faith.

Draft for Robert’s annotation · INTERNAL ONLY (runs on a pinned clone, touches nothing live) · not approved · no building yet
THE FLEET CHANGE, END TO END

What happens when someone changes a shared piece of the fleet

The picture is the index — each node jumps to where that step is decided. Follow one shared-package change from edit to per-site verdict.

Reference strip: Decisions · The one idea · Risks · Your calls · How we’ll know · Kill criterion · The machinery (Layer 2)

LAYER 1 · THE DECISION PAGE

The story — what this earns us

Plato has proven, on itself, that it can tell an agent the truth about a codebase cheaply: what’s here, what’s wired to what, and a receipt that proves the answer is still current. W6 carries that machinery onto the business — the 14-site Neuron fleet Digital Empathy actually runs.

The payoff is one specific, expensive thing made cheap. Today, when someone changes a shared piece of the fleet — a component every site renders, a build step every site runs through — the honest answer to “which of our 14 client sites did that just change?” is nobody’s. So the whole fleet gets re-QA’d by hand, or worse, nobody checks and a site breaks silently. W6 replaces that with a computed answer that carries its own proof.

  1. A shared-package edit lands. Someone changes a file in packages/* — a component, a build step. That’s “a change” (one commit’s worth of touched files).
  2. Plato reads the Neuron repo the way it reads its own. A thin Neuron adapter teaches Plato the map of what’s there and a currency proof for each piece — reusing the proven code engine, because Neuron is TypeScript and the engine already reads that correctly.
    ↘ go deeper — what the adapter actually supplies
    NeuronAdapter(repoPath) composes the code adapter over packages/**+scripts/** and adds three Neuron pieces: groundTruth (delegates), currency via buildVerifiedSnapshot → hashCommittedBlob (never hash genome.json — authority-deprecated), and graph() with the site-wiring layer kept as a separate, fenced relation. Fleet universe = the 14 enabled sites in sites-manifest.json. Full: L2.1.
  3. Which sites does the change reach? This is the whole spec. Our client sites are not code — they’re content. The shared code gets rendered over that content by a build step; sites don’t “import” the code. So Plato’s normal import-following map cannot by itself see “this component reaches this site.” That path runs through the build pipeline — so the adapter models the pipeline path explicitly, and fences honestly anywhere it can’t fully resolve it.
    ↘ go deeper — the blind spot, and the fence
    The site↔package edge is a build-pipeline relation (scripts/assembly-line.ts iterates siteIds and renders package code over site content), NOT an import edge. The pipeline-reach model over-approximates toward AFFECTED. Where it hits an .astro component Plato can’t parse (38 of them), or a site whose per-site config selects code dynamically — the answer is CANNOT-CERTIFY, never “untouched.” Full completeness audit (8 blind axes): L2.2.
  4. Each site gets a verdict, and the verdict is a receipt. Per site: affected, untouched, or can’t-certify — each carrying a {basis, receipt, currency} proof in the exact shape W1’s gate already banks. We’re not inventing a proof format; we’re pointing the proven one at the fleet.
  5. An untouched site is a site you can skip — with proof. Re-run the receipt to confirm nothing reached it. That’s the fleet-scale version of what W1 proved on Plato’s own gate: skip-with-proof, not skip-on-faith.
THE ONE IDEA THAT CARRIES THE SPEC

“Untouched, with proof” — and what it refuses to say

A site is untouched only if Plato can see the whole path from the change to that site and prove none of it lands there. Where Plato can’t see the whole path, it must not answer “untouched.” It answers CANNOT-CERTIFY and falls back to “re-QA this one by hand.” A false “untouched” is the one outcome this spec exists to make impossible — it would tell you to skip a site that actually broke.

So the bar is deliberately lopsided: cheap to say “affected,” expensive (proof-gated) to say “untouched.” Over-approximation is safe (extra QA); under-approximation is the nightmare.

WHAT I DECIDED AND WHY

The decisions, in consequences

Adapter
Reuse the proven engine; don’t rebuild it
Neuron is TypeScript; Plato’s code engine already reads that. The adapter is thin — only what’s different (the sites/ layout, the fleet manifest, the .astro fence). Consequence: small build, low risk, hard-won correctness carries over free.
Receipts
Per-site verdicts in W1’s exact shape
An “untouched” verdict is a deposit carrying {basis, receipt, currency} — the record W1 banks today. Consequence: auditable and re-runnable on day one; the standing planted-lie drill already knows how to attack that shape.
Safety
“Untouched” fails closed
The moment blast-radius hits something it can’t fully see, the verdict is CANNOT-CERTIFY, never a green “untouched.” Consequence: the mechanism can gate real QA effort — its “skip this” is provable and its “not sure” is loud.
Honesty
Correct the dead citation in the open
The old “73/73, verified” claim → “UNVERIFIED — traces to no on-disk source; the doc it cited never existed.” Consequence: the repo’s history stays honest — a corrected claim with provenance, not a suspiciously clean absence.
Scope
Nothing here touches anything live
Everything runs on a pinned /tmp clone. Consequence: full-velocity, gate-free build — Alie’s survival-frame gate sits only at the first live expression, which this spec does not reach.
WHAT COULD GO WRONG, HONESTLY

The hard problems, and what catches each

We over-fence and save no QA

If almost every change hits an .astro component or ambiguous wiring, nearly everything returns CANNOT-CERTIFY — a true result, but useless.

Caught by: the kill criterion. If the split can’t beat “re-QA everything” on a real change, we stop and study the wiring model before building more.

A real cross-site edge is missed

The nightmare: a site wrongly called untouched, and it actually broke.

Caught by: a falsify gate — a planted cross-site dependency MUST flip that site’s verdict from untouched to affected, or the gate goes red.

A tampered receipt slips through

An altered “untouched” receipt would make the proof theater.

Caught by: a falsify gate — a deliberately-tampered site-receipt MUST be detected by re-running it. Gate leg, not hope.

The 73/73 number was actually right

Then we’re now calling something true “unverified.”

But: “unverified” is the honest state of a claim with no on-disk evidence, and it’s recoverable — re-run the comparison and it earns “verified” back. A false “verified” is not recoverable the same way. Degraded-honest beats confidently-wrong.

YOUR CALLS, STANDING

What I need from you

1 · Red-pen this page

Annotate anywhere — hover a block and click the ✎, or use “Comment on anything.”

2 · The fleet-unit question

A “shared-package change” needs a unit. I chose the git commit (blast-radius computed for that diff). The alternative is a looser multi-commit “changeset.” My rec: commit-scoped — it’s the unit that already carries a currency pin. Your call if you want the looser unit; it changes nothing about the proof shape, only the boundary of “a change.”

3 · The first real fleet change to prove on

W6’s done-bar is one real fleet-wide change shipped with receipts and a measured QA delta. I’ll pick a low-stakes shared-component change on the clone and measure. Flagging it because the choice of which change is the kind of thing you may want eyes on — it’s the headline number (“we skipped N of 14 sites with proof”) the Master Plan’s proof-bar #3 rests on.

HOW WE’LL KNOW IT WORKS

Three measured numbers — all recomputed from raw by the lead

1 · The split is real and non-degenerate. On a real change, the fleet splits into affected and untouched-with-proof — and it is neither all-affected nor all-untouched (both degenerate answers are failures).
2 · The proof holds under attack. A planted cross-site edge flips a verdict; a tampered receipt is caught. Both are gate legs.
3 · The QA delta is counted. “N of 14 sites skipped with proof” on that change — the number the Master Plan’s proof-bar #3 requires.
Kill criterion: if, on a representative real change, the untouched-with-proof set is empty or so small that computing + upkeeping the receipts costs more than just re-QA’ing the fleet, stop and study the wiring model — the blast-radius frame is wrong before more is built on it. (This is W1’s kill criterion, at fleet scale.)
LAYER 2 · THE MACHINERY

For the builder — you never need to read past here

The full build contract lives in the canonical Markdown (docs/ai/SPEC-w6-internal.md, Layer 2): the ground-truth re-derived from the pinned clone at b68a4b1; the adapter interface reuse; the 8-axis completeness audit; the pipeline-reach model with its frontier-brief prerequisite; the per-site deposit shape; the G1–G6 gates with named deliberate-breaks; rollback and dependencies. Drill into the key pieces:

↘ the completeness audit — 8 blind axes, each with its fence
The UNTOUCHED absence claim is gated on clearing every axis: A1 build-pipeline path (not imports), A2 transitive code reach, A3 .astro non-graph hosts, A4 dynamic/string pipeline dispatch, A5 direct content-file changes, A6 the fleet roster itself, A7 parse-failed files, A8 clone staleness. Any blind axis → CANNOT-CERTIFY. Same pattern as the shipped conformance verdict (three answers, never two; green scoped to exactly what’s provable).
↘ the frontier-brief prerequisite (frame-fitness)
The pipeline-reach model is a novel mechanism — problem class: impact analysis across a build/transform boundary where the dependency is a generator iterating over data-driven targets, not static import edges. Field default: Bazel/Nx/Turborepo affected (task-graph + input-hash reach). Named anti-pattern of the pick: under-declared inputs → false “unaffected” (bazelbuild/bazel#11057) — exactly the nightmare A1/A4 fence against. The brief is a build prerequisite, non-author-owned.
↘ the citation cleanup — corrected, not erased
NEURON-ADAPTER.md never existed on any branch/commit. Every live authoritative pointer (CLAUDE.md, SPEC.md, src/adapters/neuron/index.mjs, GENOME-ROADMAP.md) is rewritten to point at this spec with a “never existed” note. The SPEC.md:164 “proven 73/73 byte-identical (verified)” figure is relabeled UNVERIFIED with provenance. Grep gate G5 enforces zero live dangling pointers. A quietly-erased false “verified” is how a truth layer launders its own history — the exact failure mode Plato exists to catch.