Legacy stage-zero DISABLE repair — 2026-10-24

Base: strict authenticated SSH remote main eb0c0a71c93c98bb2e394629e2c093bdcd4a9baf. Implementation is isolated on task/legacy-texture-disable-current-main-oct24, pending independent coordinator review/integration.

Microsoft's D3DTEXTUREOP contract defines DISABLE=1, terminating that stage and all later stages; stage zero disables texture mapping. Its blending contract states that disabling color also disables alpha. The bounded stage-zero result is therefore incoming diffuse RGBA. ALPHAOP=DISABLE with enabled color is undefined; this repair makes no new promise for that combination.

The software bound-texture resolver now returns no active texture for stage-zero COLOROP=DISABLE, before resolving its slot or examining its pixels/color key. Both execute-buffer and DrawPrimitive triangle front ends then take the existing diffuse route. Stored bindings remain intact. The standalone stage combiner also returns incoming diffuse RGBA before operand selection, including when internal selector bits are present. GPU triangle lowering independently rejects texture activation for a disabled stage and uses its established diffuse-only stage; this remains correct even when given a descriptor containing bound texture metadata. Capability mask 0xe, enabled independent alpha, unsupported operation/selector behavior and all later-stage support limits remain unchanged.

Evidence

node --max-old-space-size=256 test/test-legacy-texture-disable.js passes eight bound/unbound × ALPHAOP 1/2/3/4 configurations with nonwhite a0c08040 texels and unequal-alpha diffuse 8060a0e0. It verifies the two actual front ends choose the existing diffuse route (that route is a fixture double), binding preservation, ignored unsupported operands/color keys, all seven initialized subsequent disabled stages and actual textured triangle/raster/span framebuffer output when invoked directly. This does not qualify the separate untextured rasterizer; its established behavior is reused. GPU checks inspect actual descriptor/lowering at mocked submission, not WebGL pixels.

Exact baseline software fails with a0485038 versus expected 8060a0e0 for COLOROP=DISABLE/ALPHAOP=SELECTARG1. Exact baseline GPU fails because it submits one texture where zero is required. Candidate passes. Three discriminating reversions restore the old software activation, old combiner and old GPU activation independently; each rejects on a specified semantic assertion, not a compiler/import/setup failure. An initial malformed test mutation was corrected before this acceptance; its output remains in the session history.

The producer initially left test/test-legacy-texture-operation-caps.js unchanged and omitted its obsolete DISABLE diagnostic at execution. Independent review replaced that runtime rewrite with an explicit source update: only DISABLE leaves the unsupported-operation list/map, and the printed count becomes six. The DISABLE contract is tested in the new test. The nearby test now runs directly: 144 argument combinations, nine RGB/alpha pairs, six remaining unsupported operations, defaults/CURRENT/unbound/modifier checks, original mask oracle and all 15 rejecting mutations PASS. The review also tests disable then re-enable on the same object, retaining the texture binding and independent diffuse alpha.

The byte-identical independent argument-reproducer.js passes. Its hardcoded donor path is redirected by the retained preload to candidate files and imports; assertions are unchanged. Batching and points regressions PASS. No full build, native/COM, WebGL, box or gameplay claim.

Retained evidence includes compiler Git blobs/full-file SHA-256 and byte-exact excerpt offsets/order/hashes: 104827 assembled bytes, SHA-256 997006b0cb75e170a9d05a1501fe2c4b45e4076eb76fbb89d89425299b5ff225. Only authentic small excerpts are compiled with one 64KiB fixture memory. Producer compiler manifest was sealed after initial tests; this timing exception is disclosed. Independent review verified matching compiler identities and exact excerpt recipe before its compilation. Machine-specific generated receipts were removed from the final source tree; they remain recoverable from producer commit a656ac9013f0c47f22d3c5691afe06ef67ae90dd and the sealed producer allocation. All compiler inputs match the accepted standing donor, with no acquisition.

Resources, recovery and limits

Private allocation /tmp/legacy-texture-disable-current-main-oct24; root tracked files/index/refs, donor files/index/refs/config/objects and predecessor receipts are untouched. New explicit non-cone sparse checkout uses a read-only Git object alternate to the authorized donor. Initial focused closure: 2514217 bytes; initial projection 36068649 bytes within 64MiB, after-projection host free 4394939095 bytes. Final receipts include owned bytes, session/launcher output, positive external SQLite growth, 12MiB future growth and 8MiB reserve. Installed tools (including the large existing Node executable) and immutable donor are standing inputs, never copied as hidden task allocation. No newly created file approaches 24MiB.

All test invocations use installed Node with max-old-space-size=256, 60s CPU/wall and MemAvailable >=805306368. Tests finish under one second each. Initial instruction and some focused captures exceeded intended slice sizes; retained and conservatively charged in the independent 1MiB capture allocation. One initial run label was reused, overwriting its local log; the complete original output remains in the session history, and the runner now prohibits overwriting. Historical resource receipts and predecessor receipts remain unchanged. These qualifications are not platform/resource denials.

Recover the generated receipts with git show a656ac90:docs/re-notes/legacy-texture-disable-20261024/FILE. The compact run driver expects checkout at B/repo, baseline WAT/GPU recovered with git show eb0c0a71:PATH into B/baseline-core.wat and B/baseline-gpu.js. Run the focused test, the nearby test directly with --negative-controls, batching and points with the recorded Node limits. For the unchanged reproducer, use the retained preload and REPRO_RECEIPT. Local receipts/session logs preserve additional execution history; hashes are recorded in the final local seal. No packages/downloads/full compilation are needed.

No box assigned: ID/state/expiry N/A. Coordinator retains shutdown ownership. Worker stops after verified task-branch publication; no main integration authority.