Independent texture argument repair review — 2026-10-24

Verdict: ACCEPT the bounded argument repair and conservative mask reduction for integration. Reviewed candidate 77ec71ebf96aaf7c3ce37d7114821ae74d4da902, implementation 79e81ba5c425d6aa1f8506787d7a7c19909dccac, and original/current remote main 5406777ecbcef9cf9b03b40d592d722bb0086de0. No substantive repair defect was found. This verdict does not accept universal capability truthfulness, full API compatibility or gameplay qualification.

Accepted diff and source findings

The production diff from main is confined to src/09ab-handlers-d3dim-core.wat, src/09a8-handlers-directx.wat and lib/d3dim-gpu.js; the executable fixture is test/test-legacy-texture-operation-caps.js. Ancestor reports/evidence remain historical records, including the earlier rejection of unconditional capability acceptance. No production source or assertion was rewritten during this review.

The actual WAT descriptor writes raw COLORARG1/2 and ALPHAARG1/2 at offsets 164/168/172/176. Its 180 bytes start at scratch +64 and end at +244, inside the actual 256-byte heap allocation. The JS reader consumes DWORDs 41–44. Independent canaries confirm the write does not touch the preceding 64 bytes or bytes after the descriptor, including the allocation boundary. Allocation itself is a fixture double; source inspection establishes its real allocation size.

The actual device initializer zeros the 4096-byte state then installs texture-stage defaults. The eight 32-byte stage slots begin at state +2832, ending before +3088 and within that allocation. Later initializer stores only matrices/depth defaults, so they do not overwrite these slots. The loader/setter preserve zero as DIFFUSE, rather than treating it as missing state. Stage zero defaults are MODULATE/SELECTARG1, TEXTURE/CURRENT operands; subsequent COLOROP defaults are DISABLE. Independent checks cover all eight initialized stages and reject removal of the initializer call.

The software operation words retain the D3DTOP in the low byte, select diffuse ARG1 with bit 8, and texture ARG2 with bit 9. Exact CURRENT=1 resolves to incoming diffuse at stage zero. The combiner constructs separate RGB and alpha operands before selection/multiplication and strips the internal bits before decoding the operation. Raw legacy operation callers retain the old TEXTURE/DIFFUSE convention. Both execute-buffer and DrawPrimitive triangle callers resolve the bound texture and reach the same real textured triangle/raster/span path. The span forwards both words through its alpha-test and ordinary-color paths; the white-texel untextured path explicitly resets both operations to raw MODULATE.

The GPU independently lowers all four exact selectors, maps stage-zero CURRENT to diffuse, and declines unsupported selectors/modifiers before submission. With no bound texture its existing diffuse-only lowering remains. The software unbound fixture verifies dispatch to the existing untextured route; it does not render that separate route. Bound software tests exercise the actual rasterizer, sampler and framebuffer writer. GPU tests inspect lowering at a mocked submission boundary, not WebGL pixels.

Capability scope decision

I accept the ancestor 547460d4dfb6966b72cc28c04efac22a809d784f mask change solely as removal of demonstrated false advertisements: D3DTOP values 1 and 5–10 still produce MODULATE fallback, so their bits are removed from 0x3ff, leaving 0xe for SELECTARG1/SELECTARG2/MODULATE. The remaining operations now honor the reviewed stage-zero DIFFUSE/CURRENT/TEXTURE operands, including explicit zero. This conservative reduction introduces no operation implementation change. It is supported without asserting that every legal caller of those bits is correct. No alternative caps-only integration candidate was needed.

COLOROP=DISABLE still uses a bound texture. Unsupported selectors/modifiers retain legacy software fallback; the GPU declines them. Later-stage CURRENT, multitexture and universal capability truthfulness remain unqualified. The historical test assertion's phrase “exactly proven” is a mask equality oracle, not this review's claim of universal correctness. The old mask oracle and all its rejecting controls are preserved byte-for-byte.

Independent checks and evidence

All 17 producer seal entries were independently checked again. A manifest-only execution reproduced the exact excerpt list/order, ranges, 104276 assembled bytes and SHA-256 2c733550e5b8d20381fee4c69d07c914aa91d11e47ead94de5c314045a36cb05. Exact compiler paths, Git blobs and full-file hashes match the prior accepted compiler identity; individual excerpt byte/line ranges were verified before execution. There was no tool acquisition or full compilation.

Adjacent evidence contains the identity/baseline binding, rejection diagnostics, test execution/cleanup summaries, scripts, accounting contract and resource receipt. The producer's full manifest/modules and the old oracle remain in the sealed ancestor evidence; they were not repackaged or weakened.

Integration, resources and limits

Strict authenticated SSH independently returned remote main at the exact original baseline and the producer task at the exact candidate, with no intervening main changes. Integration is serialized through this existing private checkout and a unique task/legacy-texture-argument-independent-integrate-oct24 branch. Publish the reviewed task commit, recheck actual main, then fast-forward main only if still at the reconciled baseline; verify both remote refs. Final actual SHAs and release are recorded append-only in the root messageboard and private publication receipt.

This session continues the SAME original 64 MiB allocation and SQLite baseline, retaining all positive growth, highwaters, old directories, sessions, prompts and exceptions. The coordinator-authorized capture contract changes only the cumulative internal cap from 786432 to 1048576, preserving the prior 784203 bytes. The old implementation guard remains intact; a new continuation guard adds this session/output roots. Initial required reads are charged by measured source lengths plus a bounded formatting allowance, with no new blanket bootstrap. Narrowed board/source reads corrected internal per-command slicing failures; receipts retain those captures and cleanup. The new guard's isolated rejection leaves the sentinel absent and verifies process-group cleanup. Resource receipts include external outputs, future growth and the 8 MiB reserve; final accounting continues after publication.

Node uses exactly --max-old-space-size=256, a 60-second CPU/wall limit and MemAvailable admission of at least 805306368 bytes. Every compiled module is a small authentic excerpt with one 64 KiB memory. Owned child groups receive TERM, up to five seconds, then KILL if needed; cleanup is verified. No runtime, full/default build, package, download, native suite, browser/WebGL or gameplay execution was authorized or performed. No workers or Claude were launched. Box ID/state/expiry: N/A; no box ownership. Coordinator retains lifecycle ownership and all unrelated historical-accounting, Shadow Man 128 MiB and runtime403 holds remain unchanged. Root shared tracked files/index/refs and the held fixture were not modified.

Recovery roots: /tmp/legacy-texture-caps-independent-accept-oct23 and /tmp/legacy-texture-operation-caps-oct23/repo. Use the new independent-integrate-guard.py and sequential review-driver.py, never nested accounting writers. The sealed producer records remain authoritative for reused evidence; this review's scripts and receipts describe its additional checks.