interlock
What it does: An MCP server (Go, mark3labs/mcp-go) wrapping the intermute coordination backend over a Unix socket / TCP fallback. Per internal/tools/tools.go it registers 20 tools (manifest/PHILOSOPHY/AGENTS.md still say 11-12 — docs lag the code): file reservation (reserve/release/release_all, exclusive + TTL + bead-correlation metadata), dry-run conflict checks returning bead-aware collision cards, cooperative release negotiation with urgency-tiered timeouts (5m urgent / 10m normal), blocking-wait polling, requester-initiated force-release escalation with audit trail, inter-agent messaging (direct, broadcast with server-side recipient resolution + 10/min rate limit, topic discovery, stale-ack detection), contact policies (open/auto/contacts_only/block_all), and stable window-identity mapping (tmux UUID -> persistent agent ID across restarts). Enforcement is advisory-only at PreToolUse:Edit + mandatory at git pre-commit; shared-FS model with auto-pull-on-peer-commit. Includes a tier-2 semantic conflict gate (interlock-semantic-check.sh) using local intersearch/nomic-embed cosine similarity to downgrade same-file/different-region false positives, currently shadow-by-default.
Rationale: This is one of the most mature and SOTA-aligned plugins in the roster. The whole 2026 frontier on native parallel subagents with isolated context windows names coordination — race conditions on shared state, who-is-editing, conflict detection — as THE unsolved production problem, and explicitly cites interlock as ahead of most competitors on exactly this. The implementation is genuinely strong: TOCTOU eliminated via atomic ic-reserve and advisory-only-timeout (documented in docs/solutions/2026-02-16), fail-open discipline throughout (jq guard, circuit-breakered inbox fetch, fail-open semantic check), structured ToolError mapping with recoverable/retry_after hints, CSPRNG thread IDs with a monotonic fallback, and a correctness-review-driven fix to suppress release-ack spam when released==0. The cooperative (not preemptive) negotiation model with urgency tiers, deferral-with-ETA, and explicit requester-initiated escalation is exactly the blast-radius-controlled coordination the security SOTA recommends. The tier-2 semantic gate is a frontier idea most coordination tools lack — shipping it in shadow mode to accumulate real-trace data before enforcing is disciplined engineering. Verdict is keep, not modernize: the architecture is right and the one real gap (tool-count context cost) is an optimization, not a redesign.
SOTA gap: Eager tool registration is the one frontier miss. RegisterAll calls AddTools on all 20 tools unconditionally at startup, so every interlock-enabled session pays the full schema-loading tax before any coordination work — the exact anti-pattern flagged by the MCP context-bloat backlash, RAG-MCP (>50% prompt-token reduction + 3x selection accuracy from retrieval-gated tool exposure), and Anthropic’s own Tool Search Tool / defer_loading (~85% reduction). The realistic coordination hot path is ~4 tools (reserve_files, check_conflicts, my_reservations, release_all); the other 16 (window identity, contact policy, broadcast, topic discovery, stale-acks, force-release, deprecated request_release) are rarely-used and could be deferred/progressively disclosed. Secondary gap: the tier-2 semantic gate compares this agent’s edit region against the PEER’s stated reservation reason, not the peer’s actual edited region — a known limitation noted in the script header; storing an embedding of the reserved region at reserve-time (region-vs-region) would make the gate trustworthy enough to leave shadow mode. Neither gap touches the core design.
Redundancy: Clean separation, no real overlap. interlock owns write-coordination (reservations, conflict prevention, negotiation, file locking); intermux owns read-only observability (agent health, activity feed, who_is_editing, tmux monitoring). They are deliberately complementary halves of the same coordination problem and the SOTA notes cite them together as one capability area. intername (display naming) and interline (statusline bead counts) consume coordination state but do not duplicate it. The deprecated request_release tool is internal redundancy with negotiate_release and is already labeled for removal — the only cleanup item.
Actions:
- Defer-load the cold tool surface: keep ~4 hot-path tools (reserve_files, check_conflicts, my_reservations, release_all) eagerly registered and move the other 16 (window identity, contact policy, broadcast, topic discovery, stale-acks, force-release, deprecated request_release) behind progressive disclosure / defer_loading to cut per-session context cost — the RAG-MCP / Tool Search Tool pattern.
- Reconcile docs to code: plugin.json description, PHILOSOPHY.md, AGENTS.md, and the coordination-protocol SKILL.md all say 11-12 tools while tools.go registers 20 (and the RegisterAll comment itself says ‘all 20’). Update counts and tables so the tool catalog the model reads is accurate.
- Remove or hard-gate the deprecated request_release tool now that negotiate_release is the documented path, eliminating the duplicate-tool selection-confusion cost.
- Advance the tier-2 semantic gate toward enforcement: store an embedding of the reserved region at reserve-time to enable true region-vs-region comparison (not edit-vs-reason), then evaluate shadow-mode trace data to set defensible LOW/HIGH bands before flipping INTERLOCK_SEMANTIC_ENABLE on by default.