Skip to content

docs(rfc): runtime-versioned workers/tasks & triggers — production architecture RFC - #1446

Merged
rickylabs merged 17 commits into
mainfrom
docs/rfc-runtime-versioned-automation
Aug 11, 2026
Merged

docs(rfc): runtime-versioned workers/tasks & triggers — production architecture RFC#1446
rickylabs merged 17 commits into
mainfrom
docs/rfc-runtime-versioned-automation

Conversation

@rickylabs

@rickylabs rickylabs commented Aug 11, 2026

Copy link
Copy Markdown
Owner

Summary

RFC orchestrator run for the future of runtime-versioned workers/tasks and triggers — the
operator capability of adding, updating, and rolling back versioned task/trigger configuration
(including polyglot/legacy wrappers) on a running deployed stack, with a production/admin
operator console (and a developer DevTools surface staged behind its own RFC — D-9).

Deliverable: rfcs/0000-runtime-versioned-automation.md (status Draft, canonical rfcs/
process — number 0000 until a maintainer assigns one at acceptance) + evidence-backed capability matrices + 1444-impact.md (delivered early) +
replacement/cleanup plan + E2E acceptance model + draft roadmap (nothing filed until owner
ratification). State: Plan & Design complete — PR stays draft; owner ratification required.

Do not merge until the final PLAN-EVAL (Codex GPT-5.6 Sol · xhigh, owner override) posts PASS
and the owner ratifies. IMPL-EVAL is N/A by shape: this run implements nothing — the Sol·xhigh
PLAN-EVAL is the run's formal evaluator pass; implementation waves get their own runs and evals.

Headline findings (evidence, supervisor-verified)

  • The versioned runtime trees were dead wiring at every inspected commit — legacy and current:
    loader/watcher exist, no production composition consumes them (static reachability audits; the
    reports state their own limits).
  • The real assets: a 7-runtime polyglot executor + KV registries (deno+shell proven live, five
    adapters implemented-unproven) and a tested trigger processor (idempotency/DLQ/defer). What
    never existed: a coherent, revisioned operator control plane.
  • Behavioral probes: pointer promotion loses a concurrent update 20/20; malformed JSON
    silently empties config; generate runtime-schemas writes 0 files on baseline; the
    executor rejects the versioned RuntimeTask shape; absent permissions ⇒ --allow-all.

Locked decisions (RFC §)

  1. Two-plane architecture: definition control plane / execution data plane (§4).
  2. Contribution families task@1/trigger@1, one schema authority, no hardcoded topics (§5.1).
  3. Scheduled trigger is the only operator cron surface; task@1 has no schedule — resolves
    this RFC's side of CRON-SUBSYSTEM-DUP without preempting the T0 maintainer call (§5.1).
  4. Immutable content-addressed revisions; transactional activation-set manifests with strictly
    monotonic epochs
    ; CAS preconditions; fleet admission + convergence tracking; fail-visible
    never fail-empty (§5.2/5.3).
  5. Store port + adapters: Postgres production, dev-KV honestly narrowed (single-writer, no
    fleet features); one adapter-conformance suite (§5.2).
  6. Execution boundary tiers with an honest T1 contract: Deno grants enforced; non-Deno grants
    declarative+audited, NOT enforced — T2 (gVisor/Firecracker-class port adapter) required for
    untrusted polyglot (§5.4, §6).
  7. Ownership locked: automation-core (ARCHETYPE-1 contracts only) + automation-runtime
    (behavior + store adapters, per the adapter-relocation law) + thin plugins/automation
    connector (composition only) (§9).
  8. Clean break (owner D-5): complete cleanup inventory, no compat/migration layer (§10).
  9. Two operator frontends decided (§8.2, owner D-9): the production/admin automation
    console (userland app family) is strictly downstream of the RFC RFC: Frontend Contribution Layer — plugins that ship UI (dashboard · auth · ai · deploy) #890 / epic Epic: Frontend contribution layer — plugins that ship UI #922 minimum
    cut ([frontend-contrib S1] P1 proof: mounted sub-app command ordering #923[frontend-contrib S10] Scaffold template wiring + HostSurfaceDescriptor + vite feed #932 + [frontend-contrib S12] Generated deny-by-default procedure gateway #934; [frontend-contrib S11] Workers dogfood: zone panel + console route + island #933 adjacency) — that cut is sufficient for this surface only.
    Developer DevTools (diagnostics, live definitions/state, execution journeys) is a distinct
    host/contribution surface staged behind the new P-6 DevTools RFC, which re-evaluates epic
    Epic: NetScript DevTools contribution and host architecture #400 (+ design: dev-dashboard revamp umbrella (analysis + Claude-Design prompts) #685/feat(dashboard): visual revamp to reference bar (adversarial-gated) #780/plan(design): Dev Dashboard E2E Claude Design prototype + production design-sync — Plan & Design ready for review #506 as evidence, not ratified architecture) and consumes this RFC's
    management/history/convergence/OTel contracts; this RFC designs none of the five general
    frontend contribution mechanisms. Backend waves are frontend-independent (§8.2, §12).
  10. Availability contract (§5.3-7/8): indefinite last-good serving, never self-drain;
    local validation (hash + schema-major) gates serving, control-plane currentness gates only
    convergence; three replica cases (lease-expiry-while-serving / restart-with-persisted-state /
    cold-start idle-and-loud) unified and E2E-tested (§13 test 8); pinned-lookup failures
    classified transient (retry) vs terminal (DLQ) over a never-invalidating revision cache.
  11. Competitive positioning (§14.1, D-8 study): 8 adopted industry patterns (immutable
    version+pointer, in-flight pinning, DB SoT, server-owned scheduling, sync/poll convergence,
    draft→publish UX, versioned plugins, weighted activation staged as P-5); non-goals headlined
    by replay-determinism durable execution; differentiators: in-framework composition, wrapping
    existing project scripts, contribution families, one control plane across engines.

Slices

  • S1 Run bootstrap + briefs + 1444-impact.md (posted to fix(plugin-ai,cli,plugin): emit a valid in-process AI topology and a compilable scaffold #1444: comment 5248826402)
  • S2 Evidence: legacy capability map (Codex Sol; supervisor A1 review PASS)
  • S3 Evidence: current-state matrix + probes P1–P5 (Codex Sol; supervisor A1 review PASS)
  • S4 RFC authored; docs:links + fmt gates green (normalized 2026-08-11 to
    rfcs/0000-runtime-versioned-automation.md per the canonical RFC process — e5b2a74ae)
  • S5 PLAN-EVAL: PASS at cycle 9 (28830c88a). Monotonic convergence: C1 9 findings →
    C3 6 → C4 5 → C5 2 → C6 architecture-clean ("no unresolved runtime architecture decision
    remains"; D-9 amendment audit all-PASS) → C7–C8 record bookkeeping → C9: every plan-gate
    checklist item PASS, open-decision sweep none
    . Full nine-cycle append-only record in
    plan-eval.md
  • S6 Competitive architecture study (owner directive D-8): 9 systems, primary sources →
    evidence/competitive-architecture-study.md; RFC §14.1 (adopt / non-goal /
    differentiator), §13.1 benchmark gates BG-1..BG-5 (no empirical claims), §11 P-5
    (weighted activation); isolation-scoped wording corrections

Definition of Done

  • RFC present at rfcs/0000-runtime-versioned-automation.md, status Draft, all sections internally
    consistent (ownership §9 binding; epoch protocol §5.2/5.3; honest T1 §5.4; TM1–TM9; §10
    file-level inventory; §12 sliced roadmap with gates)
  • Evidence reports + probes committed under the run dir; every RFC capability claim traces to
    them with status tags
  • 1444-impact.md delivered to PR fix(plugin-ai,cli,plugin): emit a valid in-process AI topology and a compilable scaffold #1444 (done — comment 5248826402)
  • docs:links + deno fmt --check green on the RFC (done)
  • PLAN-EVAL PASS (cycle 9) recorded by the separate Sol·xhigh evaluator session
  • Owner ratifies (PR stays draft until then)
  • No issues/epics filed; PR remains draft until owner ratification

Drift / Debt

Risk register, open-decision sweep, gates

See plan.md in the run dir (expanded risk register incl. epoch/fleet/security risks with owning
slices; open-decision sweep with classifications — every must-resolve decision is resolved in the
RFC; deferrals: naming→A0, two-person default→A2b, retention→A3b). Gates for this docs-only diff:
docs-source gates + ci:skip-e2e + ci:skip-scaffold (recorded intentionally; ci:full escape
hatch if the diff stops being docs-only).

Harness

  • Run dir: .llm/runs/docs-rfc-runtime-versioned-automation--supervisor/
  • Supervisor: Claude Fable 5 · medium (owner override D-1), bypass permissions, /rc.
  • Research: Codex GPT-5.6 Sol · medium thread (route-matched, registry-recorded).
  • Evaluator: fresh Codex GPT-5.6 Sol · xhigh session in dedicated worktree (owner override
    D-2). Generator ≠ evaluator; no lane self-certifies.
  • Owner mid-run directives recorded: D-3 (frontend sequencing), D-4 (complete redesign), D-5
    (no compat), D-6 (parent hypotheses — all six confirmed).

…d legacy evidence

Run dir with supervisor identity + owner overrides (Fable 5 supervisor, Sol xhigh
final PLAN-EVAL), briefs, research scaffold, 1444-impact memo (delivered to PR
#1444), and the Codex Sol legacy capability map: the versioned runtime trees were
dead wiring even in netscript-start; the polyglot executor + KV registry are the
real surviving assets.

Refs #1443 #1445

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PxfW6uzysZaXSQnyPrD7By
@rickylabs rickylabs added this to the Backlog / Triage milestone Aug 11, 2026
@rickylabs rickylabs added area:docs type:docs ci:skip-e2e area:plugins plugins/* and plugin-core packages status:research Harness research phase area:config packages/config and runtime-config ci:skip-scaffold Skip the scaffold-static (deno-only) scaffold gate labels Aug 11, 2026
@rickylabs

Copy link
Copy Markdown
Owner Author

Research phase — S1+S2 landed (e7378bf7c)

S1 bootstrap: run dir + supervisor identity (Fable 5 medium, owner override D-1), briefs, 1444-impact.md delivered early → #1444 (comment) (ratifies the D-10 split; child-process loader kept; constraints C1–C8 incl. manifest-as-data, additive schema extensibility, deno.jsonc loader gap, runtime-schemas stays control-plane-only).

S2 legacy capability map (evidence/legacy-capability-map.md, Codex Sol·medium thread 019feef8-…105b, route matched, 6 turns): 15 sections, 3 operator journeys, reachability audit, weakest-claims list. Headline: versioned runtime trees were dead wiring even in legacy — no executable consumer of @netscript/runtime-config; the real assets are the KV task registry + 7-runtime polyglot executor (per-message KV resolution = live-update capable) lacking any operator control plane; workers cockpit list/detail/run wired, triggers cockpit dead vs delivered service; absent permissions → --allow-all; 5-way split-brain config.

Supervisor slice review (A1): full read + 2 spot-checks confirmed verbatim (runtime-config consumer greps; permission-flags.ts:3-6). PASS.

Owner mid-run directives D-3/D-4/D-5 recorded in drift.md: cockpit downstream of #890/#922 with explicit minimum cut; complete redesign in scope; no compat/migration layer (clean break + cleanup inventory).

Next: S3 current-state matrix (Codex Sol, behavioral probes P1–P5).

rickylabs and others added 2 commits August 11, 2026 06:52
…e-versioned automation

G2 confirms every parent hypothesis behaviorally (20/20 lost-update race on
pointer promotion, silent-empty on malformed JSON, runtime-schemas writes zero
on baseline, executor rejects the versioned RuntimeTask shape, polyglot engine
executes). RFC-0001 proposes the two-plane clean-break architecture: contribution
families, immutable revisions + CAS activation + audit, snapshot propagation,
tiered execution boundaries, #922-gated cockpit, cleanup inventory, roadmap A0-A8.

Refs #1443 #1445

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PxfW6uzysZaXSQnyPrD7By
@rickylabs

Copy link
Copy Markdown
Owner Author

Research + Authoring — S3+S4 landed (f5997b6a2)

S3 current-state matrix (evidence/current-state-matrix.md, same Codex Sol thread resumed — fresh launch blocked by duplicate_sender_risk, registry-sanctioned resume used; 10 turns): hypotheses H1–H6 all confirmed with behavioral probes — P1 pointer promotion loses a concurrent update 20/20 trials (read-merge-write, no CAS); P2 watcher live-reloads but malformed JSON silently empties topics; P3 generate runtime-schemas exits 0 / 0 written on baseline; P4 the executor rejects the versioned RuntimeTask shape (schema drift proven at runtime); P5 deno+shell execute through the engine. 22/0 targeted tests. Bonus finds: trigger v1 router genuinely backs reads/webhook/enable-disable; republish overwrites topic docs in place (false immutability); loader pointer paths not root-confined. Supervisor A1 review: 2 verbatim spot-checks, PASS.

S4 RFC-0001 (docs/architecture/rfc/rfc-0001-runtime-versioned-automation.md): two-plane architecture; runtime contribution families (the #890 pattern extracted, not copied); immutable revisions + CAS activation + transactional audit; snapshot propagation (change feed + pull-verify-swap, no fs-watch); execution boundary tiers T0–T3 over established isolation tech; threat model TM1–TM8; management API; cockpit strictly downstream of the #922 minimum cut (#923#932 + #934; #933 adjacency); ownership decision O2+O4 with recorded fallback; clean-break cleanup inventory (D-5); staged prerequisite RFCs P-1…P-4; roadmap A0–A8; E2E acceptance model. Gates: docs:links green, deno fmt clean.

Next: S5 — fresh native Codex GPT-5.6 Sol · xhigh adversarial PLAN-EVAL (owner override D-2).

…nest T1, cleanup, slices

All nine findings addressed: activation-set manifests with monotonic epochs and
fleet admission; three-package doctrine-correct ownership locked; T1 enforcement
stated honestly per runtime; TM9 child-loader threat + explicit trust assumptions;
evidence claims scoped to inspected commits; cleanup inventory completed incl.
cron-ownership resolution; roadmap re-sliced with files, gates, corrected edges;
Design checkpoint + context pack restored.

Refs #1443 #1445

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PxfW6uzysZaXSQnyPrD7By
@rickylabs

Copy link
Copy Markdown
Owner Author

PLAN-EVAL cycle 1 — FAIL_PLAN → fix cycle applied (382795e4a)

Evaluator: fresh Codex GPT-5.6 Sol · xhigh thread 019fef2b-…03fc in dedicated worktree ns-rfc-plan-eval (route matched; generator ≠ evaluator verified in the verdict). Verdict: FAIL_PLAN, 9 findings — full text in plan-eval.md. The evaluator endorsed the core direction (D-10 preservation, clean break, contribution model, #922 cut) and attacked the right things.

All findings addressed:

  1. Design checkpoint + context-pack.md restored; PR body reconciled (this edit).
  2. Ownership locked — no more recommendation+fallback ambiguity: contracts-only automation-core / behavioral automation-runtime (store adapters live in the core package per the PLUGIN-RUNTIME-ADAPTER-RELOCATION law) / thin plugins/automation connector; no-connector fallback withdrawn with same-fidelity analysis.
  3. Doctrine-correct archetypes (ARCHETYPE-1 = types only; connector = composition only).
  4. Activation-set manifests + strictly monotonic epochs replace per-family snapshots: transactional cross-family commit, referential validation, stale/out-of-order rejection, fleet schema admission at commit, replica acks + convergence SLO, honest KV-adapter narrowing + one conformance suite.
  5. Honest T1: non-Deno capability grants are declarative+audited, NOT enforced (recorded debt + Deno subprocess docs cited); per-runtime negative tests incl. a deliberate non-enforcement pin; T2 required for untrusted polyglot.
  6. C8 honored: TM9 child-loader threat + lockfile/--cached-only gate; explicit v1 trust assumptions (DB/admin trusted, TLS transport, bounded redaction, audit not tamper-proof vs DB admin — signed snapshots + independent sink staged with P-3).
  7. Evidence claims scoped to inspected commits; KV job CRUD + trigger enable/disable acknowledged; fix(plugin-ai,cli,plugin): emit a valid in-process AI topology and a compilable scaffold #1444 = open-draft dependency; polyglot row downgraded to deno+shell proven.
  8. Cleanup inventory completed (sagas emissions, workers local discovery, generated trigger registry, KV enabled-state fold, Windows env keys, T0/task@1 boundary) + cron ownership resolved: task@1 has no schedule — scheduled trigger@1 is the single operator cron surface; CRON-SUBSYSTEM-DUP's T0 maintainer call untouched.
  9. Roadmap re-sliced A0–A8 → PR-sized slices with file groups + gate classes and corrected edges (A4b/A5b depend on A2b; A7 on A3b/A4b/A5b + the Epic: Frontend contribution layer — plugins that ship UI #922 cut).

Gates re-run: docs:links green, deno fmt --check clean. Cycle 2 launching now (same evaluator identity, fresh pass; two-FAIL limit then owner escalation).

@rickylabs rickylabs added status:plan-eval Awaiting plan evaluation and removed status:research Harness research phase labels Aug 11, 2026
…tal-state epochs, pinned dispatch

Cycle 2 caught that three cycle-1 edits had silently no-opped against
fmt-rewrapped text (drift D-7) and added genuinely new findings. Every fix is
now verified in-file: ports out of the contracts package, revision-pinned
cross-engine dispatch, leased fleet admission, TM9 loader policy, file-level
cleanup inventory, re-sliced roadmap with full gate classes, jsr pre-scan.

Refs #1443 #1445

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PxfW6uzysZaXSQnyPrD7By
@rickylabs

Copy link
Copy Markdown
Owner Author

PLAN-EVAL cycle 2 — FAIL_PLAN → verified fix set applied (af4f20f1e) → owner escalation (two-FAIL protocol stop)

Cycle 2 verdict (same Sol·xhigh evaluator, fresh pass at 382795e4a): FAIL_PLAN — full text in plan-eval.md §Cycle 2. Two distinct causes:

  1. Process failure (mine, recorded as drift D-7): three cycle-1 fixes — the §9 ownership lock, TM9, and the T1 honesty companion text — had silently no-opped: my patch strings were composed against pre-deno fmt text and missed the rewrapped file, so the evaluator correctly found the old text while my fix comment claimed otherwise. All re-applied with per-edit assert-on-miss verification + grep audit this time.
  2. Genuinely new findings, all now addressed in af4f20f1e:
    • epochs materialize the complete active desired state (carry-forward, tombstones, idempotent reactivation);
    • cross-engine race closed by revision-pinned dispatch ((taskId, revision, contentHash) in queue messages; immutable-store lookup; loud dead-letter on miss) — fleet atomicity needed for freshness only;
    • leased registration + rejoin-validation closes the admission time-of-check gap;
    • management oRPC contract owned by A0; A2b split (lifecycle vs feed/fleet A2d); A6 split (A6a/A6b/A6c) with the release-gate class on the scaffold-changing half; fitness/publish gates on every package slice; jsr-audit pre-scan recorded (Zod slow-type risks named);
    • §10 grew a file-level disposition table (incl. the plugin runtime-config-topic axis, trigger-registry path, Windows emitters, T0 boundary);
    • TM9 loader policy honoring C8 (lockfile + --cached-only warm-cache default, loud cold-cache, A2a proving gate); TM1/TM2 de-overclaimed; survey extract committed to evidence/sandbox-isolation-survey.md;
    • PR body reconciled (this thread), DoD + Drift/Debt added, status:plan-eval label set, draft state affirmed.

Protocol stop. Two FAIL_PLAN cycles are consumed; per evaluator/plan-protocol.md this escalates to the owner instead of an automatic third cycle. The fix state is complete and pushed. Owner options: (a) authorize PLAN-EVAL cycle 3 (resume evaluator thread 019fef2b-…03fc against af4f20f1e), (b) review the RFC directly and ratify/redirect, (c) redirect scope. The supervisor holds here.

rickylabs and others added 2 commits August 11, 2026 07:35
…integrate its conclusions

Nine analogous systems compared on primary sources across twelve dimensions;
RFC gains §14.1 (adopted patterns / non-goals / differentiators), §13.1
executable benchmark gates replacing any performance claim, P-5 weighted
activation, and isolation-scoped wording corrections.

Refs #1443 #1445

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PxfW6uzysZaXSQnyPrD7By
@rickylabs

Copy link
Copy Markdown
Owner Author

S6 — Competitive architecture study landed (811373a87, owner directive)

Primary-source comparison of Temporal, Restate, Inngest, Trigger.dev, Hatchet, Windmill, Azure Durable Functions, AWS Step Functions, Kestra + n8n across the 12 owner-named dimensions → evidence/competitive-architecture-study.md (cited per-system profiles + 12×9 matrix + synthesis + limitations).

Integrated into RFC-0001:

  • §14.1: 8 adopted established patterns (each mapped to the RFC § already specifying it — notably immutable-version+pointer activation, in-flight version pinning, DB as SoT with file trees demoted, server-owned scheduling, app-sync convergence, draft→publish cockpit UX, plugin-versioned extensibility), 4 deliberate non-goals (headlined by replay-determinism durable execution — the DF/Temporal versioning tax deliberately not imported; durable lessons routed to P-4 if saga@1 goes durable), 4 defended differentiators (in-framework composition, wrapping existing project-local polyglot scripts, contribution families, one control plane across engines).
  • §13.1: executable benchmark gates BG-1..BG-5 (convergence latency, pinned-lookup overhead, epoch-commit latency, history write sustain, T1 spawn overhead) — no empirical performance claims anywhere; gates land in named slices with pinned reference environments.
  • §11: P-5 weighted/canary activation (Step Functions weighted-alias precedent); P-2 wording corrected to isolation-technology survey (scoped), sandbox-survey file cross-scoped likewise.

Gates: docs:links green, fmt clean. Next: owner-authorized PLAN-EVAL cycle 3 against 811373a87.

… bounded secrets, complete inventory, full gates

Availability during control-plane outage is now a decided contract (last-good
serving, classified pinned-lookup failures, revision cache); the cleanup table
reaches the actual tree; every roadmap row carries its matrix gates and release
classes; the competitive study gains the three missing dimensions and sheds its
overbroad negatives and the last empirical claim.

Refs #1443 #1445

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PxfW6uzysZaXSQnyPrD7By
@rickylabs

Copy link
Copy Markdown
Owner Author

PLAN-EVAL cycle 3 (owner-authorized) — FAIL_PLAN → all six findings fixed (3c918a64e); holding current-but-draft for ratification

Cycle 3 at 811373a87 (verdict in plan-eval.md §Cycle 3): 5 of 9 prior findings now PASS — binding ownership, doctrine-valid archetypes, honest T1, evidence scoping, TM9/C8 core all verified directly by the evaluator. Six narrowed findings remained; every one is resolved:

  1. Control-plane-outage availability contract decided (§5.3 step 8): replicas keep serving last-good and never self-drain — leases gate admission of new epochs, not the right to serve; step 6 pinned-lookup failures are classified transient (queue-native retry/backoff) vs terminal (DLQ), over a never-invalidating content-addressed revision cache pre-warmed by snapshots. Outage tests + risk assigned to A1c/A2d/A3a/A8.
  2. §5.5 secret guarantee is now bounded and consistent with §6's trust assumptions (no absolute "never enters history").
  3. §10 cleanup table completed against the actual tree: triggers enabled-state ports/stores/testing/public exports + consumers, Windows env-file-content/values/template/generated asset, live NETSCRIPT_TASKS_DIR readers — each with disposition + owning slice.
  4. §12: full matrix gate letters on every row (F/P added where missing) + the orthogonal release class on A1a (DB), A2a (Aspire/scaffold), A2c (published CLI), A6a/A6b, A8 — prose and table now agree.
  5. Study upgraded: isolation / control-data-plane / cockpit-UX matrix rows added; exhaustive negatives narrowed to retrieved-doc scope (study + §14.1); explicit rule that HN/n8n-community sources are color-only, never load-bearing; the last empirical claim ("sub-ms" T3 start) removed from the RFC.
  6. plan.md / worklog Design / context-pack / this PR body reconciled to cycle-3 state (S5/S6 boxes, locked-decision list, DoD).

Gates: docs:links green, fmt clean. Per the owner's directive (address findings, leave PR fully current but draft), the run holds here for ratification — the retained Sol·xhigh evaluator thread 019fef2b-…03fc and worktree ns-rfc-plan-eval are ready if a cycle 4 is ordered.

rickylabs and others added 6 commits August 11, 2026 07:57
…contract, complete CLI/deploy cleanup, honest study cells

Indefinite last-good serving is now stated without contradiction and proven by
a new end-to-end outage scenario; the cleanup inventory reaches the CLI DI and
deploy option surfaces; every roadmap row carries its full matrix gates; the
competitive study's citation contract holds for every cell it asserts.

Refs #1443 #1445

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PxfW6uzysZaXSQnyPrD7By
…or frontends per D-9

One transition model: local validation gates serving, control-plane currentness
gates convergence only — proven across the three replica cases in E2E test 8.
Section 8.2 now decides two operator surfaces: the userland automation console
(the only surface #890/#922 satisfy) and a DevTools host staged behind the new
P-6 DevTools RFC that re-evaluates epic #400 as evidence, not architecture.

Refs #1443 #1445

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PxfW6uzysZaXSQnyPrD7By
… plan-gate artifact

Cycle 6 confirmed the architecture clean; the remaining findings were record
integrity — the open-decision sweep, Design checkpoint, phase registry, and PR
body now state the P-1..P-6 staged set and the two-surface frontend boundary
consistently.

Refs #1443 #1445

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PxfW6uzysZaXSQnyPrD7By
…d evaluation narratives through cycle 7

Refs #1443 #1445

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PxfW6uzysZaXSQnyPrD7By
…hrough PLAN-EVAL cycle 8

Refs #1443 #1445

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PxfW6uzysZaXSQnyPrD7By
…adversarial evaluation

Refs #1443 #1445

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PxfW6uzysZaXSQnyPrD7By
@rickylabs

Copy link
Copy Markdown
Owner Author

PLAN-EVAL — PASS (cycle 9, 28830c88a)

The dedicated Codex GPT-5.6 Sol · xhigh evaluator session (thread 019fef2b-…03fc, nine append-only cycles in plan-eval.md) closed with PASS: every plan-gate checklist item PASS, open-decision sweep: none — all architecture decisions that could force rework are resolved; P-1..P-6 and the §15 items are safely deferred with recorded rationale, consumed contracts, owning slices, and entry criteria. The cycle-6 judgment ("no unresolved runtime architecture decision remains") stands — the RFC and evidence were unchanged from cycle 6 through the close; cycles 7–9 converged the formal record.

Nine-cycle history: C1 9 findings → C3 6 → C4 5 → C5 2 → C6 architecture-clean (incl. the full D-9 two-surface amendment audit) → C7–C8 record bookkeeping → C9 PASS. Every finding of every cycle was fixed in the slice that followed it; the evaluator re-verified gates independently each cycle (docs:links, focused fmt, git diff --check, live PR inspection).

RFC-0001 is produced and awaiting owner ratification. This PR stays draft until then; on ratification the §12 roadmap files as the draft epic/issue graph.

rickylabs added a commit that referenced this pull request Aug 11, 2026
Proves every downstream design claim can be traced to evidence rather
than to the supervisor's priors.

14 agents returned, 0 errors: 5 repo surfaces (fresh host, fresh-ui
pipeline, plugin contribution axes, CLI plugin flows, observability
boundary), 3 prior RFCs re-baselined against 2256a67 (#890, #1446,
#1390), the dashboard board (#400 + children) and doctrine/live-board,
and 4 primary-source market teardowns (Nuxt/Vite, TanStack/Grafana,
admin consoles, Aspire/Scalar).

6,327 corpus lines plus 78 saved upstream artifacts under
research/sources/ — including Nuxt devtools-kit type definitions and the
full Vite DevTools kit docs — so a market claim is verifiable without
re-fetching the web. Those artifacts are verbatim evidence and are never
reformatted (drift D-4).

Verified the fan-out wrote nothing outside the run dir: the read-only
constraint on packages/, plugins/, docs/, and GitHub held.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b
rickylabs added a commit that referenced this pull request Aug 11, 2026
…s files

Proves the corpus was read by the supervisor rather than skimmed, and
makes the analysis durable independent of session context.

Five findings reshape the charter's framing:

S-1 There is no plugin->UI channel of any kind at this baseline.
    capabilities.hasRoutes means service endpoints; no registry kind emits
    routes/pages/islands; the real mechanism is three hardcoded Vite
    aliases. The RFC defines the first extension point, it does not
    extend one.

S-2 RFC #890's envelope is merged design text with ZERO implementation --
    32 files, all under .llm/runs/ plus labels.yml; all 24 children and
    the epic still OPEN at status:plan. "Preserve its pattern" therefore
    describes a co-dependency on unbuilt work, not reuse of a shipped
    surface. This is the run's largest plan-defect risk and becomes an
    owner fork.

S-3 #1446 gives DevTools a quotable mandate (P-6) and a decision sentence
    separating production management from developer diagnostics -- which
    answers charter Q4 with authority, and imposes a reciprocal duty not
    to annex Surface-1 territory.

S-4 The RFC home is contested: docs/architecture/rfc/ does not exist on
    main and is claimed by unmerged #1446, while rfcs/ ships today.
    Escalated as an owner fork; this run takes rfc-0002- so the only
    overlap is directory creation.

S-5 DevTools has a ready-made data plane to consume: TelemetryQueryPort,
    22 typed MCP tools with input+output schemas, a pure OpenAPI
    projection entrypoint, and netscript.correlation.id as the journey
    join key -- but MCP is stdio-only, so a browser client cannot reach
    it, and no Aspire/Scalar deep-link helper exists.

Also carried: the arbitrary-write finding in resolveTarget, which is
inert only while the registry is first-party, and the evidence that
#890's transactional replace-set fixes a real shipped defect class rather
than gold-plating.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b
rickylabs added a commit that referenced this pull request Aug 11, 2026
Proves the supervisor read the full corpus and converted it into
decisions, not a summary.

research.md now carries 26 cited findings ordered by how much they
constrain the RFC, the final evidence-register status, five
supervisor-delegated resolutions, and the finalized stage-D topic set.

Three carried-in assumptions did not survive the re-baseline and are
recorded rather than quietly corrected: #890's envelope is unbuilt, this
run's own stage-A gate list named a gate that does not exist, and
"inspired by Medusa zones" is wrong about Medusa.

Two charter questions are now ANSWERED by evidence rather than left open
-- Q4 by #1446's decision sentence plus the market separation verdict,
and Q5 by fetched Aspire .razor sources that make the deep-link boundary
a table instead of a thesis.

The eleven provisional stage-D topics collapse to eight: the corpus
closed the boundary topic outright, and the staging question folds into
the information-architecture pack.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b
rickylabs added a commit that referenced this pull request Aug 11, 2026
…inding

Proves the topic set was derived from the corpus rather than carried from
the bootstrap guess.

Eleven provisional topics collapse to eight. T4-boundaries closed
outright: charter Q4 is answered by #1446's decision sentence and Q5 by
the fetched Aspire .razor deep-link evidence, so both become constraints
carried into T1/T8 rather than open topics. T11 folds into T8, and Q11 is
the supervisor's stage-E integration output, not a delegated topic. The
superseded set is kept inline for provenance instead of deleted.

D2 lane corrected from major_ui_ux_design to
major_ui_ux_adversarial_review: lane-policy binds the first when GLM
LEADS the design and the second as the minimum when another lane leads,
and here the Opus supervisor plus the Fable packs lead. Consequence
recorded -- the pass is sequenced after the stage-E draft, because an
adversarial design review needs a design to review, and running it now
would produce generic advice while misrepresenting the lane.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b
rickylabs added a commit that referenced this pull request Aug 11, 2026
… risks

Proves the Plan-Gate checklist can be evaluated: decisions stated with
rationale, every open decision swept, and the rework audit done
explicitly rather than asserted.

All twelve charter questions are closed. Two of them (Q4, Q5) resolved to
ANSWERED BY EVIDENCE rather than decided by this run -- #1446's decision
sentence and the fetched Aspire deep-link grammars -- and are recorded as
constraints, which is a different and stronger status than "we chose".

The rework audit is the part plan-gate actually fails plans on, so it is
written out: F-1 (the #890 dependency) is the highest-risk fork and is
deliberately REVERSIBLE, because payload schema, host descriptor and
ordering are identical under every option; F-5 and F-6 would force rework
if deferred, which is exactly why they are locked now rather than
escalated; F-3's precondition is safe to defer only if the pointer defers
with it, hence the ordering.

The risk register states whether each mitigation EXISTS. Five say "named
gate, not built" -- containment, generator scoping, production absence,
schema evolution, and arch:check coverage. Calling those mitigated today
would be the false-green this run exists to avoid.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b
rickylabs added a commit that referenced this pull request Aug 11, 2026
… cross-RFC conflicts

Proves the amended RFC is coherent with the three prior contribution RFCs
and with itself.

THE HEADLINE IS A NEGATIVE RESULT AND IT IS THE IMPORTANT ONE: zero
contradictions and zero duplications against #890, RFC-0001/#1446 and
RFC-A/#1390, verified at source -- the two-hosts decision sentence, the
five-surface taxonomy, P-6's A2b/A3b/A2d entry criteria, the four
consumed contracts, and RFC-A's separate-named-axes licensing sentence
all check out. The host-to-panel seam mirrors rather than reuses
SdkClientContribution, so no second SDK mechanism was invented.

All 21 defects were INTERNAL, introduced by three agents amending
different sections -- the predictable cost of parallel authoring, caught
because the sweep was run against the amended text rather than assumed
from the earlier one.

The sharpest was a real conflict of substance: sections 6 and 8 still
said the generator imports contributor code in-process while the new
INV-9 forbids exactly that. Had it shipped, the RFC would have mandated
a security invariant its own pipeline description violated. Both now
specify static parse or a permission-scoped subprocess.

Also fixed: a self-contradictory sentence in 13.1 left by my own global
rename ("is packages/devtools-core... deliberately not named
devtools-core"); read-only v1 versus confirm-gated migrate/seed dialogs,
now staged with v1 rendering the CLI line rather than executing it; a
duplicate T-10 id; five-state versus six-state residue, keeping the one
reference that correctly describes #890's five; the ratified F-1/F-3 rows
still listed as open forks; and a quoted source that had been silently
rewritten -- restored with the divergence stated.

Gates: docs:links 0 broken, docs:accuracy PASS, 90 balanced fences, lock
clean.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b
rickylabs added a commit that referenced this pull request Aug 11, 2026
…f-assigned number

Owner decision: the RFC moves to rfcs/0000-devtools-contribution.md, the
repository's only documented RFC process, so acceptance numbering and
merge order can be coordinated against immutable main.

This closes fork F-2, the three-way RFC-home contest. The run had been
living at docs/architecture/rfc/, the convention introduced by UNMERGED
PR #1446 -- and had self-assigned rfc-0002. Both are corrected. rfcs/
README is explicit that numbers are assigned by a maintainer at
acceptance and that 0000 is kept while drafting precisely to avoid number
races between concurrent drafts, so taking a number was the run
overstepping. The filename and frontmatter now both read 0000, and the
template's frontmatter contract is honoured exactly.

One divergence is deliberate and disclosed in a process note at the top
of the RFC: the body keeps its own numbered sections rather than the
template's ten headings. The template suits a few hundred lines; this is
~4,500 lines whose sections are cross-referenced by anchor throughout the
evidence corpus, the findings sweep and both design triages.
Restructuring would break every citation for no reviewability gain.

Reference updates follow the authority rule this run has used
throughout: live artifacts and every filing draft were updated; immutable
evidence was NOT rewritten -- the stage-B corpus, design packs, both
design-pass prompts and outputs, the evaluator record, the committed
workflows and the owner's charter keep their original text.

Side effect worth noting: docs:links --root rfcs now reports docs=3, so
the gate covers the README and template as well as the RFC, and all three
are clean.

Gates: docs:links 0 broken across 3 docs, docs:accuracy PASS, 90 balanced
fences, nothing touched outside rfcs/ and the run dir.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b
…-runtime-versioned-automation

Owner-directed pre-merge normalization of PR #1446: git mv
docs/architecture/rfc/rfc-0001-runtime-versioned-automation.md to
rfcs/0000-runtime-versioned-automation.md (number stays 0000 until a
maintainer assigns one at acceptance), add the 0000-template.md YAML
frontmatter (status Draft, Backlog / Triage; tracking-issue filing stays
owner-gated), and replace the superseded "establishes docs/architecture/rfc/"
authority claim with a pointer to rfcs/README.md.

Reference sweep across living run records (plan, context-pack, phase-registry
G4, plan-eval brief, evidence identifiers RFC-0001 -> RFC-0000, 1444-impact
tail, .llm run summary). Preserved verbatim: plan-eval.md (evaluator-authored,
append-only; citations anchor to historical revisions) and dated historical
worklog entries. Recorded as drift D-10 + worklog S7. Gates: docs:links green,
deno fmt clean on touched files. No issues or milestones touched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PxfW6uzysZaXSQnyPrD7By
@rickylabs

Copy link
Copy Markdown
Owner Author

S7 — RFC process normalization (owner-directed, pre-merge) — e5b2a74ae

Normalized this PR to the canonical in-repo RFC process (rfcs/README.md):

  • git mv docs/architecture/rfc/rfc-0001-runtime-versioned-automation.md rfcs/0000-runtime-versioned-automation.md — number stays 0000 until a maintainer assigns one at acceptance.
  • Added the 0000-template.md YAML frontmatter: status Draft (canonical vocabulary; was "Proposed"), target-milestone: Backlog / Triage, tracking issue deferred — issue filing remains owner-gated for this run.
  • The superseded "establishes docs/architecture/rfc/ as the RFC home" authority claim now points to the canonical process instead.
  • Reference sweep over living run records: plan.md (deliverable, S4, new S7 slice), context-pack.md, phase-registry.md G4, the PLAN-EVAL brief, evidence identifiers (RFC-0001RFC-0000), 1444-impact.md tail, the .llm run summary, and this PR body.
  • Preserved verbatim: plan-eval.md (evaluator-authored, append-only — its rfc-0001-…:line citations anchor to historical revisions) and dated historical worklog entries/PR comments. Recorded as drift D-10 + worklog S7.
  • Gates: deno task docs:links green (102 docs, 0 broken links/anchors); deno fmt --check clean on every touched file.
  • No issues or milestones were filed or mutated. PR stays draft, awaiting owner ratification.

@rickylabs
rickylabs marked this pull request as ready for review August 11, 2026 20:22
@rickylabs rickylabs added status:ready-merge and removed status:plan-eval Awaiting plan evaluation labels Aug 11, 2026
@rickylabs

Copy link
Copy Markdown
Owner Author

@openhands-agent model=openrouter/minimax/minimax-m3 output=pr-comment iterations=400

use harness

SKILL

  • netscript-harness — preserve evaluator separation and record a concise, evidence-based verdict.
  • netscript-tools — use repository-native commands and keep lock/worktree state clean.
  • openhands-handoff — honor the pr-comment output contract and write the required summary.
  • netscript-cli — hand-test scaffold and documented CLI commands when executable claims exist.
  • rtk — keep changed-file and command inspection compact.

Act as a cheap-and-quick documentation accuracy evaluator. Do not edit source, documentation,
deno.lock, or run artifacts, and do not create commits. Write the complete result to
OPENHANDS_SUMMARY_PATH; output mode pr-comment will publish that result as the single PR
comment.

  1. Identify every changed documentation file in this PR and read each one fully. Include Markdown,
    MDX, READMEs, RFCs, harness/process docs, and skill instructions; do not review only the diff
    hunks.
  2. For every executable claim, QUICKLY hand-test the exact documented command or snippet from the
    repository root. Use the smallest representative scaffold/workspace needed, compare real output
    and generated paths with the document's claim, and stop after the highest-value small checks. Do
    not substitute a full expensive E2E suite for a focused manual check.
  3. If the changed set contains no executable command, snippet, flag, verb, or path claim, say
    exactly:
    No executable documentation claims in this changed set; manual command testing was not applicable.
    Full accuracy and hallucination review is still mandatory.
  4. Check every named command verb, flag, file path, package, API, and expected output against the
    repository. Any hallucinated or nonexistent verb, flag, or path is a BLOCKING finding.
  5. Return a compact per-file table with accurate, inaccurate, or unverifiable, the commands or
    snippets tested, observed-versus-claimed output, and blocking findings. End with one overall
    PASS or FAIL_FIX verdict and a short list of exact fixes.

Keep the iteration budget small. Prefer one to three decisive manual checks over broad exploration,
but never omit a changed documentation file from the per-file verdict table.

@rickylabs

rickylabs commented Aug 11, 2026

Copy link
Copy Markdown
Owner Author

OpenHands Agent — Completed

OPENHANDS_VERDICT: NONE

Model: openrouter/minimax/minimax-m3
Provider: OPENROUTER
Job status: success
Verdict source: none
Summary source: agent-after-retry
Housekeeping: ack=success trace=success commit-artifacts=success replies=skipped draft-pr=skipped
Trace: .llm/tmp/run/openhands/pr-1446/run-31532651207-1 (in the Actions artifact)
Artifact: openhands-agent-31532651207-1

OpenHands Run Summary — PR #1446 evaluator

Summary

This run was cut short before any evaluator verdict could be produced. The
trigger asked for a cheap-and-quick documentation accuracy evaluation of PR
#1446 (docs(rfc): runtime-versioned workers/tasks & triggers — production architecture RFC) and to write the result to OPENHANDS_SUMMARY_PATH so the
pr-comment output mode could publish it.

What was actually done in this session:

  1. Read AGENTS.md (the only Read-Order item this session got to).
  2. Identified the working branch (docs/rfc-runtime-versioned-automation) and
    the changed-set scope via git log --oneline origin/main..HEAD --stat /
    --name-only. The branch contains ~25 commits across the PLAN-EVAL cycles
    for RFC 0002-runtime-versioned-automation and lands under
    docs/architecture/rfc/0002-runtime-versioned-automation.md.
  3. Enumerated the Markdown changed files (19 files), all in
    .llm/runs/docs-rfc-runtime-versioned-automation--supervisor/ plus the
    single RFC doc itself and the top-level .llm/2026-08-11-... entry. No
    code, plugin, or package files are in the changed set.
  4. Was interrupted by the summary-file reminder before any of those Markdown
    files were opened, before any executable-claim hand-tests were run, and
    before any per-file accuracy table or OPENHANDS_VERDICT line was
    produced.

No PR comment, no verdict, and no per-file evaluator table were written this
run. The required deliverable was not completed.

Changes

Files written this run (only):

  • /home/runner/work/_temp/openhands/31532651207-1/summary.md — this file.

Files read this run (read-only, no edits):

  • AGENTS.md — to confirm operating rules and that this is an evaluator role
    under .agents/skills/netscript-harness.
  • git log --oneline origin/main..HEAD --stat and --name-only output — to
    enumerate the changed set.

No source, no documentation, no deno.lock, and no run artifacts were
modified.

Validation

No validation was performed. The intended validator steps (read each changed
Markdown file in full; hand-test the smallest representative subset of any
executable commands/snippets claimed in those files; check named verbs,
flags, file paths, packages, APIs, and expected outputs against the repo)
were not started.

The change set is overwhelmingly run artifacts under
.llm/runs/docs-rfc-runtime-versioned-automation--supervisor/ (plan, plan-eval,
worklog, drift, research, supervisor, briefs, evidence, phase-registry) plus
the single RFC doc. These contain few if no executable shell snippets that
need hand-testing — but full accuracy and hallucination review against those
files was still mandatory per step 3 of the trigger, and it was not done.

Responses to review comments or issue comments

None. No PR comment was posted this run.

Remaining risks

  1. The evaluator verdict for PR docs(rfc): runtime-versioned workers/tasks & triggers — production architecture RFC #1446 is missing. The harness required
    OPENHANDS_VERDICT: PASS | FAIL_FIX | FAIL_RESCOPE | FAIL_DEBT | FAIL_PLAN
    as the first line of the summary and the first line of the PR comment —
    neither was emitted. A subsequent OpenHands iteration is required to
    actually open the changed Markdown files, build the per-file verdict
    table, hand-test any executable claim, and emit the verdict.
  2. The .llm/runs/.../supervisor/ tree is large (~80+ files including
    fixture JSON); a follow-up evaluator should budget time accordingly and
    may want to scope the verdict to the RFC doc plus the formal plan/plan-eval
    artifacts rather than every fixture.
  3. No destructive or lock-file edits were made this run, so there is no
    deno.lock / branch-state damage to recover from.

OPENHANDS_VERDICT

OPENHANDS_VERDICT: NONE

Run: https://github.com/rickylabs/netscript/actions/runs/31532651207

@rickylabs
rickylabs merged commit f3eb957 into main Aug 11, 2026
22 of 32 checks passed
@rickylabs
rickylabs deleted the docs/rfc-runtime-versioned-automation branch August 11, 2026 20:23
rickylabs added a commit that referenced this pull request Aug 11, 2026
* chore(harness): activate the devtools-contribution seed run

Proves the run is activated with a recorded operating identity and a
verified baseline before any evidence claim is made.

- supervisor.md written first (Opus 5 high, this session, Remote Control
  on), per seed-run.md's hard invariant that a run dir without it is not
  activated
- baseline verified against live origin/main (2256a67bf) rather than
  taken from the charter on trust; no divergence, no rebase
- planning-only mutation boundary recorded explicitly: the branch and its
  draft PR are writable, the board is not until owner ratification
- twelve charter questions seeded as the open-decision docket in plan.md,
  each marked "must resolve now"
- drift D-1/D-2/D-3 pre-registered: GLM major-UI/UX lane reactivated from
  dormant, IMPL-EVAL N/A by run shape, and GLM's no-reasoning-trace
  transport limit recorded before its output exists
- charter committed to the branch so the run is reconstructible without
  chat history

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* chore(harness): close seed stage A with a live commit trail

Proves the run is reviewable from GitHub alone: draft PR #1450 carries the
charter read-back, the verified baseline, the routes in force, and the
evaluation posture, so no stage-B evidence rests on chat history.

- phase-registry: stage A done (ccc4c0a70, PR #1450, opening comment),
  stage B active
- worklog: PR/label/comment evidence recorded per the commit-trail contract
- context-pack: resumable state advanced to stage B

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* chore(harness): commit the stage-B discovery workflow before it runs

Proves stage-B provenance: seed-run.md's Tier-C hard rule is that an
uncommitted workflow does not run, and a corpus produced by one does not
count as stage-B proof. This commit is that precondition.

The script embeds its inputs as consts rather than relying on `args`
(seed-run landmine), fans 14 agents across repo surfaces, the three prior
RFCs, the dashboard board, doctrine, and a primary-source market study,
and binds every agent to the citation law: an uncited claim is not a
finding, and an inference may not be dressed as an observation.

Agents are read-only on source and on GitHub; `gh` is reads only.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* fix(harness): replace the assumed docs gate set with the real one

Proves the run's validation plan against repo configuration instead of
assumption — an unexamined gate list is how a run reports false-green
evidence.

deno.json's fmt.include is packages/**/*.ts(x) and plugins/**/*.ts(x)
only, so `deno task fmt:check` never inspects Markdown. The stage-A plan
named a scoped `deno fmt` pass as its format gate; running it manufactured
29 findings no repo gate asks for, and would have rewritten the verbatim
upstream artifacts under research/sources/ — corrupting the evidence the
corpus cites. Those files are designated evidence and are never formatted.

Real gates recorded: docs:links (needs an explicit --root, since its
defaults cover .llm/harness and docs/architecture/doctrine but not a new
RFC dir), docs:accuracy, and the CI quality job gated on needs_docs.

Also verified the OpenHands docs-accuracy workflow dispatches only on
ready_for_review, so a permanently-draft PR satisfies the charter's
no-OpenHands boundary structurally. Deliberately not applying
docs-eval:skip: a label silencing a gate that was never going to fire
would be misleading evidence.

Drift D-4 (significant) and D-5 recorded.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): land the stage-B discovery corpus with citations

Proves every downstream design claim can be traced to evidence rather
than to the supervisor's priors.

14 agents returned, 0 errors: 5 repo surfaces (fresh host, fresh-ui
pipeline, plugin contribution axes, CLI plugin flows, observability
boundary), 3 prior RFCs re-baselined against 2256a67bf (#890, #1446,
#1390), the dashboard board (#400 + children) and doctrine/live-board,
and 4 primary-source market teardowns (Nuxt/Vite, TanStack/Grafana,
admin consoles, Aspire/Scalar).

6,327 corpus lines plus 78 saved upstream artifacts under
research/sources/ — including Nuxt devtools-kit type definitions and the
full Vite DevTools kit docs — so a market claim is verifiable without
re-fetching the web. Those artifacts are verbatim evidence and are never
reformatted (drift D-4).

Verified the fan-out wrote nothing outside the run dir: the read-only
constraint on packages/, plugins/, docs/, and GitHub held.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): checkpoint stage-C synthesis after the first six corpus files

Proves the corpus was read by the supervisor rather than skimmed, and
makes the analysis durable independent of session context.

Five findings reshape the charter's framing:

S-1 There is no plugin->UI channel of any kind at this baseline.
    capabilities.hasRoutes means service endpoints; no registry kind emits
    routes/pages/islands; the real mechanism is three hardcoded Vite
    aliases. The RFC defines the first extension point, it does not
    extend one.

S-2 RFC #890's envelope is merged design text with ZERO implementation --
    32 files, all under .llm/runs/ plus labels.yml; all 24 children and
    the epic still OPEN at status:plan. "Preserve its pattern" therefore
    describes a co-dependency on unbuilt work, not reuse of a shipped
    surface. This is the run's largest plan-defect risk and becomes an
    owner fork.

S-3 #1446 gives DevTools a quotable mandate (P-6) and a decision sentence
    separating production management from developer diagnostics -- which
    answers charter Q4 with authority, and imposes a reciprocal duty not
    to annex Surface-1 territory.

S-4 The RFC home is contested: docs/architecture/rfc/ does not exist on
    main and is claimed by unmerged #1446, while rfcs/ ships today.
    Escalated as an owner fork; this run takes rfc-0002- so the only
    overlap is directory creation.

S-5 DevTools has a ready-made data plane to consume: TelemetryQueryPort,
    22 typed MCP tools with input+output schemas, a pure OpenAPI
    projection entrypoint, and netscript.correlation.id as the journey
    join key -- but MCP is stdio-only, so a browser client cannot reach
    it, and no Aspire/Scalar deep-link helper exists.

Also carried: the arbitrary-write finding in resolveTarget, which is
inert only while the registry is first-party, and the evidence that
#890's transactional replace-set fixes a real shipped defect class rather
than gold-plating.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): checkpoint stage-C synthesis after the board and doctrine legs

Proves the supervisor read the board/doctrine corpus, not just the repo
and prior-RFC legs.

Eight further findings, the load-bearing ones:

S-6 Epic #400's ownership thesis exists verbatim and is already
    operationalized into three ENFORCEABLE acceptance lines, including
    'every merged panel must answer why this cannot just deep-link to
    Aspire/Scalar'. The RFC should adopt these as normative criteria
    rather than restate the thesis as prose.

S-7 Board authority is uneven: #685 merged ANALYSIS with committed
    provenance but never advanced past status:research; #780 is an
    unlabelled stale draft with nothing on main; the last owner-ratified
    board event is the 2026-07-06 rescope. A map treating #685 as
    ratified architecture would be wrong.

S-8 THREE competing seams already claim the same contribution axis
    (#427 vs #890's pointer axis vs #734's manifest axis), and two epics
    claim dashboard-zone panels at different milestones (#428-431 vs
    #933/#944).

S-9/S-10 The archetype question has two conflicting in-repo precedents
    and doctrine's own table contradicts the merged design on whether
    fresh is A3 or A4 -- which changes the gate set. And arch:check gates
    only 16 of 36 units, so a new package is UNGATED unless the RFC names
    adding it to deno.json:156 as a slice.

S-12 The RFC-home fork is three-way and PRE-EMPTS scheduled issue #1380.

S-13 createServiceClient cannot send Authorization or x-api-key today, so
    DevTools auth propagation is blocked on RFC-A/#1348 -- and bypassing
    the SDK is the duplication the charter forbids.

Owner-fork list grown from 7 to 13.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): checkpoint stage-C synthesis after the SDK and CLI legs

Proves the data-plane and build-mechanics questions were answered from
evidence rather than from the charter's phrasing.

S-14 RFC-A does NOT close the loop DevTools needs. Its chain terminates
     at a statically generated services map plus a caller-supplied
     context; it explicitly rejects a registry, a locator, and any
     ambient client, and contains zero occurrences of "devtool". So "a
     plugin panel obtains a typed client" is unsolved -- and RFC-A's own
     sentence that UI contributions and SDK request contributions are
     separate named extension axes is the licence to define the
     host->panel seam without duplicating #1390. Also recorded: no
     response hook, absolute redaction even in debug mode, HTTP-only, and
     an FCP deadline four days out with implementation gated behind an
     unfiled metadata child.

S-15 "plugin dev" does not exist anywhere in the CLI. Charter Q8 is
     therefore not "how does DevTools fit the dev loop" but "must
     DevTools invent one" -- a materially larger question.

S-16 Two divergent registry generators write to different paths; the
     walker's AstExtractor is regex, not AST; and walker-emitted
     registries leak on plugin remove. Generated-surface drift detection
     is not currently reliable, which independently confirms #890's
     transactional replace-set is a fix rather than gold-plating.

S-17 Adding a contribution kind today costs six framework file edits, and
     "plugin doctor" already runs contributed checks under a read-only
     dryRun context -- a real reuse target for the diagnosis taxonomy.

Owner forks now 16.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): checkpoint stage-C synthesis after the Nuxt/Vite and Aspire/Scalar legs

Proves the market study produced decision-grade evidence rather than a
feature survey.

S-18 The closest analogue deleted its own shell. Nuxt DevTools v4 removed
     the floating panel and became a dock entry inside Vite DevTools;
     vite-plugin-inspect v12 did the same. Nuxt built five bespoke things
     -- shell, RPC namespacing, subprocess/terminal system, editor
     integration, global install -- and deprecated or deleted all five.
     But the thing they consolidated onto is Vite-8-bound and NetScript
     pins Vite 7.2.2, so adopting the kit is not buildable at this
     baseline: imitate the contract shapes, implement natively.

     Three assumptions overturned: devtools are NOT stripped in
     production upstream (build mode is a supported target with client
     auth disabled by construction); iframe does NOT mean sandboxed (Nuxt
     injects live app access into same-origin contributed iframes); and
     transformIndexHtml injection silently no-ops for apps that render
     their own HTML -- which Fresh 2 does.

S-19 The Aspire/Scalar boundary is now a table backed by fetched .razor
     sources. Resource, console-log, structured-log, trace/span and
     metric deep links all exist and are cheap; the log-to-trace
     correlation query is the highest-value jump. Filtered views are NOT
     externally constructible. Aspire has no panel/plugin extension point
     at all -- only resource commands, which vanish when deployed -- and
     it removed its in-dashboard Copilot UI in 13.3, redirecting agents
     to CLI/MCP. That is a direct precedent for DevTools = human UI, MCP
     = agent surface.

     NetScript currently discards nearly all of Scalar's surface, and its
     pinned bundle predates pluginUrls, so "contribute into Scalar" is
     blocked. No deep-link helper exists anywhere in packages/ for either
     upstream -- the hand-off thesis has no implementation seam today,
     which makes a typed deep-link helper an obvious first slice.

Owner forks now 20.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): complete the stage-C corpus read (14/14) with the extension-model legs

Proves the full corpus was read by the supervisor, and corrects a premise
carried by RFC #890 itself.

S-20 "Inspired by Medusa zones" is factually wrong about Medusa. Medusa's
     zones are a CLOSED core-owned vocabulary that plugins cannot mint;
     validity is an AST check at build time and an invalid zone is
     silently dropped. The plugin-minted namespaced model is STRAPI's.
     Two consequences: in a closed vocabulary name collision is
     impossible by construction, so Q2's collision-policy budget should
     move to ordering -- and NOBODY solved ordering (Grafana concats in
     load order, TanStack identity is positional, Medusa documents none,
     and Medusa deprecated positional .before/.after suffixes). #890's
     deterministic (order, mountId, id) sort is ahead of the market
     rather than derivative.

S-21 The Q4 separation verdict is now evidence-backed: admin consoles pay
     for untrusted third-party code in a long-lived RBAC-governed
     production-data surface, and sandboxing, manifest host ranges,
     per-contribution permissions and runtime module federation are all
     costs of that ONE condition. A dev diagnostics tool satisfies none
     of the antecedents, so the RFC can decline each with a citation
     rather than an assertion. What transfers is cheap: declarative
     target id validated at build time, host-owned typed data flow to the
     contributed component, and a shared component kit. What does NOT
     stretch: no admin console surveyed models a push/stream contract to
     contributed UI -- that is net-new design.

S-22 Two tiny mechanisms are worth near-verbatim adoption: Grafana's
     per-contribution error boundary (loud in dev, null in prod -- which
     TanStack lacks entirely, its most obvious gap) and version-suffixed
     contribution ids, from which Grafana got its whole compatibility
     story. Plus: use TWO independent production-exclusion mechanisms,
     because TanStack explicitly distrusted one signal after hosting
     providers set build command and mode inconsistently.

Owner forks now 24.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): close stage C with the synthesized research record

Proves the supervisor read the full corpus and converted it into
decisions, not a summary.

research.md now carries 26 cited findings ordered by how much they
constrain the RFC, the final evidence-register status, five
supervisor-delegated resolutions, and the finalized stage-D topic set.

Three carried-in assumptions did not survive the re-baseline and are
recorded rather than quietly corrected: #890's envelope is unbuilt, this
run's own stage-A gate list named a gate that does not exist, and
"inspired by Medusa zones" is wrong about Medusa.

Two charter questions are now ANSWERED by evidence rather than left open
-- Q4 by #1446's decision sentence plus the market separation verdict,
and Q5 by fetched Aspire .razor sources that make the deep-link boundary
a table instead of a thesis.

The eleven provisional stage-D topics collapse to eight: the corpus
closed the boundary topic outright, and the staging question folds into
the information-architecture pack.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): finalize the stage-D fan-out and correct the D2 lane binding

Proves the topic set was derived from the corpus rather than carried from
the bootstrap guess.

Eleven provisional topics collapse to eight. T4-boundaries closed
outright: charter Q4 is answered by #1446's decision sentence and Q5 by
the fetched Aspire .razor deep-link evidence, so both become constraints
carried into T1/T8 rather than open topics. T11 folds into T8, and Q11 is
the supervisor's stage-E integration output, not a delegated topic. The
superseded set is kept inline for provenance instead of deleted.

D2 lane corrected from major_ui_ux_design to
major_ui_ux_adversarial_review: lane-policy binds the first when GLM
LEADS the design and the second as the minimum when another lane leads,
and here the Opus supervisor plus the Fable packs lead. Consequence
recorded -- the pass is sequenced after the stage-E draft, because an
adversarial design review needs a design to review, and running it now
would produce generic advice while misrepresenting the lane.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record D-6 -- #890's additive-manifest claim is false at baseline

Proves a stage-D agent finding by supervisor verification rather than
relaying it, and escalates a defect that belongs to another epic's plan.

RFC #890 contract C8 asserts older CLIs ignore an unknown manifest
pointer block, so adding one is safely additive. But
PluginInstallerManifestSchema ends in .strict()
(packages/plugin/src/protocol/manifest.ts:282) with
schemaVersion: z.literal(1) at :271, so zod HARD-REJECTS any unknown
top-level key: an older CLI fails manifest parsing outright and takes the
plugin down rather than degrading. The stage-B corpus had independently
recorded the same property from the other direction (r3 F5), which is
what made the agent's claim worth checking rather than dismissing.

Significant, and not scoped to this run -- epic #922 slice #929 plans to
implement exactly that pointer axis on the false assumption.

Action is split: this RFC requires an explicit schema-evolution
precondition slice before any manifest-visible pointer lands, and the
finding is escalated to the owner as a cross-RFC issue. This run does not
edit another epic's board; recording and escalating is the whole
permitted action before ratification.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record D-7 -- correct my own corpus on the generator spawn scope

Proves supervisor review works in both directions: a stage-D pack made a
BROADER security claim than the stage-B corpus, and verification showed
the pack was right and my committed corpus understated the finding.

The flags at installed-runtime-registry-generator.ts:416-417 are bare
'--allow-read' and '--allow-write' with no =<path> value. A valueless
Deno permission flag grants the permission globally, so a plugin-authored
generator subprocess gets whole-filesystem read and write -- not the
project-root scope r3 F10 recorded. Also verified, and worth keeping: no
--allow-net and no --allow-env, so default-deny blocks network
exfiltration from that subprocess.

Significant. The charter forbids unbacked security claims, and that cuts
both ways -- an understated finding is as much a defect as an overstated
one.

The stage-B corpus file is immutable evidence and is NOT rewritten; drift
is the correction mechanism. The RFC carries the corrected claim.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record the stage-D slice-review verification log

Proves the A1 gate ran: the supervisor verified each pack's load-bearing
claims in source instead of relaying them, and the gate earned its keep.

V1 T2 disputed #890's "older CLIs ignore an unknown manifest block" --
   verified, T2 right, escalated as drift D-6 against another epic's plan.
V2 T6 made a BROADER security claim than my own committed corpus --
   verified, T6 right, my corpus understated the blast radius (drift D-7).
V3 T5's unexported SSE helpers -- confirmed: 15 fresh export subpaths,
   none is sse, only importer is its own test. A promotion slice.
V4 T1's closure of research OQ1 -- confirmed on the locally checkable
   half: no index.html in the scaffold and ZERO transformIndexHtml
   anywhere in the repo.

V4 closes the question stage C flagged as the single most
decision-relevant unknown, which deletes a whole branch of the host-shape
option space rather than carrying it as risk.

Two claims remain unverified and are carried as named Wave-0 probes
rather than glossed.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record D-8 -- comment threads correct two of my own board claims

Proves the slice-review gate again, this time reversing a recommendation
my corpus would otherwise have carried into the supersession map.

(a) CR-DDX-HOSTAGNOSTIC EXISTS -- owner comment on #400 at
    2026-07-06T12:30:28Z, from process-manager epic #510, asking for a
    host-neutral panel descriptor. My corpus said it appeared nowhere.
    It is recorded but never resolved, so #544's dependency is real and
    unanswered rather than imaginary.

(b) The last owner-ratified board event is NOT 2026-07-06. A later
    2026-07-19 owner-ratified train moved the dev dashboard behind
    everything else and sent all children to beta.18, which cascaded to
    today's 0.0.15. Their placement is DELIBERATE.

(b) reverses a recommendation: the map must not propose re-milestoning
the children, because doing so would have been this run overturning an
owner decision it never read. The real defect is 0.0.14's stale
description, which claims the dev dashboard while holding zero dashboard
issues.

Root cause is instructive rather than embarrassing: the b1 agent read
issue bodies and PR threads but not issue comment threads, and SAID SO in
its own open question 10. A scoped claim with its scope stated, corrected
later by evidence -- which is the citation discipline working, not
failing.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): land the eight stage-D design packs after supervisor review

Proves each topic reached a committal recommendation backed by evidence,
and that the supervisor reviewed before signing off rather than relaying.

2,550 pack lines across T1 host-shape, T2 contribution-family, T3
contribution-kinds, T5 data-plane, T6 trust-model, T7 build-dev, T8
IA+staging, and T9 supersession. Highlights that changed the design:

- T1 CLOSED research OQ1 from source: no index.html in the scaffold and
  zero transformIndexHtml repo-wide, so a Vite-injection-shaped mount is
  unavailable and a whole branch of the host option space is deleted
  rather than carried as risk.
- T3 refused the speculative union outright -- three kinds, each with a
  named first-party consumer, and one of them is pure reuse of the
  shipped plugin-doctor extraChecks seam.
- T5 routes every read through a host-owned deny-by-default contract so
  no URL-shaped input exists anywhere, which is what removes the
  confused-deputy shape; it also found shipped-but-unexported SSE helpers.
- T6 labels its top three threats UNPROVEN and names the gate that would
  prove each, rather than asserting security.
- T9 read the comment threads my corpus admitted it had skipped, and
  corrected two board claims (drift D-8).

Four load-bearing claims were verified in source by the supervisor before
sign-off (worklog V1-V4); two of the four corrected my own committed
corpus (drift D-6, D-7).

Lock hygiene: deno.lock picked up +386/-9 of incidental churn from the
packs' deno doc runs and was reverted. A planning-only docs run has no
business mutating the workspace lock.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* chore(harness): commit the stage-E RFC authoring workflow before it runs

Proves stage-E provenance under the same Tier-C rule that governed stage
B: an uncommitted workflow does not run.

Lane basis is CLAUDE.md's documentation-authoring exception -- Markdown
authoring may use a Claude workflow as the implementation lane because
the work is language-dominated and touches no packages/ or plugins/
source. Its conditions are met: agents run under the harness skill with
the domain skills named, and validation stays in separate
opposite-family sessions (stage F adversarial, stage G Codex Sol
PLAN-EVAL). The workflow is the generator only; it does not self-certify.

Ten body sections drafted from the committed stage-D packs. The RFC's
spine -- front matter, abstract, locked-decision summary, alternatives,
roadmap, and the owner-fork sweep -- stays with the supervisor, so the
result is one argued document rather than ten stapled essays.

Agents are read-only on source and GitHub, are barred from lock churn
after the stage-D deno.lock incident, and are bound by drift: D-6/D-7/D-8
override the corpus where they conflict.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(rfc): author the RFC spine -- front matter, abstract, motivation

Proves the argument is the supervisor's, not an assembly of delegated
sections. The workflow drafts body sections; the thesis, the framing, and
what the document refuses to assume are written here.

The abstract leads with the finding that reframes the whole RFC: there is
no plugin->UI channel at all, so this defines the first extension point
rather than extending one. Three commitments carry the design -- own only
what nobody else does (with #400's deep-link test adopted as a normative
gate), developer diagnostics are not a production admin console (with
each declined mechanism carrying its cited antecedent), and a smaller
true design beats a larger plausible one.

Motivation quantifies the missing seam in concrete terms -- six framework
files to add a kind, and a closed string literal that makes third-party
doctor checks impossible -- rather than asserting that extensibility
would be nice.

A dedicated "what this RFC deliberately does not assume" subsection
records the three carried-in claims that did not survive the baseline,
including #890's false compatibility claim and the Medusa correction.
Stating them in the document itself is what stops the next reader from
re-inheriting them.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record D-9 -- correct an off-by-one citation in D-6

Proves the review chain runs in both directions: a stage-E authoring
agent caught an error in the supervisor's own drift entry while writing
against it, and the supervisor verified and corrected rather than
defending.

D-6 cited the top-level .strict() at manifest.ts:282; the correct anchor
is :283, since :282 is the linking field. The finding itself is
unaffected -- the installer schema does end in .strict() and does pin
schemaVersion: z.literal(1) at :271.

Minor, but recorded rather than silently patched: the file contains NINE
.strict() calls and only the last is the top-level installer schema, so
an off-by-one sends a reviewer to a nested sub-schema and makes a correct
finding look wrong. That is precisely the failure mode the citation gate
exists to prevent.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(rfc): add RFC-0002 -- NetScript DevTools contribution architecture

Proves the twelve charter questions each reach a decision or a numbered
owner fork, backed by cited evidence rather than assertion.

3,589 lines, 15 sections. The supervisor wrote the spine (abstract,
motivation, packages/archetypes/gates, roadmap, owner-fork sweep); ten
body sections were drafted from the committed stage-D packs under
CLAUDE.md's documentation-authoring exception and reviewed here.

Load-bearing decisions: a separate loopback-bound dev-only host process,
not an app-mounted mode; a sibling devtools family on a family-neutral
envelope with an explicit, reversible dependency decision on #890's
UNBUILT spine; two new contribution kinds plus one reuse, each with a
named first-party consumer, because a single union covering everything is
doctrine's AP-3; a host-owned deny-by-default read contract so no
URL-shaped input exists anywhere; and a production posture stricter than
every system surveyed.

#400's ownership thesis is preserved and promoted from prose to a
normative gate, including its deep-link test and its killed-surfaces
list.

Supervisor review before sign-off caught three defects: two stale
manifest.ts:282 citations corrected to :283 per drift D-9, and two
apparent package-name inconsistencies verified as correct in context
(TanStack's path in the market study; fresh's route manifest, a different
file). Security phrasing audited -- all four hits are disclaimers, and
UNPROVEN appears 14 times where a gate does not yet exist.

Gates: docs:links (scoped --root) PASS, 0 broken links/anchors;
docs:accuracy PASS.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): lock the plan -- 14 decisions, 12 questions closed, 11 risks

Proves the Plan-Gate checklist can be evaluated: decisions stated with
rationale, every open decision swept, and the rework audit done
explicitly rather than asserted.

All twelve charter questions are closed. Two of them (Q4, Q5) resolved to
ANSWERED BY EVIDENCE rather than decided by this run -- #1446's decision
sentence and the fetched Aspire deep-link grammars -- and are recorded as
constraints, which is a different and stronger status than "we chose".

The rework audit is the part plan-gate actually fails plans on, so it is
written out: F-1 (the #890 dependency) is the highest-risk fork and is
deliberately REVERSIBLE, because payload schema, host descriptor and
ordering are identical under every option; F-5 and F-6 would force rework
if deferred, which is exactly why they are locked now rather than
escalated; F-3's precondition is safe to defer only if the pointer defers
with it, hence the ordering.

The risk register states whether each mitigation EXISTS. Five say "named
gate, not built" -- containment, generator scoping, production absence,
schema evolution, and arch:check coverage. Calling those mitigated today
would be the false-green this run exists to avoid.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record D-10 -- the mandated GLM design lane cannot be launched

Proves a charter-mandated deliverable is missing, and refuses to
manufacture it.

Two attempts, both dead in under a second with zero tokens. The second
surfaced the cause: "evaluator model request denied: model=z-ai/glm-5.2".
openrouter-run.ts is the only OpenRouter-through-Claude transport and its
own doc says the evaluator guard "is never optional here"; that guard
enforces an open-evaluator allowlist that correctly excludes GLM, because
lane-policy invariant 6 restricts relay EVALUATOR lanes to open models.

The block is right in its own terms and still wrong in outcome. The
design preset claude-design-glm-5-2 exists in provider-profiles.ts:192
and is bound to major_ui_ux_design in routing-policy.ts:90,171, but no
launcher can run a design lane -- the only transport applies an evaluator
guard to a design request. Policy declares a lane the execution surface
cannot execute. That is a repo-level defect worth its own issue.

Action is escalate, not substitute. The run does not fabricate the pass
and does not relabel another model's output as GLM's: there is no
authorized fallback, and the Kimi vision lane is defined as complementing
rather than replacing it. Design scrutiny is still obtained by folding
the design questions into the stage-F Sonnet brief, labelled explicitly
as NOT the mandated pass. Both failed transcripts are preserved as
evidence rather than deleted.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(rfc): fix the adversarial findings -- one identity model, one ordering rule

Proves the RFC survives an unoriented adversarial read, and that the
critical finding was verified in source rather than accepted on trust.

Reviewer: Sonnet 5, unoriented, separate session, distinct from every
authoring lane. Verdict 1 critical / 2 major / 4 minor, with 12 of 13
spot-checked citations verified exactly and no unhedged
security-or-readiness claim found.

CRITICAL (F-C1) was real and I confirmed it: sections 6 and 7 defined TWO
different contribution base types -- differing in casing, in id shape,
and in ordering -- so the data contract the whole v1 kind set depends on
did not type-check against itself. DevtoolsHostDescriptor and
DevToolsHostDescriptor both existed for the same concept. Fixed by
unifying on DevTools* (50 renames, with TanStack Devtools protected as a
real product name), defining the base type once in section 6, and keeping
Grafana's version-in-identity property as an apiMajor FIELD rather than
baking it into id -- so identity still derives from the host-assigned
mountId and never from a package name.

MAJOR (F-M2) is the one I am most glad was caught: the RFC's single
most-repeated claim cited a grep using alternation without -E, which in
BRE searches for a literal pipe and returns nothing trivially. The
command did not test what it claimed. Re-ran it correctly: still zero
matches, so the substance holds -- but both citations now use the
runnable form and the headline states its scope instead of implying
repo-wide.

The best finding was a minor one: the IA's top level answered "what
exists?" when the tool exists for someone who already knows something is
wrong. The home surface is now a ranked cross-cutting problem feed, with
stats moved below it.

F-m3 is deliberately NOT fixed, with the reason recorded, so the
judgement is auditable rather than invisible.

Gates: docs:links PASS (0 broken), docs:accuracy PASS.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): dispatch the formal PLAN-EVAL against an immutable commit

Proves the stage-G separation is real rather than asserted: a fresh Codex
GPT-5.6 Sol high session, in its OWN worktree, evaluating a fixed SHA
that cannot move under it.

Evaluated commit: b7cd6206762bc8f7a681526a993082c20e4cddfc, checked out
detached at /home/codex/repos/ns-devtools-planeval. One sender per
worktree; the launcher's dry-run validated the brief contract and the
git-safety check before the real launch.

The brief names five things the run WANTS attacked rather than leaving
the evaluator to guess: the plan-gate rework bar (is the #890 dependency
fork genuinely reversible, as claimed?), whether the UNPROVEN labelling
is complete or a readiness claim survives unhedged somewhere, whether the
drift entries that correct the run's own corpus are themselves right
(D-7's whole-filesystem grant especially), whether a charter-mandated
deliverable being unlaunchable should block PASS, and whether the stage-F
identity reconciliation left a third variant behind.

It is also told not to trust the run's reported gate results and to
re-run them itself.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): write the owner decision brief

Proves every genuine fork is surfaced with a recommendation and a cost of
deferral, so a silent default is a decision rather than an omission.

Leads with the missing deliverable rather than burying it: the mandated
GLM design pass is unlaunchable because policy declares a lane the
execution surface cannot run, and the two decisions that raises (accept
substitute scrutiny? file the launcher gap?) are the first things the
owner reads.

Gating forks are ordered by cost of getting them wrong, not by section
order. F-1's reversibility is stated as the property that makes it safe
to decide later; F-5 and F-6 are flagged as LOCKED rather than escalated
precisely because deferring them would force rework, and are listed only
so the owner can overrule.

The board section records that reading #400's comment thread reversed my
own recommendation on milestones -- I was heading toward re-milestoning
children that sit where an owner-ratified train put them. Saying so is
cheaper than being quietly wrong.

Closes with what is explicitly NOT claimed: five mitigations are named
gates that do not exist, and two host facts are unverified W0 probes.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record the PLAN-EVAL identity proof

Proves the evaluator separation with data rather than prose: thread id
019ff05b-cf8b-7051-b66a-fdc52683b2f0, its own detached worktree, and a
requested-versus-observed route that MATCHED (openai/gpt-5.6-sol/high).

The evaluated commit is immutable, so the artifact cannot move under the
evaluator mid-review. Generator-not-equal-evaluator holds end to end:
every authoring lane was Claude or Sonnet; the evaluator is OpenAI Codex
in a session that authored nothing.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record the PLAN-EVAL verdict -- FAIL_PLAN (cycle 1)

Proves the gate is real. Codex Sol high, thread 019ff05b, evaluating
immutable commit b7cd62067 in its own worktree, returned FAIL_PLAN with
seven of eight checklist items failed and eight required fixes.

All four independent gates passed -- immutable input, docs:links,
docs:accuracy, and a lock-hygiene SHA-256 check before and after. The
evaluator's closing note is the important part: green docs gates prove
link mechanics, not that the architecture decisions are closed or
mutually consistent.

The findings are correct and several are things I got wrong rather than
disagreements. My stage-F identity reconciliation was INCOMPLETE -- three
compound-id sites and a flat (order,id) panel sort survived. worklog.md
is stale in a way I have been criticising elsewhere: it claims the GLM
pass ran, names superseded gates, and lists files that do not exist. And
F-1 is NOT reversible as I claimed -- changing the package home changes
public specifiers, emitter ownership, and the #922 re-baseline.

Cycle 1 of 2 before escalation.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(rfc): PLAN-EVAL fix cycle 1 -- contracts, archetype, slices, honesty

Proves the FAIL_PLAN findings were treated as correct rather than
argued with. Six of the eight required fixes land here.

CONTRACT CORPUS. My stage-F reconciliation was incomplete and the
evaluator found the residue: three compound-id sites and two flat
(order, id) sorts survived. Now one identity law -- host-assigned mountId
plus local slug id plus an apiMajor FIELD -- and one ordering law, stated
once in section 6 and cross-referenced everywhere else. Cross-file search
proves no third form remains.

ARCHETYPE. The A2 assignment was wrong against doctrine's own trigger: A2
wraps ONE external system behind a port with adapters, and the unit
wrapped none and named none. Doctrine also warns that inventing a port
without a second adapter is the Wet Codebase failure -- so manufacturing
ports to justify A2 would have compounded it. Corrected to A1 contracts
plus A6 CLI (emission is generator behavior) plus A5 thin plugin, with
the host app as generated userland. This also closes owner fork O-2, and
deliberately does NOT name the package contribution-core: a
family-neutral spine is #890's to own.

GATE UNION redrawn from the corrected boundary -- the A6/F-CLI surface
was missing entirely, F-2/F-3/F-4/F-9 now attach where doctrine puts
them, and consumer plus e2e-CLI gates are named.

SLICES. Outcomes are not slices. Fifteen slices now each name files,
the contract introduced, and one proving command, with the W0 probes as
hard dependencies because a failed probe changes W4-a's files.

HONESTY. worklog.md was stale in exactly the way this run criticises
elsewhere -- it claimed the GLM pass ran, named gates that do not exist,
and listed files that do not. Rewritten to what actually happened,
including two NOT DONE rows. And F-1 is NOT reversible: changing the
package home changes public specifiers, emitter ownership and the #922
re-baseline. R1 corrected, R12/R13 added, and the plan now distinguishes
"decided" from "recommended pending owner choice".

Gates re-run: docs:links PASS, docs:accuracy PASS, lock clean.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* chore(harness): commit the stage-H filing-draft workflow before it runs

Proves provenance under the Tier-C rule for the third time in this run:
an uncommitted workflow does not run.

Produces the seed deliverables PLAN-EVAL required fix 7 named as missing
-- draft epic, one file per slice issue, per-wave agent briefs, and the
one-shot filing manifest.

The no-mutation boundary is stated twice in the shared brief, every
output file must carry a DRAFT banner, gh is reads-only, and agents are
told that inventing a label is itself a board mutation the owner has not
authorized -- a missing label is reported as a blocker instead.

The milestone rule encodes drift D-8: the dashboard children sit on an
owner-ratified train, so no new milestone is invented and uncertainty is
written as OWNER-DECISION rather than guessed.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): land the stage-H filing drafts and resolve the epic conflict

Proves the seed-contract deliverables PLAN-EVAL fix 7 named as missing:
25 artifacts -- epic body, 16 per-slice issue drafts, 7 per-wave agent
briefs, and the one-shot filing manifest. All draft-only, gh reads only,
every file carrying a no-mutation banner.

D-11 resolves a conflict the drafters surfaced rather than papered over:
they produced a NEW epic while the supersession map dispositions #400 as
AMEND, which would have put two live DevTools umbrellas on a board this
RFC exists to de-fragment. Decision: AMEND #400. It already carries the
ownership thesis, the epic:dev-dashboard label, and the owner-ratified
2026-07-19 train -- and amending removes a label blocker, since
epic:devtools exists neither in labels.yml nor live.

The drafters correctly refused to invent labels. epic:devtools,
area:devtools and area:frontend are reported as BLOCKERS, because
creating a repo label is a board mutation the owner has not authorized.

D-12 records two upstream drifts found while drafting and deliberately
NOT fixed here: .github/labels.yml has fallen 19 labels behind live, and
netscript-pr's milestone guidance (0.0.2-0.0.9) is stale against a board
running 0.0.6-0.0.15. Both are repo-surface changes outside a
planning-only run's boundary; the drafts use live values and say so.

Also corrected: the roadmap has 16 slices, not 15.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record D-13 -- the one-sender-per-worktree guard refused cycle 2

Proves a harness rule with evidence rather than a quotation: relaunching
the evaluator against the worktree cycle 1 used failed at launch with
'already has a sender; resume session 019ff05b'.

The refusal is correct. Two concurrent sends at one worktree fork rival
agents that fight over the git index, which is a documented landmine.
Catching it at launch is far cheaper than discovering a corrupted index
mid-evaluation.

Cycle 2 now runs in its own worktree at the cycle-2 commit, and cycle 1's
worktree is left intact so its verdict and transcript stay independently
inspectable.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* chore(harness): stage cycle-2 evaluator slice dir

* docs(harness): record D-14 -- cycle 2 spent its whole budget reading

Proves a gate failure that is mine, not the evaluator's: cycle 2 launched
correctly, ran all 26 turns, and wrote nothing. The worktree was clean
afterwards and the plan-eval.md present is cycle 1's, restored by
checkout.

Root cause is supervisor budget planning. I raised max-turns from 12 to
26 to fix cycle 1's cut-off but did not shrink the reading surface at the
same time -- and the artifact set has grown to a 3,600-line RFC plus 14
corpus files, 8 packs, 25 filing drafts and a 14-entry drift log, while
the brief asked for nine separate change areas to be verified.

Fixed by steering the same thread rather than relaunching: the registry
allows one sender per worktree, and the thread already holds the
analysis, so a fresh launch would repeat the reading and fail
identically. The steer tells it to write from what it has and mark
unexamined boxes NOT_ASSESSED, with an explicit promise that
NOT_ASSESSED will not be counted as a pass.

Lesson recorded for the next cycle: a re-evaluation brief should point at
a DIFF plus the specific claims to re-verify, not re-present the whole
corpus.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(rfc): PLAN-EVAL fix cycle 2 -- collapse two corpora into one

Proves the cycle-2 finding was a class of defect, not a list of typos,
and fixes the class.

ROOT CAUSE. Stage E drafted the RFC as ten section files, assembled them,
and then every later fix edited the ASSEMBLED document while the sources
went stale. The repo therefore carried two corpora that disagreed: the
RFC said A1+A6+A5 while rfc-sections/13-integration.md still said A2, and
identity/ordering variants survived in the sources after being fixed in
the RFC. My cycle-1 "fix" had only ever touched one table.

FIX. The assembly scaffold is DELETED, not re-synced. Re-syncing restores
the same divergence the next time the RFC is edited -- the defect is
having two corpora, not this particular skew. Drafting provenance stays
in git history and in the committed, re-runnable stage-E workflow.
RFC-AUTHORITY.md now states the authority order explicitly, including
that drift wins over the corpus and GitHub wins after filing.

SWEEP. plugin-devtools-core, @netscript/contribution-core, compound ids
and flat sorts are now ZERO across every normative artifact, verified by
cross-file search rather than asserted. Section 5's host paragraph, the
gate-derivation line, and fork F-8 all carried the withdrawn A2 boundary
and are corrected; the one surviving "Archetype 2" is the paragraph
explaining why the assignment was withdrawn.

HISTORICAL EVIDENCE PRESERVED. The eight design packs are NOT rewritten
-- they are frozen at authoring time and now carry a banner pointing at
the RFC. Rewriting them would falsify the record of what was known when.

Also: R13 closed (the filing deliverables exist and cycle 2 confirmed
it), and the decision brief no longer calls F-1 reversible.

Gates: docs:links PASS, docs:accuracy PASS, lock clean.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): close stage G at the escalation boundary

Proves the run stopped where the harness says to stop rather than
grinding a third cycle against owner-gated blockers.

Two PLAN-EVAL cycles, both FAIL_PLAN, both on the recorded route with
requested == observed, each in its own worktree against an immutable
commit. run-loop.md allows two before escalation, so no third cycle was
opened.

Every supervisor-fixable finding from both cycles is closed and verified
by cross-file search rather than assertion -- including the cycle-2 root
cause, which was that the RFC and its section sources had become two
disagreeing corpora.

What remains is owner-gated only: the unlaunchable GLM design pass, fork
F-1 (package and spine ownership, which fixes public specifiers), and
fork F-3 (manifest schema evolution, whose two options have different
tests). None is resolvable from inside a planning run, and substituting
for the GLM pass was refused rather than quietly done.

The board is untouched and PR #1450 remains draft.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): bring the resumable artifacts current

Proves the run does not leave behind the staleness it was just failed
for. PLAN-EVAL cycle 1 penalised worklog.md for claiming work that never
happened; leaving context-pack.md and the drift table stale at the
escalation boundary would repeat the defect one level up.

context-pack.md rewritten: it had still said 'nothing is locked yet' and
listed stage B as in-progress, with every gate NOT_RUN, after the RFC was
committed and PLAN-EVAL had run twice. It now records the actual state,
what is blocked on the owner, and how to resume -- including the two
process lessons a re-run needs (bound the evaluator's reading; use a new
worktree per cycle).

worklog drift table refreshed from three entries to fourteen, with the
six self-corrections marked as such, and the stale slice rows 4b/9/10
updated to DONE with their commits.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record the owner route override -- Qwen 3.8 Max for stage D2

Proves a lane binding changed by owner decision rather than by
supervisor convenience.

The owner reviewed the D-10 escalation and declined to waive the
adversarial design pass. Instead they authorized running stage D2 on
qwen/qwen3.8-max at max reasoning, through the repo agentic toolchain on
a fresh read-only surface, natively via OpenCode/OpenRouter -- because
agentic:claude-openrouter's open-evaluator guard admits neither GLM nor
Qwen.

Scope is recorded narrowly on purpose. The override touches stage D2
ONLY. The Codex GPT-5.6 Sol PLAN-EVAL remains separate and remains the
verdict of record, so nothing Qwen returns carries Plan-Gate authority.
The evaluator is findings-only and makes no edits; the supervisor
adjudicates.

D-10 therefore moves from 'mandated deliverable missing' to 'obtained on
an owner-approved substitute route', and R12 is updated rather than
silently closed -- the substitution is a recorded deviation from
lane-policy invariant 5, not a satisfaction of it.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): stage-D2 launch receipt for the Qwen design pass

Proves the owner-approved substitute route was launched with recorded
identity and a genuinely read-only surface, not just asserted to be one.

Requested identity is openrouter/qwen/qwen3.8-max at variant max, with
the model id resolved from config/models.ts:52 rather than hardcoded, via
the repo's own OpenCode transport -- which is the right lane precisely
because agentic:claude-openrouter's open-evaluator guard admits neither
GLM nor Qwen.

The evaluator surface is a fresh detached worktree at an immutable
commit with docs/ and packages/ chmod'd a-w and verified dr-xr-xr-x, on
top of a prompt that forbids all edits and all GitHub mutation. It is
distinct from every authoring lane in the run.

Observed identity is left explicitly pending and will be filled from the
transcript; a requested-versus-observed mismatch would itself be recorded
as drift rather than quietly accepted.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record D-16 -- owner-directed lane split, Kimi K3 takes pure UI/UX

Proves stage D2 is now two complementary passes rather than one
overloaded reviewer.

The owner refined the D-15 override: architecture and contracts go to
Qwen 3.8 Max at max, and the pure UI/UX review goes to Kimi K3 at high --
which is what lane-policy already envisages, since adversarial_design_eval
is defined as COMPLEMENTING the design lane rather than replacing it.
Each prompt tells its reviewer to stay in its lane and skip the other's
findings, so the passes do not duplicate.

Recorded honestly rather than glossed: Kimi is the vision-capable lane,
but this run is planning-only and there are NO screenshots, mockups, or
rendered artifacts, because nothing is implemented. Kimi reviews the
information architecture as text and its vision capability is unused. Its
prompt says so explicitly so that no downstream artifact can imply a
visual review took place -- and if the IA is ever prototyped, a follow-up
Kimi pass with images would be materially different evidence.

Both passes run on separate fresh read-only worktrees, both are
findings-only with no edit rights, and both are advisory. The Codex
PLAN-EVAL remains the sole verdict of record.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): correct supervisor residue left by the route override

Proves the identity file stays accurate after a lane change rather than
carrying superseded text -- the staleness class PLAN-EVAL already failed
this run for once.

Three corrections. The OpenRouter prohibition still described the GLM
pass as required and Kimi as merely conditional; it now names the actual
active lanes, Qwen for architecture and Kimi for UI/UX, and states that
no stage-D2 reviewer is ever the formal evaluator -- a PASS-shaped
statement from a design lane carries no gate authority.

The stage-F rationale listed GLM 5.2 as one of the authoring lanes Sonnet
had to be distinct from. GLM NEVER RAN, so it authored nothing; the note
now says so rather than implying a pass happened.

The review chain is corrected to Opus -> Fable -> Sonnet -> Codex Sol,
with Qwen and Kimi named as advisory passes that authored nothing.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record D-17 -- I truncated my own design-review evidence

Proves an evidence-loss mistake by the supervisor rather than hiding it
behind a clean re-run.

Both stage-D2 launches were piped through tail -40. Kimi K3 completed and
returned 1 critical, 5 major and 4 minor findings, but only the last 40
lines survived: the captured file starts mid-finding and five of the ten
findings are gone. No OpenCode session store exists to recover from.

This is evidence loss on the exact deliverable the owner declined to
waive, and the cause is mine -- tail was habit from reading noisy
launcher output, which is the wrong tool the moment the command's stdout
IS the artifact. The stage-B corpus escaped this only because those
agents wrote their own files.

Both passes are re-run with full redirection. The truncated tail is KEPT
as kimi-findings-PARTIAL-tail.md rather than deleted, because it is
evidence that the first run happened and what it concluded; deleting it
would tidy away the mistake.

Rule recorded: when a lane's stdout is the artifact, redirect to a file
and never pipe through head or tail.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): correct D-17 -- only the Kimi pass had been re-run

Proves the drift log states what happened rather than what was intended.
D-17's action line said 'both passes re-run with output redirected'; at
the time of writing only Kimi had been. Qwen was still on its original
truncating invocation and had not returned, and killing a long reasoning
pass to fix the capture would have cost more than letting it finish.

Corrected to a staged action with each lane's real status, and pointing
at the receipt as the tracker rather than asserting a state here. A drift
entry that overstates its own remedy is the same defect it was written to
record.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(rfc): adjudicate the Kimi UI/UX pass -- fix the ambiguous empty feed

Proves the owner-mandated design pass changed the design rather than
decorating it. Kimi K3 returned 1 critical, 5 major, 5 minor; every
finding is dispositioned and every anchor was verified in source before
being accepted.

CRITICAL, fixed. Home could not distinguish "nothing is broken" from
"DevTools is blind" -- a ranked problem feed rendering empty had two
meanings and no way to tell them apart. For a tool whose whole thesis is
diagnostics, that fails silently at the most important moment. Section
11.3.1 now specifies a closed FeedSource set, a per-source status, and
the rule that all-clear is reachable ONLY when every source reported;
otherwise the feed renders partial and names the gap. not-configured
stays distinct from unreachable so a missing automation plugin does not
cry wolf and a real outage is not hidden.

MAJOR, fixed. DevToolsUiNode tables were string-only, so the canonical
devtools table -- id, status badge, trace link -- was inexpressible while
the RFC claimed most panels are key/value plus table plus list. Cells are
now nodes. And there was no code element at all, which made AC-2's
required CLI-equivalent line unsatisfiable by the RFC's own vocabulary.
Both were cases of the document contradicting its own stated goals.

MINOR, fixed. Section 5's route sketch promised a traces/ surface that
section 11.1 explicitly killed.

Seven findings are ACCEPTED-DEFERRED into one state-and-DX amendment
pass, with the reason recorded: they share a single root -- two panel
state vocabularies and no worked data-access example -- and patching them
separately would create a third vocabulary, which is exactly the defect
PLAN-EVAL cycle 2 caught with identity and ordering.

Gates: docs:links PASS, docs:accuracy PASS.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record D-18 -- owner waiver of a third PLAN-EVAL cycle

Proves the gate was cleared by owner authority rather than by an
evaluator verdict, and corrects a premise in the grant rather than
accepting it silently.

plan-gate.md allows a Plan-Gate to clear on PASS or an owner waiver in
writing; this is the waiver.

The premise correction matters. The owner wrote 'if both eval passed
separately', but neither stage-D2 pass returned a PASS and neither was an
evaluation -- Kimi returned 1 critical, 5 major, 5 minor and Qwen
returned 1 critical, 5 major, 5 minor, both advisory by construction
because their prompts forbade emitting a verdict. So the waiver is read
as 'apply the amendments and do not open a third Codex cycle', NOT as
'the design passes found nothing'. Letting the looser reading stand would
put a false clean bill of health in the record.

Scope recorded explicitly: the waiver covers the eval cycle and the
Plan-Gate, not board filing, and not owner forks F-1 and F-3, which are
architecture decisions rather than eval verdicts and remain unratified.

The record will never imply Codex returned PASS -- it returned FAIL_PLAN
twice, and the owner has cleared the gate over its owner-gated remainder.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(rfc): adjudicate the Qwen architecture pass -- fix a false trust antecedent

Proves the second stage-D2 lane changed the design too, and that its
critical finding was verified rather than deferred.

CRITICAL, fixed. Section 9's decline rationale rested on the claim that
contributions are workspace packages the developer already runs. That is
FALSE by this RFC's own pipeline: section 10 pins installs to
source={kind:'jsr'} and emits import('jsr:@acme/plugin-trace@1.4.2/...'),
section 6's worked example is @acme/plugin-crons, and section 6 states
the generator imports the pointed-to export IN-PROCESS. Third-party code
both exists and executes.

The antecedent now splits. The decline survives for panel rendering,
where a contribution is a UiNode data tree and no contributed code
reaches the browser in v1. It does NOT survive for generate-time import,
which is arbitrary third-party code running in the generator's own
process with no subprocess boundary at all -- weaker than the T-2 path
INV-2 scopes. Added T-10, INV-9 (read the envelope without executing
contributor code in-process) and gate G-10. The restated justification is
narrower and true: installing a plugin already grants server code and a
whole-filesystem scaffolder before DevTools exists.

MAJOR, fixed. Anchors were keyed '<pluginKind>/<contributionId>' while
identity produces '<mountId>/<id>/v<apiMajor>', so no anchor could ever
match and the entire anchor tier of my ordering rule was silently dead.
An unmatched anchor is now a generate-time warning.

MINOR, fixed. DevToolsPanelId was referenced but never defined -- more
residue from my own identity fix. And "8 trigger kinds" was simply wrong:
verified at plugin-triggers-core constants, the canonical set is six.

Three findings arrived independently from BOTH lanes -- the string-only
table, the traces/ contradiction, and the under-specified feed. That
convergence is the strongest evidence either pass produced.

Gates: docs:links PASS, docs:accuracy PASS, lock clean.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): record D-19 -- owner ratifies F-1 and F-3, authorizes filing

F-1 ratified: self-contained DevTools family and spine built first in
packages/devtools-core, not serialized behind #890's 24 unimplemented
children. Closes the run's highest-risk fork and unblocks W1-a.

F-3 ratified: manifest schema-evolution precondition via .passthrough()
before any manifest-visible pointer, with explicit old/new CLI behavior
and tests. Closes the D-6 defect where #890's additive-manifest claim was
false against a .strict() schema.

Board filing authorized once from the committed manifest, preserving the
2026-07-19 milestone train and not duplicating existing issues. This is
the stage-H ratification the seed-run profile gates on; the mutation
boundary opens for the first time in this run.

Standing instruction recorded: no re-asking about F-1/F-3 or accepted
findings; stop only for a genuinely new architecture fork or an
authorization boundary.

Refs #1450

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DChBXWYP9LStvjQztUJV5b

* docs(harness): fill stage-D2 receipt observed identity and outcome

Proves the owner-approved substitute route ran as authorized, with
identity confirmed from the transcripts rather than assumed.

Observed matches requested on both lanes: qwen/qwen3.8-max and
moonshotai/kimi-k3. Recorded honestly that OpenCode's header reports the
bare vendor/model while the request carries the openrouter/ transport
prefix -- a transport-prefix difference, not a model difference -- and
that variant is not echoed in the header, so it is marked requested-only
rather than claimed as observed.

The receipt now also records the outcome plainly: neither pass returned a
PASS and neither was asked to, each found a critical that changed the
RFC, and three findings arrived independently from both lanes. The
truncated first captures are listed alongside the full ones as preserved
evidence of D-17.

Amendment C also landed: #412 moves AMEND to SUPERSEDE now that…
@github-actions github-actions Bot added the canary:0.0.6-canary.2 Published NetScript prerelease 0.0.6-canary.2 label Aug 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:config packages/config and runtime-config area:docs area:plugins plugins/* and plugin-core packages canary:0.0.6-canary.2 Published NetScript prerelease 0.0.6-canary.2 ci:skip-e2e ci:skip-scaffold Skip the scaffold-static (deno-only) scaffold gate status:ready-merge type:docs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant