The High Council/try it
SIMULATED DEMO  ·  NOT A REAL RUN

Click through a council run yourself

Everything below is reconstructed for this demo, not a real run - hand-authored to match the shape of a real report.json, so you can see the mechanism working before running your own. For an account of an actual run with real spend, see the board. Nothing on this page makes a network request; every section below expands right here.

The question

Should a cache invalidation endpoint be synchronous (caller waits for every edge node to confirm) or asynchronous (caller gets an immediate ack, edges converge within a bounded window)?

Proposals

Each seat proposed blind, without seeing the others. Click a proposal to open it.

A-1 Synchronous invalidation with a 2-second timeout, falling back to async

Seat A (lab: seat-lab-alpha, demo label). Callers block for confirmation from all edges up to 2s; past that, the call returns success anyway and the invalidation finishes asynchronously. Rationale: most invalidations converge in under 200ms in the reference deployment, so the common case gets a real guarantee and the tail doesn't stall callers.

B-1 Fully asynchronous, with a read-your-writes exception for the calling node only

Seat B (lab: seat-lab-beta, demo label). Caller's own node invalidates synchronously (so it never re-reads its own stale write); every other edge converges asynchronously within a stated SLA window. No caller-visible timeout to tune.

C-1 Fully synchronous, no timeout, with a circuit breaker per edge

Seat C (lab: seat-lab-gamma, demo label). Caller always waits for every edge; an edge that fails to ack within its own breaker threshold is marked degraded and excluded from future invalidations until it recovers, rather than changing the contract for a slow-but-healthy edge.

Blind debate

Seats argue without knowing who wrote what. Click a post to see the reply from the proposal's own author.

Seat C objects to A-1

Post: "A caller-visible timeout that silently degrades the guarantee is worse than no guarantee at all - a caller who checks the return value has no way to tell which case happened."

Author's reply (A): amend "Fair - I'm adding a response field naming which path was taken (`confirmed` vs `pending`) rather than hiding it behind a shared 200."

Seat A objects to C-1

Post: "No timeout at all means one slow-but-not-yet-tripped edge can stall every caller in the system during the breaker's own detection window. That window is itself a hidden timeout, just an unbounded and unstated one."

Author's reply (C): withdraw "Correct, and I don't have a bounded number for the breaker's detection window that would fix this. Withdrawing in favour of B-1's stated SLA."

Seat A supports B-1

Post: "Read-your-writes on the caller's own node while everything else converges async is the right split - it solves the actual bug this endpoint exists to prevent without a tunable timeout at all."

Author's reply (B): keep "Kept as written - no objection raised against it."

Sign-off

Under signoff: "unanimous", every seat has to agree on the same draft or the reviser fixes the union of all objections and the whole panel re-reviews. Click a seat's verdict for its stated reason.

seat-lab-alpha signed off

"The response-field amendment fixes my only objection to B-1's alternative. No remaining concerns."

seat-lab-beta signed off

"My own proposal is the accepted draft with no changes required of it. Signing off."

seat-lab-gamma signed off

"I withdrew my own proposal once the unbounded-window problem was pointed out. B-1 doesn't have that problem. Signing off."

3 of 3 seats signed off on the same draft in this reconstruction. A real run can end unanimous, split, or capped at maxRounds with objections still open - see the board for a real run that ended split.

Run it on your own question.

This demo is fixed and offline. A real run argues your actual task, with your own provider keys, and writes its own report.json.

Clone the repo See a real run Back to The High Council
MIT. See LICENSE.