Primary implementation surface
These routes are generated from canonical source. Their exact status remains separate from implementation availability.
Validate advanced Three.js WebGPU/TSL scenes with falsifiable visual contracts, mechanism diagnostics, sustained CPU/GPU timing, refresh-derived budgets, quality-governor traces, tile-GPU resource models, visual-error metrics, leak loops, and stable JSON+PNG evidence.
These routes are generated from canonical source. Their exact status remains separate from implementation availability.
This skill contributes to the following cross-skill owner graphs.
Validation treats an image as a claim to be falsified. A fixed-view contract pins camera, seed, resolution, and time; comparison is perceptual error against a stored baseline:
$$E = \operatorname{quantile}_{0.99}\big(\Delta E_{pixel}\big) < \tau, \qquad \text{plus } \max_{region} \bar\Delta E < \tau_{region}$$Determinism is tested by seed sweeps ($F(seed_1) \ne F(seed_2)$, but $F(seed_1)$ twice is byte-identical) and temporal pairs ($t_0, t_1$ frames must differ where motion exists, match where it doesn't). Performance claims bind to measurements:
$$\operatorname{median}_{30\,frames}(t_{GPU,pass}) \le b_{pass} \quad\text{for every budgeted pass}$$The no-post baseline isolates cause from grade: every effect must be visible with post-processing off, or the effect is the post. Evidence ships as a stable JSON+PNG bundle — capability manifest, renderer.info counters, per-pass timings — so regressions diff cleanly.
Every image identifies what it proves. Page screenshots demonstrate the published presentation only; generated inputs demonstrate asset channels only; canonical acceptance still requires render-target readback and a schema-v2 bundle.
10 published images
generated asset preview
generated asset preview
generated asset preview
generated asset preview
generated asset preview
generated asset preview
generated asset preview
generated asset preview
generated asset preview
generated asset preview
The complete SKILL.md as loaded by agents — verbatim, rendered.
Validate the mechanism that creates the image, its error, and its sustained
cost. A polished frame is not proof. The canonical path is current Three.js
with WebGPURenderer, TSL, NodeMaterial, RenderPipeline, built-in post
nodes, and compute/storage evidence whenever the implementation uses GPU-side
state.
Accept only when all of these agree:
authored physical and visual invariants
-> inspectable implementation and ownership graph
-> mechanism-isolation diagnostics
-> invariant-specific visual-error measurements
-> sustained performance and resource evidence on the target
-> final image inside the declared viewing envelope
Define the contract before tuning. Each invariant names its observable, reference or analytic truth, diagnostic, metric domain, mask, acceptance gate, and blocking failure. Pixel similarity alone cannot prove geometry, radiometry, field evolution, temporal reconstruction, or resource ownership.
Every numeric value in a contract, manifest, table, caption, or conclusion must carry exactly one label and a source:
Authored: a declared input or policy fixed before the run;Derived: computed from labelled inputs by a recorded formula;Measured: observed during this run, with method and sample scope;Gated: an acceptance bound fixed before inspecting the candidate result.Serialize numeric evidence as { value, unit, label, source }. Do not publish
bare budgets, sample counts, resolutions, percentiles, quality constants, or
error thresholds. p50 [Measured] and p95 [Measured] name estimators; their
reported values still use the numeric-evidence record. A gate derived from a
frame envelope is stored twice: the computed envelope as Derived and the
frozen acceptance limit as Gated, with the latter citing the former.
The validation surface uses:
WebGPURenderer from three/webgpu, initialized before capability checks;three/tsl and the matching NodeMaterial family;RenderPipeline ownership graph using pass(), mrt(),
PassNode.setResolutionScale(), and a single output-transform owner;renderer.compute() or renderer.computeAsync() and storage-resource
evidence when simulation, culling, compaction, histories, or generated
instance data are GPU-owned;After initialization prefer renderer.compute() for submission. In r185,
computeAsync() is not a GPU-completion fence; CPU-visible completion needs an
actual readback/map, while GPU timing needs resolved timestamp evidence.
Use references/graphics-validation-protocol.md for the artifact schema, timing protocol, target/storage/bandwidth inventories, visual-error families, lifecycle tests, and rejection criteria.
Set trackTimestamp: true when constructing WebGPURenderer whenever the
predeclared contract requires GPU timing; requesting it after initialization is
too late. Record backend truth only after initialization:
await renderer.init();
if (renderer.backend.isWebGPUBackend !== true) {
throw new Error('WebGPU backend required for canonical visual validation. Report the blocker. Only when the user explicitly requested teaching how to apply fallback when WebGPU is unavailable may threejs-compatibility-fallbacks be loaded.');
}
After the gate, record revision, renderer/backend identity, output color space, tone map, sample count, depth mode, output buffer type, compatibility mode, timestamp support, adapter features, and adapter limits. Wrap every numeric capability or enum in the numeric-evidence record; do not serialize raw numbers.
Budgeted tiers retain the canonical WebGPU mechanism and name every visual loss. They are not compatibility branches. This skill never teaches or embeds a non-WebGPU fallback.
visual-contract.json: invariant-to-artifact bindings, numeric-evidence
policy, target refresh envelope, visual-error gates, performance claims, and
blocking failures;evidence-manifest.json: renderer/backend, target device, browser, display
refresh, gated presentation rate, camera, seed, time, viewport, DPR, quality
state, assets, color pipeline, post graph, stochastic masks, and known compromises;p50 [Measured],
p95 [Measured], deadline misses, GPU timestamps when required, browser and
compositor reserves, presentation cadence, and capture overhead separated;Use the canonical
physics domain and interaction contract
whenever two or more physical domains or a physics-to-render boundary is
claimed. Validate the PhysicsContext, provider schemas, scheduler DAG,
InteractionBatchLedger, InteractionReactionGroup, ConservationGroup,
PhysicsPresentationCandidate, sealed
CameraViewPublication, ViewPreparationPublication,
PhysicsPresentationSnapshot, LightingTransportSnapshot, and append-only
FrameExecutionRecord; a polished coupled animation is not interface proof.
The sealed Snapshot is per presentation target/view and deliberately contains
references. Validate adjacent previous/current presented states and independent
provenance in Candidate pairs, complete render instants/transforms/matrices in
CameraViewPublication, reactive/reset/resource publications in
ViewPreparationPublication, and the Snapshot's exact transitive ID/lease/event
closure. Do not define or accept a reduced validation-local schema. Motion
bindings cover rigid,
skinned, instanced, and procedural deformation plus spawn, despawn, teleport,
reparent, and LOD validity. Motion vectors from solver n/n+1 endpoints fail.
Validate the acyclic lifecycle:
simulation/provider commits + origin rebase
-> immutable PhysicsPresentationCandidate
-> per-view CameraViewPublication
-> per-view ViewPreparationPublication
-> sealed PhysicsPresentationSnapshot
-> depth/velocity/radiance/history/output consumers
-> append-only FrameExecutionRecord of completed reset/submit actions
No stage mutates an earlier immutable record. A one-frame-deferred alternative is
legal only when declared and when the current frame continues using the exact
prior committed resource/version named by its snapshot. GPU descriptors pin
generation, layout, entity-map, slot, and a queue-safe lease through every
consumer submission and until its central reuseProhibitedUntil condition is
satisfied;
retirement must appear in FrameExecutionRecord.leaseDispositionById with its
completion join/evidence. Do not equate
logical state version, submission epoch,
GPU queue availability, or host visibility; computeAsync() is not a fence.
A pre-seal failure must append a FrameExecutionRecord with aborted overall
status (or partial-failure when another target survives), exclude the failed
target from snapshotIds, store typed absence in its target execution's
snapshotId, cancel/defer actions, retire only failed-target-exclusive
preparation leases, and retain Candidate leases until every surviving consumer
joins through leaseDispositionById. Device loss must append overallStatus: device-lost
and affected target statuses device-lost, advance deviceLossGeneration, cancel actions, and
invalidate lost-generation resources/leases without mutating immutable
Candidate/Snapshot records or fabricating a completion token. Rebuild histories
and timing proof under the new generation.
Acceptance requires schema/version/unit/axis checks; DAG edge and barrier
ordering; step/subcycle convergence for numerical solvers; provider validity,
uncertainty, and error propagation; source/flux/conservation and equal-and-
opposite reaction residuals for claimed conserved quantities; rebase
invariance; deterministic reset; and conservative quality-state migration.
Require the exact central QualityTransition when a migration changes
physics-facing state or provider semantics, cadence, represented
support/band/filter, error bounds, inventories, stable IDs/RNG streams, or event
and exact-once application-ledger cursors. A render-only tier change may remain
local only when those contracts and every committed physical version are
unchanged; the trace must prove that exclusion.
Every unsupported channel must remain explicitly unavailable rather than
becoming zero or an invented adapter default.
Validate exact ledger and publication closure, not record presence. Every
ErrorPropagationLedger input, transform/filter/interpolation, local term,
correlation rule, output error, and consumer gate must resolve. Every applied
InteractionRecord.applicationLedgerKey must resolve to exactly one accepted
row in the canonical InteractionApplicationLedger, matching its batch's
sequence range, per-consumer cursor, and exactOnceApplicationLedgerVersion.
Every successful commit must close its PhysicsStageWrite and
StateAdvanceClaim through PhysicsPreparedPublication, PhysicsCommitGroup,
PhysicsCommitTransaction, PhysicsCommitReceipt, and exact
CommitPublicationLineage, including content/publication digests, dependency
completions, gate results, and the single atomic registry swap. The Candidate,
Camera, ViewPreparation, sealed Snapshot closureManifest,
plannedConsumerActions, submitted pass/dispatch keys, action results,
completion tokens, and lease dispositions are one immutable render-plan closure
through FrameExecutionRecord; no orphan, duplicate, subset, or superset is
accepted.
Run one deterministic end-to-end interaction fixture:
exactly one precipitation ingress per interval:
causal-cloud PrecipitationEmissionSnapshot
OR external EnvironmentForcingSnapshot precipitation channels
-> rain ground/water flux
-> water mass and momentum source
-> boat buoyancy/drag/reaction
-> wake source
-> wave/breaking dissipation
-> one foam source/history
-> shoreline wetness
-> vegetation wetness/load and boat/terrain/vegetation contact
Capture each provider input/output, event/source record, reaction owner, residual, reactive epoch/mask, reset action, and final visual contribution. Disable each link in turn; downstream state must change only through declared dependencies. This fixture must also cross an origin rebase, simulation-rate change, quality migration, resize/DPR transition, and an external pose-stream gap or error.
The two precipitation ingress arms are mutually exclusive over one
PhysicsTimeInterval. Never consume or merge both: record the selected source/version and
make the other arm typed absence. Cloud-owned precipitation must traverse its
PrecipitationEmissionSnapshot and transport delay; externally prescribed
precipitation must use the forcing snapshot's mass-flux, phase, and velocity
channels without fabricating a cloud emission.
For every domain and target, record coordination intervals, per-owner native
ticks/subcycles, compute dispatches, render passes, queue submissions,
executions per presented frame, barriers,
readbacks (steady-state physics/render readback is normally zero), hot working-
set bytes, resident and peak/migration-overlap bytes, compulsory reads/writes
per execution, traffic per presented frame, upload volume, timing-query resolve
latency, CPU/GPU/presentation distributions, and settled quality. A mobile
claim requires this evidence on the named physical low-power device.
Separate route-shared simulation/provider/Candidate work and resources from
per-target/view Camera/ViewPreparation, pass, attachment, history, and output
work in the canonical PhysicsCostLedger. Validate each view, count shared
costs once, apply exact multiview and
frames-in-flight multipliers, and report both the per-view rows and composed
mobile total; neither multiplying shared work by view count nor hiding
view-local cost in an amortized aggregate is valid.
Do not use a universal device-class millisecond table. For each target
device/browser/display/viewport/DPR combination, record requested presentation
rate Authored, actual display refresh Measured, and a feasible frozen target
rate Gated; derive its frame period Derived by dimensional inversion.
Measure the browser main-thread reserve and compositor/GPU reserve with a
pass-through host-shell run under the same conditions. An unmeasured reserve
may be Authored as a provisional assumption, but it cannot support a claim of
measured device headroom.
Derive separate stage envelopes:
CPU scene envelope [Derived]
= refresh period [Derived]
- browser/main-thread reserve [Measured or provisional Authored]
- CPU safety reserve [Authored]
GPU scene envelope [Derived]
= refresh period [Derived]
- compositor/GPU reserve [Measured or provisional Authored]
- GPU safety reserve [Authored]
Use reserve quantiles consistent with the frozen tail-latency gate. If the host shell exposes only combined browser/compositor overhead, subtract that combined reserve once and mark the stage attribution unavailable; never subtract correlated or overlapping reserves twice.
CPU and GPU stages may overlap; do not add their durations unless a measured
dependency serializes them. Freeze p95 [Gated] stage limits and deadline-miss
limits as Gated values sourced from these envelopes. Record presentation cadence
and dropped/deferred frames independently. Initialization, compilation, asset
upload, readback, PNG encoding, and automation overhead are separate measured
phases, never silently removed from end-to-end startup or capture claims.
Performance acceptance requires both cold and sustained traces on each target
class. Window durations, sampling cadence, workload path, and thermal
stabilization rule are Authored; minimum sample and residence requirements
are Gated. Report per-window CPU and GPU p50 [Measured] and
p95 [Measured], presentation intervals, deadline misses, memory trend, active
quality state, and quality transitions.
The sustained verdict uses the final stable window, not an average that hides
late throttling. Temperature, clocks, power, and hardware counters are
Measured when exposed. If they are unavailable, report only observed timing,
cadence, memory, and quality drift; do not claim absence of thermal throttling.
An emulator or desktop emulation is not evidence for a low-power target.
An adaptive governor passes only if the settled tier meets both the performance gates and its visual-error gates. Oscillation, repeated emergency drops, unbounded recovery, or satisfying timing by crossing the visual-error gate is a failure. Log the exact decision metric, filtered value, threshold, hysteresis, dwell interval, transition cause, and resource rebuild cost.
The contract declares gpuTimingRequirement before capture. GPU timestamp
timing is required for claims about GPU headroom, per-pass or per-dispatch
cost, GPU thermal degradation, bandwidth limitation, or compliance with a GPU
stage envelope. When required timing is unavailable, the verdict is
INSUFFICIENT_EVIDENCE; it is not SKIP, zero cost, or a pass. CPU frame time,
animation-frame cadence, and presentation intervals remain useful end-to-end
measurements but cannot identify GPU cost.
Resolve and record render and compute timestamp scopes separately. Timestamp resolution/readback is a measured auxiliary phase and cannot contaminate the steady-state sample window.
Visual correctness, deterministic behavior, and lifecycle checks may be signed off separately only when the contract explicitly excludes GPU performance claims. Record the unsupported claim and the device/browser needed to close it.
For low-power and tile-based GPUs, inventory more than allocated target bytes. Derive and gate:
Do not infer tile dimensions, on-chip occupancy, cache hit rate, compression,
or physical bandwidth from WebGPU abstractions. Such values are Measured
only when hardware counters expose them. Otherwise publish a Derived model
with uncertainty and reject any claim that the scene is proven
bandwidth-bound. Avoid avoidable attachment stores, resolves, full-resolution
histories, and pass breaks before reducing the mechanism.
Choose metrics per invariant and before seeing the candidate result:
Every result is Measured; every acceptance threshold is Gated. Store metric
domain, units, reference provenance, alignment, mask, percentile statistic,
and aggregation rule. Report spatial error maps and worst-case captures, not
only a scene-wide scalar. A stochastic mask must be authored before capture and
cannot hide deterministic failure.
Use this profile for procedural island, coast, reef, beach, and shallow-water scenes such as the supplied isometric archipelago reference family. Read the coastal archipelago system to identify the selected water branch and its invariants, then apply the coastal evidence protocol.
Treat the reference as a causal feature ledger, not a color thumbnail. Record and independently validate:
The evidence bundle must prove one shared coast/bathymetry transform. Capture the coast level set, terrain elevation and semantic regions, bathymetry, coast frame, compiled land boundary, rendered water intersection, foam source, foam history, wetness, and asset support/exclusion masks. A visually close frame fails when those signals are independently authored and merely happen to align at the design camera.
Freeze exact cameras for archipelago-overview, island-design, coast-near,
and grazing-water. At each applicable view capture final, no-post, semantic
terrain groups, land/coast field, bathymetry/depth, water state and normals,
optical thickness, foam source/history, asset constraints, LOD/chunk seams,
camera/framing overlay, and output ownership. Add an underwater or
water-crossing view only when the contract claims underwater rendering or a
camera transition.
Use native-domain gates fixed before candidate inspection:
Run deterministic representative and stress seeds selected before inspection. Exercise reset, steady forcing, stronger forcing, local disturbance, camera motion, resize/DPR, quality transition, and long sustained evolution when the selected mechanism makes them relevant. A still frame cannot sign off foam advection, simulation boundaries, LOD registration, history decay, or frame-rate-independent evolution.
Validate Full, Budgeted, and Minimum viable states as separate visual
contracts. Every state preserves coastline identity, semantic terrain order,
bathymetric ordering, water/normal state agreement, foam causality, landmark
support, and the single output owner. Lower states may reduce projected-error
detail, local-water or foam resolution/cadence, sub-pixel wave bands,
secondary asset population, caustics, or clouds only after the corresponding
error gate passes. Never bind a state to “desktop,” “integrated,” or “mobile”
by label; select the stable state from sustained measurements on a named
physical target.
For each physical desktop-discrete, integrated, and low-power/mobile target,
record simulation executions per presented frame, compute and render pass
cadence, storage and history layouts, per-step reads/writes, uploads,
attachment load/store/resolve behavior, logical live bytes, peak simultaneous
transients, and p50 [Measured]/p95 [Measured] CPU, GPU, and presentation
distributions. A device-class name or a universal millisecond table is not an
acceptance envelope. If GPU timing required by the claim is unavailable, keep
the visual verdict separate and return insufficient GPU-performance evidence.
Reject the coastal claim on a visible land-water gap or overlap, coast or foam swimming, shallow/deep response that contradicts bathymetry, refracted geometry crossing an occluder, non-finite water state, invalid normal, solver boundary leak, unbounded foam history, floating/buried landmarks, forbidden vegetation support, unstable seed identity, or any quality transition that changes the primary composition or crosses a frozen error gate.
SRGBColorSpace.NoColorSpace or explicit
linear-data semantics.RenderPipeline or an explicit renderOutput() stage owns the sole output
conversion.Reject or narrow the claim when any required invariant lacks a direct
diagnostic and metric; the final relies on post treatment to create missing
form; visual-error gates fail; sustained p95 [Measured] or deadline gates
fail; the governor settles outside the visual contract; required GPU timing is
unavailable; tile/resource evidence omits a material cost; deterministic reset
fails; or lifecycle loops leak persistent resources.
This skill evaluates an implementation; it does not supply the subject
mechanism. Load threejs-choose-skills first, then only the selected subject
and image-pipeline skills. If canonical WebGPU is unavailable, report the
blocker. Do not load, quote, or propagate compatibility fallback teaching
unless the user explicitly requests teaching how to apply fallback when WebGPU
is unavailable.
Preserved concept proxies and generated-asset previews. They are excluded from primary completion counts and link to the canonical lab through the schema-v2 registry.