The High Council/the board
MCP SERVER  ·  CLI  ·  BRING YOUR OWN KEYS

Watch a panel of AI models argue about a plan - then change their minds

This is the multi-model debate mechanism behind The High Council, published as an MCP server anyone can run in their own Claude Code. No account, no hosted service, no charge - you bring your own provider keys and read what actually happened below.

Clone the repo See the board
4
labs
3
rounds
$0.0442
this run cost

The board

The question: Should a new systems language make null unrepresentable by default, given it must constantly cross a C FFI boundary that is natively nullable?

Below is a real run. Not a diagram of how the mechanism works - a record of what the labs actually said to each other while it ran, written to BOARD.md as it happened.

Watching models lose arguments

deepseek · deepseek-ai/DeepSeek-V4-Flash-0731
Withdrawn by its own author

Proposed nullable-by-default with a compiler-inserted null check before every dereference of an FFI-derived reference. Qwen, GLM and Mistral all objected - pervasive runtime overhead in exactly the domain that can't afford it, and no zero-cost path for the common case. DeepSeek agreed and withdrew it: "the objections... are valid: pervasive runtime null checks... introduce unpredictable overhead in performance-critical code." DeepSeek withdrew all three of its own proposals over the course of the run, finishing with 0 of 3 accepted.

mistral · mistralai/mistral-large-2512
Withdrawn by its own author

Proposed compiler-generated FFI wrapping via a #[ffi] attribute, so the compiler - not the programmer - writes the null-check/wrap code at every C boundary call. DeepSeek, Qwen and GLM all objected: it hides the per-call cost from the systems programmer, and GLM went further - a compiler-synthesized reference from untracked C memory "fabricates a language reference... the language does not own or track lifetimes for - that is a dangling-reference design bug, not a convenience." Mistral withdrew it: "The explicit conversion mechanism... addresses the FFI boundary more transparently."

More labs catching each other's mistakes

deepseek

Caught Qwen's own acceptance test contradicting its proposal - the test targeted a raw pointer type as non-nullable when the proposal itself defined raw pointers as nullable. Qwen agreed and amended: "Lab A... is correct that the acceptance test incorrectly targets raw pointers, which remain nullable in this design."

deepseek and glm · cross-check

Both independently flagged that Mistral's representation proposal had a literal placeholder - "'How' field is '[object Object]' - not a real mechanism" - instead of an actual answer, and that its acceptance test overstated the design's cost. Mistral corrected it: niche-filling "does require a null check on unwrap... only a branch at unwrap time, not at FFI boundary crossing."

Not unanimous - the panel refusing to rubber-stamp

This run did not get unanimous sign-off, and that's shown here rather than smoothed over. But read it precisely: the two labs below did not object to the design - they held out over a structural conflict in the run's own setup (a required internal section vs. a "must be standalone" publication rule). That's a different kind of disagreement from the design debate above, shown separately so it isn't mistaken for one.

qwen · qwen/qwen3.5-plus-20260420

Held out to the round cap over a structural conflict, not a design objection: this chain's own build-stage contract requires every draft to carry a "Scope ledger" section naming internal proposal IDs; the task's own acceptance criteria demand a fully standalone, publication-ready document with no internal process record. The two requirements genuinely conflict - no draft can satisfy both - and Qwen disputed it explicitly across both revision rounds rather than accept the required section being quietly deleted just to produce a clean board.

glm · z-ai/glm-5.3-flash

Raised the identical structural conflict independently: the trailing "Scope ledger" names lab and proposal IDs and "cannot be published as-is on a standalone public page as the request requires." Same root cause as Qwen's holdout, same result - held out rather than sign off on a contradiction in the run's own setup.

The debate, drawn

Every row is a proposal. Every column is a seat on the panel. A mark means that seat posted about that proposal during the debate, and which way. The right-hand column is what the proposal's own author did once they had read the argument against it.

Seats are lettered, not named, because the debate itself ran blind - no seat knew who wrote what. The legend below says which lab filled which seat.

Proposal A B C D Its author then...
A-1 Non-null by default with explicit raw pointer type for FFIits own author▲ proposed mergingno post● supportedwithdrawn, in favour of G-1
A-2 Zero-cost Option via niche-filling for referencesits own authorno postno post▲ proposed mergingwithdrawn, in favour of M-1
A-3 Nullable-by-default with compiler-enforced null checks at FFIits own author◆ objected◆ objected◆ objectedwithdrawn, in favour of G-1
B-1 Default Rule: Non-Nullable References◆ objectedits own author◆ objected● supportedamended
B-2 FFI Mechanism: Explicit Unwrap at Boundary▲ proposed mergingits own authorno post▲ proposed mergingwithdrawn, in favour of G-2
B-3 Representation: Niche-Filled Zero-Cost Option◆ objectedits own authorno post● supportedamended
C-1 Position statement: non-null default with a distinct raw-pointer type● supportedno postits own author● supportedamended
C-2 FFI boundary mechanism with niche-filling representation● supported● supportedits own author● supportedamended
C-3 Two-sided cost ledger with accurate precedent checks● supportedno postits own author● supportedkept as written
D-1 Non-nullable references by default with niche-filled Option<T>◆ objectedno post◆ objectedits own authoramended
D-2 Explicit FFI boundary translation with `#[ffi]` attribute◆ objected◆ objected◆ objectedits own authorwithdrawn, in favour of Q-2
D-3 Cost ledger for non-nullable-by-default with FFI translation◆ objectedno post▲ proposed mergingits own authorwithdrawn, in favour of G-3

● supported it  ·  ◆ objected to it  ·  ▲ proposed merging it

Read one row and the mechanism is visible without any explanation from us: proposal A-1 drew objections, and its own author withdrew it. 6 of the 12 proposals ended that way, after 12 objections across the board.

Seat A deepseek  ·  Seat B qwen  ·  Seat C glm  ·  Seat D mistral

Then the panel voted on the result

deepseek signed off
qwen declined to sign off
glm declined to sign off
mistral signed off

2 of 4 seats declined, and the result shipped with their objection on the record rather than edited out. A seat declining is a disagreement about the run's outcome - not a verdict on any one proposal above.

Run 2026-09-11T10-06-06-899Z, chain plan-debate-c2-4lab, $0.0442 total. Drawn from the run's own report.json; nothing here is illustrative.

Per-lab scoreboard

Lab Model Proposed Accepted Withdrawn Signed off
deepseekdeepseek-ai/DeepSeek-V4-Flash-0731303yes
qwenqwen/qwen3.5-plus-20260420321no
glmz-ai/glm-5.3-flash330no
mistralmistralai/mistral-large-2512312yes
$0.0442

4 labs arguing a real design question over 3 rounds, for four cents. Real API spend, no markup, because there is no charge here at all. Your own runs will cost whatever your own provider keys charge for the models you choose.

Read the mechanism, then read the setup.

The full README treatment - how it works stage by stage, MCP tools, chains, spend cap - lives on the main page.

Back to The High Council Try it yourself
MIT. See LICENSE.
Also published as a write-up on sower-industries.de, built around this same run.