POC · measured 2026-09-16 · every number is from the project's records, listed at the end
seq 1Planplan.version · stage mvp
The weakness is named, and it is next.
FIX-590 first, at $0 from the ledger already recorded. Then the MVP: the substrate's real search and fetch, identity for what a plain fetch cannot reach, evaluation as a ledger and a doctrine seeded from the side-by-side, driven mode for the agent in Claude Code or OpenCode, and a real budget coordinator.
seq 2Planplan.version
POC → FIX-590 → MVP → Production.
Sixty-nine work packages in three stages, each with a title, a what, what it needs and a done-when that is measured, not asserted. 28 POC, 25 MVP, 16 production. This page names the packages the landing page names; the rest are listed by title.docs/PACKAGES.json — every title, what and done-when below is quoted or condensed from it
seq 3Runstage poc · 28 packages
POC: built, measured, one fix packaged.
The 28 POC packages are built and their gate is measured on the proof page: seven of eight checks pass. The eighth has a fix packaged against it.
FIX-590
Replay is a function of the ledger, not of sibling timing (A1 at concurrency > 1)
Found by the second POC gate and confirmed by the independent audit: at concurrency above one, the A1 check resolved a claim’s cited URL against any task.retrieved row of the run, so a task’s admission depended on which sibling tasks had already committed — and the same output was rejected “A1: url not fetched in run” when the run was replayed at concurrency 1. The fix: A1 resolves against the task’s own task.retrieved rows (its fetches and its recorded memo hits); a URL the task never retrieved is “not fetched” regardless of siblings — replay-stable by construction, the same shape as input_hash and the memo hit. The raw output of a rejected anchor is kept as evidence, as today.
done when over a copy of the gate ledger, check 8’s unequal set is exactly the one live run d7f8f21a…, the other 12 replays id-equal and claim_status-equal at 0 calls and 0 reserves, and check 4 still 0 mismatches; a new offline test at concurrency 6 in which one task cites a page only a sibling fetched gives the same admission outcome as at concurrency 1 and a report-equal replay; the 8 gold-8 replays stay byte-identical; SPEC erratum C-186, DESIGN §12 and the TESTPLAN row written
seq 4Planstage mvp · 25 packages
MVP: the substrate, identity, evaluation, driven mode, budget.
What waits on what among the named MVP packages. K6 (consistency classes and HLC) gates most of the stage; the substrate’s S1 feeds the JS-wall fallback, the second judge and the OpenCode driver; identity waits on the budget coordinator and the Decision ledger.docs/PACKAGES.json — the needs arrays of S1, S3, I1, I2, K13, E2, E3, E7, K9, F2, F3, G1, G2, G3
Substrate
S1
rs integration
Replace the interim retrieval with the substrate library: one implementation of the kernel’s Retriever trait over Substrate; search and fetch results admitted unchanged; SERP and Fetch rows carry a policy version; one MCP server hosts the rs tools and run.*.
done when gold-8 runs with zero browser sessions unless a JS wall is classified
S3
JS-wall fallback
The fetch classifier signals render-needed; the kernel routes only those to browser-use with the slot pool.
done when render rate ≤ 5 % of fetches on the campaign mix
A crate beside rsd owning rung-1 accounts, token and session lifecycle, per-identity budget and the operator/device register; the ledger holds only token_ref and session_ref; fail-closed; compiled out of the hosted profile.
done when a rung-1 grant is issued only inside a live escalate_rung1 Decision; a dead session yields BLOCKED (needs re-login) plus an operator alert, never a retry; the hosted profile links neither rs-identity nor rs-browser, CI-proven
I2
rs-browser — CDP worker, home-node-pinned
Drives the orchestrator-managed stable-Chrome profile in place over a loopback CDP port within the Decision window; refuses on datacenter egress; human-rate, tiny daily cap through the scarce reserve/settle class; authenticated bodies go to an owner-only, non-replicated, short-retention store.
done when a rung-1 fetch on the home node succeeds; the same call on datacenter egress is refused; no cookie bytes appear in any ledger, CAS, log or grant response
K13
Kernel invariants P13 + P14 and identity provenance columns
P13: any event with rung ≥ 1 references a live, scope-matching Decision, else rejected. P14: no event, ledger row, CAS body or log may contain a credential secret — only a *_ref — enforced by a secret-shape detector at admission. Provenance columns (rung, identity kind, decision id, risk, account class, attended) on every SERP, fetch and ledger row; hosted export refuses risk ≠ none.
done when a rung-1 event without a Decision ref is rejected; an event whose payload contains a cookie header or a Bearer token is rejected with reason secret_shape; the export filter drops every risk ≠ none row in a test
Evaluation
E2
Eval ledger
Labels with propensity, judge outputs and scores per (plan version, doctrine version, model); the gold set is gold-8 plus the E1 judgments, growing with Decision.feedback; bench.result events.
done when a model A/B on one unit is scored via replay with zero repeated calls on unchanged units
E3
Two judges and sampled audit
Two judge backends scored by peer prediction; a sampled citation audit that re-fetches and diffs; proper scoring over κ.
done when judged invariants move from pending to scored, calibrated on the 50-query human set
E7
Evaluation doctrine v1 and report lints
The method by which reports are judged, as a versioned doctrine and as mechanical checks, seeded from the E1 side-by-side: the per-report source audit, quote-fidelity spot checks, disputed facts resolved against the primary source, the four-angle self-attack, flip conditions written down. Report lints the kernel runs on every finished run — primary-source share, duplicate findings, a source both contested and confirming, a claim stronger than its quote, a claim contradicting its quote, date sanity, served-from-cache share — written as bench.result rows; judge.scored carries its evidence refs and a revises ref to the previous judgment.
done when doctrine/eval/v1 renders; the lints run offline over the gate ledger and reproduce E1’s numbers where mechanical (primary share within ±5 points; the Q4 and Q7 duplicates; the Q5 contested-and-confirming source; the Q6 must-vs-SHOULD); a judge.scored over one gold-8 run references its rubric version and evidence, and a second judgment revising it refs the first
Driven mode
K9
Driven mode: run.next / run.submit
Task leases; a frontend pulls the next unit’s inputs and schema and submits the output; admission identical to headless; stalled driven runs finish headless.
done when a half-driven, half-headless run produces the same event kinds and passes the same invariants
F2
OpenCode config
command.research plus agent.researcher (a stateless driver that loads the generated skill); agent.investigator and agent.verifier restricted to rs.*; the auditor without web tools.
done when /research in OpenCode with Gemini completes a driven standard run
F3
Claude Code skill
The same generated skill; Claude Code as a driver over the same MCP surface.
done when the same run driven from Claude Code yields the same event kinds
Budget and governance
G1
rsd budget coordinator
reserve, settle and release per scope, linearizable, with reservation expiry; the POC’s budget stub becomes a transport swap.
done when an over-cap unit is refused before invocation from two concurrent runs; an orphaned reservation expires
G2
Policy and Decision ledgers
rs decide writes Decision events; Policy rules derive with scope and expiry; default_applied is recorded.
done when every fetch and search row carries the policy version it ran under
G3
Seed the five substrate decisions
Identity line · Cloudflare egress lane · robots policy · engines per campaign · paid Yandex.
done when five Decision events exist, none default_applied
Also in the MVP, by title: K6 Consistency classes and HLC · K7 Schema versions and upcast · K8 Rejection and repair policy · K14 kernel-events crate · B5 Knowledge-hit guards · B6 Campaign memory · S2 Knowledge ledger v1 · F4 CLI: rs research · E4 Promotion gate · O1 Backup, service, doctor · X2 MVP gate measurement.docs/PACKAGES.json, stage mvp
seq 5Planstage prod · 16 packages
Then production.
K10
Multi-node sync
The mergeable class across the Mac and a cloud node; the sequenced class log-shipped from its owner; either side may be offline.
done when a replica rebuilt from the other node yields identical derived-view hashes after 24 h of divergent writes
K11
Transparency log
A Merkle tree over events as a view; hourly checkpoints anchored for $0; rs seen returns an inclusion proof.
done when a proof verifies offline against a published checkpoint
K12
Tiering to R2
Primary ledgers age to Parquet on R2 with zone maps; derived ledgers drop and rebuild.
done when a year-old run replays from the cold tier with the same hash
F5
Cloud clients
Streamable-HTTP MCP with bearer auth against the cloud node; per-client fairness.
done when a driven run from a remote Claude Code session completes against the cloud node
Also in production, by title: B7 Plan v2: skippable phases · B8 Graph retriever · S4 GLiNER extraction · S5 Change-cadence verification · E5 Off-policy eval and multileaving · E6 Red-team closure · G4 Learned budgets · G5 Expiry and PROV-O export · O2 Cluster deploy · O3 SLOs and alerts · O4 Docs and licence review · X3 Production gate measurement.docs/PACKAGES.json, stage prod
next: try it — who it is for, and how the POC is used today.