clay-borg/history/260802-render-port-response.md
tegwick c5fa610e59 CB-WP-0012-T02: adversarial review — not approvable as written
Four of six challenges conceded; the survey's two main arguments are
replaced rather than clarified.

C1  The survey concluded the sub-100k region was empty without ever
    measuring it. It is not empty: tiny-skia fits at 83,956, and the
    real windowed floor is fltk at 140,079 — 1.5x corrected headroom,
    not 128x. "Two orders of magnitude" is withdrawn.

C1b Following that concession: wgpu+winit is 1,741,979 marginal lines
    against a 250,000 target. AM-4a is incompatible with INTENT stage 2
    by 7x, and has been since both were written. Raised for the
    maintainer; deliberately not decided by this pass.

C2  "Marginal cost zero" was scored on an axis chosen to produce zero,
    and the same relocation already flattered sdl2 and fltk in the
    survey's own table. One acquisition rule now covers all three, and
    it raises two candidates' cost rather than lowering the winner's.

C3  The survey contradicted itself on the second-use rule. cb-render-api
    and cb-render-null are withdrawn; cb-render-html ships against the
    existing Project trait, and the port waits for stage 2's second use.

C6  The candidate measurements did carry a positive control. The C1
    batch did not — it copied dep-weight.py's measurement function
    without its guards — and was re-measured under them before being
    cited. Figures reproduced unchanged. The HTML row is relabelled
    0 by construction, not by measurement.

C4/C5 become six controls binding on ADR-0007.

The recommendation stands. The reasoning that reached it does not.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-02 04:12:22 +02:00

9.3 KiB
Raw Blame History

260802 — response to the challenge on CB-RES-0006

One round, per InnerLoop §Step 2. Four challenges conceded, two answered with evidence, and one of the concessions turned up something larger than this pass.


C1 — the unmeasured interval — conceded, and the framing withdrawn

The challenge is right and the survey's rhetoric was wrong. "Two orders of magnitude" described the candidates I picked, and I picked them from what a 2026 Rust developer reaches for, which is a list of GPU-era stacks. The real floor for a windowed toolkit is fltk at 140,079 marginal lines — 1.5× the corrected headroom, not 128×.

The C1 table is folded into the survey as measured data, including tiny-skia at 83,956, which fits inside 92,798 and disproves the interval claim by itself.

So dependency cost alone does not decide this. The survey's argument as written is withdrawn. What replaces it is an allocation argument, and it is stronger:

INTENT stage 2 names wgpu explicitly. That is a 1,741,979-line marginal cost, already measured, already unavoidable, and it arrives one stage from now. Against that, spending 1.5× the entire remaining budget on a stage-1 windowing toolkit that stage 2 immediately discards is the wrong allocation — not because it does not fit, but because it buys a thing with a known expiry using money already committed elsewhere.

That argument does not need AM-4a's target to be exactly 250,000. It only needs stage 2's bill to be larger than stage 1's benefit, which is measured, and true by a factor of twelve.

C1b — what the concession exposed: AM-4a cannot survive stage 2

Following C1 honestly produces a finding neither the survey nor the challenge was looking for.

marginal lines
AM-4a target, total 250,000
current shipped-runtime (corrected, proc-macro excluded) 157,202
headroom 92,798
wgpu + winit, which INTENT stage 2 names by name 1,741,979

Stage 2 exceeds the entire AM-4a target by 7×, and exceeds the remaining headroom by 19×. No sequencing, no feature-gating and no metric correction closes a gap that size. AM-4a as targeted is incompatible with INTENT as written, and has been since both were written; nothing in this pass caused it.

That is a maintainer's decision, not mine — either the target moves, or the port stays out of the AM-4a configuration by an argued rule, or stage 2 changes. It is recorded here and carried to the evidence file, and it is deliberately not resolved by this pass, because a pass that discovers a budget conflict and also decides it has reviewed nothing.

It does, however, retire one bad reason for the recommendation. "HTML, because we cannot afford anything else" is false. "HTML, because stage 1 should not spend stage 2's money on something stage 2 throws away" is true.

C2 — the metric is gameable by relocation — conceded; one rule, stated

The challenge is right that the survey scored the browser at zero on an axis chosen to produce zero, and right that the same move already makes sdl2 and fltk look cheap in the survey's own table. I had not noticed, because I had measured no bindings.

The rule, which belongs in AM-4's definition and not in this pass's reasoning, applied consistently to all three:

AM-4 counts third-party code the project causes to be acquired. It does not count runtimes the user already has independently of us — the kernel, the system C library, the shell, the terminal, a web browser. It does count a library our build or install instructions cause to be fetched, pinned, or linked, whether or not its source is Rust.

Under that rule, consistently:

  • a browser is not counted — nothing we ship or instruct causes it to be acquired;
  • sdl2/fltk are counted at more than their Rust binding, not less — they oblige a user to install a -dev package they would not otherwise have, so the survey's 191,973 and 140,079 understate them;
  • and the rule makes the metric harder to satisfy by relocation, not easier, which is the direction a rule proposed by the party it benefits has to go before it is worth anything.

This makes the HTML row honest rather than merely favourable. It also means the survey's table understates two candidates, and that correction is folded in.

C3 — the port contradicts the second-use rule — conceded entirely

Recommendations 1 and 4 cannot both stand, and 4 is the one INTENT supports. CommitWindow is already in this repo with a delete-by date for exactly this mistake.

cb-render-api is withdrawn from this pass. cb-render-html ships against the existing Project trait, which is a real interface with real implementations rather than a speculative one. The port gets declared at stage 2, when wgpu supplies the second concrete use and the interface can be derived from two implementations instead of imagined from one.

This also removes cb-render-null: a null implementation of an interface that does not exist yet is a null implementation of nothing.

And it changes the pass's tier. The structural trigger for tier L was "creates a new capability port." This pass no longer creates one. That is recorded rather than acted on — the declaration and its roll stand, and the pass runs at the weight it declared. Re-rolling a tier because review made the work smaller would make the tier a function of the outcome, which is the one thing a tier declaration must not be. The CHAOS calibration window gets a second entry from this, and it is a more interesting one than the first: tier L at full weight deleted its own structural trigger.

C4 — the loopback server — conceded; controls carried to ADR-0007

The challenge is right that "loopback only" is not a boundary against a browser that also reads the internet, and right that "a page it emitted itself" is an assumption no code checks. All four controls are adopted as conditions on the implementation, and the fourth is the load-bearing one:

  1. an unguessable token minted per process, required on every request;
  2. Origin / Sec-Fetch-Site checked, rejected by default;
  3. bound explicitly to 127.0.0.1;
  4. a test that a request without the token is refused — and, per M-D1-MUT, a mutation that removes the check and turns that test red.

Controls 13 without 4 are three claims and no evidence, which is the class this project keeps finding in its own work.

C5 — the gate stops at the language boundary — conceded; both controls adopted

Naming a challenge in the survey and calling it pressed was not an answer, and the challenge says so correctly.

  1. JavaScript may not construct commands. The page reports raw pointer facts; Rust decides what command they mean. JS becomes input transport, and the decision becomes testable in Rust against synthetic events.
  2. The coverage gate crosses the boundary. The HTML counterpart to every_view_field_is_classified asserts over the parsed emitted document — the token is in the document, or the build fails. Asserting over the Rust that emits the document would reproduce CB-WP-0011's original defect one layer up.

C6 — the zeros — partly answered, partly conceded

Answered: the candidate measurements did carry the positive control the challenge says they lacked. measure.py tracks an unlocated list per candidate and it is empty for all seven — verified in results.json, not asserted. So no candidate figure is a silently-stopped harness.

Conceded, twice over:

  • gap.py, which produced the C1 table, copied the measurement function without the guard. The C1 numbers therefore have no positive control. They are load-bearing now, since they are what withdrew the survey's main argument, so they must be re-measured under the guard before ADR-0007 cites them.
  • The survey's HTML row is 0 by construction, not by measurement — there is no crate to fail to locate. The challenge is right that a reader cannot tell that zero from a dead one, and the survey printed them identically in a table whose other rows are measurements. It is relabelled rather than left to be read as a measured figure.

The general observation is worth keeping: a probe script that copies a tool's measurement function and not its controls is how a positive control gets lost, and it happened here inside one pass, in a repo whose whole discipline is positive controls.


What changed in the survey

  • The "two orders of magnitude" framing is withdrawn; the real floor is fltk at 1.5× corrected headroom.
  • The C1 candidates are folded in as measured rows, re-measured under the positive control.
  • The recommendation's justification changes from affordability to allocation against stage 2's known 1,741,979-line bill.
  • The AM-4 acquisition rule is stated, and it raises the cost of two candidates rather than lowering the cost of the recommended one.
  • cb-render-api and cb-render-null are withdrawn from this pass.
  • The HTML row is relabelled 0 by construction.
  • C4 and C5's six controls become conditions in ADR-0007.
  • AM-4a's incompatibility with stage 2 is raised as a maintainer decision and explicitly not decided here.

Approvable after these changes. The recommendation stands; the argument that reached it does not, and has been replaced.