# 260802 — challenge to CB-RES-0006 Adversarial review, one round, per InnerLoop §Step 2. **Fidelity note, first, because it caps everything below.** The spec asks for a *separate session or agent*. This review was run in the same session as the survey, because this environment's standing instruction is not to spawn agents unless asked. So it does not have the property the step exists to provide: the reviewer inherits the author's sampling, the author's framing, and the author's blind spots. Every prior instance of this class in the repo — CB-WP-0002's dedup sample, CB-WP-0005's AM-7 assertion — was a shared blind spot between author and reviewer who sampled the same way. Treat the challenges below as a lower bound on what a genuinely separate reviewer would find. The claim rests on numbers, so per the table in §Step 2 the reviewer's job is to reproduce them independently and to mutate the assertions behind them — not to argue with the prose. --- ## C1 — The survey concluded the sub-100k region was empty without looking **This is the challenge that lands.** The survey measures seven candidates. The cheapest windowed one costs 480,501. It then reports the corrected headroom as 92,798 and concludes that no windowed toolkit fits — a conclusion about the interval `0 < x < 92,798` drawn from a sample whose smallest windowed member is 480,501. Nothing was measured in the interval the conclusion is about. The candidate list is not random, either. It is the list a 2026 Rust developer reaches for, which is a list of GPU-era stacks: everything on it pulls `wgpu`, `winit`, or `rustix`. Cheap, old, thin bindings to system libraries were structurally absent from the sample. Measured, same method, marginal against the same base: | candidate | marginal lines | vs 92,798 corrected headroom | |---|---:|---:| | `tiny-skia` alone | **83,956** | **fits**, at 90% of it | | `fltk` | **140,079** | 1.5× | | `sdl2` | **191,973** | 2.1× | | `sdl3` | 276,445 | 3.0× | | `raqote` | 286,852 | 3.1× | | `minifb` | 774,389 | 8.3× | | `pixels` | 863,528 | 9.3× | | `speedy2d` | 1,328,008 | 14.3× | **The survey's central rhetorical move — "this is not a near miss to be negotiated; it is two orders of magnitude" — is false.** It is two orders of magnitude for the candidates the survey chose. The real floor for a windowed toolkit is `fltk` at 140,079, which is **1.5×** the corrected headroom. That is exactly a near miss to be negotiated. `tiny-skia` at 83,956 actually fits — it is a pure-Rust CPU rasterizer with no windowing, so it is not by itself a table, but it disproves the survey's stated interval claim on its own. **Required:** the survey must either withdraw the "two orders of magnitude" framing and re-argue against a 1.5× floor, or concede that its recommendation rests on something other than dependency cost. ## C2 — "Marginal cost zero" is scored on an axis chosen to produce zero AM-4a measures vendored third-party **Rust**. The HTML option scores zero because it relocates the renderer into a runtime AM-4a cannot see. The browser is tens of millions of lines of unaudited third-party code. Calling that zero is true under the metric and false in substance. If a proposal may satisfy a dependency target by moving the dependency somewhere the target does not look, then the target constrains nothing, and this pass is the first to demonstrate it. That is a worse outcome for the project than buying `macroquad` honestly. **And the same critique convicts C1's cheap candidates.** `sdl2` at 191,973 and `fltk` at 140,079 are thin Rust bindings to large C libraries; their `.rs` line counts exclude the actual implementation for exactly the same reason the browser's is excluded. So the metric already permits this move, and the survey's own table already rewards it — it simply did not notice, because it never measured a binding. **Required:** one rule, applied to all three. Either relocating an implementation into an unmeasured runtime is permissible (and then `sdl2` and `fltk` are legitimately cheap and must be compared on their merits, not excluded on cost), or it is not (and then HTML is not free either). The survey cannot have it one way for the browser and another for `sdl2` without stating the distinction. It states none. ## C3 — The survey contradicts itself on the second-use rule Recommendation 1 declares `cb-render-api` a canonical port now. Recommendation 4 says `cb-render-wgpu` at stage 2 is "where the port interface gets its second use and only then becomes canonical." Both cannot hold. INTENT: *"No concept becomes canonical merely because it looks general. It becomes canonical after surviving a second concrete use."* A port interface written against exactly one implementation, which emits whole documents, will acquire a document's shape — retained mode, full state per update, string identity, no frame timing — and stage 2 will find it unimplementable and rewrite it. The survey names this risk in §6 and mitigates it with "write it to be implemented twice," which is a wish. `CommitWindow` is already on record in this repo as the concept that looked general, has a delete-by date, and has declined two second-use opportunities. **Required:** either defer `cb-render-api` until stage 2 supplies a second implementation, and ship `cb-render-html` directly against the existing `Project` trait — or state why this port is exempt from a rule INTENT states without exception. ## C4 — The 250-line HTTP server is undersold, and "loopback only" is not a boundary The survey bounds the risk with "listens on loopback only and speaks to a page it emitted itself." Neither clause holds: - Any process on the machine can reach a loopback listener. Hot-seat play is explicitly *several people at one machine*. - **Any web page the user visits can reach it too.** A page on the open internet can issue requests to `127.0.0.1` — that is what DNS rebinding and cross-origin POST are. The browser running the table is the same browser reading the internet; that is the whole premise of the option. - "A page it emitted itself" is an assumption the server cannot check unless it is written to check it, and the survey specifies no such check. An unauthenticated loopback endpoint that accepts `POST /command` and mutates authoritative game state is a remote-controlled game from any tab the user has open. **Required, as concrete controls the survey lacks:** an unguessable token minted per process and required on every request; `Origin` and `Sec-Fetch-Site` checked and rejected by default; the listener bound to `127.0.0.1` explicitly rather than `0.0.0.0`; and a test that a request without the token is refused. The last one is the one that matters — the other three are claims until something asserts them. ## C5 — The proposal regresses the finding the previous pass paid for CB-WP-0011's finding, in its own words: a renderer's defect class is **silent omission**, no natural renderer assertion catches it, and the fix is to walk the shape of the input and make silence cost a build. This proposal moves drag hit-testing and command construction into JavaScript embedded in emitted strings — a language `cargo test` cannot run, `clippy` cannot lint, and `M-D1-MUT` cannot mutate. The gate that CB-WP-0011 built stops at the language boundary, and the survey proposes putting the interactive half of stage 1 on the far side of it, one pass after paying to learn why that is dangerous. §6 lists this as "the strongest argument against, and the one T02 should press." Naming a challenge in advance is not answering it. **Required, as controls:** - **JS may not construct commands.** The emitted page reports raw pointer facts — "pointer down on element `id`, up on element `id`" — and Rust decides what command that is. That confines JS to input transport and makes the decision testable by feeding the Rust side synthetic events. - **The coverage gate must cross the boundary.** `every_view_field_is_ classified` must have an HTML counterpart asserting over the *parsed emitted document*, not over the Rust that emits it. Emitting a `