Skip to content

RFC: Typed SDK client contributions - #1390

Merged
rickylabs merged 12 commits into
mainfrom
docs/rfc-sdk-client-contribution
Aug 11, 2026
Merged

RFC: Typed SDK client contributions#1390
rickylabs merged 12 commits into
mainfrom
docs/rfc-sdk-client-contribution

Conversation

@rickylabs

@rickylabs rickylabs commented Aug 8, 2026

Copy link
Copy Markdown
Owner

Summary

Draft RFC for a minimal typed SDK client contribution seam. Formal Claude Fable 5 PLAN-EVAL cycle
1 returned FAIL_PLAN / CHANGES_REQUESTED; this branch now remediates F-A1 through F-A10 while
preserving the typed request-header/context contribution axis and stable-v1/upstream-major-neutral
decision.

Scope

Slices

  • S1 harness bootstrap — 158849031
  • S2 repository/upstream re-baseline and RFC authorship — 89ae608ea
  • S3 initial gate/handoff record — e78ac0a65
  • S4 root-requested oRPC v2 audit amendment — 7a0d39808
  • Formal PLAN-EVAL cycle-1 verdict artifact — f1a29fe1a
  • S5 F-A1–F-A10 RFC/type-fixture remediation — 78a7cecd1
  • S5 author handoff record — bc9554590
  • S5 live PR reconciliation and cycle-2 entry — 4978f7d84
  • S5 aggregate base-to-HEAD diff hygiene — 9f45404ac

Cycle-1 corrections

Validation

  • real-surface fixture check — PASS
  • scoped fixture lint — PASS, 1 file / 0 findings
  • RFC/harness/fixture format — PASS, 9 files
  • focused RFC links — PASS, 1 document / 0 broken
  • repository docs links — PASS, 102 documents / 0 broken
  • docs accuracy — PASS
  • doctrine — PASS, exit 0; warning-only baseline unchanged
  • diff hygiene — PASS
  • review-thread gate — PASS, 0 total / 0 unanswered

Package publish/JSR/doc-lint baselines from the initial RFC remain recorded and unwaived. CLI/
scaffold runtime E2E remains an implementation merge-readiness gate, not a docs-only RFC gate.

Harness and review boundary

  • Run: .llm/runs/docs-rfc-sdk-client-contribution--rfc/
  • Verdict: .llm/runs/docs-rfc-sdk-client-contribution--rfc/plan-eval.md
  • Handoff: .llm/runs/docs-rfc-sdk-client-contribution--rfc/final-handoff.md
  • Phase: status:review; Fable cycle 2 and Qwen final evaluation both passed; formal FCP opened 2026-08-08
  • The root orchestrator must steer the existing Fable session for cycle 2, then own the later Qwen
    pass. This generator launched neither.

Definition of Done

  • Every F-A1–F-A10 correction is normative or has an executable future gate.
  • The fixture models real current contract/client/query/key/Desktop surfaces in-tree.
  • Board-stage reconciliation preserves live issue ownership without mutation.
  • Exact cycle-2 reviewer instructions are in the final handoff.
  • Formal cycle-2 verdict is recorded by the owner-designated evaluator.

Keep this PR draft. Do not number or merge the RFC until maintainer acceptance and the remaining
owner-directed review passes complete.

@rickylabs rickylabs added area:plugins plugins/* and plugin-core packages area:sdk packages/sdk ci:skip-e2e ci:skip-scaffold Skip the scaffold-static (deno-only) scaffold gate priority:p1 High rfc Request for Comments - substantial/breaking design change status:research Harness research phase type:docs labels Aug 8, 2026 — with ChatGPT Codex Connector

Copy link
Copy Markdown
Owner Author

[SLICE: S1] [STATUS: COMPLETE]

Harness bootstrap is live at commit 158849031.

Scope

  • Activated .llm/runs/docs-rfc-sdk-client-contribution--rfc/ with the mandatory supervisor, research, plan, Design worklog, context pack, and drift artifacts.
  • Preserved the launch-generated implementation brief and concrete daemon thread identity.
  • Recorded Archetypes 2/4/5/6 under SCOPE-docs, the owner-directed external review route, and the explicit-refspec push rule.
  • Opened this draft against main; no closing keyword, RFC number, issue/milestone mutation, or framework code.

Evidence

  • HEAD, freshly fetched origin/main, and merge-base: fac9e339042c5394bf882311657d8981d353a1c3.
  • Explicit push: git push origin HEAD:refs/heads/docs/rfc-sdk-client-contribution — exit 0.
  • Required labels applied with exactly one lifecycle label: status:research.
  • Docs-only CI lane is intentional: ci:skip-e2e + ci:skip-scaffold.

Next

Re-baseline current exports/types/tests, live issues/PRs, and primary upstream oRPC sources before locking the RFC design.

@rickylabs

Copy link
Copy Markdown
Owner Author

Research summary (S2)

  • Run: .llm/runs/docs-rfc-sdk-client-contribution--rfc/
  • Commit: 89ae608ea935ba8b2776d55e7cb5a09cc29e2520
  • Baseline: origin/main at fac9e339042c5394bf882311657d8981d353a1c3

Re-baseline

  • Current SDK client options are closed; port and timeout are accepted but unused.
  • The HTTP link already owns fetch, retry, dedupe, tracing, codec, and dispatch; oRPC already exposes the narrower async typed headers/context seam.
  • Direct, server-query, and TanStack surfaces currently erase request context, and current full keys do not include it.
  • Trace is not a valid contribution dogfood because final trace injection belongs at client-span dispatch.
  • Plugin discovery has no generic SDK-client group; auth convention ownership belongs in plugin-auth-core.

Proposal challenge

The carried-in broad envelope was rejected. The RFC keeps only versioned request-header preparation plus the mandatory cache-effect declaration needed for safe query use. Bearer auth and locale prove distinct consumers. Custom transport remains #451; #1353 becomes trace-ownership conformance.

Evidence

No PLAN-EVAL or IMPL-EVAL was launched.

@rickylabs

Copy link
Copy Markdown
Owner Author

Plan summary (S2)

  • Run: .llm/runs/docs-rfc-sdk-client-contribution--rfc/
  • Commit: 89ae608ea935ba8b2776d55e7cb5a09cc29e2520
  • RFC: rfcs/0000-sdk-client-contributions.md (0000, Draft)

Locked design

  • Package-owned protocol { family: "netscript.sdk-client", major: 1 } with literal id, runtime context declaration, exclusive lower-case header ownership, cache effect, and async preparation.
  • Literal tuples intersect per-call context; construction repeats validation for widened/JavaScript/plugin boundaries.
  • Valid contributors see the same snapshot and commute; tuple order controls deterministic first failure only.
  • Cache safety is mandatory: invariant, synchronous non-secret partitioned, or direct-only with query maps omitted.
  • Bearer auth lives in @netscript/plugin-auth-core/sdk; locale owns accept-language as the non-auth proof.
  • Transport retains discovery/codec/fetch/retry/dedupe/trace/errors; trace headers and Fetch-owned fields are reserved.
  • Source resolver failures are discarded; exported diagnostics use a fixed redacted allowlist.
  • Static plugin references expose availability; explicit generated/app tuples activate contributions per service.

Implementation boundary and gates

The RFC specifies exact public types, compatibility defaults, migration, failure taxonomy, inference budgets, staged issue ownership, docs/scaffold work, and conformance gates. This PR changes no framework code. Full scaffold E2E is intentionally deferred to implementation merge readiness.

Generator self-audit

The Plan Gate checklist is complete for evaluator entry. That is not an external verdict. The root orchestrator owns the existing Fable review and later Qwen adversarial pass.

@rickylabs rickylabs added status:plan-eval Awaiting plan evaluation and removed status:research Harness research phase labels Aug 8, 2026
@rickylabs

rickylabs commented Aug 8, 2026

Copy link
Copy Markdown
Owner Author

Final handoff (S3)

  • Branch HEAD: e78ac0a65f5475ed37152272b16ba7d89deca8c3
  • Reviewable RFC commit: 89ae608ea935ba8b2776d55e7cb5a09cc29e2520
  • Run: .llm/runs/docs-rfc-sdk-client-contribution--rfc/
  • Handoff: .llm/runs/docs-rfc-sdk-client-contribution--rfc/final-handoff.md
  • Lifecycle: status:plan-eval

Generator outcome

The RFC is decision-complete for external review: exact public/type surface, composition and conflict law, async context, cache identity, redaction, transport/trace ownership, generated/plugin discovery, compatibility/migration, implementation stages, gates, and board reconciliation are specified. Auth-core bearer and locale prove distinct consumers without a parallel framework.

Gate evidence

Formatting (8 files), focused and repository link checks, docs accuracy, exact-shape type proof, doctrine, diff hygiene, and the 0/0 review-thread gate pass. Four package publish dry-runs are OK. Existing plugin JSR and private-type-ref findings are recorded as baselines and explicitly not waived. Runtime scaffold E2E is deferred to implementation merge readiness because this PR is docs-only.

Reviewer action

The root orchestrator should steer the already-existing Claude Fable 5 session using the exact instructions in final-handoff.md, record identity/findings/verdict, reconcile any RFC edits, and only then run the planned Qwen adversarial pass. This generator launched no evaluator and claims no external verdict.

Do not number or merge the RFC, implement product code, create/close issues, or mutate milestones from this handoff.

@rickylabs rickylabs added status:research Harness research phase and removed status:plan-eval Awaiting plan evaluation labels Aug 8, 2026
@rickylabs

Copy link
Copy Markdown
Owner Author

[PHASE: RESEARCH] Root-requested post-generator oRPC v2 audit amendment

  • This resumes the existing RFC-A generator thread; it is not an evaluator verdict.
  • Reconcile upstream-major neutrality, NetScript-owned internal adapter ports, prepare-once retry semantics, the incoming request-header companion boundary, and a separate v2 migration RFC/spike.
  • Preserve the ratified contribution-axis story and issue/milestone state; no evaluator is being launched.

Next handoff: amended RFC plus harness evidence, then restore exactly one lifecycle label: status:plan-eval.

@rickylabs rickylabs added status:plan-eval Awaiting plan evaluation and removed status:research Harness research phase labels Aug 8, 2026
@rickylabs

Copy link
Copy Markdown
Owner Author

[PHASE: PLAN] [STATUS: READY_FOR_PLAN_EVAL]

Root-requested post-generator oRPC v2 audit amendment is reconciled. This is research/plan authorship, not a formal evaluator verdict.

Delivered

  • Final branch HEAD: 7be129d8037c9a4807e6101d62db827e3ff82a70
  • Reviewable RFC/research amendment: 7a0d398087a6608ff1a55bb9fe4c47158edb72a7
  • Run: .llm/runs/docs-rfc-sdk-client-contribution--rfc/
  • Handoff: .llm/runs/docs-rfc-sdk-client-contribution--rfc/final-handoff.md

Corrected decision record

  • RFC-A is normatively upstream-major-neutral: public/generated declarations contain zero raw oRPC types, links, plugins, contexts, interceptors, or metadata accessors.
  • Three package-private NetScript ports own procedure metadata, prepared outbound headers, and transport policy; version-specific wiring is non-normative.
  • Preparation occurs exactly once per logical call above retries. Each attempt reuses byte-equivalent immutable contributor headers/context. Direct unmemoized link-header preparation is non-conforming.
  • Implement RFC-A against stable v1. A separate low-risk decision may move the exact family to v1.15.0. Production v2 beta, protocol rollout, errors/status, GET/CSRF, OTel, serializers, streaming, and broad parity work belong to a separate RFC/spike.
  • RequestHeadersHandlerPlugin is only an optional incoming server companion and may be absent for direct calls; it is not outbound contribution composition.
  • The cache partition/direct-only law remains: official v2 TanStack integration still excludes client context from query keys.

Evidence

  • Audit input read in full: 59 lines; SHA-256 fa8b0ab5cd1afd57b8f6c20036a265fa7c8fb48764f88f97f289c44c0737d3d0.
  • Stable-channel tool: seven workspace oRPC v1.14.x dependencies are behind to v1.15.0; no dependency mutation.
  • Focused impact scan: 91 @orpc/* reference files, 74 after excluding test paths/name patterns.
  • Official releases, v1-to-v2 migration, request-header, TanStack, error/client-error docs, and beta.25 codec/retry source reconciled.
  • PASS: eight-file formatting, focused RFC links, 102-document links, docs accuracy, exact-shape type probe, doctrine, and diff hygiene. No runtime/scaffold E2E for this docs-only amendment.
  • Explicit push used: git push origin HEAD:refs/heads/docs/rfc-sdk-client-contribution.

Fable focus

Decide outer wrapper versus immutable per-call memo; procedure-auth metadata placement; GET/CSRF ownership; v1.15.0 sequencing; default incoming request-header plugin behavior for direct calls; mixed-version endpoint requirements for the separate v2 migration; and whether v2 OTel can ever replace final injection without violating NetScript span ownership.

The PR is restored to exactly one lifecycle label, status:plan-eval. The root orchestrator must steer the existing Fable session. This generator launched no evaluator, assigned no RFC number, and mutated no issue or milestone.

Cross-family evaluator (Fable 5 high, owner-designated). Ten findings
F-A1..F-A10; core thesis verified incl. prepare-once reproduced on locked
v1.14.6. Deep-dive delegations recorded (wf_b3416478-edf, Opus 5 xhigh).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@rickylabs

Copy link
Copy Markdown
Owner Author

[PHASE: PLAN-EVAL] [VERDICT: CHANGES_REQUESTED]

FAIL_PLAN, cycle 1 of 2. Evaluator of record: Claude Fable 5 · high (owner-designated cross-family PLAN-EVAL; generator was Codex Sol xhigh). Full verdict: .llm/runs/docs-rfc-sdk-client-contribution--rfc/plan-eval.md @ f1a29fe1a. Deep-dive delegations (recorded): 2× Opus 5 · xhigh, read-only, workflow wf_b3416478-edf.

The core thesis is verified sound — headers + typed per-call context, prepare-once above retry (now reproduced on the locked v1.14.6, not just v2-beta: headers resolve in encode, retry re-enters upstream of it), partition/direct-only cache law (v1 generateOperationKey confirmed context-free), auth+locale dogfoods, stay-on-stable-v1 (v1.15.0 shipped 2.5h after beta.26 — v1 is actively maintained), and RequestHeadersHandlerPlugin correctly treated as an incoming-server companion (confirmed in shipped beta.26 types). The failures are gate-bar completeness failures.

Findings

  1. F-A1 (critical) — zero-oRPC-symbol gate fails on unchanged code. ContractLike's bound carries the literal '~orpc' metadata accessor (ports/service-client.ts:78-86; deno doc --json on the ports barrel shows it), and doctrine 02:218-240 sanctions oRPC builder types in contracts — yet the gate (§Conformance, type-gates last bullet + publish gates) scans both. Repair: scope the gate to (a) new RFC-A protocol types and (b) generated client declarations, with named existing-debt exceptions owned by [sdk-client S1] fix(sdk): preserve contract errors through safe() and isDefinedError #1350/Type soundness ratification: eliminate unsound and arbitrary types across the public surface and the docs #1278.
  2. F-A2 (critical) — server key algebra unaddressed. The partition suffix changes public fixed 3-tuples (createActionQueryKey, ActionMethod.key) plus CacheKey/key-bridge/kv-persister/collections — none named in §Query propagation; TanStack key injection requires per-procedure precomputed queryKey wrapping (replacing the zero-cost cast at create-service-query-utils.ts:57-63); fixture service-query-utils-upstream_type.ts:39-40 pins upstream assignability the context generic breaks. Repair: normative server-key subsection deciding the suffix's type-level shape + surface enumeration + fixture disposition.
  3. F-A3 (major) — additive claim contradicted. ServiceClientMethod/ServiceClientShape/ServiceQueryClientContext are public; the sketches show no compatibility defaults. Add them or the change is breaking.
  4. F-A4 (major, security) — streaming reconnect under prepare-once. v1 retry re-enters from inside async-iterator consumption (plugins/index.mjs:337-360) → long-lived streams reconnect with a frozen credential; the fixture only forces one retry. Add an explicit rule (re-prepare per reconnect, bounded reconnect, or streams direct-only/no-retry) + an iterator-phase fixture.
  5. F-A5 (major) — desktop transport bypass. @netscript/sdk/desktop builds a second client; contributions never apply — same contract silently sends no bearer. Scope it in/out/rejected-with-consequence.
  6. F-A6 (major) — private ports live nowhere + no absence gate. src/ports/ is the public barrel; name the private location and add a deno doc-absence assertion to the adapter gates.
  7. F-A7 (medium) — ServiceClientContext retry fields are upstream-shaped (hand-copy of ClientRetryPluginContext, intersected at http-client-link.ts:27) and contribution-visible; retry is off by default so the fixture must drive context.retry; dedupe replaces downstream context, colliding with the snapshot-gate wording; the prepared-header channel (private context symbol vs wrapper) is unstated.
  8. F-A8 (medium) — v2 amendment corrections. (a) GET direction inverted: GET inference is on today (http-client-link.ts:82); v2 rejects GET by default (verified allowMethods default in shipped beta.26) — rewrite §"Boundaries reserved for the v2 migration" + Q10 as keep-GET (allowMethods + Sec-Fetch CSRF) vs accept-losing-GET. (b) v2 removes inferRPCMethodFromContractRouter (the exact import at http-client-link.ts:17) — add to the v2 gate list. (c) GET-only dedupe filter becomes a silent no-op without GET — add a dedupe-effectiveness gate. (d) @orpc/opentelemetry already ships on v1 (1.14.11+) — the rename belongs to [sdk-client S4] refactor(sdk): centralize HTTP method and GET-cache policy #1351; only span topology is v2-scoped. Also: every manifest is ^1.14.6 — only deno.lock pins the family; state lock-only pinning as the gate for the "separate v1.15.0 decision" or require exact pins.
  9. F-A9 (minor) — the 16-budget probe is gitignored/excluded and models a stripped algebra; commit an in-tree fixture against real ContractLike/defineServices/ServiceQueryUtils.
  10. F-A10 (minor, strengthening) — cite the now-verified v1 per-attempt header behavior; state dedupe header-safety; one privacy sentence for input: unknown reaching third-party prepare; keep the planned stage-0 reconciliation of [sdk-client S1] fix(sdk): preserve contract errors through safe() and isDefinedError #1350's live scope.

FCP adjudication: Q1–Q4/Q7–Q9/Q11 safe to defer; Q5 safe once F-A7's channel statement lands; Q10 must be rewritten per F-A8(a).

Next

  • Root orchestrator resumes the Codex generator with this list; every repair is a scoped amendment — no structural redesign requested.
  • Label moved status:plan-evalstatus:plan in this action; restore status:plan-eval with the amended handoff.

@rickylabs rickylabs added status:plan Harness plan phase and removed status:plan-eval Awaiting plan evaluation labels Aug 8, 2026
rickylabs added a commit that referenced this pull request Aug 8, 2026


Both CHANGES_REQUESTED (cycle 1); cross-RFC composition verdict, amendment
map, and v2-migration epic proposal in CROSS-RFC-REVIEW.md. Evaluator-only
writes; no board mutation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@rickylabs rickylabs added status:plan-eval Awaiting plan evaluation and removed status:plan Harness plan phase labels Aug 8, 2026
@rickylabs

rickylabs commented Aug 8, 2026

Copy link
Copy Markdown
Owner Author

[PHASE: PLAN] [STATUS: READY_FOR_PLAN_EVAL] — formal cycle-1 remediation

Claude Fable 5's authoritative FAIL_PLAN / CHANGES_REQUESTED cycle 1 is reconciled by the author.
This comment requests owner-directed cycle-2 re-evaluation; it does not claim PASS and does not
launch an evaluator.

Exact delivery

  • Final branch HEAD: 9f45404acaf97a1593ee8fd1aea098626dfb3691
  • Reviewable RFC/type remediation: 78a7cecd1d5eaafa7a65bc25a21af497567128dc
  • Handoff evidence: bc955459046c19a31fe00195b32f37f25a04e24f
  • Formal cycle-1 verdict: f1a29fe1a65d59f71a59bf4b6b2a48fc49e1e86f
  • Run: .llm/runs/docs-rfc-sdk-client-contribution--rfc/
  • Exact handoff: .llm/runs/docs-rfc-sdk-client-contribution--rfc/final-handoff.md

F-A1 through F-A10

  • F-A1: scoped zero-oRPC checks to named new RFC-A nodes and generated client declarations,
    under a non-growing [sdk-client S1] fix(sdk): preserve contract errors through safe() and isDefinedError #1350/Type soundness ratification: eliminate unsound and arbitrary types across the public surface and the docs #1278 baseline.
  • F-A2/F-A3: exact default 3-tuple/partitioned 5-tuple server keys across all named cache paths,
    recursive TanStack wrapping, and explicit defaults on every widened public generic.
  • F-A4: unary retries prepare once; iterator-phase reconnect creates a fresh preparation epoch,
    rotates credentials, and replays one immutable record inside that epoch.
  • F-A5/F-A6: HTTP-only scope rejects Desktop contributions; three private ports live only under
    src/internal/client-contributions/ with doc-graph and packed-import absence gates.
  • F-A7: contributors see declared context plus signal only; retry/cache/trace/dedupe semantics
    and the prepared-call channel remain transport-private; forced retry is context.retry: 1.
  • F-A8: v1 GET direction is corrected. The separate v2 spike must replace removed inference plus
    configure allowMethods/CSRF or retire GET and replace dedupe, and must pass the complete atomic
    family/rollout/parity/error/execution/OTel/Desktop/stream/cache/runtime/E2E/docs/publish matrix.
  • F-A9: committed real-surface fixture imports current contract, defineServices, client/query,
    action/factory/cache-key, and Desktop types; it proves defaults, 3/5 keys, conflicts, and 16/17.
  • F-A10: verified stable-v1 retry/header and dedupe facts, raw-input privacy, active-v1 status,
    and [sdk-client S1] fix(sdk): preserve contract errors through safe() and isDefinedError #1350 Stage 1a versus metadata Stage 1b board ownership are explicit.

Gate evidence

  • PASS: Deno type fixture and scoped lint (0 findings)
  • PASS: format, 9 files
  • PASS: focused RFC links, 1 document / 0 broken
  • PASS: repository docs links, 102 documents / 0 broken; docs accuracy
  • PASS: doctrine, exit 0; warning-only baseline unchanged
  • PASS: working-tree and aggregate origin/main...HEAD diff hygiene; one trailing blank in the
    original implement.md bootstrap artifact was corrected
  • PASS: review threads, 0 total / 0 unanswered
  • PASS: explicit pushes used only HEAD:refs/heads/docs/rfc-sdk-client-contribution
  • PR remains draft against main, milestone null, Epic: Typed SDK client contributions — credentials, transport policy, metadata, and cache-safe extensions #1348 reference-only, and has every required
    label with exactly one lifecycle label: status:plan-eval.

Cycle-2 action

Steer the existing owner-designated Claude Fable 5 session. Read plan-eval.md, the remediated RFC,
the committed fixture, then the research/plan/worklog/drift/final-handoff artifacts. Re-evaluate
F-A1 through F-A10 individually, with special attention to scoped declaration checks, all key paths
and defaults, stream credential refresh, Desktop rejection, private-port absence, contribution
context projection, the corrected v2 GET/migration matrix, real-surface inference evidence, and
#1350 Stage 1a/1b reconciliation.

Do not number or merge the RFC, implement framework code, create/close issues, mutate milestones,
launch a rival evaluator, or start the later Qwen pass from this authoring handoff.

rickylabs and others added 2 commits August 8, 2026 20:58
All F-A1..F-A10 verified resolved at 78a7cec; fixture independently
type-checked (exit 0); lane audit adds type:test alongside type:docs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@rickylabs

Copy link
Copy Markdown
Owner Author

[PHASE: PLAN-EVAL] [VERDICT: APPROVED]

PASS, cycle 2. Same owner-designated Fable 5 evaluator session as cycle 1. Verdict of record: .llm/runs/docs-rfc-sdk-client-contribution--rfc/plan-eval.md @ 14b5c858c. Accepted RFC content SHA: 78a7cecd1d5eaafa7a65bc25a21af497567128dc (branch HEAD at verdict: 14b5c858c, atop the author's harness-hygiene commit 9f45404ac which touches run artifacts only — verified no RFC/fixture change).

All ten cycle-1 findings verified resolved mechanically, several beyond the asked bar:

  • F-A1: declaration gate scoped to named RFC-A symbols + full scan of generated files, with a non-growing ~orpc/contracts allowlist tied to Type soundness ratification: eliminate unsound and arbitrary types across the public surface and the docs #1278/[sdk-client S1] fix(sdk): preserve contract errors through safe() and isDefinedError #1350.
  • F-A2: new server-key-algebra section — default exact three-tuple preserved, partitioned five-tuple, all six bridge surfaces dispositioned, TanStack wrap cost stated, upstream-assignability fixture kept valid by the Record<never,never> default.
  • F-A3: compatibility defaults on every widened public generic.
  • F-A4: logical-call-epoch model; iterator-phase reconnect = new epoch with exactly-once re-preparation; the stream fixture asserts preparation count 2 and credential rotation across epochs — the frozen-credential path is closed.
  • F-A5: desktop MessagePort explicitly rejected (SDK_CONTRIBUTION_TRANSPORT_UNSUPPORTED, excess-property + runtime + generator failure + docs obligation).
  • F-A6: ports pinned to src/internal/client-contributions/ with doc-graph absence gates and a packed-consumer negative.
  • F-A7: contributions see only their declared-context projection + signal; the seven framework keys are reserved and rejected.
  • F-A8: GET direction corrected (preserve-with-allowMethods+Sec-Fetch-CSRF vs retire-and-replace-dedupe); inferRPCMethodFromContractRouter replacement and dedupe-effectiveness in the v2 gates; OTel package selection assigned to [sdk-client S4] refactor(sdk): centralize HTTP method and GET-cache policy #1351; lock-only family pinning stated.
  • F-A9: fixture committed in-tree against the real contract/client/query/key surfaces, 16-accept/17-reject — independently re-executed by this evaluator: deno check exit 0.
  • F-A10: v1.14.6 per-attempt fact, header-safe dedupe, input sensitivity, [sdk-client S1] fix(sdk): preserve contract errors through safe() and isDefinedError #1350 Stage 1a/1b split all adopted.

Lane/label ruling (evaluator authority): the PR now carries a compile-only source-tree type fixture. ci:skip-e2e/ci:skip-scaffold remain valid (no runtime/generator/export/lock change; the proportionate gate is the scoped type-check, executed by author and evaluator). type:test is added alongside type:docs for diff honesty. Merge-readiness note: the docs-lane skip does not itself compile the fixture — keep the fixture check as a recorded PR gate.

Non-blocking advisory: harmonize the two RFCs' target-milestone frontmatter conventions at numbering time (A says implementation 0.0.7; B says ratification 0.0.6 with a footnote).

Next

Label moved status:plan-evalstatus:augment-review (the pending root-owned Qwen 3.8 Max adversarial acceptance pass is the advisory-review stage). Handing the accepted SHA back to the root orchestrator; do not merge before the Qwen pass and owner ratification.

@rickylabs rickylabs added type:test Tests only status:augment-review Advisory augment/review pass and removed status:plan-eval Awaiting plan evaluation labels Aug 8, 2026
@rickylabs

Copy link
Copy Markdown
Owner Author

Final Comment Period — disposition: accept

The independent review sequence is complete:

  • Claude Fable 5 PLAN-EVAL cycle 2: APPROVED / PASS
  • Qwen 3.8 Max, maximum reasoning, final adversarial review: PASS_ACCEPT
  • Cross-RFC composition with RFC-B: PASS
  • All F-A1–F-A10 findings independently confirmed resolved
  • No Critical or Major findings; only board/process advisories remain

Authoritative final report: QWEN-FINAL-ADVERSARIAL-EVAL.md at 278a2dd9a

Maintainer disposition of the safe questions

  1. Start with an exact 16-contribution ceiling. A later increase requires equivalent compile-budget evidence.
  2. Keep the environment-reading bearer helper as an application example in the first slice; any future shipped helper must be a server-only export.
  3. Keep feat(sdk): in-process link-mode adapter for single-process service mounting #451 independent.
  4. Preserve the RFC's current public names for v1; semantic refinements still require compatibility evidence.
  5. Use the RFC-preferred outer logical-call wrapper for stable v1; the mandatory retry/reconnect fixtures remain authoritative.
  6. Keep [sdk-client S1] fix(sdk): preserve contract errors through safe() and isDefinedError #1350 focused on literal-safe errors and file a dependent metadata child after acceptance.
  7. Make the stable-v1 incoming request-header companion explicitly selected, not preset-global.
  8. Move the exact oRPC family to stable v1.15.0 under [sdk-client S4] refactor(sdk): centralize HTTP method and GET-cache policy #1351 before the client-seam implementation; this is lock-only and must prove a single-family lock.
    9–11. Transfer the mixed-rollout, GET/CSRF/dedupe, and OTel-topology decisions to the separate future oRPC-v2 RFC.

The maintainer numbering order will be RFC-A as 0001 and RFC-B as 0002. target-milestone will consistently mean the first implementation milestone, so this RFC remains targeted at 0.0.7.

FCP window

This comment opens the repository-required approximately seven-day FCP with disposition accept. Please raise any concrete objection by 2026-08-15 22:00 Europe/Zurich. Unless a blocking objection is substantiated, the maintainer will then assign 0001, fill accepted metadata, mark the PR ready, and merge it. Tracking issue #1348 remains open for implementation.

The final review explicitly rejects migrating production to oRPC v2 first: v2 is still beta and wire-incompatible, and its request-header plugin is incoming/server-side rather than the outbound typed contribution seam. RFC-A should land on stable v1; the v2 migration gets its own later RFC and conformance gate.

@rickylabs rickylabs added status:review and removed status:augment-review Advisory augment/review pass labels Aug 8, 2026
rickylabs added a commit that referenced this pull request Aug 8, 2026
…afts) (#1347)

* plan(seed): bootstrap fable5 remediation roadmap seed run

Run dir + supervisor identity, owner eval waivers (PLAN-EVAL/IMPL-EVAL),
lane overrides (Fable 5 high orchestrator, Opus 5 workflow contributors),
drafts-only mutation boundary.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): commit Stage-B corpus workflows before execution

Two read-only Opus-subagent research workflows (prior waves + live board;
repo/docs domain audit + external comparisons), per seed-run Tier-C rule.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): supervisor distillation of Codex pre-plan package; record Stage-B fan-out

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): land Stage-B corpus slice 1 — prior waves + live board ground truth

Seven Opus-5 research artifacts (3.8k lines): waves 1-6 evidence, exhaustive
open-board snapshot (259 issues/13 milestones), 0.0.5 orchestration history,
live conventions incl. label/milestone/RFC practice. Supervisor-reviewed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): land Stage-B corpus slice 2 — repo/docs domain audit + external bar

Eleven Opus-5 artifacts (5.2k lines): docs/MCP/CLI/web/SDK/auth/runtime/
observability/scaffold-doctrine audits with execution-verified defect
verdicts, plus eis-chat teardown, meta-framework competitive bar, oRPC
extension-model deep dive. Supervisor-reviewed (see worklog S2b note).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): Stage-C synthesis — gap taxonomy, adjudications, T1-T8 packs, train direction

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): commit Stage-D design-pack workflow before execution

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): milestone train + Wave-7 adoption proposal (supervisor drafts)

Two-milestone insertion via house rename pattern; complete per-issue move
ledger; entry/exit criteria; thin Wave-7 A/B/C measured smoke matrix.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): dedup & supersession dispositions for existing issues

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): land Stage-D design packs — 41 issue drafts, RFC-A/RFC-B, amendments

Three milestone directories (0.0.6 verification/docs/RFCs; 0.0.7 typed
seams+generation; 0.0.8 runtime truth+service slice), 929-line amendments
file, dedup table + Stage-E ledger. Supervisor-reviewed; six corpus
corrections recorded.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): Stage-E plan lock — master plan, implementation handoff, run close

12-fork owner sweep, program DAG, filing gate + first executable PR groups;
plan.md locked, context-pack finalized, session record written. No board
mutation occurred in this run.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): ratify Stage-H filing manifest

* docs(plan): record ratified roadmap filing

* plan(seed): commit PLAN-EVAL deep-dive workflow before execution (evaluator delegation record)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): record cross-family PLAN-EVAL of RFC-A/#1390 and RFC-B/#1389

Both CHANGES_REQUESTED (cycle 1); cross-RFC composition verdict, amendment
map, and v2-migration epic proposal in CROSS-RFC-REVIEW.md. Evaluator-only
writes; no board mutation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): record PLAN-EVAL cycle 2 — both RFCs APPROVED; Qwen handoff brief

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* plan(seed): record final Qwen RFC acceptance

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
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
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  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
rickylabs added a commit that referenced this pull request Aug 11, 2026
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
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
rickylabs marked this pull request as ready for review August 11, 2026 20:15
@rickylabs
rickylabs merged commit b3dc006 into main Aug 11, 2026
18 checks passed
@rickylabs
rickylabs deleted the docs/rfc-sdk-client-contribution branch August 11, 2026 20:15
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:plugins plugins/* and plugin-core packages area:sdk packages/sdk 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 priority:p1 High rfc Request for Comments - substantial/breaking design change status:ready-merge type:docs type:test Tests only

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant