Repository navigation
v7.200.3
Dual-host CI lane, v2 adapter hardening, and the deferred #2910 tail
What
- Dual-host CI lane landed (issue #2910, ADR-0003's deferred follow-up): the
smokejob gains a merge-group-gatedv2-host-smokestep running three legs —scripts/repro-2910-v2.mjs(Node dual-shape +setup()timing, min-of-2 within the 400 ms repro-704-class deadline),scripts/repro-2910-v2-host.mjs(a real pinned@opencode/cli@2.0.29host loaded auth-free: plugin-load line, banner,agent.updated/command.updatedregistration events,.swarm/materialization — no credentials required in CI), and the v2 guidance-parity fixture test. Weeklyhost-contract-checkgains a failure-independent v2 digest leg (scripts/check-host-contract-v2.ts) over a dual corpus — 12@opencode/plugind.ts files + the@opencode/schema/@opencode/clientpermission-bearing surfaces + three sst/opencode host sources (model-request.ts,context.ts,v1/config/migrate.ts) — pinned against an emitted 2.0.26 fixture; advisory on PRs, blocking + tracking-issue routing weekly.drift-checkgains a v2 vendored-pin freshness notice (thesrc/host/v2/types.tspin vs npm-latest, fail-open). First live run of the digest honestly reportsSTRUCTURAL_DRIFTat npm-latest 2.1.4 (Context.credential,PermissionDomain,Agent.Infoshape changes) — the detector working as designed. - v2 adapter hardening (folded issues, user-authorized single PR):
- #3351: the tool-permission bridge is assert-first —
ask()routes through the documentedpermission.assert(resolve=allow, reject=deny; input{sessionID, agent, action, resources}with the host-exact action normalization); on reply-only hosts (2.0.26 pin) anyreplyresolution now DENIES (reply is the answer-side RPC; recorded decision on the issue). No more fail-open on resolved denials. - #3352: sibling v2 registrations are atomic (a first
execute.before/agent-transform/compaction rejection no longer skips its sibling) and the agent-transform surface is owner-token keyed — one setup instance's cleanup can no longer clear another live instance's state. - #3318:
/swarmcommands register independently of agents; a leading/swarm/swarmtoken is stripped from the host's argument text; every failure arm (no prompt surface, rejected prompt, thrown dispatch, safeHook-swallowed handler errors via a new bounded read-once registry) reaches the operator through the deferred-warning buffer + stderr instead of debug-only logs;invocation.deliveryis honored on submit; a debug trace of the raw invocation makes the live contract observable. The live cause of the reported v2 failure is not claimed fixed: the hardening removes the repo-side silent failure modes and makes the live contract observable; the live triage is auth-blocked and recorded on #3318. - #3350: a failed v2 startup preflight (config-read timeout OR degraded load) is operator-visible (exactly one warning naming the live budget); the registration-stage budget is test-seamable (
_internals) and the unreachablepending.length > 0guard is removed (recorded decision: the timeout catch always warns); the constant-name collision is gone. - #2910 permission port: v2 agents now carry the v1 permission block mapped with the host's own migration semantics (write/patch→edit, task→subagent, bash→shell, verbatim otherwise; string effects →
resource:'*'; nested globs expand; rules appended after the host defaults under last-match-wins) — the deny-by-default tool surface and the memory/external-skills opt-in maps are enforced at the agent level on v2. - #2910 reload wiring:
buildV2RegistrationTables(fresh config read, init-parity inputs, no side-effecting re-init) +deferredV2RefreshRegistrationsre-derive the agent/command tables and call the domainreload()s when they change — triggered by successfulconfig doctor --fixwrites through policy-permitted in-process dispatches (the v1 tool-policy routes--fixto the human CLI path, where a host restart applies the new tables — disclosed limitation) through both the shortcut and the genericswarmroute.
- #3351: the tool-permission bridge is assert-first —
- Docs: host-support matrix in
docs/installation.md; a dual-host architecture section indocs/architecture.md; README/modes lane-status corrections; the ADR-0003 append-only delivery note; hook-inventory rows 4/5/8/11 and the Epic per-consumer row refreshed to the shipped state.
Why
ADR-0003 deferred the dual-host CI lane to "the #2910 follow-up PR … before the next minor release cut so the v2 lane is CI-proven, not smoke-proven only." Until now, a v2-only break (the #3004 decode-error class) was invisible until a manual spike run, the v2 parity transport had no committed oracle, the v2 permission/opt-in surface was unenforced at the agent level, and four audited defect classes in the adapter (fail-open permission bridge, dropped sibling registrations, silent command-path failures, invisible preflight timeouts) shipped with only debug-gated logging. The folded issues (#3318/#3350/#3351/#3352) were all verified-open on main and are the same adapter surface this lane proves.