Ledger Kernel · research-stack
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.

POC 28 packages · gate 7 / 8 FIX-590 replay = f(ledger) MVP 25 packages Production 16 packages S1 · S3 substrate: real search + fetch; a browser only if needed I1 · I2 · K13 identity: vault, home-pinned browser worker, provenance E2 · E3 · E7 evaluation: Eval ledger, two judges + citation audit, E7 K9 · F2 · F3 driven mode: the agent drives run.next / run.submit G1 · G2 · G3 budget daemon; Policy + Decision ledgers; 5 decisions then: multi-node sync transparency log tiering · cloud clients

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.

kernel prerequisitessubstrateevaluationdriven modegovernanceidentityK6 · consistency, HLCK14 · kernel-eventsG1 · budget coord.S1 · rs integrationE2 · Eval ledgerK9 · driven modeG2 · Policy, DecisionS3 · JS-wall fallbackE3 · two judgesF2 · OpenCode configF3 · Claude Code skillG3 · five decisionsI1 · rs-identityK13 · P13 + P14E7 · eval doctrineI2 · rs-browserK9 also needs K5 · F1— POC packages, builtarrow = needs (docs/PACKAGES.json), transitively reduced: K6 → K13 is implied through G2, E2 → E7 through E3

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

Identity

  • I1
    rs-identity — identity orchestrator + vault (rung 1)

    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.