Sovereign Renderer · Hardened Evidence · 2026-07-21
Six capability rungs built from a bare CUDA context up to a subsurface-scattering skin material — each one validated by a physics test with a pass/fail number, not by how it looks. Every render below was produced by our own kernels on the GPU, in userspace only, so nothing here can write firmware.
A kernel we wrote is compiled to PTX at runtime by nvrtc and launched through the CUDA driver API — entirely in userspace. No kernel-mode driver, no firmware, VBIOS or NVRAM write exists anywhere in the path, so this cannot brick hardware.
The toolchain finding that made it possible: nvcc is unusable here (no MSVC host compiler), so the way onto the GPU is runtime compilation + a gcc-built host that dynamically loads nvcuda.dll.
Colour bleed is visible — the floor picks up red on the left, green on the right. But "visible" isn't proof, so the walls were neutralised to grey and the scene re-rendered. If the tint is really indirect light off the coloured walls, it must vanish.
| patch | colored | control | GI effect |
|---|---|---|---|
| near red wall | +18.0 | +4.0 | +14 red |
| center | +2.0 | +1.0 | ~0 |
| near green wall | −6.0 | +4.0 | +10 green |
Under uniform illumination, a surface must reflect exactly its albedo (0.90 here). More than that is energy creation — a bug. The test caught, then confirmed the fix of, a diffuse/specular coupling error, and isolated the remaining loss as the known single-scatter deficit.
| rough .08 | rough .40 | rough .85 | |
|---|---|---|---|
| metal 0.0 | 0.903 | 0.905 | 0.884 |
| metal 1.0 | 0.902 | 0.873 | 0.435 |
deficit rough metal 0.435 = single-scatter GGX loss — carried to rung 04.
The rung-03 deficit was the named debt. A GPU-precomputed directional-albedo table drives the standard multiscatter compensation; the win condition was never "looks brighter" — it was the furnace re-measuring the lost energy back without crossing 1.0.
| rough .40 | rough .85 | max | |
|---|---|---|---|
| metal 1.0 | 0.873 → 0.901 | 0.435 → 0.863 | 0.905 |
Volumetric random walk — the method Arnold and RenderMan use for skin, not a diffusion approximation. A purely-scattering sphere (no absorption) must be invisible in a furnace: every photon that enters has to exit. Measured over all 1,048,576 pixels, not a patch.
| scene | mean | Δ vs reference |
|---|---|---|
| reference (no sphere) | 127.000 | — |
| albedo 1.0 sphere | 127.000 | 0.000 |
| albedo 0.7 sphere | 93.385 | −33.6 (absorbs) |
Unifying the rough-dielectric surface (rung 03) with the colored subsurface interior (rung 05) into a single material — which also eats the debt of keeping them separate. Per-channel, full-frame: a white version stays invisible; a reddish one must tint the whole frame red with no channel exceeding the background.
| material | R | G | B |
|---|---|---|---|
| reference | 127.0 | 127.0 | 127.0 |
| white skin | 126.7 | 126.7 | 126.7 |
| reddish skin | 108.2 | 89.6 | 87.9 |
honest physically correct, but it reads as dark reddish wax — not flesh. No texture/pores, isotropic (not forward) scattering, optically thick, harsh light.
Real skin scatters light forward, not isotropically. A Henyey-Greenstein phase function passes the energy check — a forward-scattering white sphere stays invisible in the furnace, because the phase function is normalized. But I predicted it would transmit more backlight, and the full-frame measurement refuted that flat out.
| test | value | verdict |
|---|---|---|
| furnace, white g=0.8 | 126.67 (Δ0.33) | energy conserved |
| backlit isotropic g=0 | 91.84 | — |
| backlit forward g=0.8 | 90.48 | 0.985× — not more |
honest forward scattering redistributes the glow directionally (visible) but does not raise net transmission at this optical thickness — the optimistic claim died on the number, which is the point of measuring.
Perturbing the surface normal with high-frequency noise adds micro-geometry — the specular coat highlight shatters into a stippled, pore-like pattern, and energy stays conserved (a bump changes direction, not light). But measuring it was a cautionary tale worth publishing.
| samples | no bump | pores | ratio |
|---|---|---|---|
| 512 spp (noisy) | 14.71% | 15.48% | 1.05× — confounded |
| 4096 spp (clean) | 2.91% | 4.40% | 1.51× |
honest the 512-spp "detail" was ~80% Monte-Carlo noise — a per-pixel gradient metric is invalid until the noise is suppressed. And it reads as leathery/orange-peel, not human pores.
The render kernels had grown four copies of the same vector / RNG / GGX / noise code. Extracted into one shared device header, handed to the runtime compiler as an include; the skin kernel dropped to 67 lines. A refactor must change nothing — and the furnace proves it, to the byte.
| check | result |
|---|---|
| furnace, before → after refactor | R108.2/G89.6/B87.9 — bit-identical |
| "g=0.8 broke it" (read R104) | false alarm — HG absorption, not the refactor |
| "multi-octave pores are finer" | refuted — 1.28× vs 1.51×, softer |
honest a false regression (isolated by holding a variable fixed) and a false improvement (measured) — both caught before shipping. The other three kernels still carry their copies; that's next.
Value noise gives broad dimples, but skin is cells. Driving the surface normal from a Worley cell-distance field instead reads — by eye — as a fine pore-cell stipple, nearer to skin than the earlier orange-peel. The honest catch is in the number.
| surface | density | vs smooth |
|---|---|---|
| value-noise dimples | 4.40% | 1.51× |
| cellular pore-cells | 4.22% | 1.45× — lower |
honest an edge-count metric measures detail quantity, not pattern type — it can't tell "pore-like" from "bumpy." That blind spot is the case for a perceptual vision-model judge, which this stack still lacks.
Every earlier rung had a physics invariant to check. "Does this read as skin" has none — it needs a perceptual judge, so Claude's vision is the benchmark: it ranks cellular > value > smooth. The real question is whether a mechanistic (Nishi-side) judge can reproduce that ranking.
| feature | smooth | value | cellular | matches Claude? |
|---|---|---|---|---|
| Claude vision | 12 | 20 | 26 | — benchmark |
| fine edges @18 | 2.91 | 4.40 | 4.22 | no — value>cellular |
| sharp edges @40 | 0.17 | 0.76 | 0.68 | no — value>cellular |
| fine/coarse freq | 0.86 | 0.53 | 0.52 | no — smooth highest |
hardened "pore-like" is spatial organization, not edge quantity — a statistical judge provably can't match Claude here. The Nishi side needs a vision model that reproduces this ranking, then the scores; it doesn't exist yet. That is the load-bearing gap.
Rung 11 proved the load-bearing gap was a perceptual judge, so I stood one up: Qwen2.5-VL-3B running on the 5080 via llama-server — a local vision model doing both jobs, captioning and judging. Captioning works. Matching Claude's skin-realism ranking does not — and I measured that four ways rather than assert it.
| task | result | matches Claude? |
|---|---|---|
| captioning | "smooth dark red sphere, subtle reflection" / "swirling pattern" | yes — works |
| absolute skin score | 20 / 20 / 20 | no — no discrimination |
| comparative rank | reasoning right, final string garbled | no — unstable |
| pore-density proxy | smooth 30 · value 75 · cellular 60 | no — matches the metric, not Claude |
hardened Claude's "cellular looks more like skin" is a subtle skin-semantic call that neither scalar metrics nor the 3B VLM reproduce — both rate value-noise as bumpier. A 7B model is downloading to test whether scale closes it. Never-brick: the VLM is userspace GPU inference.
Scaling to Qwen2.5-VL-7B and — crucially — fixing the extraction protocol (score all three surfaces in one structured response, not one flat number at a time) the local vision model now reproduces Claude's ranking. The earlier flat scores were the model fumbling its output format, not failing to see: its reasoning had the order right all along.
| run | smooth | value | cellular | order |
|---|---|---|---|---|
| 1 | 0 | 30 | 70 | cellular > value > smooth ✓ |
| 2 | 0 | 20 | 50 | ✓ |
| 3 | 0 | 20 | 60 | ✓ |
| 4 | 0 | 20 | 40 | ✓ |
proven the exact judgment three scalar metrics could not make (rung 11), a local vision model on the 5080 now makes reliably. It matches Claude's ordering — the discriminating call — not identical scores. The perceptual judge exists; captioning improved too (it read the Cornell walls and ceiling light correctly). Both birds delivered.