OpenCode-Mesh v1.1.0
Released September 21, 2026
What's Changed
Added
- CLI grew a
gcverb with--jsonoutput, per-verb--helpon every verb, multiword send text,--jsonflags on peers and send, snapshot restore on uninstall, and a purge fallback that reports its method (gate: E2E suite spawning the real binary pluscodecov/patchgreen) - Keychain reads gained a non-blocking path with Linux
secret-toolfallback sharing the existing TTL cache, wired into the enumerate probe (gate: fallback tests failing before, green after) - Enumerate probes cap response bodies at 1MB, hashing over-cap bodies empty while small bodies fingerprint byte-identical (gate: over-cap and completion tests failing before, green after)
- Install docs lead with the platform path (plugin entry plus skill by name) with the custom installer kept as a documented alternate (gate: skills CLI discovery verified live against this repo)
Fixed
- Fix fresh installs writing invalid JSON on empty plugin configs by taking a no-leading-comma branch on blank object bodies (gate: matrix test asserting
JSON.parseover three empty shapes) - Fix corrupt registry wipes by refusing writes on present-but-unparseable stores with
STORAGE_CORRUPT, leaving entries intact (gate: garbage-seed test asserting survival plus the throw) - Fix GC deleting concurrent joins by snapshotting candidates read-only and re-validating inside the single writer (gate: mid-sweep join repro asserting survival)
- Fix per-sweep trashing of live state by gating deletion behind legacy-directory detection, leaving live
outboxandtokenpaths alone (gate: live-plus-legacy seed test) - Fix transient direct failures dropping by routing 429, 5xx, and network faults to the claim leg; 404 misses keep
PEER_NOT_FOUNDwithdidYouMean, 401 keepsUNAUTHORIZED, and direct 429 now queues instead of surfacing (gate: two-leg test with typo target plus stubbed 500 and 429) - Fix broadcast dropping its tail by removing the mid-fanout 413 rethrow and reporting every peer in the failed list (gate: three-peer fan-out with middle failure)
- Fix sandboxed roots sharing the live lock by threading an optional root through
withRegistryLockfrom every writer (gate: two-root test asserting per-root lock files) - Fix forged direct senders by re-attesting the sender against the live registry on the direct leg, marking unknown senders quarantined (gate: unknown-agent send asserting the marker)
- Fix status-only sessions reading as attached by conferring attached from the
psoracle alone (gate: ps-plus-status feed asserting onlypsids attach) - Fix empty status views clearing markers by treating null and empty maps as no-evidence past grace (gate: marker held across an empty view)
- Fix permission faults misclassified as contention by narrowing
isLockContentionand the lock loop toEEXISTonly, soEACCESthrows loud instead of degrading register tobusy: true(gate: injectedEACCESasserting the loud throw) - Fix delivered rows re-claimable in the take window by adding the
delivered_at IS NULLexclusion as defense-in-depth (gate: deliver-then-claim asserting zero rows) - Fix leading lookalike markers passing quarantine by tagging at any position when enabled (gate: index-zero feed asserting the tag)
- Fix peers display mutating the registry by removing the persist from the read path, output byte-identical (gate: dead-id list asserting byte-identical registry)
- Fix full-disk misses on the Node driver by also mapping numeric
errcode13 toSTORAGE_FULL, proven against real full disks on both drivers with no permission shape colliding (gate: exact Node error-shape replay) - Fix unknown commands exiting 1 by printing usage and exiting 2 under the usage contract (gate: E2E spawn asserting code plus stderr)
- Replace the dependency-review deny list with the allow list for
MIT, Apache-2.0, ISC, BSD-3-Clause, MPL-2.0(gate: CI green)
Removed
- Drop the broadcast mutant probe and registry retention probe: both read repo source and asserted on text, banned under the vitest rules, with behavior already owned by gate and prune tests (gate: full suite green minus two plus a repo-wide source-read sweep)
📖 41 Commits since v1.0.1
| Commit | Description | Author |
|---|---|---|
6b6e893 |
chore: cut 1.1.0 release prep | Division 7 |
202baae |
docs: correct 22 inaccuracies since 1.0.1 | Division 7 |
bfcddcb |
docs: changelog entries for all changes since 1.0.1 | Division 7 |
06c62bd |
docs: platform install primary, custom installer alternate | Division 7 |
c1617c2 |
docs: platform install primary, custom installer alternate | Division 7 |
1b327ef |
test: drop redundant keychain fork-count assert | Division 7 |
2aaa0c8 |
test: drop source-scraping probes, behavior tests own the pins | Division 7 |
cbc3d94 |
fix: unknown command exits 2 with usage | Division 7 |
a2f6928 |
fix: map node driver errcode 13 to STORAGE_FULL | Division 7 |
42e3e1e |
fix: contention helper reads EEXIST only, EACCES throws loud | Division 7 |
095f977 |
test: cover keychain async success and bare-variant legs | Division 7 |
9af24a8 |
fix: async keychain read with secret-tool fallback | Division 7 |
959f294 |
test: cover enumerate stream completion and small-body legs | Division 7 |
0592705 |
fix: bound enumerate response body to 1MB | Division 7 |
09faf23 |
test: cover purge tiers and empty snapshot lookup | Division 7 |
fa000bf |
test: cover snapshot lookup paths | Division 7 |
849cc7d |
test: cover restore without snapshots | Division 7 |
1492c51 |
feat(cli): snapshot restore plus purge fallback | Division 7 |
fa5f7be |
chore: stamp build version | Division 7 |
3d2cc7b |
feat(cli): flags, multiword send, per-verb help | Division 7 |
6f01446 |
docs: update docs to link agent skill | Division 7 |
463e8a7 |
feat(cli): add gc verb with json output | Division 7 |
39dba56 |
fix(peers): display never mutates the registry | Division 7 |
3a9bdd9 |
ci: replace deprecated deny-licenses with allow-licenses | Division 7 |
13b842b |
fix(quarantine): tag lookalikes at any position | Division 7 |
088364c |
fix(outbox): exclude delivered rows in claim take | Division 7 |
32f16b4 |
fix(lock): permission denial fails fast, not contention | Division 7 |
8f5cf51 |
fix(attach): empty views keep markers for lack of evidence | Division 7 |
3b58fc8 |
fix(attach): attach from ps only, never status | Division 7 |
8bdef0e |
docs: restructure install instructions | Division 7 |
8d86206 |
fix(send): attest direct senders, quarantine the rest | Division 7 |
74740f0 |
fix(lock): scope registry locks per mesh root | Division 7 |
9cc9a23 |
docs: edit opencode v2 support message | Division 7 |
b59ea5c |
fix(send): report full failed tail on broadcast | Division 7 |
7713d51 |
fix(send): queue transient direct failures, misses stay loud | Division 7 |
4878c4f |
fix(gc): trash only legacy directories, keep files | Division 7 |
b23b4c0 |
test(matrix): retain rationale-only inline comments | Division 7 |
090e30d |
fix(gc): prune on live data so concurrent joins survive | Division 7 |
55257bd |
docs: note v1 compatibility window plus stamp build version | Division 7 |
7fcbae9 |
fix(registry): refuse writes on corrupt store with STORAGE_CORRUPT | Division 7 |
8e985ff |
fix(install): write valid JSON for empty plugin config | Division 7 |