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.
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.
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."
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."
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."
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.
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.
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.
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 FFI | its own author | ▲ proposed merging | no post | ● supported | withdrawn, in favour of G-1 |
| A-2 Zero-cost Option via niche-filling for references | its own author | no post | no post | ▲ proposed merging | withdrawn, in favour of M-1 |
| A-3 Nullable-by-default with compiler-enforced null checks at FFI | its own author | ◆ objected | ◆ objected | ◆ objected | withdrawn, in favour of G-1 |
| B-1 Default Rule: Non-Nullable References | ◆ objected | its own author | ◆ objected | ● supported | amended |
| B-2 FFI Mechanism: Explicit Unwrap at Boundary | ▲ proposed merging | its own author | no post | ▲ proposed merging | withdrawn, in favour of G-2 |
| B-3 Representation: Niche-Filled Zero-Cost Option | ◆ objected | its own author | no post | ● supported | amended |
| C-1 Position statement: non-null default with a distinct raw-pointer type | ● supported | no post | its own author | ● supported | amended |
| C-2 FFI boundary mechanism with niche-filling representation | ● supported | ● supported | its own author | ● supported | amended |
| C-3 Two-sided cost ledger with accurate precedent checks | ● supported | no post | its own author | ● supported | kept as written |
| D-1 Non-nullable references by default with niche-filled Option<T> | ◆ objected | no post | ◆ objected | its own author | amended |
| D-2 Explicit FFI boundary translation with `#[ffi]` attribute | ◆ objected | ◆ objected | ◆ objected | its own author | withdrawn, in favour of Q-2 |
| D-3 Cost ledger for non-nullable-by-default with FFI translation | ◆ objected | no post | ▲ proposed merging | its own author | withdrawn, 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
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.
| Lab | Model | Proposed | Accepted | Withdrawn | Signed off |
|---|---|---|---|---|---|
| deepseek | deepseek-ai/DeepSeek-V4-Flash-0731 | 3 | 0 | 3 | yes |
| qwen | qwen/qwen3.5-plus-20260420 | 3 | 2 | 1 | no |
| glm | z-ai/glm-5.3-flash | 3 | 3 | 0 | no |
| mistral | mistralai/mistral-large-2512 | 3 | 1 | 2 | yes |