WallRiderLangWRL CORE 0.1.2 · FROZEN
THE REAL IDENTITY SPINE, IN YOUR BROWSER

Seal a world.

Type WRL Core world source on the left. It is desugared, parsed, validated, canonicalized and hashed as you type — by a JavaScript port of the same spine that runs inside TRVM Forge. The sem- ids below are real: the pinned conformance fixture seals here to the exact id every Forge battery folds against. Nothing is sent anywhere.

Two encodings are read here, and there is no switch to choose between them. A source that declares ir 2.0 on the line after its profile is read as Semantic IR 2.0, where every route carries a name; anything else is read by the frozen IR 1.0 spine. The source decides — never a dropdown, never the last button pressed. A world whose id depended on the interface would not have an id.

self-check: running…

Buttons marked load a world the toolchain refuses — the red bar and its typed code are the demonstration, not a fault in the page. Unmarked buttons seal. Which is which is asserted by the conformance suite, button by button.

IR 2.0 · draft ·
World source
Canonical graph

      
Migration & adoption §D8.16
Canonical artifact bytes

      
Desugared source

      
Derived relations derived · not canonical · not in the bytes
Correspondence with the pinned fixture §D8.5 · a migration claim, computed
SemanticArtifactID

What this page is doing

desugar sugar.v2 parse strict world mouth validate typed codes canonicalize order-independent serialize sorted-key JSON sha-256 → sem-

The reference implementation's canonical bytes are json.dumps(artifact, sort_keys=True, separators=(",",":")). Every value in a sealed artifact is an ASCII string, an integer, a boolean, or a container of those — so a recursive key-sorted serializer reproduces those bytes exactly, and WebCrypto SHA-256 reproduces the id. That is why this playground can be honest rather than illustrative.

The serializer is hand-rolled rather than JSON.stringify for one reason: rotor lanes are BigInt. At w=64 a lane may legally reach 264−1, and a JS number cannot hold it — an authored 9223372036854775807 would serialize as 9223372036854776000 and quietly mint a different id from the arbitrary-precision reference. Lanes are exact here at any width. Every other artifact scalar is bounded to ±(253−1) and refused — never rounded — outside it.

What it deliberately does not do: lower to a backend, compile to interaction-calculus terms, or reduce to a Film. Those live in TRVM and are not a browser's job. This page covers the semantic half of the pipeline — everything up to and including identity.

Where this is stricter than the current Forge parser

Two mouths, one identity function. Every difference below is a rejection, so for every world both accept the canonical bytes are identical — no id can move across the gap. This is the intended Core 0.1.3 tightening, implemented in the browser first because this is the surface an author actually touches.

Things worth trying

And in IR 2.0 (draft)

Crossing between the two encodings

Two buttons, in the Migration & adoption panel, and they are the only two things on this page that mint an id you did not ask for. Neither runs because you typed.