Skip to content

v2.2.0 — The 100-Concurrent-Agent Release: first-class multi-agent collaboration

Choose a tag to compare

@FatStinkyPanda FatStinkyPanda released this 12 Jun 16:02
· 31 commits to master since this release

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 start wins an atomic cross-machine claim by removing the state:available label — 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 verify re-confirms a checkout at loop start / before pushing; lost checkouts self-drop so two machines never finish the same issue.
  • work submit pushes the issue branch, opens (or crash-safely adopts) THE pull request — Closes #N — and arms auto-merge behind the required CI checks. work land finalizes 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:available seeding, and the master-gate ruleset (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.json binds 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 N proves 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-filed swarm-regression issues.
  • 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.replace calls 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.