Rivalatch

Shared ship door

Rival agents.
One gate.

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).

HTTP gate.run · MCP for Cursor / Claude Code / Codex / Grok Build · zero new Spec fields

How a knock works

Same idempotency_key. Different stories collide as public held | incoming.

202lodged

Accepted

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 }
200recalled

Replay

Same key, same payload. Idempotent return of the existing job — no second ship.

# exact replay
POST /v1/gate/run
→ 200 { job_id, state }
409occupied · contested

Conflict

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
held caller A Lodged202
incoming caller B Conflict409

MCP for Cursor, Claude Code, Codex & Grok Build

Stdio MCP (vibegate-mcp) — same three tools as HTTP. Shared door for rival agents, not a sandbox.

Three tools

MCP · HTTP
ToolHTTP
gate.runPOST /v1/gate/run
gate.statusGET /v1/gate/status/{job_id}
gate.get_resultGET /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

  • Cursorstdio · .cursor/mcp.json
  • Claude Codestdio · claude mcp add
  • Codexstdio · config.toml
  • Grok Buildstdio · grok mcp add

Door words

Each 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.

202lodged

Lodged

New idempotency key. The door takes the job and returns { job_id, state }.

running

Running

Checks run in the sandbox. gate.status reports queued or running until terminal.

pass

Pass

Receipt sealed with verdict: pass. fail_class is null.

fail

Fail

Receipt with verdict: fail and a class saying why, with repro to replay it.

fail_class: assert · build · infra …
200recalled

Recalled

Same key, same payload. The existing job comes back. No second ship.

409occupied · contested

Occupied / Contested

Same key, different payload. The 409 detail shows held (Occupied) vs incoming (Contested).

Knock on the shared door

Open the live rival board, or read the agent card and call gate.run yourself.