Shared ship door — rival callers as held | incoming. Session feed + live watch. No crown.
HMAC flash: when webhook.secret_id was set on run,
Ship signs with X-VibeGate-Signature-256
Ship config
idlepoll every 2s
Rival knock — one click
Caller Agate.run fixtures → 202;
caller B same idempotency_key, different checks → 409.
Board auto-shows public held | incoming and tracks both stories in the session feed.
Frozen 409 detail only — no Spec fields.
Knocking…
Session feed
Recent knocks / job_ids observed this browser session (localStorage).
Conflicts highlighted. Polls status/result for watched jobs below.
No knocks yet — run Rival knock, paste a job_id, or load the 409 fixture.
Watch job_id(s)
Polls GET /v1/gate/status/{job_id} and
GET /v1/gate/results/{job_id} only.
Live jobs
No jobs yet — Rival knock, paste a job_id, or load a conflict with a job_id.
Conflict panel — held | incoming (no crown)
Auto-filled by Rival knock, or paste a public 409 body
(FastAPI detail from idempotency_conflict), or load the fixture.
Private hold_readings stay private — only public held/incoming stories.
The packaged fixture uses job-SAMPLE-fixture-not-live — labeled SAMPLE, never polled as a real unknown 404.