@descix/frqtl-node 0.6.1-p3.4 → 0.7.0-p1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CLAUDE.md +3 -3
  2. package/README.md +4 -3
  3. package/dist/dist-manifest.json +26 -56
  4. package/dist/frqtl/experiments/_shared/empty-sketch.js +17 -0
  5. package/dist/frqtl/objects/setup/setupBlackbodySubstrate.js +6 -6
  6. package/dist/frqtl/objects/setup/setupFxSmoke.js +2 -2
  7. package/dist/frqtl/objects/setup/setupG3Collide.js +1 -1
  8. package/dist/frqtl/objects/setup/setupSphereEmitter3D.js +2 -2
  9. package/dist/frqtl/objects/v1-replacements.js +1 -1
  10. package/dist/frqtl/parts/OvenBox.js +2 -2
  11. package/dist/frqtl/parts/SphereEmitter.js +1 -1
  12. package/dist/shim/engine/router.js +18 -6
  13. package/dist/shim/engine/site-assemble.mjs +268 -0
  14. package/dist/shim/engine/site-graph.js +42 -14
  15. package/dist/shim/host/device.js +1 -1
  16. package/dist/shim/index.js +3 -7
  17. package/dist/shim/notebook/catalog.js +2 -2
  18. package/dist/shim/notebook/format.js +1 -1
  19. package/dist/shim/notebook/knob.js +1 -1
  20. package/dist/shim/notebook/notebook-knobs.js +1 -1
  21. package/dist/shim/project/specifiers.js +8 -8
  22. package/dist/shim/registry/copy-gate.js +3 -3
  23. package/dist/shim/registry/index.js +9 -12
  24. package/dist/shim/registry/roster-link.js +142 -0
  25. package/dist/shim/registry/roster.js +595 -0
  26. package/dist/shim/registry/scene-source.js +80 -105
  27. package/dist/shim/registry/studio-landing.js +15 -7
  28. package/dist/shim/render/sun-look.js +1 -2
  29. package/llms.txt +4 -2
  30. package/package.json +1 -1
  31. package/dist/frqtl/scenes/absorbing-wall-3d.js +0 -37
  32. package/dist/frqtl/scenes/absorbing-wall.js +0 -36
  33. package/dist/frqtl/scenes/atomic-model.js +0 -91
  34. package/dist/frqtl/scenes/big-bang.js +0 -49
  35. package/dist/frqtl/scenes/blackbody.js +0 -84
  36. package/dist/frqtl/scenes/circuit-sat.js +0 -131
  37. package/dist/frqtl/scenes/collision-matrix-3d.js +0 -110
  38. package/dist/frqtl/scenes/counting-wall-3d.js +0 -40
  39. package/dist/frqtl/scenes/counting-wall.js +0 -42
  40. package/dist/frqtl/scenes/double-slit.js +0 -34
  41. package/dist/frqtl/scenes/dse-one-emitter.js +0 -200
  42. package/dist/frqtl/scenes/dse-one-slit.js +0 -118
  43. package/dist/frqtl/scenes/dse-photoelectric.js +0 -74
  44. package/dist/frqtl/scenes/dse-tunnel-rebuild.js +0 -279
  45. package/dist/frqtl/scenes/dse-two-emitters.js +0 -201
  46. package/dist/frqtl/scenes/dse-two-slits.js +0 -136
  47. package/dist/frqtl/scenes/empty.js +0 -17
  48. package/dist/frqtl/scenes/laser-buildup.js +0 -56
  49. package/dist/frqtl/scenes/mirror-3d.js +0 -60
  50. package/dist/frqtl/scenes/mirror-route.js +0 -164
  51. package/dist/frqtl/scenes/mirror.js +0 -42
  52. package/dist/frqtl/scenes/omni-3d.js +0 -30
  53. package/dist/frqtl/scenes/omni-source.js +0 -25
  54. package/dist/frqtl/scenes/self-interference.js +0 -42
  55. package/dist/frqtl/scenes/smoking-gun.js +0 -126
  56. package/dist/frqtl/scenes/straight-walk.js +0 -25
  57. package/dist/frqtl/scenes/sun.js +0 -42
  58. package/dist/frqtl/scenes/two-source.js +0 -42
  59. package/dist/frqtl/scenes/wave.js +0 -29
  60. package/dist/shim/engine/artifact-shell.js +0 -211
  61. package/dist/shim/registry/exhibits.js +0 -436
  62. package/dist/shim/registry/scene-roster.js +0 -35
  63. package/dist/shim/registry/showcase-link.js +0 -61
  64. package/dist/shim/registry/walkthrough.js +0 -752
package/CLAUDE.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  A discrete cellular-automata physics engine (compiled Rust → WASM) for node: the same modules as
4
4
  `@descix/frqtl-web` (one source, built twice), plus the node engine door `bootNode` and the hosted eyes.
5
- `0.6.1-p3.4` (npm dist-tag `next`). Node ≥ 22.12.
5
+ `0.7.0-p1` (npm dist-tag `next`). Node ≥ 22.12. See it run: https://egpt-frqtl.descix.net
6
6
 
7
7
  ## Install
8
8
  npm install @descix/frqtl-node
@@ -56,8 +56,8 @@ try {
56
56
  ```
57
57
  - REGENERATE-grade or nothing: hosting re-runs the scene, so the project is required; an ad-hoc or
58
58
  raster-only scene is refused by name. The page and this process compute the same project identity.
59
- - The picture is SOURCE + declared renderState. A rung's look lives on its registry row: pass
60
- `effectiveRenderState(rung, mode)` (`./registry`).
59
+ - The picture is SOURCE + declared renderState. A scene's look lives on its row of a loaded roster: pass
60
+ `effectiveRenderState(row, mode)` (`./registry`, on the bag `loadRoster(href)` returns).
61
61
  - The browser is a real, pinned dependency reached only by `./eyes`; bring your own via `browserType`.
62
62
  - Every still's `build.gl` records the raster path the browser actually used.
63
63
 
package/README.md CHANGED
@@ -4,7 +4,8 @@ FRQTL for node: a discrete cellular-automata physics engine (compiled Rust → W
4
4
  local per-pixel rules — a frame moves one pixel per tick, single occupancy, momentum — rather than force
5
5
  equations. Interference, blackbody spectra and atom-like binding emerge from the automaton.
6
6
 
7
- `0.6.1-p3.4` (npm dist-tag `next`). Node ≥ 22.12.
7
+ `0.7.0-p1` (npm dist-tag `next`). Node ≥ 22.12. See it run: https://egpt-frqtl.descix.net (the showcase scenes in
8
+ STUDIO and the GYM).
8
9
 
9
10
  ## Install
10
11
 
@@ -32,10 +33,10 @@ const tick = u.doTick(); // TickData: fr
32
33
  | `./eyes` | `openHostedEyes` — a `composite` still through the REAL renderer, in a managed headless browser (pulls the pinned `playwright`) |
33
34
  | `./parts`, `./parts/*` | the parts barrel; one part = one file |
34
35
  | `./project` | `FRQTL_WEB_SPECIFIERS`, `libPathOf`, `importMapFor`, `pageImportMapFor`, `FRQTL_WEB_HOST_SPECIFIERS`, `linkProject`, `sketchProject`, `SKETCH_ENTRY`, `projectIdentity`, `MANIFEST_FILE`, `MANIFEST_KEYS`, `normalizeManifest`, `parseManifest`, `serializeManifest`, `manifestFor`, `RECORD_FILES`, `RECORD_KEYS`, `CHANGE_KEYS`, `OPS`, `BY`, `CLIP_SECONDS`, `CLIP_NAME`, `clipName`, `jsonText`, `rowFaults`, `recordFolderFaults`, `applyRows` (stands alone: no other import is needed) |
35
- | `./registry` | the walk-through rungs, the showcase roster, the scene list (`sceneGroups`), `projectOf`, a showcase tile's link (`showcaseHref(row)` relative to the serving site, `showcaseUrl(row)` absolute on `SHOWCASE_SITE.origin`; `row` is an element of the same imported `EXHIBITS`, and the link carries the row's effective mode on a multi-mode rung), and how STUDIO resolved the link it opened with (`STUDIO_LANDING_ATTR` on `<html>`, a `STUDIO_LANDING_OUTCOMES` id) |
36
+ | `./registry` | the roster contract and its readers, as in `@descix/frqtl-web`: a host's roster (JSON) names its scenes and the package ships no scene rows. `loadRoster(href)` (a `file:` URL in node) → the frozen bag every reader takes first (`normalizeRoster`, `ROSTER_KEYS`); scene rows (`walkthroughById`, `walkthroughModes`, `effectiveRenderState`, `walkthroughIs3D`, `firstContactOf`, `sceneGroups`, `sceneUrlOf`); showcase cards (`exhibitFor`, `showcaseCard`, `showcaseIntro`, `showcaseHref(roster, card)`, `showcaseUrl(roster, card)`); `projectOf(roster, id, { mode })`, `emptyProjectOf({ router })`; `STUDIO_LANDING_ATTR`, `STUDIO_LANDING_OUTCOMES` |
36
37
  | `./kinds` | `registerKind`, `kindNamed`, `kindOf`, `registeredKinds` |
37
38
  | `./host-view` | `declareHostView`, `HOST_VIEW_OUTCOMES`, `CONTRACT_VIOLATIONS`, `HOST_SDK_SCRIPT` — the DeSciX host-view declarer (pure: a node test can drive a call site with a stub SDK) |
38
- | `./site-graph` | `SITE_GRAPH_DIR`, `SITE_BUILD_ATTR`, `SITE_BUILD_ID_RE`, `siteBuildStampOf`, `STATIC_APP_PAGE`, `HOST_PROVIDED_ATTR`, `SITE_PLACEMENTS`, `SITE_ENTRY_PAGES`, `isSiteEntry`, `siteGraphFaults` — the static site's shape (graph directory, build-stamp attribute, build id pattern and its reader, IDE entry page, the attribute declaring a file host-provided, the graph directory of each placed package, the entry pages) and the rule that a served graph is the placed releases' bytes, for a reader of a served site (both packages) |
39
+ | `./site-graph` | `SITE_GRAPH_DIR`, `SITE_BUILD_ATTR`, `SITE_BUILD_ID_RE`, `siteBuildStampOf`, `STATIC_APP_PAGE`, `SITE_STUDIO_DIR`, `HOST_PROVIDED_ATTR`, `SITE_PLACEMENTS`, `SITE_ENTRY_PAGES`, `isSiteEntry`, `siteGraphFaults` — the static site's shape (graph directory, build-stamp attribute, build id pattern and its reader, IDE entry page, the attribute declaring a file host-provided, the graph directory of each placed package, the entry pages) and the rule that a served graph is the placed releases' bytes, for a reader of a served site (both packages) |
39
40
  | `./register` | installs the resolve hook for a sketch's `@descix/frqtl-web/...` imports (`node --import @descix/frqtl-node/register`) |
40
41
  | `./shim/controls/registry.js`, `./shim/render/sun-look.js`, `./compat/renderer/display-slot.js`, `./compat/renderer/orbit-bag.js`, `./objects/setup/_collisionMatrixLanes.js`, `./compat/engine.js` | the six non-part modules a scene may import (the rows of `FRQTL_WEB_SPECIFIERS`) |
41
42
  | `./objects/objects/tagger.js`, `./objects/schema/index.js`, `./shim/render/heat-colormap.js`, `./objects/schema/valueNormalizer.js`, `./objects/objects/Box.js`, `./objects/objects/QuantumEmitter.js`, `./shim/expr/ast-schema.js`, `./objects/objects/actionCompiler.js`, `./objects/v1-replacements.js`, `./objects/objects/slitLinerScatter.js`, `./objects/setup/setupSphereEmitter3D.js`, `./objects/objects/directedRedirectProgram.js`, `./compat/renderer/lo-drawn-center.js`, `./objects/setup/setupTunnelPointExit.js`, `./objects/constants/WallBehaviors.js`, `./objects/objects/absorbRadiation.js`, `./objects/geometry/SlabFace.js` | the 17 part-internal modules a forked part file imports (the `tier: 'part-internal'` rows of `FRQTL_WEB_SPECIFIERS`): not a scene API — the linker admits them only from a `parts/*.js` file — and they move with the parts |
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@descix/frqtl-node",
3
- "version": "0.6.1-p3.4",
3
+ "version": "0.7.0-p1",
4
4
  "files": {
5
5
  "eyes/index.js": "b3563421030bb7fdd277eb697959fbe9107463cbb5478160edc7d887daa67be3",
6
6
  "fat/pkg-node/egpt_wasm.js": "5e6af1f6725c93c0e9ad7386f1785cbe639ce596a4caa19ca85729c1f2bea04d",
@@ -37,6 +37,7 @@
37
37
  "frqtl/compat/renderer/unprojectStill.js": "43c4286c124eaa238d963fe3ae5551a1c87727809d5245a129f368a117863c45",
38
38
  "frqtl/compat/vendor.js": "2393ada71cdbe750d409174e1ba9b098148796efdff746b315d706a0b32e58e8",
39
39
  "frqtl/experiments/_shared/boot-failure.js": "1a92e85b06acdefede5613f2fac7cd4e61d2aba590820f1bfa92f6829fcbbdd4",
40
+ "frqtl/experiments/_shared/empty-sketch.js": "129ffd99353cc5a5d3318bac5684e975510989c360131327ada286c7fd02824a",
40
41
  "frqtl/node-entry.js": "a401039b4fcf53ac620edbd80985aa4448122f2e3caaeaf4d5595f5e9d512b60",
41
42
  "frqtl/objects/FrqtlApp.js": "bc4b4b2206588cd91fc8454b058a11d4b8b797fa3064e32af12be81d2d927d6e",
42
43
  "frqtl/objects/ObjectFactory.js": "a8f050ce61b7ab9c9b4f81e9eeaebf05c3cc0b532c741ce93d6e952489772b11",
@@ -83,27 +84,27 @@
83
84
  "frqtl/objects/setup/_collisionMatrixLanes.js": "e5184a9e690e677bc941cce113f2d3d5c51de41d8322515fc707f5414c7b81be",
84
85
  "frqtl/objects/setup/_setupOptions.js": "bc9bff3c647418db452976b54e9f91474c59abf5acbde1d62747a11a9501cca0",
85
86
  "frqtl/objects/setup/_worldInit.js": "636eb9610f0d446d7c8d660c322d31cdaaae2a35546549f92572751414ad604b",
86
- "frqtl/objects/setup/setupBlackbodySubstrate.js": "c23b397dca46e0c30dfb50148f545a3d634e43452e3aa4d29188327d3d730705",
87
+ "frqtl/objects/setup/setupBlackbodySubstrate.js": "1e0de4873812454b09b4666dbaa1e0987310d4d77d1516bb24d6a2b6751e3036",
87
88
  "frqtl/objects/setup/setupCircuitBasic.js": "8204f7d42f8dd888e6a4e1175b16a6e67b69fb2d943af6c2b40c900b905dd453",
88
89
  "frqtl/objects/setup/setupCollisionMatrix.js": "5df3b6c93a5b1fc5f8c0a443c1d3e0003ef170bb39b6101e60b4f3017ec26f60",
89
90
  "frqtl/objects/setup/setupConeEmitter3D.js": "284d5353857817e5821d6c3897ba15b22f32388971ae149094e1353f15f0a4d6",
90
91
  "frqtl/objects/setup/setupDoubleSlit.js": "c802de116d1f0a603bbb4a7bbfbbe11aaefbeb036e1df513320bf4a9adb3519f",
91
92
  "frqtl/objects/setup/setupDoubleSlit_Laser.js": "373f0b8a5087072063457b5cf9f67f43afc26a71a89d667520fde5a81cc075d7",
92
93
  "frqtl/objects/setup/setupEmpty.js": "d0fc6e8661514965fa68720a714a2fe44bfbf414f92549e4c86c8bf60a4cc1d1",
93
- "frqtl/objects/setup/setupFxSmoke.js": "52bcaea78c85349f92a8a6664c11e3d7215e2a47772f2fbd39ee2212e88b1cab",
94
+ "frqtl/objects/setup/setupFxSmoke.js": "f0267a0c5e0ee0329fd312acc8287d8a699a4009ca2207030eaba9ce9988361f",
94
95
  "frqtl/objects/setup/setupG1Race.js": "431df40700a8633fae54eea98f160e7852deb3765c3b374c35c0e1af24611d31",
95
96
  "frqtl/objects/setup/setupG2Sweep.js": "2d44e194a6def2f5cb3eb32db4d69b7f709894f345b77d2305047f37a5d14773",
96
- "frqtl/objects/setup/setupG3Collide.js": "f3e9c5f0a9efc2c50d92d48b975544d40a48d03b189969217fe994df7385ae48",
97
+ "frqtl/objects/setup/setupG3Collide.js": "329ca85b556ed5d2dacb6ff28808ac357078aef180c247ebb00da17753bcc6f5",
97
98
  "frqtl/objects/setup/setupLightSourceLab.js": "4b31ecf0d97244058883876f2577e601846d72ee244fdb210fdfcb660b0d0b53",
98
99
  "frqtl/objects/setup/setupOscillator.js": "0b706b20d98088f47c351b0b84280cf5e4468504bb07517360f3999a0cf0fbfb",
99
100
  "frqtl/objects/setup/setupParticleWalk.js": "38e1a939c180d1921c9b338083017505a3326936531cfae62c603b3b86c3b033",
100
101
  "frqtl/objects/setup/setupParticleWalk3D.js": "df0a24aaf3d9acb474faa9f7b7a4c83446e63935d2e7e0f28185fd197097a15e",
101
- "frqtl/objects/setup/setupSphereEmitter3D.js": "aba08f21ec1fb402a450b3e9ae8d33b91501d8556707e9b8b43e636397cf8cda",
102
+ "frqtl/objects/setup/setupSphereEmitter3D.js": "bcbadd1ceaadacb3e0b0d1c3c7dcfa60fed3e2b8a0c96367e7863bb0b77a489e",
102
103
  "frqtl/objects/setup/setupTraceCircuit.js": "cc551cdfa1879289574dd93b97669387371c488b27ec6b53df2ff75ba83525f0",
103
104
  "frqtl/objects/setup/setupTunnelLab.js": "6125711bde04577372ac9dd95deb521fc58ad3d97a73699df2bed5636804d25b",
104
105
  "frqtl/objects/setup/setupTunnelPointExit.js": "d68c25e14b3876a04f7aca8324b647cce2ac6f9265d38b88cabba99f2d02c25d",
105
106
  "frqtl/objects/setup/setupWaveInterference.js": "b74e1406580a0bd2749686f87f9eec929e3e33c2fe6a7648cdaa2a26449e4fc1",
106
- "frqtl/objects/v1-replacements.js": "7be6910430fcfbbe39db2a60b991b9c0b3ded9a8c05295060107042cee6bc201",
107
+ "frqtl/objects/v1-replacements.js": "1bb5f65583320d9ed7acf45398b042d328d8a7fce2f3e5e1cb6bec1e1b551f10",
107
108
  "frqtl/package-core.js": "4e645a91edf27f9631dd97aeafc72b11c06a7fbfc0f435d194f4635da872f6d7",
108
109
  "frqtl/parts/CameraControls.js": "c31a42296256703c5d06098b1dfb548d2ad5b39de0485fb9cff71ea777a5cc7f",
109
110
  "frqtl/parts/CameraPath.js": "bf5d620b2789c76b5a79c092ae0a3dc802fa6ef28a05df2ed1935481d4bba636",
@@ -118,72 +119,43 @@
118
119
  "frqtl/parts/LightColor.js": "8637e5a09bbad3a4fdd2034ccb44dfc1fda743e29b12b4c685a64b9e1df28daa",
119
120
  "frqtl/parts/LiveChart.js": "5d31947db9909e7a85dcbd99560e49b3f24ad60aea13f24b736a04d45998f060",
120
121
  "frqtl/parts/LogicGate.js": "05716711db1794ce9e29027ea16af083e5a1cc8b0657dce853cb6d2f6ee1fc02",
121
- "frqtl/parts/OvenBox.js": "7e393dd736c6ae410d85e5fe3edbea8677e5834bd1fe7b19d4e8f46af13764ac",
122
+ "frqtl/parts/OvenBox.js": "7f6a5fc98294626d4f30fe914740b7e076eb27b0234f37926a36b61eb54a9b54",
122
123
  "frqtl/parts/PointSource.js": "57b3b8353cba8c5ebfff6653e39948c9f0ee240449b4af08247687d3d9d9f092",
123
124
  "frqtl/parts/Rectangle.js": "8be4cae13135c3cb185d025dfd10d3a03b21d5627bfa92363c2faa021f751571",
124
125
  "frqtl/parts/SlitLightSource.js": "89a17aaade03e2e961af4181e6c3fd479d31c2c3298c46abc477a13f26d7a07a",
125
126
  "frqtl/parts/SlitScreen.js": "bdcaa761d0aa68c415a06ab2c523a8d4553a4c48cee00fe33d5df994adcf599a",
126
- "frqtl/parts/SphereEmitter.js": "bf801404c67ff26dbf61353ea617fcefcff5a546c2e62f4d4afb95e9781c7a5e",
127
+ "frqtl/parts/SphereEmitter.js": "fbe0498772cf175b9bd0f804e0cdee92f613dcdb5f645ac4f580e3f447c33bd9",
127
128
  "frqtl/parts/Trace.js": "f9d91bb9435bc5fabfd7bfdbfbf3f3ae34e2338090251d9e9d6c11abc2ed25fb",
128
129
  "frqtl/parts/Tunnel.js": "7a7c3e52caa5f018178c596d735e6062c4cac1545d014216d3027ba9f457d07d",
129
130
  "frqtl/parts/Wall.js": "7af7a41f7c8348deee1237a20e37e9c0e69cd3669ab315efaa8eeac03fbbccb8",
130
131
  "frqtl/parts/index.js": "70b8e227e09663889f4c7942d385f843d977579765723f829880fd6e9868ac53",
131
- "frqtl/scenes/absorbing-wall-3d.js": "722bb433142833f03150052b95039686aba0d9db510a5ff13fad95b5f17e0cf8",
132
- "frqtl/scenes/absorbing-wall.js": "0a47ca64e56481841339cd5882cf0e54ec7c14d87a4306d016ead1ff26591197",
133
- "frqtl/scenes/atomic-model.js": "1b484ba37d90af9c06d9bf6a114b8867c914d12cc0a0dbeec27dd96230829fac",
134
- "frqtl/scenes/big-bang.js": "e0807d81f4bcc6626080f81d472c6ead9c8d8f7d97bd67c6da76a476868b25f4",
135
- "frqtl/scenes/blackbody.js": "bdd6ee3c628f0cf1161eeb855a4a582902ab56174da937bf0d5180d930ef8278",
136
- "frqtl/scenes/circuit-sat.js": "db69468352e955b4ff9c36e8d3cf03cc3e88d368b6d3cc485d664bb5cb085d57",
137
- "frqtl/scenes/collision-matrix-3d.js": "8a0c1189d5e2f23092b216515608319643bc010ff837aadffdf84b2078c96793",
138
- "frqtl/scenes/counting-wall-3d.js": "1d08e60d58faeed4315400a2d0fbc10460d7869babc72a8dd7f906b5dff6ba54",
139
- "frqtl/scenes/counting-wall.js": "35b617a20c154f89c63d4a60a205f5d67ba8bb3342730e269528f884a522f131",
140
- "frqtl/scenes/double-slit.js": "d37aff36667783fe5991b8219439803facb730bd0abe9219483f2ef42056e988",
141
- "frqtl/scenes/dse-one-emitter.js": "619892663838e0f018b9ade83c9994fb0709b9ed9904c92e41470a7b7fdd396f",
142
- "frqtl/scenes/dse-one-slit.js": "7bf299e3cc64dd3d1f8df805eec63d98d36b8592d55e3ef478d46c38bf674812",
143
- "frqtl/scenes/dse-photoelectric.js": "e0402c4508a4d97d3d9461f889b10a49da82ef5f232d81455c5e482db8b0bda6",
144
- "frqtl/scenes/dse-tunnel-rebuild.js": "c2721b4460dbe2f38e7e3bcff6f8498fd798c3404b807931b288ae2ccd43eec5",
145
- "frqtl/scenes/dse-two-emitters.js": "74cf1d4b226b0ce4e337697a0327de9b95190159b2554f53e629d89525321877",
146
- "frqtl/scenes/dse-two-slits.js": "f303a848d9c463a5a9443c380b257795b19127b122bdd2fcb28855841b219939",
147
- "frqtl/scenes/empty.js": "f3c2161f7bbc1be2d7fba0f117ac16b9e60966d9448877ead4037e3cb4fee678",
148
- "frqtl/scenes/laser-buildup.js": "f4b29b2eeeca730642f5adf2f499f6594b73f6e51ba6aa9a237f4ee643c5cf23",
149
- "frqtl/scenes/mirror-3d.js": "79ac794dfbc608037936908a9fe58ca34be93be6263d5940bb38129d55bb7943",
150
- "frqtl/scenes/mirror-route.js": "1407dd7a39c0efcd5ea0f028d67299c1ca4153c1c0cab2bb36d10416f1129931",
151
- "frqtl/scenes/mirror.js": "c7bcd440e9a78e333fd81d906b3788a62342910f46cf98de860098fcc1e0ba91",
152
- "frqtl/scenes/omni-3d.js": "d420a7aae9fdfd394b9288ce1f0256416e1b07f70bc570a928a4592c32a47c27",
153
- "frqtl/scenes/omni-source.js": "4f9aaa0e0ccbf4d18908d1628688dbeae376b535318f0cf969d61d8ea8f90b83",
154
- "frqtl/scenes/self-interference.js": "5ffa272d806a0af2b136f6ce6258b2d71f3a662de005a8941381a317120a47e4",
155
- "frqtl/scenes/smoking-gun.js": "d130fdcb49f8c8ea201245195ab4a84108ef59218908bd373f5f69a5b73dc2a4",
156
- "frqtl/scenes/straight-walk.js": "bb4f5a9fc05dacfad8531843ca02c6dc2c6217f940529d47d0f5aacfcb03a125",
157
- "frqtl/scenes/sun.js": "fa06cac429af5a2ad4fe846969a7bf763f2a76d9d9b169328cd1f45bad6bda8f",
158
- "frqtl/scenes/two-source.js": "1444a0e503f4a5e349d4364e31e698bc67d723a4b2864f262603e75ba5f9f088",
159
- "frqtl/scenes/wave.js": "cabbece84daceca9199bbea22be610281bdf3137c8c5724bc601758e711f111f",
160
132
  "shim/bundle/index.js": "edc501a039ce47102657604df71fbc17ba3e4760ca087055351231c7469f5c50",
161
133
  "shim/bundle/indexHtml.js": "2c4fbc502bb33fce93596cee19e143a58bb63c18d0b18ea597f81610e3a9a027",
162
134
  "shim/bundle/zip.js": "00f7b5fb5f36ff40a59d86758c503d9d7fb43949c1b5a4f2e7367c43d92786f9",
163
135
  "shim/bus.js": "dac2eeccd8774268c51014be4c46c00b9985fdf49ebb44355aa370e949c8c5bc",
164
136
  "shim/controls/index.js": "206f2f9cdb19e122e650517e09ef1e858f962b4ebe555174aee3bea4ae938dff",
165
137
  "shim/controls/registry.js": "3df843d774968d18e012624f2aba2fb09b08ede9e21b6c1f6687d4f3e9b46d3e",
166
- "shim/engine/artifact-shell.js": "f23c327500f8174b12d464868f6ec9c1701e7a9a5faa1c43a2ddafc3191dc38c",
167
138
  "shim/engine/boot-phases.js": "c6e12e12824bcf6f1a289f46e41c898a5416c80c131594525145aae9a3eefbfa",
168
139
  "shim/engine/engine-stack-boot.js": "0abf57dcff2ca2bb025c787a17875d49d54d9218ac08c78cb9c678dbb6118d08",
169
- "shim/engine/router.js": "3846722d4b9314c6176c62e0ff6b04cbf50b52b7195fd250426740f1f334065b",
170
- "shim/engine/site-graph.js": "b0d2569c67516d08bba17a152d5d3bfa0b036666eda7f11df74b4d68854e1b93",
140
+ "shim/engine/router.js": "59092b6bf0474bbd0d55300dd8d3574ce6ad03fb55a0a0af5e7cceb6d365ac9c",
141
+ "shim/engine/site-assemble.mjs": "37c9915c34b102daa8fe6389f8d66a1e3379e074e87d2ad79b0cff7a81a2d4b6",
142
+ "shim/engine/site-graph.js": "4d5e5f9ecc2cefcf30eab25203178c0bb13230e9ce7f34bb3b36178f6b79dcb9",
171
143
  "shim/experiment-frame/index.js": "5a0219aaa225d8f808c405b08623ce85ada37d83fb4f55f983db3303e431e47f",
172
144
  "shim/expr/ast-schema.js": "4f1133b887639bbd86fab976292323bf4a955cdc873ff7ca8e8a8eb3b416923f",
173
145
  "shim/field-descriptor/index.js": "050091a9cab0bd37b32b5d8a52fc9bca3b42a089c188d7e49a11cf88b5c069f7",
174
146
  "shim/frame-data/index.js": "df6957b0b4a8e0ee0035bc970647b90089b421ae7f05911cc047d48457164be6",
175
- "shim/host/device.js": "7dd8d069463141e4f8bdc8827d747c0a9e27ad7ec1d2c6feaaad6e58f0bed512",
147
+ "shim/host/device.js": "281e7e7ec4d8164a5a9f6d8de64be7ca0781a262d23efa0b43b6cf1fdbfd797e",
176
148
  "shim/host/host-view.js": "feec2f5fdc318e75cd01768c24891f85d2694a269696fcfffd9567d31983cf43",
177
149
  "shim/host/index.js": "fade4b171218965570aa2e67e841920ebb3d972ff15e1cfa0394fd3fa123d82c",
178
- "shim/index.js": "96165c6161ffddbace0be0cde0b3a83943298531537dd2cc9c6e281b8274ff19",
150
+ "shim/index.js": "dd3708d4935e597d9ca46a23077064bd1f460bb1e86315372c9d147bdfb3f0d1",
179
151
  "shim/notebook/canvas-guard.js": "b19d3a86df3835bd617c7130cde997b6f8a8a0c140f95338b733115d5947ed7b",
180
- "shim/notebook/catalog.js": "68243a154e12bf36a76598aa554119f6e3b8b5363c8452d157c8a562b9c38dc1",
181
- "shim/notebook/format.js": "f8b1da9eb37da3a9609f7721426e2242f1279780ea212ea08d9f3c50bb18b578",
152
+ "shim/notebook/catalog.js": "a257d67de2cac13429b2f676bbd43028e7aca5ee258918f005dfc85f2b3cef1f",
153
+ "shim/notebook/format.js": "272710d069e2d9fc0178124cddf5d3667a2dc14fbfc21ce254bace1ebf5dfb4f",
182
154
  "shim/notebook/frqtl-setups-importmap.js": "df86defa90cb85675564e7bb269451684b5cc7679f2c6b1884c07c8272e8ff1c",
183
155
  "shim/notebook/kernel.js": "95b8efe960927d8cda0896eea8995f5df5972a471e0217916c32881913bddfcd",
184
- "shim/notebook/knob.js": "f07e9ac9697c7178aa68e4b2f4300145f8e2d2dc41b64aa0afede7e2d68705b1",
156
+ "shim/notebook/knob.js": "b67696a94a3f2bec3391e46be895ad80525de1da62bdd4ed3229dcdab0e9e063",
185
157
  "shim/notebook/module-resolver.js": "0bcf6ca4954e198dd77ce61b502cebed6d2c118926fd0d2dd0816991b8334b7a",
186
- "shim/notebook/notebook-knobs.js": "891cd6a24ed70256ed723844918866ba162dd71f839cd06ff4d8fc92a0a17452",
158
+ "shim/notebook/notebook-knobs.js": "d684bc192deaa56b820b0c1f27029a276becdf689c9c3cea7ab809f89a515d68",
187
159
  "shim/notebook/produced-bindings.js": "3d46038ec541a9ff896abae4f62d25780633cdc952e4c9d0d90d917298471090",
188
160
  "shim/notebook/realm-registry.js": "ffee52e7c93447c8b82bfc0784b51346686b4373766da298f50a759d3443ab6a",
189
161
  "shim/notebook/realm-transport.js": "5173676a94211f85122e0581a16abba925e9c4b5900b5891911bfaec5ea02daf",
@@ -208,21 +180,19 @@
208
180
  "shim/project/read-text.js": "b89bd70e3a271e1f42c8ce9427a20cdd9a4c4c9c31b64c49ff1f56b095620136",
209
181
  "shim/project/record-format.js": "87d5cc2eae8ff600db1db58a0e0047819f7c9839ff702acdedc366c7647eb0ef",
210
182
  "shim/project/register-node.mjs": "9b408da7dc1b11d16237cd62caca281c823ea80173d386ad35e41ea17c34857f",
211
- "shim/project/specifiers.js": "288e5e06e53b873449190f6f85855177a72e52623bd11eef016acafb8095d829",
212
- "shim/registry/copy-gate.js": "cfbf52669c849b8837b326f2743458f1ead0720cad51a6c6d409c9bd6c7f9495",
213
- "shim/registry/exhibits.js": "5a2f085c8a6b012114796897ec284f2bdd5081936b4e474d6227318c67dfb48a",
214
- "shim/registry/index.js": "3a96c6b8790058663bb3157f6daecbcc199c2472d096b413e1766dd279832c05",
215
- "shim/registry/scene-roster.js": "318fe373f71b1c58d05425693f2fad4bd5368f6095b65817c6d637430a0bfb73",
216
- "shim/registry/scene-source.js": "c9c4b48c24d4b1ebee1549a7891a1ba708909b94b9403ce28eefbd902cacf49f",
217
- "shim/registry/showcase-link.js": "daf5c1426aeb3c578bace5e0edea9ba2538cd82336d2cdc944e5fed6decd7551",
218
- "shim/registry/studio-landing.js": "bd81ad9333332de4a29b3121f963edd354450c75c97f4f43170a98c2dcceb7f3",
219
- "shim/registry/walkthrough.js": "439e03fc6c85e5982a98049118dc89f33c498778c1f3349bbbe8f60d64761071",
183
+ "shim/project/specifiers.js": "2d2518ffae6e5490556b279791ca3d0a567352142e1f6a18114d74ec7f34afc5",
184
+ "shim/registry/copy-gate.js": "5817688261480253dc3d8ebd6612e025cb7c7c1c2cab7cd3135b90c068477ccf",
185
+ "shim/registry/index.js": "3f869443962f07326deb626c8edf7dd5880724925dbbbf0224390db02f7bd95a",
186
+ "shim/registry/roster-link.js": "7c079eec1350640c8399e16f2515e1cdfb5c6cd31f77c16dfda85ec782a538d0",
187
+ "shim/registry/roster.js": "df0dcc70d4c2202913a1e3e8788e9f1907ad63e43150c85960ebdfe9864d53db",
188
+ "shim/registry/scene-source.js": "913ef72fc7caeeafc2eb6a28a2dcced752579e63c83b48d51f5bf36f67c55a88",
189
+ "shim/registry/studio-landing.js": "115294cd43b96c8a4892dd74eb58bdee096baf520cc655e589300f9bc1dfb724",
220
190
  "shim/render-state/apply.js": "94a9e60cb1722c9a82aa00f2f161fd65e6f438147333856a786e42a4ad5b7064",
221
191
  "shim/render-state/index.js": "72a6a3dcd8037893cb8fbd7ef32b126770e7efaec70847f8e4f2915ddb690b43",
222
192
  "shim/render/capture-envelope.js": "74db53dbc8c87d1b52452bcb858b1cc5210593062fec0b98609cd59cab63777a",
223
193
  "shim/render/heat-colormap.js": "0eadc758179024734c45eaeffd8f5b44e7c4102b7042767a4a5b66541b3bbd7c",
224
194
  "shim/render/render-stages.js": "baf674c205df7638af53e51ac77152a448fe6bf6d4ea51d58ac565556cd38da7",
225
- "shim/render/sun-look.js": "95cf56ee8a5c8da107323bf0dd33568e68e2a8bb2d9a5d61a3453a1b9d28ba2c",
195
+ "shim/render/sun-look.js": "f9cd57b6850a9a8f9785f2abd45c14878298876f5659dd0da31292158f70c256",
226
196
  "shim/rpc/index.js": "56af3afeed22e8d718cd2f7a8ad70db8745f54dbc139af9d71f1d73e2ca37698",
227
197
  "shim/runtime/index.js": "92bb4d8b5f203f949e441781b864efe5c6748df14a3a8f306e4c0bc11c7f6d35",
228
198
  "shim/storage/boot.js": "689504e15dc075e32d08abf61c75a45b1d565c09f086b42400dae40d8186c411",
@@ -0,0 +1,17 @@
1
+ /* Copyright 2023-2026 by Essam Abadir */
2
+
3
+ /**
4
+ * The Empty Universe — STUDIO's and the GYM's blank world, package content (not a showcase scene).
5
+ *
6
+ * A sketch like every other: it states its world in its first (and only) statement and constructs
7
+ * nothing; the palette authors into it. Read as a project by
8
+ * lib/shim/registry/scene-source.js::emptyProjectOf, through the router (a lib-identity path).
9
+ */
10
+
11
+ export const parts = {};
12
+
13
+ export default function buildExperiment(exp) {
14
+ // THE WORLD: a 600x400 2D canvas + universe on the dim-2 fundamental, λ multiplier 8.
15
+ exp.createCanvas(600, 400, { dimension: 2, wavelengthScale: 8 });
16
+ exp.declare(parts);
17
+ }
@@ -4,14 +4,14 @@
4
4
  * setupBlackbodySubstrate — Blackbody experiment reconstructed under the
5
5
  * as-intended control loop.
6
6
  *
7
- * ## One-line OvenBox difference from `lib/frqtl/scenes/blackbody.js` (config a vs config b)
7
+ * ## One-line OvenBox difference from the blackbody showcase scene (config a vs config b)
8
8
  *
9
9
  * Both configs use the SAME revised OvenBox sugar (walls = NONE + eject op-programs,
10
10
  * emitters, slit preserved). Apart from the `temperature` VALUE (the scene's
11
11
  * TEMPERATURE = 1500, this factory's default 300), the ONLY OvenBox option that differs
12
12
  * is the thermostat count source:
13
13
  *
14
- * config a (scenes/blackbody.js) : OvenBox default → countSource = 'active-quanta'
14
+ * config a (the blackbody scene) : OvenBox default → countSource = 'active-quanta'
15
15
  * config b (THIS FILE) : ONE extra option → countSource = 'oven-rect'
16
16
  *
17
17
  * Outside the OvenBox: the scene seats its sink at the canvas edge (30 px); this factory
@@ -31,7 +31,7 @@
31
31
  * - **`options.layer4=true`** (default, implies layer3): adds velocity-flip ops
32
32
  * (L4 bounce = L3 eject + flip, conformance EP27–EP28).
33
33
  * - **`options.layer5=true`** (default): enables `universe.withInterQuantumCollisions=true`
34
- * — as `lib/frqtl/scenes/blackbody.js` sets it. ENGINE physics; no new
34
+ * — as the blackbody showcase scene sets it. ENGINE physics; no new
35
35
  * op-programs. Expected JS↔WASM divergence on parent-frame count (deferred §6).
36
36
  *
37
37
  * Set any flag to `false` only for progressive test isolation (L1/L2/L3 runs). The default (all true) runs the
@@ -129,7 +129,7 @@ import { CollisionActions } from '../../parts/CollisionActions.js';
129
129
  var slitWall = options.slitWall !== undefined ? options.slitWall : 'right';
130
130
 
131
131
  // ── L5: parenting / promotion flag ──────────────────────────────
132
- // L5 is on by default (matching scenes/blackbody.js). Set layer5:false
132
+ // L5 is on by default (matching the blackbody scene). Set layer5:false
133
133
  // to run without inter-quantum collisions (L1/L2/L3/L4 only).
134
134
  var USE_L5 = options.layer5 !== undefined ? options.layer5 : true;
135
135
 
@@ -137,7 +137,7 @@ import { CollisionActions } from '../../parts/CollisionActions.js';
137
137
  universe.init(fundamental_dim, { wavelengthScale: 1 });
138
138
  universe.brownianMotion = true;
139
139
  // L5: enable inter-quantum collisions → merge → promotion (compound/parent frames).
140
- // Matches scenes/blackbody.js. Diverges JS↔WASM on parent count
140
+ // Matches the blackbody scene. Diverges JS↔WASM on parent count
141
141
  // — expected (deferred quadtree/promotion workstream, handoff §6).
142
142
  universe.withInterQuantumCollisions = USE_L5 ? true : false;
143
143
 
@@ -159,7 +159,7 @@ import { CollisionActions } from '../../parts/CollisionActions.js';
159
159
  // ── OvenBox (config b — the ONE distinguishing config line) ──────────
160
160
  //
161
161
  // countSource: 'oven-rect' is the ONLY difference from config a.
162
- // Config a (scenes/blackbody.js) passes no countSource → OvenBox defaults
162
+ // Config a (the blackbody scene) passes no countSource → OvenBox defaults
163
163
  // to 'active-quanta'. Config b passes countSource: 'oven-rect'.
164
164
  //
165
165
  // OvenBox handles internally:
@@ -43,7 +43,7 @@
43
43
  * ── Layer 2: physics behavior ────────────────────────────────────────────────
44
44
  *
45
45
  * The smoke billow is EMERGENT PHYSICS, not a sprite trick. It mirrors the
46
- * Blackbody aggregation mechanic (lib/frqtl/scenes/blackbody.js):
46
+ * Blackbody aggregation mechanic (the blackbody showcase scene):
47
47
  *
48
48
  * universe.withInterQuantumCollisions = true
49
49
  * → colliding quanta PARENT into compound frames (merge/promote pipeline)
@@ -133,7 +133,7 @@ import { CollisionTypes } from '../../parts/CollisionTypes.js';
133
133
  // ── Universe init ─────────────────────────────────────────────────────
134
134
  // fundamental_dim=0 — leaf quanta are 1-px frames.
135
135
  // withInterQuantumCollisions = true — inter-quantum collisions drive the
136
- // merge/promote pipeline (as lib/frqtl/scenes/blackbody.js sets it).
136
+ // merge/promote pipeline (as the blackbody showcase scene sets it).
137
137
  universe.init(0, {
138
138
  wavelengthScale: waveLengthMultiplier,
139
139
  brownianMotion: false,
@@ -108,7 +108,7 @@ import { assertSetupOptions as _assertSetupOptions, requireWorldRect as _require
108
108
  // ── Live control handle (Blackbody shape) ──────────────────────────────
109
109
  // Each setter writes through the property accessors against the stored quantum ids.
110
110
  // No page reload — the same shape as the blackbody scene's temperature knob
111
- // (lib/frqtl/scenes/blackbody.js: slider onChange → oven.setTemperature, live).
111
+ // (the blackbody showcase scene: slider onChange → oven.setTemperature, live).
112
112
  var collideControl = {
113
113
  /**
114
114
  * Update mass_B / mass_A live.
@@ -472,7 +472,7 @@ import { FrqtlWorldInit } from './_worldInit.js';
472
472
  * The canonical sketch idiom shares ONE bag across both steps:
473
473
  * exp.createCanvas(W, H, setupSphereEmitter3D.worldCfg(SRC)); // WORLD (and its canvas)
474
474
  * exp.addObject('SphereEmitter', SRC); // PART
475
- * (walkthrough.js cl1d + its 3D twin). So the bag reaching `worldCfg` legitimately
475
+ * (the mirror-route scene, 2D and 3D). So the bag reaching `worldCfg` legitimately
476
476
  * carries the keys the SphereEmitter FACADE owns and strips before forwarding
477
477
  * (`emissionCap`/`gateCounter`) — `worldCfg` projects out the four world knobs and
478
478
  * ignores the rest BY DESIGN. Gating it on OPTIONS alone would reject the recipe the
@@ -555,7 +555,7 @@ import { FrqtlWorldInit } from './_worldInit.js';
555
555
  // `leafDimension` = the dimension THIS emitter births its leaves at (per-emitter
556
556
  // — the corrected model: dimension is an ADDABLE scale layer, and
557
557
  // an emitter creates leaves AT a chosen dimension via makeLeafFrame's explicit
558
- // `level` + `addDimension` (the SAME pattern scenes/blackbody.js uses: init at a base
558
+ // `level` + `addDimension` (the SAME pattern the blackbody scene uses: init at a base
559
559
  // fundamental, then addDimension for the higher scale layer). Default =
560
560
  // fundamentalDimension → BYTE-IDENTICAL to every pre-existing caller (birthing at
561
561
  // level=fundamentalDimension is identical to the old level=null, which defers to the
@@ -4,7 +4,7 @@
4
4
  * v1-replacements.js — the V1 → V2 port map: every removed V1 kind names its V2 composition, so an
5
5
  * unknown-kind throw TELLS the author what to build instead of leaving them to guess. A LEAF (no
6
6
  * imports): ObjectFactory reads it for its unknown-kind refusals, SlitLightSource for its own, and
7
- * the sketch rule (lib/frqtl/scenes/test/_sketch-rule.mjs) reads the names from here.
7
+ * the sketch rule (lib/frqtl/test/_sketch-rule.mjs) reads the names from here.
8
8
  */
9
9
 
10
10
  export const V1_REPLACEMENTS = Object.freeze({
@@ -35,7 +35,7 @@
35
35
  *
36
36
  * `getTemperatureTickFunction()` returns a tick function that reads
37
37
  * `universe.activeQuanta` each tick and directly CRUDs the four emitters.
38
- * Push this into `universe.experimentTickFunctions` as scenes/blackbody.js already
38
+ * Push this into `universe.experimentTickFunctions` as the blackbody scene already
39
39
  * does — no other wiring needed.
40
40
  *
41
41
  * ### `countSource: 'oven-rect'` (config b — the "better oven")
@@ -432,7 +432,7 @@ import { registerKind } from '../objects/kinds.js';
432
432
  * `max(1, floor((temperature - activeQuanta) / 4))` and activate them.
433
433
  *
434
434
  * This is the ORIGINAL thermostat behavior — identical to the pre-convergence
435
- * OvenBox and compatible with scenes/blackbody.js (which calls this method
435
+ * OvenBox and compatible with the blackbody scene (which calls this method
436
436
  * without arguments).
437
437
  *
438
438
  * NOT applicable when `countSource: 'oven-rect'` — use `thermostatStep(tickData)`
@@ -143,7 +143,7 @@ import { CollisionTypes } from './CollisionTypes.js';
143
143
  * It is exported because a SECOND surface needs it. The canonical sketch idiom shares
144
144
  * ONE bag across the world step and the part step —
145
145
  * `exp.createCanvas(W, H, setupSphereEmitter3D.worldCfg(SRC)); exp.addObject('SphereEmitter', SRC);`
146
- * (walkthrough.js cl1d and its 3D twin) — so `worldCfg` is handed a SUPERSET of the
146
+ * (the mirror-route scene, 2D and 3D) — so `worldCfg` is handed a SUPERSET of the
147
147
  * factory's own vocabulary and must tolerate exactly these keys. The factory cannot
148
148
  * require this file (the arrow runs object → setup; a back-require is a cycle), so it
149
149
  * declares `SKETCH_OPTIONS` and `setup-factory-option-vocabulary.test.mjs` §4 asserts
@@ -152,7 +152,7 @@ var DIST_PROFILE = buildDistProfile('../..');
152
152
  // lib/shim/engine/test/router.test.mjs asserts them against the two
153
153
  // package.json#version fields so a forgotten bump fails `make verify`, not a
154
154
  // silent stale-CDN-URL bug.
155
- var CDN_SDK_VERSION = '0.6.1-p3.4'; // sdk/frqtl-web/package.json#version (the ONE version owner) — bound by router.test.mjs
155
+ var CDN_SDK_VERSION = '0.7.0-p1'; // sdk/frqtl-web/package.json#version (the ONE version owner) — bound by router.test.mjs
156
156
  var CDN_MATH_SDK_VERSION = '0.3.3-p2.1'; // sdk/egpt-math-sdk/package.json#version — bound by router.test.mjs; bumped with each npm publish
157
157
 
158
158
  /**
@@ -251,7 +251,7 @@ var CDN_PROFILE = buildCdnProfile(CDN_BASE);
251
251
  // under `descix serve`), so every location is known only RELATIVE TO THE DOCUMENT.
252
252
  //
253
253
  // ENTRIES vs GRAPH. The site's HTML entries (the IDE document, pub/index.html, pub/sdk.html,
254
- // pub/artifact/*.html, pub/experiments/{id}/index.html) sit at FIXED URLs — `*.html` is
254
+ // pub/experiments/{id}/index.html) sit at FIXED URLs — `*.html` is
255
255
  // no-store on the platform (app-developer runbook §8.1). Everything those entries LOAD (the
256
256
  // sdk payload: JS, WASM, CSS, JSON, notebooks) is the GRAPH and sits under the build-stamped
257
257
  // directory STATIC_SDK_DIR/<build>/, so a browser holding a file from an earlier build never
@@ -526,7 +526,7 @@ var _assertProfileParity = (function () {
526
526
  * // CDN mode (static hosting — the artifact host shell has no server, no page anchor):
527
527
  * const cdnRouter = engineRouter({ mode: 'cdn', engine: 'wasm' });
528
528
  * console.log(cdnRouter.resolve('compat/engine.js'));
529
- * // 'https://cdn.jsdelivr.net/npm/@descix/frqtl-web@0.6.1-p3.4/dist/frqtl/compat/engine.js'
529
+ * // 'https://cdn.jsdelivr.net/npm/@descix/frqtl-web@0.7.0-p1/dist/frqtl/compat/engine.js'
530
530
  *
531
531
  * // CDN mode, self-hosted: a copy of dist/ served from the consumer's own origin:
532
532
  * const selfHosted = engineRouter({ mode: 'cdn', engine: 'wasm', base: 'https://example.org/vendor/frqtl-web/dist' });
@@ -559,17 +559,29 @@ function _staticProfileFor(opts) {
559
559
  * profile's package root (`__frqtlRoot`) at its lib path — 'shim/…' as itself, everything else under
560
560
  * 'frqtl/'. The module graph needs nothing more: a module locates its imports relative to itself.
561
561
  */
562
- var LIB_IDENTITY_PREFIXES = Object.freeze(['assets/vendor/', 'compat/', 'objects/', 'parts/', 'experiments/_shared/', 'scenes/', 'shim/']);
562
+ var LIB_IDENTITY_PREFIXES = Object.freeze(['assets/vendor/', 'compat/', 'objects/', 'parts/', 'experiments/_shared/', 'shim/']);
563
+
564
+ /**
565
+ * Router-relative prefixes no profile resolves any more, each with what replaced it. resolveInProfile refuses a path
566
+ * under one BEFORE any profile key or the dev-core fallback, so every profile throws the same refusal.
567
+ */
568
+ var RETIRED_PREFIXES = Object.freeze({ 'scenes/': 'a scene is a roster row, not a package path: its URL is sceneUrlOf(roster, row) (lib/shim/registry/roster.js) on the roster a host loads' });
563
569
 
564
570
  /**
565
571
  * Map a frqtl-relative path through a profile: a lib-identity path under the package root, else the
566
572
  * FIRST matching public prefix (insertion order). Returns null when nothing matches — the caller decides
567
- * what an unmapped path means.
573
+ * what an unmapped path means. A path under a RETIRED_PREFIXES prefix THROWS naming its replacement.
568
574
  * @param {object} profile
569
575
  * @param {string} relPath
570
576
  * @returns {string|null}
571
577
  */
572
578
  export function resolveInProfile(profile, relPath) {
579
+ Object.keys(RETIRED_PREFIXES).forEach(function (prefix) {
580
+ if (relPath.indexOf(prefix) === 0) {
581
+ throw new Error('[engineRouter] "' + relPath + '" is under the retired prefix "' + prefix + '": ' +
582
+ RETIRED_PREFIXES[prefix] + '. (FAIL-LOUD.)');
583
+ }
584
+ });
573
585
  for (var j = 0; j < LIB_IDENTITY_PREFIXES.length; j++) {
574
586
  if (relPath.indexOf(LIB_IDENTITY_PREFIXES[j]) === 0) {
575
587
  return profile.__frqtlRoot + (relPath.indexOf('shim/') === 0 ? relPath : 'frqtl/' + relPath);
@@ -706,4 +718,4 @@ export function engineRouter(opts) {
706
718
 
707
719
 
708
720
  // Export profiles for the sdk build to consume.
709
- export { LIB_IDENTITY_PREFIXES, DEV_CORE_PROFILE, DIST_PROFILE, CDN_PROFILE, STATIC_SDK_DIR, STATIC_APP_ASSETS_DIR, STATIC_HOST_VIEW_ENTRY, CDN_SDK_VERSION, CDN_MATH_SDK_VERSION, CDN_BASE, cdnDistBaseFor, CDN_MATH_BASE, buildCdnProfile, buildDistProfile, buildStaticProfile, staticGraphDir, staticSdkBase, staticEntryBase };
721
+ export { LIB_IDENTITY_PREFIXES, RETIRED_PREFIXES, DEV_CORE_PROFILE, DIST_PROFILE, CDN_PROFILE, STATIC_SDK_DIR, STATIC_APP_ASSETS_DIR, STATIC_HOST_VIEW_ENTRY, CDN_SDK_VERSION, CDN_MATH_SDK_VERSION, CDN_BASE, cdnDistBaseFor, CDN_MATH_BASE, buildCdnProfile, buildDistProfile, buildStaticProfile, staticGraphDir, staticSdkBase, staticEntryBase };