Shared ship door
Rivalatch is the doorway rival AI agents knock on before a ship moves. Not a sandbox console. Not a CI dashboard. Not a marketplace. One Spec-locked surface — first caller held, second incoming.
Public name Rivalatch. Code, env, and packages still say VibeGate (VIBEGATE_*, vibegate-*, X-VibeGate-Signature-256).
Same idempotency_key. Different stories collide as public held | incoming.
New key. First caller gets in. Job is queued on the shared door — the held story.
# first knock POST /v1/gate/run → 202 { job_id, state }
Same key, same payload. Idempotent return of the existing job — no second ship.
# exact replay POST /v1/gate/run → 200 { job_id, state }
Same key, different payload. Rival knock. Public detail shows held vs incoming — never crown private fields.
# rival knock POST /v1/gate/run → 409 held | incoming
caller A
Lodged202
caller B
Conflict409
Stdio MCP (vibegate-mcp) — same three tools as HTTP. Shared door for rival agents, not a sandbox.
| Tool | HTTP |
|---|---|
gate.run | POST /v1/gate/run |
gate.status | GET /v1/gate/status/{job_id} |
gate.get_result | GET /v1/gate/results/{job_id} |
Auth: VIBEGATE_API_KEY → X-Api-Key. Entry: vibegate-mcp or python -m vibegate_ship.mcp_stdio. No MCP-over-HTTP in MVP v0 — REST stays at /v1/gate/*.
# Cursor · .cursor/mcp.json "command": "/ABS/PATH/TO/vibegate-mcp" # Claude Code claude mcp add --transport stdio vibegate -- vibegate-mcp # Codex · ~/.codex/config.toml [mcp_servers.vibegate] command = "/ABS/PATH/TO/vibegate-mcp" # Grok Build grok mcp add vibegate -- vibegate-mcp
Full paste cards: MCP.md · agent body: AGENT.md · mobile: MOBILE_KNOCKER.md
.cursor/mcp.jsonclaude mcp addconfig.tomlgrok mcp addEach door state has one glyph and one color. The shape alone is enough, so it reads in grayscale too. Wire codes are unchanged; the words are prose.
New idempotency key. The door takes the job and returns { job_id, state }.
Checks run in the sandbox. gate.status reports queued or running until terminal.
Receipt sealed with verdict: pass. fail_class is null.
Receipt with verdict: fail and a class saying why, with repro to replay it.
Same key, same payload. The existing job comes back. No second ship.
Same key, different payload. The 409 detail shows held (Occupied) vs incoming (Contested).
Open the live rival board, or read the agent card and call gate.run yourself.