Repository navigation
v2.2.0 — The 100-Concurrent-Agent Release: first-class multi-agent collaboration
v2.2.0 — The 100-Concurrent-Agent Release
Multi-agent collaboration is now first-class: GitHub-native, atomically safe with many agents on one device or across machines, and E2E-verified on every commit. This release also rolls up the previously untagged v2.1.0 coordination primitives (leases, claims, journal, identity-collision detection).
GitHub-native work lifecycle
- A GitHub issue is the unit of work:
collab work list / start / verify / submit / land / done / drop / tick. work startwins an atomic cross-machine claim by removing thestate:availablelabel — GitHub's one-winner primitive (the losing machine gets a 404 and leaks no local state) — then assigns, labels (in-progress,agent:<callsign>), creates the matching source-area claim, and journals the checkout.work verifyre-confirms a checkout at loop start / before pushing; lost checkouts self-drop so two machines never finish the same issue.work submitpushes the issue branch, opens (or crash-safely adopts) THE pull request —Closes #N— and arms auto-merge behind the required CI checks.work landfinalizes merged PRs (releases everything, deletes the remote branch) and heals behind/unarmed ones. At scale, agents never push the default branch directly.collab github-setup [--apply]provisions any repo in one command: coordination labels,state:availableseeding, and themaster-gateruleset (PR + required CI contexts, strict up-to-date, no force-push, admin break-glass). It refuses to apply when the pinned contexts don't match real check runs — a typo can never hard-block all merging.- Auto-impact GitHub Actions keep ONE self-healing comment on every in-progress issue and every PR: importers, transitive dependents, affected tests, and a conflict radar against other in-progress issues.
Many agents on one device: seats
.mcp/seat.jsonbinds a workdir to a call-sign (create-once O_EXCL); identity resolves env > seat > hostname, so N sessions on one laptop can never silently merge into one hostname identity.collab seat new <callsign>provisions a git-worktree seat in one command;collab join <callsign>= seat + heartbeat + engine probe + team status.- Cross-workdir use of one identity is refused at the lease/claim/work layer (structural enforcement, not etiquette).
Atomic store, fenced leases
- Every store write is an O_EXCL create, an atomic temp+rename replace, or a rename-to-unique-tombstone take: readers never see partial JSON, exactly one contender wins any CAS, removals verify what they removed and restore on mismatch.
- Leases carry monotonic fence numbers (sidecar high-water mark survives release, break, and crash). Renew is a take-verify-recreate CAS that can never resurrect an expired lease;
lease valid --fence Nproves the incarnation before irreversible acts; corrupt leases recover instead of deadlocking. - Per-writer journal segments (
<identity>.<pid>.ndjson, one O_APPEND syscall per event) with merged tails; janitor GC (lease-elected) reaps stale presence, orphaned claims, abandoned checkouts, and strays; maildir mailboxes with claim-by-rename exactly-once consumption — transiently unreadable mail is restored, never destroyed.
E2E testing on every commit
collab selftest: 51 checks in a throwaway store, including a real multi-process race smoke.collab swarmtest: N real OS processes prove lease mutual exclusion (including fencing under forced expiry), journal exactly-once, claim/checkout single-winner, and collision detection — runs at 6 processes in the pre-push hook, 16 in CI on ubuntu AND windows, and 100 nightly (hammer mode) with auto-filedswarm-regressionissues.- Rewritten hooks: pre-commit is a pure E2E gate (never mutates the tree); pre-push runs selftest + the full suite + a swarm + the security audit.
Windows platform hardening (each found by the new gates)
- Two concurrent
os.replacecalls to one destination can both report success — deterministic rename destinations are not a CAS; every tombstone/claim name embeds pid+random. - NTFS delete-pending makes O_EXCL creates raise
PermissionError— treated as busy, never broken. - Readers retry transient sharing violations; "unparseable + young" means mid-write, not corrupt.
Full details in CHANGELOG.md and the collab story in the README.