Repository navigation
Description
What this tracks
Coordination issue for bringing the acq msb backend to parity with sbx,
so a kit can declare backends: [sbx, msb]. This replaces the branch-only
exploration doc (docs/explorations/acq-backend-parity.md) that the child issues
used to reference; the decision rationale for the biggest piece lives in
ADR-0014.
Scope note: this lists remaining work. Gaps already resolved in earlier PRs
(the sbx port-publish carry #221 /
#223, the msb agent install/launch and
github-via-REST secret binding #230 which closed
#203, and the removal of opencode-web.sh in
favor of the openchamber kit) are done and not re-listed.
Remaining work
- acq: implement neutral port-publish + background kit vocabulary (ADR-0013) and msb consumer #224 — Neutral port-publish + background vocabulary + msb consumer (gap A).
The largest blocker tobackends: [sbx, msb]. Design accepted in ADR-0014; sbx
half already landed. Implemented onfeat/msb-parity: neutral
publishedPorts+backgroundread neutral-first with a deprecated
backend_extras.sbxfallback; msb consumer maps entries to-p HOST:GUEST
and detaches background startup commands.PATTERNS_KIT_REFhas now been
bumped to the released neutral-schema commit (see cross-repo below), so the
fields light up end-to-end. - acq(msb): drop unreachable SUPPORTS_SNAPSHOTS flag to 0; wire acq snapshot as follow-up #225 — msb
SUPPORTS_SNAPSHOTSflag reconciled (gap B).msb --tree
(0.6.7) showsmsb snapshotdoes exist as a full CLI verb — so the earlier
"no CLI verb" reasoning was wrong. Wiringacq snapshotis beyond sbx
parity, so it stays deferred; implemented: flag set to0(matches what
acqsurfaces, not what msb can do) with an honest comment + test assertion. - acq(msb): bind generic custom-endpoint secrets at provision (not just usai) #226 — Generic custom-endpoint secret binding on msb (gap C).
Implemented: the msb binding is no longer a fixed usai+github table — any
stored service with a resolved host/env binds via--secret ENV@HOST. Added a
non-secret endpoint sidecar (host+env only,0600, value never on argv/disk)
so the store persists the pair; multi-hostENV@HOST[,HOST...]supported. - docs(BACKEND_GUIDE): refresh version banner + msb differences/limitations table (parity gaps B/C/D/I) #227 — BACKEND_GUIDE refresh follow-through (gap J).
Banner + tables refreshed; the differences table / capability flags now read
shipped (not "scheduled") for A–C, and reflect thePATTERNS_KIT_REFbump
and the live-verified post-hoc port publish. Done onfeat/msb-parity. - test-acq: 'msb auto-detect falls back to msb' fails locally when a real sbx is on PATH (PATH-robustness) #217 — test-acq PATH robustness (gap H). Implemented: the
backend-detection subshells constrainPATH(stub dir + a coreutils dir) so a
real hostsbxon PATH can't leak into_auto_detect_backend; both detect
cases deterministic. (Reconciled with the host-agnostic variant that later
landed onmain.) - Post-hoc port publish on msb via ssh serve + ssh -L (gap K) #238 — Post-hoc port publish on msb via
ssh serve(gap K). Expose a
port on a running sandbox without re-create, viamsb ssh serve+ OpenSSH
-L, wired behindacq ports --publish. Closes the last port-capability gap
vs. sbx; flipsSUPPORTS_PORT_FORWARD=1. Design in ADR-0015. Implemented and
live-verified (see Wave 4). Closes onfeat/msb-paritymerge.
Wave 1 landed (2026-07-29). #224, #225, #226, #217 implemented,
code-reviewed, integrated ontofeat/msb-parity(omnibus PR
#233).Wave 2 landed (2026-07-29). #227 (shipped-state doc pass) and #238 (gap K,
post-hoc ports viassh serve) integrated.Wave 3 landed (2026-07-29). Adapter hardening: oversized-function split
(+ aset -eregression fix caught in review), the dotted-service-name
fail-closed fix, and the #239 evaluation (design note + guards). patterns
gap-G validator hardening verified already-resolved on patternsmain.Wave 4 landed (2026-08-01). Second review round on PR #233 addressed
(background-flag / sbx-self-backgrounding accuracy, post-hoc-publish liveness
so a dead tunnel fails closed, sshIdentitiesOnly/-F none,chown -R -P,
ADR-0015 accepted). Mergedmaintwice (adopting the merged
#241 / #248 / #249).PATTERNS_KIT_REF
bumped to the released neutral-schema commit
(6230faa53ae88e125f04521ab8eee932eeaacdbc) now that the patterns schema and
openchamber kit are on patternsmain(below), satisfying ADR-0014's cross-repo
gate. Fixed a LIST-modeset -ehard-fail inacq ports. Added
scripts/verify-ports-live(live harness for the ADR-0015 path). De-referenced
ephemeral tracker refs from code/docs and generalized AGENTS.md from SBX-only to
the sbx/msb sandboxing backend. Live on a macOS + msb 0.6.7 KVM host:
scripts/verify-backends14/0 (1 skip: playbook fetch w/o gh token) and
scripts/verify-ports-live15/0 (happy-path publish + host-reaches-guest,
LIST, fail-closed negative, teardown). Offlinescripts/test-acq500/0,
scripts/test-migrate-or-halt57/0.Remaining: merge PR #233 (re-review
requested); after which #224/#227/#238 close with it.
Cross-repo (patterns)
-
patterns:
publishedPorts+backgroundschema/validator (gap A dep).
Merged — feat(kits): add neutral publishedPorts + background to hybrid/v1 schema agentic-coding-patterns#276 added the neutral fields to
kit-hybrid-v1.schema.jsonand enforced them invalidate-kits.pywith tests.
On patternsmain. quickstart'sPATTERNS_KIT_REFis bumped to amain
commit that includes it, lighting up the acq: implement neutral port-publish + background kit vocabulary (ADR-0013) and msb consumer #224 consumer. -
patterns openchamber msb/ppp parity (feat(openchamber): adopt neutral publishedPorts + background; sbx+msb parity agentic-coding-patterns#283).
Merged. The openchamber kit adopts the neutralpublishedPorts/background
vocabulary and declaresbackends: [sbx, msb]; the no-sudo install PATH fix and
the honest transient-vs-definitive fast-fail landed in the same PR. This is the
home for the retiredopencode-web.shsuccessor — with the kit on patterns
mainand the quickstart pin bumped, the browser-OpenCode UI is covered on msb,
not just sbx. -
patterns — harden
validate-kits.py(gap G). Reject malformed
files[].mode/commands[].user/ unsafefiles[].pathat the shared kit
validator. Verified RESOLVED on patternsmain(2026-07-29): schema
patterns^0[0-7]{3}$(mode),^[0-9]+$(user),^/[A-Za-z0-9._/-]+$(path)
are enforced per-kit, a code-level_SAFE_PATH_REadds defense-in-depth, and
test_validate_kits_injection.pyregression-tests rejectmode: "0644; id"
anduser: "0; id"(live-confirmed reject vs. accept).
Accepted (no action; recorded for context)
- Gap E — no state-preserving in-place kit heal on msb. msb re-applies kits
idempotently (never destroys state); revisit if microsandbox ships a
state-preserving in-place kit-add primitive. Recorded in ADR-0011. - Gap I —
verify-backendsmsb row can't run in CI. Needs host/dev/kvm
(no nested sandboxes). Run manually on a KVM host after each release / after ≥3
behavior-affecting fixes (AGENTS.md §8.3); documented in BACKEND_GUIDE.
Adapter hardening (follow-up, not a parity gap)
- msb adapter: use --script for kit-command injection instead of copy+sh -c #239 — Evaluated msb
--scriptfor kit-command injection. Concluded
NOT a clean win (kit argv already travels as separate positional params, not
an interpolatedsh -c; and kit commands also run mid-life via
acq_backend_apply_kit/ensure_kits_appliedwhere a create-time--script
can't apply). Landed as a load-bearing design note + regression guards
(comment-only) rather than a refactor. - Split oversized msb functions (§13.3 size limit). Done —
_acq_msb_exec_command,acq_backend_secret_set,acq_backend_secret_rm
split into ≤50-line helpers (behavior-preserving; code review also caught &
fixed aset -eshift-abort regression).acq_backend_provisionremains
over-limit and is a separate future extraction (create-flag assembly /
mount translation / secret-binding seams). -
acq_secret_meta_listdotted-name mis-scope. Fixed —_acq_secret_key
now fails closed on dotted service/sandbox names (hosts-with-dots still
allowed) andmeta_listanchors on the sandbox prefix; +regression tests. - Flaky
msb portstests (ephemeral-port selection). Resolved — the
gap-K port tests use a deterministic test seam (ACQ_MSB_FORCE_SERVE_PORT) and
a persisted per-process counter (not$$), with a distinct-port assertion, so
the stubbed serve+ssh background processes no longer race.scripts/test-acq
is stable at 500/0 across repeated runs.
Fast-follow (tracked separately, out of this epic's parity scope)
- acq(msb):
acq secret lsshows no rows on a Linux secret-tool keychain host #252 —acq secret lsshows no rows on a
Linuxsecret-toolkeychain host (enumerates the file dir only). - acq run:
acq run --name X -- CMD(no agent positional) silently no-ops instead of failing closed #253 —acq run --name X -- CMDwith no
agent positional silently no-ops instead of failing closed. - docs(CONTRIBUTING): update stale
sbx-kits/path toacq-kits/#255 —CONTRIBUTING.mdstill references
the legacysbx-kits/path (should beacq-kits/).
Sequencing
ADR-0014 (accepted) ──> #224 (neutral fields + msb consumer) ──> patterns openchamber Increment B (merged)
└──> ADR-0015 / #238 (post-hoc publish via ssh serve, gap K)
#225 (snapshot flag reconcile) ── independent, low-risk (beyond-parity; no verb build)
#226 (msb generic secrets) ── independent
#217 (test PATH robustness) ── independent, low-risk
#227 (guide follow-through) ── trails A–C
#239 (--script eval) ── independent adapter hardening
patterns validator (gap G) ── parallel, shared security choke point
All parity work is implemented and integrated on feat/msb-parity; the epic
closes when PR #233 merges.
AI-assisted (OpenCode); requires human review.
Activity
mogul commentedon Jul 30, 2026
Wave 2 landed + live verification (2026-07-29).
feat/msb-parityfast-forwarded to include gap K (#238, post-hocacq ports --publishviamsb ssh serve+ssh -L,SUPPORTS_PORT_FORWARD=1) and gap J (#227, BACKEND_GUIDE shipped-state pass, reconciled to describe post-hoc as implemented-pending-live-verification).scripts/verify-backendswas run on a KVM host against the integrated wave: 15 passed / 0 failed / 0 warnings, covering both sbx and msb — usai kit + USAi 401-on-wire, git-ssh-sign, /home/agent ownership, playbook kit (AGENTS.md fetched via REST), and agent install with RAM headroom on both backends. This clears the live-verification caveat that was owed for gaps A/C (#224/#226) and the msb provisioning path generally.Still pending live verification: gap K's actual SSH tunnel (
msb ssh serve+ssh -Lhost→guest forward) is not yet averify-backendsrow, so it remains stub-tested only — to be confirmed on a KVM host per ADR-0011.AI-assisted (OpenCode).
feat(acq)!: sbx↔msb backend parity, incl. live openchamber-on-msb (om…
mogul commentedon Aug 11, 2026
Follow-on tracked in #303 — host ssh-agent / unix-socket forwarding into the guest to get
git-ssh-signworking on themsbbackend (currently an sbx↔msb parity gap; sbx forwards the host agent by default, msb has no equivalent).Blocked on a tagged
msbrelease that contains the upstream vsock work: superradcompany/microsandbox#1290 was closed in favor of superradcompany/microsandbox#663, and the capability landed onmainvia superradcompany/microsandbox#1297 (--vsock HOST_PATH:PORT[/stream|/dgram]), but is not yet in a release (latest is v0.6.8). #303 has the full upstream watch-list and our follow-onacq/kit checklist.feat(msb): forward the host ssh-agent into the guest via --vsock (#316)