FerryCat
FerryCat is a local MCP server for deterministic cross-host AI agent task handoff, review, and verification through a shared SQLite WAL mesh.
Dispatch contracts to another local agent with file pointers, SHA-256 baselines, TTLs, and optional JSON Schema validation.
Atomically claim pending tasks, verify on-disk file fingerprints, and detect stale/unsafe workspaces before review.
Fulfill claimed contracts with summaries, structured outputs, proposed fixes, and artifacts while guarding against TOCTOU changes and schema failures.
Inspect mesh state and contract outputs read-only, including expiry status, retries, errors, and salvaged results.
Check pointer-file health before fulfilling via read-only verification.
Release, extend, or fail claimed contracts to manage ownership, timeouts, and unrecoverable errors.
Enforce workspace path containment and block sensitive files during dispatch/worker flows.
Supports Google Antigravity as a target desktop AI agent host, enabling cross-host handoff and code-review contracts to be dispatched to and fulfilled by Antigravity agents.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@FerryCat dispatch a review of src/api.ts to WorkBuddy"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
FerryCat: Contract-Driven Cross-Host AI Agent Handoff Bus
FerryCat (
ferrycat) is a lightweight, deterministic cross-host AI agent handoff, code review, and verification harness built on the Model Context Protocol (MCP) and Node.js built-innode:sqlite(WAL mode).
Purpose-built to safely bridge isolated desktop IDE agent hosts (such as Google Antigravity, WorkBuddy, Claude Code, and Cursor) across separate OS processesβenabling Actor-Critic evaluation loops, static analysis gates, and SWE-bench-style patch verification without context drift or blind reviews on stale files.
π Deep Dive: Why I Started Building FerryCat: When Two AI Coding Hosts Live on the Same Desktop
Quick Glance (See It in 60s)
No IDE setup or config file edits required. Watch the entire deterministic loop execute inside an isolated sandbox in ~2 seconds:
npx ferrycat demoβ‘ FerryCat Zero-Config Sandbox Demo β‘
β [1/4] Contract Dispatched Locked: src/calc.ts (sha256: ce3ba9a5...bc5d)
β [2/4] Contract Claimed Lease: 7424261d-9a3f-4a86-a7ff-de278c273e96
β [3/4] Execution & Check Heartbeat 1 renewal | CHANGES_REQUESTED (loose equality caught)
β [4/4] Contract Completed TOCTOU: 0 dirty files | Status: COMPLETED (elapsed: 2.1s)
π End-to-end multi-agent handoff verified successfully!π‘ Real benchmark: spins up an isolated child-process sandbox, triggers 1 real lease renewal, and runs a static analysis & verification gate that catches loose equality at
src/calc.ts:6. Options (--keep/--json/--no-color) detailed in Quickstart Β§0.
Related MCP server: AgentMesh MCP
Core Pain Points & Engineering Solutions
While the official MCP Tasks specification (2025-11 / 2026-07) addresses long-running operations within a single Client β Server connection, it does not solve cross-host collaboration on a developer workstation:
stdioProcess Isolation: Desktop IDEs spawn local MCP servers as independent child processes with isolated memory spaces and distinct Node.js runtimes.Silent Blind Reviews on Stale Code (
Stale Context): When handing off a task from Host A to Host B, unushed IDE buffers, branch switches, or mid-review edits cause the receiving agent to audit outdated code and produce plausible but invalid conclusions.Context Window Bloat: Pasting hundreds of lines of source code across chat windows duplicates token consumption on both ends.
Unstructured Handoff Outputs: Free-form prose responses lack deterministic schema enforcement, making downstream consumption unreliable and prone to infinite retry loops.
FerryCat resolves these failure modes through a human-scheduled, contract-driven SQLite WAL bus:
[Developer] [Host A: Antigravity] [~/.ferrycat/mesh.db] [Host B: WorkBuddy]
| | | |
|-- 1. "Dispatch review" --->| | |
| |-- dispatch_contract() -------->| Write status = SUBMITTED |
| | (Full SHA-256 + Line Bounds) | Store size / sha256 snapshot |
| | | |
|-- 2. Switch IDE: "Poll" ---|--------------------------------|------------------------------>|
| | |<-- poll_next_task() ----------|
| | | (Atomic claim changes===1 |
| | | + Verify disk SHA-256) |
| | | |-- Read local files
| | |<-- fulfill_contract() --------|-- Re-verify SHA-256
| | | (Validate Ajv JSON Schema | & submit JSON
| | | -> status = COMPLETED) |
| | | |
|-- 3. Switch IDE: "Inspect" | | |
| |-- inspect_mesh_state() ------->| Read-only query of COMPLETED |
|<-- Present structured res -| | |Key Architectural Pillars
1. Deterministic 7-State Machine
Every state transition is bound to an explicit SQL transaction with optimistic concurrency control (changes === 1), eliminating phantom or dangling states:
dispatch_contract()
β
βΌ
βββββββββββββ
β SUBMITTED β (Queue TTL: default 1800s)
βββββββ¬ββββββ
β
poll_next_task()
ββββββββββββββββββΌβββββββββββββββββ
β (Queue TTL) β (Hash Match) β (Missing / Size Diff / SHA-256 Mismatch)
βΌ βΌ βΌ
βββββββββββββ βββββββββββββ βββββββββββββββββ
β TIMED_OUT β β CLAIMED β β POINTER_STALE β (Terminal: Rejects blind review)
βββββββββββββ βββββββ¬ββββββ βββββββββββββββββ
β² β (Exec TTL: default 300s)
β fulfill_contract()
β ββββββββββββββββββΌβββββββββββββββββ¬βββββββββββββββββ
ββββ€ (Exec TTL) β (Schema Valid) β (Retries > 2) β (Mid-Review File Edit)
β βΌ βΌ βΌ
β βββββββββββββ βββββββββββββββββββββ βββββββββββββββββ
ββββββββββββ COMPLETED β β VALIDATION_FAILED β β POINTER_STALE β
βββββββββββββ βββββββββββββββββββββ βββββββββββββββββNote on
POINTER_STALEvs.SELF_CONTAINEDPatch Mode (FC-202):POINTER_STALEis terminal whenever on-disk pointer files mismatch the dispatched SHA-256 baseline, except when a read-only contract (code_review/architecture_audit) attaches a verified unifiedgit_patch(--patch-file) that satisfies all three gates: every declared file block carries at least one@@hunk with real+/-content (EMPTY_PATCH_HUNKS/EMPTY_PATCH_CONTENTotherwise), and the touched paths cover every pointer file (PATCH_DOES_NOT_COVER_POINTERSotherwise). In thatSELF_CONTAINEDmode,poll_next_taskreturnspatch_mode: "SELF_CONTAINED"with an explicitworkspace_warninginstructing the reviewer to inspectgit_patchrather than stale on-disk files.
Holder-side lifecycle controls on a CLAIMED contract (all require agent_id === target_agent):
Call | Transition | Guard rails |
|
| Resets |
|
| Must be called inside the active window; max 5 renewals per holder; refused once |
|
| Requires a |
2. Full-File SHA-256 Fingerprinting, Pre-Flight Verify & TOCTOU Soft-Failure Buffering (ADR-0004)
Dispatch Snapshot:
dispatch_contractreads target files on disk, recording bytesize, full-filesha256(64 hex chars),first_line, andlast_line. If a file was modified within the last 3 seconds, awarningis emitted to alert the requester of potential unsaved IDE buffers.Claim Verification:
poll_next_taskverifiesExistence -> Byte Size -> Full-File SHA-256(never rejecting onmtime_msalone to tolerate no-op IDE saves). On mismatch, it waits150msasynchronously (non-blocking, FC-203) and retries once to rule out transient IDE flushes before marking the contractPOINTER_STALEβ unless the contract is a read-only review/audit carrying a verified unifiedgit_patchcovering all pointer files (SELF_CONTAINEDpatch mode, FC-202), in which case it claims with an explicitworkspace_warningand records__verified_on_disk__: "NO"and__unverified_pointers__inverified_sha256.Pre-Flight Verify (
verify_contract): A strictly read-only check allowing workers or scripts to audit pointer health (valid: truevsvalid: falsewith dirty files list) before submitting.TOCTOU Soft-Failure Buffering:
fulfill_contractchecks on-disk pointer fingerprints. If dirty pointers are detected:Strike 1 returns
RETRY_NEEDED, leaves the contractCLAIMED, renews the execution window, and lists dirty files with recovery instructions (git stash/git checkout -- <file>).Strike 2 transitions to terminal
POINTER_STALEand saves the full submitted review payload intosalvaged_result_jsonso review effort is never lost.
TOCTOU Race Narrowing: While no file-based system can eliminate the microsecond race between reading disk bytes and committing a database row, FerryCat's dual-verification (at
polland atfulfill) drastically narrows the TOCTOU window from minutes of blind review down to the sub-millisecond atomic SQL transition boundary.
3. Bounded Schema Validation (RETRY_NEEDED $\le 2$)
Outputs are validated against the contract's JSON Schema via cached Ajv validators, with errors flattened into concise single-line paths (e.g.,
["/passed: must be boolean"]).Up to 2 validation failures return
RETRY_NEEDEDwhile keeping the contractCLAIMEDfor immediate self-correction (each rejection also renews the execution window); a 3rd failure transitions the contract to terminalVALIDATION_FAILED.
4. Dual-Stage TTL & Read-Before-Write Sweeping
Separates
queue_ttl_sec(default 1800s forSUBMITTED) fromexec_ttl_sec(measured fromclaimed_at), preventing tasks claimed late in the queue window from timing out prematurely during execution.exec_ttl_secdefaults are tiered bytask_type:code_review/architecture_auditβ 1800s (deep reasoning or human-in-the-loop),implementation/test_generationβ 300s. An explicitexec_ttl_secalways wins.poll_next_taskexecutes a lock-freeSELECT COUNT(*)probe before attempting anyUPDATEon expired rows;inspect_mesh_stateis strictly read-only.
5. Defense-in-Depth Path Security
Enforces path containment within
workspace_rootand blocks sensitive file patterns (.env*,*.pem,*.key,id_rsa*,*credentials*,*secret*,.npmrc,.git/config) on bothdispatchandworkerverification paths.Path Resolution:
workspace_rootis strongly recommended to be passed as an absolute path. If a relative path is provided, it is deterministically resolved againstprocess.cwd()viapath.resolve.
6. Threat Model & Security Assumptions (Local Workstation IPC)
Assumed Trust Environment: FerryCat is intentionally designed as a Trusted Local Workstation Bus bridging isolated IDE hosts operating under the same OS user account. Callers and workers share the local file system (
workspace_root) and SQLite database (~/.ferrycat/mesh.db).Defense Scope: Path containment (
assertSafePointerPath) and sensitive file pattern filters prevent unintentional workspace escapes, symlink traversals, or accidental leakage of credentials/secret files during handoffs.Daemon Execution Surface: In daemon mode (
ferrycat-cli daemon), handler scripts are invoked directly viaexecFile. Write permissions toferrycat.config.jsonor handler script paths are equivalent to host execution privileges (ADR-0005 Β§2.2). Keep configurations local and version-controlled.Out of Scope (Non-Goals): FerryCat does not provide adversarial sandboxing, multi-tenant isolation, or network authorization against malicious local processes or adversarial agents spoofing
AGENT_NAME.
Applicability Boundaries (When NOT to Use FerryCat)
Disjoint File Systems: FerryCat offloads context by file reference; both hosts must share access to the same local
workspace_root.Trivial Single-Turn Queries: Each cross-host handoff involves 3 explicit human window switches (~15β25s overhead).
Multi-Step Dynamic DAG Pipelines: FerryCat's background daemon (
ferrycat-cli daemon, ADR-0005) manages single-step contract dispatch and supervised worker lifecycles; for complex multi-step branching DAG orchestrations, use dedicated DAG workflow engines such as PatchCat.
Controlled Daemon & Declarative Handlers (ADR-0005)
FerryCat provides a controlled daemon mode governed by SQLite microsecond CAS leases on daemon_locks and declarative scripts defined in ferrycat.config.json (ideal for binding static analysis gates like tsc / eslint / AST checks or automated test suites like Jest / Vitest / Pytest as deterministic verification workers):
# Run a single dispatch cycle with declared handlers
ferrycat-cli daemon --config ./ferrycat.config.json --once
# Start continuous daemon loop
ferrycat-cli daemon --config ./ferrycat.config.json
# Inspect lease ownership + write-ahead journal health (read-only)
ferrycat-cli daemon --statusdaemon --status reports journal_degraded / last_journal_error / journal_path / journal_entries alongside lease ownership, so a silently unwritable write-ahead journal (which would disarm crash recovery) is visible instead of failing mute.
Example ferrycat.config.json:
{
"version": 1,
"daemon": {
"poll_interval_ms": 1000,
"lease_ttl_sec": 30,
"heartbeat_interval_ms": 10000,
"notify": true
},
"agents": {
"workbuddy": {
"handlers": {
"code_review": {
"exec_file": "./scripts/review-handler.js",
"pass_env": ["CUSTOM_ANALYZER_PATH"]
}
}
}
}
}Quickstart
0. See what it actually does first (ferrycat demo)
Before configuring any MCP server, watch the whole loop in ~3 seconds:
npx ferrycat demo(or npx -p ferrycat ferrycat-cli demo)
It spins up a fully isolated sandbox under the OS temp dir (dedicated SQLite database,
sample source file, sample handler), runs dispatch β claim β supervised execution β TOCTOU re-verification β COMPLETED, then deletes the sandbox.
Your real workspace and ~/.ferrycat/mesh.db are never read or written.
β‘ FerryCat Zero-Config Sandbox Demo β‘
Sandbox: /tmp/ferrycat-demo-c5iK6V
β [1/4] Contract Dispatched
Locked src/calc.ts (sha256: ce3ba9a5...bc5d)
β [2/4] Contract Claimed
Lease 7424261d-9a3f-4a86-a7ff-de278c273e96
β [3/4] Execution & Schema Check
Heartbeat 1 lease renewal(s)
β [4/4] Contract Completed
TOCTOU fingerprints matched (0 dirty files)
π End-to-end multi-agent handoff verified successfully!Option | Effect |
| Emit a structured result for CI / upstream assertions |
| Keep the sandbox and print its path for manual |
| Disable ANSI colors (auto-off when not a TTY or |
1. Recommended: Zero-Install MCP Mounting (via npx)
No local clone or manual compilation required. Run npx ferrycat init --yes to auto-detect installed hosts (Antigravity, WorkBuddy, Cursor, VS Code, Windsurf, Claude Desktop, Claude Code) and safely merge the ferrycat server entry (with backup and JSONC protection), or mount manually into your IDE's MCP configuration using npx -y ferrycat:
Antigravity Configuration
Edit %USERPROFILE%\.gemini\antigravity\mcp_config.json (or ~/.gemini/antigravity/mcp_config.json on macOS/Linux):
{
"mcpServers": {
"ferrycat": {
"command": "npx",
"args": ["-y", "ferrycat"],
"env": {
"AGENT_NAME": "antigravity"
}
}
}
}WorkBuddy / Claude Code / Cursor / Codex Configuration
Configure the target host's MCP settings with its respective AGENT_NAME:
{
"mcpServers": {
"ferrycat": {
"command": "npx",
"args": ["-y", "ferrycat"],
"env": {
"AGENT_NAME": "workbuddy"
}
}
}
}2. Global Installation & Source Build
Global CLI Installation:
npm install -g ferrycatThen simply set
"command": "ferrycat"in your MCP config.Local Source Build (For Contributors):
git clone https://github.com/GuoBug/FerryCat.git cd FerryCat npm install npm run build npm testMount using your local path:
"command": "node","args": ["--experimental-sqlite", "/path/to/FerryCat/dist/index.js"].
First-Class CLI Experience (ferrycat-cli)
Beyond serving as an in-IDE MCP Server, FerryCat provides a first-class CLI utility (ferrycat-cli). The single ferrycat executable dispatches on its first argument: no argv starts the MCP stdio server, a known subcommand routes to the CLI. So you can run npx ferrycat <command> with zero install (or ferrycat-cli <command> once installed globally). Sharing the same ~/.ferrycat/mesh.db SQLite WAL database and Zod validation contracts, the CLI allows developers to inspect mesh health, verify working tree safety, and hook into automated CI/Git scripts without leaving their terminal:
1. Terminal Visual Inspection (ASCII Status Table)
Inspect all cross-host handoffs and error reasons formatted as an ASCII table:
# View all contracts in an ASCII table
npx ferrycat inspect
# Filter by target agent (e.g., only tasks for antigravity)
npx ferrycat inspect --target antigravity2. Pre-Flight Verification (Auditing Before Mutation)
Audit on-disk pointer file integrity against the contract's baseline SHA-256 before committing review work (ADR-0004), eliminating false-positive deliveries:
npx ferrycat verify <CONTRACT_ID>3. Local CI & Headless Worker Execution
Poll the queue, claim tasks, and execute local review/test scripts with automatic failure closure:
# Safely run a script upon task arrival (no shell quotation hazards)
npx ferrycat worker --agent codex --mode=exec --exec-file ./scripts/review.sh --delivery envelope
# See docs/examples/ for dispatch.example.json, fulfill.example.json, and handler.example.cjs templates.4. Zero-Config Sandbox Walkthrough (demo)
Run the self-contained multi-agent lifecycle simulation without configuring an MCP server:
npx ferrycat demoOptions (--keep to retain SQLite for manual inspection, --json for CI assertions) detailed in Quickstart Β§0.
5. Production Controlled Daemon (daemon, ADR-0005)
Run the headless orchestration daemon coordinating background workers via atomic CAS leases and declarative script bindings:
# Launch daemon using project-local declarative configuration
npx ferrycat daemon --config ./ferrycat.config.json
# Run single poll/dispatch iteration for a targeted agent and exit
npx ferrycat daemon --agent workbuddy --onceExposed MCP Tools
Tool Name | Role | Transactional Behavior |
| Requester | Enforces path blacklist $\to$ computes full-file SHA-256 & line bounds (plus optional unified |
| Worker | Sweeps expired TTLs (read-before-write) $\to$ claims via |
| Worker | Re-verifies SHA-256 (TOCTOU guard) $\to$ validates Ajv JSON Schema ($\le 2$ retries via |
| Worker (holder) | Hands a |
| Worker (holder) | Heartbeat: restarts the execution window ( |
| Worker (holder) | Marks a |
| Worker / Any (Read-Only) | Pre-flight check: validates on-disk pointer files against the baseline SHA-256 without mutating contract state (ADR-0004). |
| Any (Read-Only) | Pure read-only query of contract states, outputs, |
π‘ Architecture Decision Records & Engineering Verification:
ADR-0001: Cross-Host SQLite WAL Bus & Human-Scheduled Poll Model (Why
node:sqliteWAL +poll_next_taskinstead of 60s Blocking Hold or single-connection MCP Tasks)ADR-0002: Full-File SHA-256 Fingerprinting, TOCTOU Guard & Cross-Model Audit (Stale-context prevention and real-world cross-host verification records)
ADR-0003: GUI Sandbox vs CLI Process Hybrid Layering Architecture & Wake-Up Boundaries (Desktop HITL approval vs in-house CLI dual-channel autonomy)
ADR-0004: Separation of Review and Mutation (SRM), TOCTOU Soft-Failure Buffering & Immutable Baseline Protocol (How to prevent review abortion from concurrent or well-intended reviewer edits; live mesh case: contract
fc_1793098036393_aea8bb9b)ADR-0005: Controlled Daemon, Atomic CAS Micro-Leases & Safe Execution Boundaries (Microsecond atomic CAS leases on
daemon_locksand declarative whitelist handler enforcement)ADR-0006: Dual-Track TOCTOU Semantics & Post-Mutation SHA-256 Fulfillment (Why
implementation/test_generationtasks commit post-mutation SHA-256 intoverified_sha256while preserving pre-mutation baselines inpointers; live mesh case:fc_1793100801409_4eedf544)
About the Author
Guo Qiang (GuoBug), Product Engineer specializing in platform engineering and growth. Currently focused on AI workflow orchestration, DAG state machines, and deterministic system architectures.
Open Source & Homepage: https://github.com/GuoBug Β· https://guobug.github.io
Inquiries and discussions on workflow engine architecture, topological scheduling, and developer experience are warmly welcomed.
Available Tools
8 toolsdispatch_contractA
Dispatch a task or code review contract to another local AI agent host via the shared SQLite WAL mesh.
Purpose
Registers a new contract in SUBMITTED status with full-file SHA-256 fingerprint snapshots of all target files, establishing an immutable baseline for cross-host verification.
Usage Guidelines
When to use: Use when requesting code reviews, architecture audits, implementation, or test generation from a target agent (e.g., target_agent="workbuddy" or "antigravity").
When NOT to use:
Do NOT use to claim or execute tasks (use poll_next_task).
Do NOT use to check task status or inspect outputs (use inspect_mesh_state).
Do NOT use if the target host does not share the same local filesystem access to workspace_root.
Prerequisites: workspace_root must be a valid directory accessible by both hosts. Pointer files must exist on disk and be saved. Sensitive files (.env, keys, credentials, .git/config) and path escapes are strictly blocked.
Behavior & Side Effects
Mutates database: Synchronously inserts a single row into contracts with status='SUBMITTED' in SQLite WAL (~/.ferrycat/mesh.db).
SHA-256 Snapshot: Computes 64-char hex SHA-256, byte size, and first/last lines for each pointer. Emits a warning if any file was modified within the last 3 seconds (indicating unsaved IDE buffers).
Lifecycle & Expiry: Starts the queue_ttl_sec countdown (default: 1800s / 30m). If the target agent never claims it before queue_ttl_sec elapses, the contract lazily transitions to TIMED_OUT.
Once claimed, execution is governed by exec_ttl_sec (tiered default: 1800s for review/audit, 300s for implementation/test).
Return Value
Returns { contract_id: string, status: 'SUBMITTED', created_at: number, files: Array<{ path, size, mtime_ms, sha256, first_line, last_line, line_range? }>, warning?: string }. Note: requester_agent / target_agent / task_type / title / TTLs are NOT echoed back β read them via inspect_mesh_state if needed.
Inputs: title (required), pointers (required), task_type (required), target_agent (required), +7 more.
extend_ttlA
Heartbeat renewal for long-running execution: restarts the active execution window of a CLAIMED contract.
Purpose
Prevents execution timeout during deep reasoning, extensive test execution, or complex multi-step refactoring by resetting the execution clock.
Usage Guidelines
When to use: Call periodically during long-running tasks before the active exec_ttl_sec countdown expires.
When NOT to use:
Do NOT use after the window has already expired (expired contracts transition to TIMED_OUT).
Do NOT use to deliver task completion (use fulfill_contract).
Do NOT use if abandoning the task (use release_contract or fail_contract).
Prerequisites: Caller must be the current holder and contract must be currently CLAIMED.
Behavior & Side Effects
Mutates database: Resets claimed_at=nowMs (restarting the full exec_ttl_sec window from the current moment) and increments extend_count.
Quotas & Boundaries: Maximum 5 renewals per holder. Bounded by the contract's absolute lifetime ceiling (created_at + 4 * queue_ttl_sec); rejected if proposedExpiresAt > lifetimeDeadline.
Return Value
Returns { ok: boolean, contract_id: string, status: 'CLAIMED' | 'TIMED_OUT', claimed_at?: number, expires_at?: number, extend_count: number, max_extends: number, message: string }.
Inputs: contract_id (required), agent_id, claim_token.
fail_contractA
Explicitly mark a CLAIMED contract as terminal FAILED with a mandatory failure reason.
Purpose
Immediately terminates a claimed task that cannot be completed, recording actionable diagnostic reasons and freeing the requester from waiting for the execution TTL to expire.
Usage Guidelines
When to use: Use when a task encounters an unrecoverable failure (e.g. fatal syntax error, broken test suite, missing required environment).
When NOT to use:
Do NOT use if the task succeeded (use fulfill_contract).
Do NOT use if the task is recoverable by another agent or retryable (use release_contract).
Prerequisites: Caller must be the current holder and reason must be non-empty.
Behavior & Side Effects
Mutates database: Sets status='FAILED', error_reason='WORKER_FAILED: ', and completed_at=nowMs.
Late report handling: If the execution window already expired before fail_contract was called, the status becomes TIMED_OUT while faithfully preserving the worker's reason for the requester.
Return Value
Returns { ok: boolean, contract_id: string, status: 'FAILED' | 'TIMED_OUT', message: string }.
Inputs: reason (required), contract_id (required), agent_id, claim_token.
fulfill_contractA
Submit execution or review deliverables for a CLAIMED contract, with TOCTOU soft-failure buffering and Ajv JSON Schema validation.
Purpose
Delivers the final output of a task, verifies that the code baseline was not mutated during execution, validates structured payloads, and transitions the contract to terminal COMPLETED.
Usage Guidelines
When to use: Use after completing task work to deliver result_summary, optional structured_output, and optional artifacts_pointers.
When NOT to use:
Do NOT use if you cannot complete the task (use release_contract to re-queue, or fail_contract to record failure).
Do NOT use if you modified pointer files directly on disk. If modified accidentally, run "git stash" or restore the files, run verify_contract, and pass proposed fixes inside structured_output.fixes.
Behavior & Side Effects
Authorization: Caller agent_id must match target_agent of the claimed contract.
TOCTOU Guard & Soft-Failure Buffer (ADR-0004) β exactly ONE recoverable rejection:
1st blocked fulfill: returns status='RETRY_NEEDED', keeps the contract CLAIMED, renews the execution window (claimed_at=now), and lists dirty_files with restore instructions.
2nd blocked fulfill: transitions to terminal status='POINTER_STALE', preserving your summary and payload in salvaged_result_json so the work is not lost.
Only ONE rejection is recoverable: restore/stash the files BEFORE retrying, and call verify_contract first so a stray second attempt cannot burn the buffer.
Schema Validation: If contract_schema was defined, validates structured_output via cached Ajv validator. Failures 1 & 2 return RETRY_NEEDED with flattened error paths and renew the execution window; 3rd failure transitions to terminal VALIDATION_FAILED.
On Success: Transitions to terminal status='COMPLETED', recording result_summary, structured_output, artifacts_pointers, and verified SHA-256 snapshot.
Return Value
Returns { ok: boolean, contract_id: string, status: 'COMPLETED' | 'RETRY_NEEDED' | 'POINTER_STALE' | 'VALIDATION_FAILED', retry_count: number, max_retries: number, toctou_strike?: number, max_toctou_strikes?: number, dirty_files?: Array<{ path, reason, detail }>, validation_errors?: string[], message: string }.
Inputs: contract_id (required), result_summary (required), agent_id, claim_token, +2 more.
inspect_mesh_stateA
Strictly read-only query of contracts, execution progress, outputs, diagnostic counters, and failure causes.
Purpose
Provides comprehensive observability into the multi-agent mesh state without acquiring database locks or mutating rows.
Usage Guidelines
When to use:
Check whether a contract you dispatched has been claimed or completed.
Inspect result summaries, structured outputs, or salvaged results of completed/stale contracts.
Monitor queue depth or pending contracts for a specific agent via target_agent filter.
When NOT to use:
Do NOT use to claim tasks (use poll_next_task).
Do NOT use to dispatch tasks (use dispatch_contract).
Do NOT use to verify on-disk file pointer hygiene (use verify_contract).
Behavior & Side Effects
Zero side effects: Pure read-only SELECT query against SQLite WAL. Never alters rows or triggers sweeps.
Dynamically calculates is_logically_expired: true when a contract has exceeded its queue or execution TTL based on the current timestamp, even before the next lazy sweep runs.
Return Value
Returns { total_returned: number, contracts: Array<{ contract_id, requester_agent, target_agent, task_type, title, status, is_logically_expired, created_at, claimed_at, completed_at, retry_count, extend_count, release_count, toctou_strike, result_summary, structured_output, artifacts_pointers, error_reason, salvaged_result, verified_sha256 }> }.
Inputs: limit, status, contract_id, target_agent, +1 more.
poll_next_taskA
Atomically claim the oldest pending SUBMITTED contract assigned to this agent and verify local file fingerprints.
Purpose
Retrieves and claims next available contract work for the current agent, transitioning it from SUBMITTED to CLAIMED.
Usage Guidelines
When to use: Call periodically or when notified to discover and atomically take ownership of pending tasks assigned to your agent_id.
When NOT to use:
Do NOT use to non-destructively inspect queue depth or monitor status without claiming (use inspect_mesh_state).
Do NOT use to create contracts (use dispatch_contract).
IMPORTANT (ADR-0004): Pointers are an immutable baseline snapshot ("what I read"). Never edit pointer files directly on disk while holding a review contract; deliver any proposed code fixes via structured_output.fixes in fulfill_contract.
Behavior & Side Effects
Mutates database: Atomically claims the oldest SUBMITTED contract for agent_id using optimistic concurrency (UPDATE ... WHERE status='SUBMITTED', checked by changes===1). Starts the exec_ttl_sec window.
Lazy TTL sweep: Automatically sweeps and marks expired contracts as TIMED_OUT using lock-free read-before-write probing.
Fingerprint verification: Verifies Existence -> Byte Size -> SHA-256 for all pointers. If on-disk files were altered or missing, marks the contract POINTER_STALE and transparently advances to claim the next valid candidate in the queue.
Return Value
When work is claimed: { ok: true, has_task: true, status: 'CLAIMED', contract: { contract_id, requester_agent, target_agent, task_type, title, context_summary, workspace_root, pointers, contract_schema, claimed_at, exec_ttl_sec } }.
When queue is empty: { ok: true, has_task: false, message: 'No pending contracts for agent "<agent_id>"' }.
Inputs: agent_id.
release_contractA
Hand a CLAIMED contract back to the queue tail as SUBMITTED with a fresh queue window.
Purpose
Allows an agent holding a claimed task to safely release ownership back to the queue without failing or aborting the task.
Usage Guidelines
When to use: Use when your agent claimed a task by mistake, encounters missing local dependencies/tools, or needs to switch git branches before processing.
When NOT to use:
Do NOT use if the task permanently failed or cannot ever be completed (use fail_contract).
Do NOT use if you simply need more time to finish active execution (use extend_ttl).
Prerequisites: Caller must be the current holder (agent_id matches target_agent) and contract status must be CLAIMED.
Behavior & Side Effects
Mutates database: Resets claimed_at=NULL, updates queued_at=nowMs, resets extend_count=0 (renewal quota is per holder), and increments release_count.
Preserves retry_count: The schema validation circuit-breaker quota is contract-level; releasing a contract cannot launder previously consumed retry attempts.
Audit history: Appends reason to error_reason history ("RELEASED_BY_HOLDER: | prev: ...").
Limits: Maximum 3 releases per contract. Refused once the contract reaches its absolute lifetime ceiling (nowMs >= created_at + 4 * queue_ttl_sec).
Return Value
Returns { ok: boolean, contract_id: string, status: 'SUBMITTED' | 'CLAIMED' | 'TIMED_OUT', release_count: number, max_releases: number, message: string }.
Inputs: contract_id (required), reason, agent_id, claim_token.
verify_contractA
Read-only pre-flight consistency check (ADR-0004): audits on-disk pointer files against the baseline SHA-256 snapshot.
Purpose
Enables agents or automated scripts to verify that on-disk files match the contract's dispatched baseline before calling fulfill_contract, preventing accidental TOCTOU strikes.
Usage Guidelines
When to use: Call before fulfill_contract while holding a CLAIMED contract to confirm file cleanliness, or when investigating why a fulfill call was blocked.
When NOT to use:
Do NOT use to deliver results (use fulfill_contract).
Do NOT use to renew time (use extend_ttl).
ADR-0004 Rule: Pointers are an immutable review baseline. If verify_contract reports dirty files, restore or stash them (e.g., git stash or git checkout -- ) and deliver proposed changes inside structured_output.fixes.
Behavior & Side Effects
Zero side effects: Pure read-only operation. Never updates the database, never alters contract status, and never consumes a TOCTOU strike.
Complete pointer check: Verifies all pointer files on disk and returns every drifted file (reason: SIZE_MISMATCH, CONTENT_CHANGED, or FILE_MISSING).
Return Value
Returns { ok: true, valid: boolean, fulfillable: boolean, contract_id: string, status: ContractStatus, target_agent: string, toctou_strike: number, max_toctou_strikes: number, dirty_files: Array<{ path, reason, detail }>, message: string }. NOTE: valid only means every pointer still matches its dispatched baseline. fulfillable additionally requires the contract to be CLAIMED. A contract that already went terminal (FAILED / POINTER_STALE / COMPLETED) can report valid=true while fulfillable=false, so branch on fulfillable rather than valid before calling fulfill_contract.
Inputs: contract_id (required), agent_id, claim_token.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogβ¦
TDQS
Scored across 8 tools
Each tool maps to a distinct lifecycle action (dispatch/create, poll/claim, fulfill, fail, release, extend, inspect, verify) with explicit 'do NOT use X, use Y' guidance that pre-empts confusion between close pairs like inspect_mesh_state vs verify_contract and extend_ttl vs release_contract. Boundaries are unusually crisp.
All eight names follow a consistent snake_case verb-first pattern (dispatch_contract, poll_next_task, fulfill_contract, fail_contract, release_contract, extend_ttl, inspect_mesh_state, verify_contract). Noun phrases vary slightly in length but the convention is uniform and predictable.
Eight tools cleanly cover one coherent domain (a cross-host contract queue). Every tool earns its place in the lifecycle β no redundant wrappers and no filler.
The lifecycle is nearly fully covered: create, claim, heartbeat, release, fail, deliver, plus read-only state and file-consistency inspection. The notable gap is a requester-side cancel/revoke for a SUBMITTED contract (the only remedy is waiting for queue TTL), which is a minor but real dead end.
Maintenance
Related MCP Connectors
Control plane for autonomous software labor. Agents claim objectives over MCP with audit trail.
Public MCP for agent verification, work discovery and governed interoperability.
Project management shared by people and AI agents, with persistent project state through MCP.
Team memory for AI coding agents and code reviews, reviewed by humans and served over MCP.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables MCP-capable coding agents to coordinate via authenticated task creation, claiming, messaging, and review approval over a secure local event log.-
- AlicenseCqualityCmaintenanceEnables coding agents to coordinate around shared project context, durable tasks, messages, artifacts, multimodal analysis requests, design-system checks, change proposals, and review requests through a compact MCP interface. It persists state locally in JSON and exposes tools, resources, and prompts for agent-to-agent workflows.9MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI coding agents to plan, split, and build one project together through shared tasks, file leases, a versioned contract, and urgent interrupts over MCP.MIT
- AlicenseNot gradedqualityCmaintenanceEnables Claude and Codex agents to delegate implementation, testing, research, or review tasks to each other through local MCP tools, while supporting persistent sessions, isolated editing workspaces, and reviewed integration. It also allows progress tracking, cancellation, model selection, and management handoff between providers.2MIT