@descix/frqtl-node 0.6.0-p0.1 → 0.6.0-p0.2

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 (130) hide show
  1. package/CLAUDE.md +1 -1
  2. package/LICENSE.md +664 -0
  3. package/README.md +1 -1
  4. package/dist/dist-manifest.json +125 -125
  5. package/dist/fat/pkg-node/egpt_wasm.js +7 -7
  6. package/dist/fat/pkg-node/egpt_wasm_bg.wasm +0 -0
  7. package/dist/fat/pkg-node/package.json +1 -1
  8. package/dist/frqtl/compat/providers/wasm-engine.js +29 -31
  9. package/dist/frqtl/compat/providers/wasm-load-browser.js +2 -2
  10. package/dist/frqtl/compat/renderer/RenderFamily.js +1 -2
  11. package/dist/frqtl/compat/renderer/RenderMesh.js +2 -3
  12. package/dist/frqtl/compat/renderer/RenderShape.js +1 -1
  13. package/dist/frqtl/compat/renderer/captureStill-common.js +1 -2
  14. package/dist/frqtl/compat/renderer/display-slot.js +1 -1
  15. package/dist/frqtl/compat/renderer/providers/p5-provider.js +5 -5
  16. package/dist/frqtl/compat/renderer/providers/three-camera-contract.js +1 -1
  17. package/dist/frqtl/compat/renderer/providers/three-camera-geometry.js +4 -4
  18. package/dist/frqtl/compat/renderer/providers/three-provider.js +23 -27
  19. package/dist/frqtl/compat/renderer/renderCapabilities-common.js +2 -2
  20. package/dist/frqtl/compat/renderer/renderer-provider-contract.js +1 -1
  21. package/dist/frqtl/compat/vendor.js +2 -2
  22. package/dist/frqtl/objects/FrqtlApp.js +22 -24
  23. package/dist/frqtl/objects/ObjectFactory.js +1 -2
  24. package/dist/frqtl/objects/constants/WallBehaviors.js +5 -5
  25. package/dist/frqtl/objects/geometry/SlabFace.js +6 -6
  26. package/dist/frqtl/objects/instruments/capture-host.js +2 -2
  27. package/dist/frqtl/objects/instruments/capture.js +4 -5
  28. package/dist/frqtl/objects/instruments/hosted-eyes.js +3 -4
  29. package/dist/frqtl/objects/objects/DirectedTunnel.js +10 -11
  30. package/dist/frqtl/objects/objects/LightSource.js +22 -25
  31. package/dist/frqtl/objects/objects/QuantumEmitter.js +14 -14
  32. package/dist/frqtl/objects/objects/Tube.js +14 -14
  33. package/dist/frqtl/objects/objects/absorbRadiation.js +12 -13
  34. package/dist/frqtl/objects/objects/actionCompiler.js +52 -52
  35. package/dist/frqtl/objects/objects/controlAction.js +2 -2
  36. package/dist/frqtl/objects/objects/controlBind.js +2 -2
  37. package/dist/frqtl/objects/objects/directedRedirectProgram.js +3 -3
  38. package/dist/frqtl/objects/objects/emitterProgram.js +9 -9
  39. package/dist/frqtl/objects/objects/frqtl-control-slider.js +3 -3
  40. package/dist/frqtl/objects/objects/frqtl-control-sync.js +9 -9
  41. package/dist/frqtl/objects/objects/frqtl-control-widgets.js +2 -2
  42. package/dist/frqtl/objects/objects/frqtl-control-write-queue.js +2 -2
  43. package/dist/frqtl/objects/objects/makeControlsForObject.js +25 -29
  44. package/dist/frqtl/objects/objects/makeControlsForRenderSurface.js +2 -2
  45. package/dist/frqtl/objects/objects/slitLinerScatter.js +8 -10
  46. package/dist/frqtl/objects/objects/sustainedSource.js +15 -16
  47. package/dist/frqtl/objects/objects/tagger.js +2 -2
  48. package/dist/frqtl/objects/schema/engine-scopes.js +11 -12
  49. package/dist/frqtl/objects/schema/index.js +6 -6
  50. package/dist/frqtl/objects/schema/scopes.js +10 -10
  51. package/dist/frqtl/objects/setup/_collisionMatrixLanes.js +1 -1
  52. package/dist/frqtl/objects/setup/setupBlackbodySubstrate.js +1 -1
  53. package/dist/frqtl/objects/setup/setupCollisionMatrix.js +3 -3
  54. package/dist/frqtl/objects/setup/setupConeEmitter3D.js +7 -8
  55. package/dist/frqtl/objects/setup/setupDoubleSlit.js +20 -21
  56. package/dist/frqtl/objects/setup/setupFxSmoke.js +1 -1
  57. package/dist/frqtl/objects/setup/setupLightSourceLab.js +23 -26
  58. package/dist/frqtl/objects/setup/setupSphereEmitter3D.js +39 -40
  59. package/dist/frqtl/objects/setup/setupTunnelLab.js +17 -19
  60. package/dist/frqtl/objects/setup/setupTunnelPointExit.js +1 -1
  61. package/dist/frqtl/objects/setup/setupWaveInterference.js +4 -5
  62. package/dist/frqtl/objects/v1-replacements.js +0 -1
  63. package/dist/frqtl/parts/CameraControls.js +5 -5
  64. package/dist/frqtl/parts/CameraPath.js +1 -1
  65. package/dist/frqtl/parts/CollisionActions.js +2 -3
  66. package/dist/frqtl/parts/CollisionTypes.js +1 -2
  67. package/dist/frqtl/parts/DetectorWall.js +10 -10
  68. package/dist/frqtl/parts/FrqtlControlsPanel.js +11 -11
  69. package/dist/frqtl/parts/FrqtlVision.js +1 -1
  70. package/dist/frqtl/parts/GraphingDetectorWall.js +3 -4
  71. package/dist/frqtl/parts/LargeObject.js +7 -8
  72. package/dist/frqtl/parts/LightColor.js +2 -2
  73. package/dist/frqtl/parts/LiveChart.js +1 -1
  74. package/dist/frqtl/parts/LogicGate.js +4 -7
  75. package/dist/frqtl/parts/OvenBox.js +1 -2
  76. package/dist/frqtl/parts/PointSource.js +10 -11
  77. package/dist/frqtl/parts/SlitLightSource.js +6 -6
  78. package/dist/frqtl/parts/SlitScreen.js +14 -14
  79. package/dist/frqtl/parts/SphereEmitter.js +24 -24
  80. package/dist/frqtl/parts/Tunnel.js +17 -17
  81. package/dist/frqtl/parts/Wall.js +17 -17
  82. package/dist/frqtl/scenes/dse-one-emitter.js +1 -1
  83. package/dist/frqtl/scenes/dse-one-slit.js +2 -2
  84. package/dist/frqtl/scenes/dse-photoelectric.js +3 -3
  85. package/dist/frqtl/scenes/dse-tunnel-rebuild.js +5 -6
  86. package/dist/frqtl/scenes/dse-two-emitters.js +1 -1
  87. package/dist/frqtl/scenes/dse-two-slits.js +2 -2
  88. package/dist/frqtl/scenes/laser-buildup.js +1 -1
  89. package/dist/frqtl/scenes/mirror-3d.js +4 -4
  90. package/dist/frqtl/scenes/mirror-route.js +9 -9
  91. package/dist/frqtl/scenes/mirror.js +1 -1
  92. package/dist/frqtl/scenes/self-interference.js +1 -1
  93. package/dist/frqtl/scenes/smoking-gun.js +1 -1
  94. package/dist/frqtl/scenes/sun.js +2 -2
  95. package/dist/shim/bundle/frqnb.js +3 -3
  96. package/dist/shim/bundle/index.js +1 -1
  97. package/dist/shim/bundle/manifest.js +2 -2
  98. package/dist/shim/bundle/zip.js +1 -1
  99. package/dist/shim/controls/index.js +14 -14
  100. package/dist/shim/controls/registry.js +3 -3
  101. package/dist/shim/engine/artifact-shell.js +1 -2
  102. package/dist/shim/engine/router.js +15 -17
  103. package/dist/shim/expr/ast-schema.js +5 -5
  104. package/dist/shim/field-descriptor/index.js +7 -8
  105. package/dist/shim/frame-data/index.js +3 -3
  106. package/dist/shim/index.js +4 -4
  107. package/dist/shim/notebook/canvas-guard.js +1 -1
  108. package/dist/shim/notebook/catalog.js +2 -2
  109. package/dist/shim/notebook/format.js +26 -26
  110. package/dist/shim/notebook/kernel.js +3 -4
  111. package/dist/shim/notebook/knob.js +0 -1
  112. package/dist/shim/notebook/module-resolver.js +6 -6
  113. package/dist/shim/notebook/produced-bindings.js +1 -1
  114. package/dist/shim/notebook/setup-builder.js +9 -12
  115. package/dist/shim/notebook/vendor-importmap.js +1 -1
  116. package/dist/shim/notebook/view-builder.js +1 -1
  117. package/dist/shim/notebook/view-ctx.js +1 -1
  118. package/dist/shim/notebook/warmup.js +2 -2
  119. package/dist/shim/page-params/index.js +8 -9
  120. package/dist/shim/registry/copy-gate.js +1 -1
  121. package/dist/shim/registry/exhibits.js +4 -4
  122. package/dist/shim/registry/experiments.js +3 -3
  123. package/dist/shim/registry/walkthrough.js +21 -24
  124. package/dist/shim/render/render-stages.js +2 -2
  125. package/dist/shim/render/sun-look.js +2 -2
  126. package/dist/shim/rpc/index.js +2 -2
  127. package/dist/shim/runtime/index.js +12 -12
  128. package/dist/shim/storage/modules.js +8 -8
  129. package/llms.txt +2 -2
  130. package/package.json +4 -3
@@ -10,7 +10,7 @@
10
10
  * (rung cl1d-mirror-route).
11
11
  */
12
12
 
13
- // A CLOSED {10/3} STAR BILLIARD (CEO 2026-07-25): a 2-particle-wide laser loops
13
+ // A CLOSED {10/3} STAR BILLIARD: a 2-particle-wide laser loops
14
14
  // m1→m2→…→m10→m1 FOREVER. Ten mirrors at the vertices of a regular decagon; each tilt solved
15
15
  // from its in/out chords so the reflected centre-line hits the next mirror, and the star's
16
16
  // symmetry closes the tenth leg back into the first. Each mirror tags the beam with its own
@@ -42,17 +42,17 @@ export default function buildExperiment(exp) {
42
42
  var IS3D = FrqtlDisplay.name() === 'three';
43
43
  var W = 600, H = 400, WORLD_D = 600; // THE WORLD this scene states (its co-init call below)
44
44
  var f = Math.min(W, H) / 600;
45
- // R 225·f (CEO 2026-07-25): adjacent decagon vertices sit 2R·sin18° ≈ 0.618R apart vs slab
45
+ // R 225·f: adjacent decagon vertices sit 2R·sin18° ≈ 0.618R apart vs slab
46
46
  // height ~110·f, so the mirrors separate with clear gaps. Fit: R + rotated-slab half-diagonal
47
47
  // (≈55·f) stays inside min(W,H)/2 with margin.
48
48
  var CX = Math.round(W / 2), CY = Math.round(H / 2), R = Math.round(225 * f), HOP = 3, ROT = 12;
49
- // CAP 6400 / burst 8 (CEO 2026-07-25 brightness retune): a VERY BRIGHT braid. The cap is
49
+ // CAP 6400 / burst 8 (brightness retune): a VERY BRIGHT braid. The cap is
50
50
  // LIVE-controllable off the population counter (select 'population' in Layers → Inspector
51
51
  // 'Population Gate').
52
52
  var SW = Math.max(10, Math.round(14 * f)), SH = Math.max(70, Math.round(110 * f)), CAP = 6400;
53
53
  // SD — the 3D slab z-depth: a 2:1 tile (twice the slab height, z-centred on the beam plane).
54
54
  // The scene z-collimator clamps ALL quanta to this band, so every mirror provably faces every
55
- // alive quantum (CEO drive ruling 2026-07-26).
55
+ // alive quantum.
56
56
  var SD = 2 * SH;
57
57
  // Each mirror a DIFFERENT colour = its identity (a red→magenta rainbow); the recolor hook
58
58
  // stamps that colour onto every particle it reflects (string_map['render.color']).
@@ -76,7 +76,7 @@ export default function buildExperiment(exp) {
76
76
  if (Math.abs(((op - outA + 540) % 360) - 180) > 0.5) { o = (o + 90) % 360; }
77
77
  ORI.push(o);
78
78
  }
79
- // The NARROW STRAIGHT-WALK laser (CEO 2026-07-25 exemplar ruling): the SAME emitter as Rung 1
79
+ // The NARROW STRAIGHT-WALK laser (the exemplar): the SAME emitter as Rung 1
80
80
  // (Straight Walk) — preset 'particle-walk', every walk-character field INHERITED from the same
81
81
  // factory defaults (chargeMode 'positive', dim 0 = 'light' P=1, fundamentalWaveLength 64 → the
82
82
  // λ16 braided transverse ripple) — with ONLY the deliberate loop deltas: (a) a 2px source line
@@ -86,7 +86,7 @@ export default function buildExperiment(exp) {
86
86
  var pS = pos[9], p0 = pos[0];
87
87
  var dx = p0[0] - pS[0], dy = p0[1] - pS[1], L = Math.hypot(dx, dy), ux = dx / L, uy = dy / L;
88
88
  var emit = [Math.round(pS[0] + 70 * f * ux), Math.round(pS[1] + 70 * f * uy)];
89
- // EMISSION-CAP GATE as DECLARED DATA (CEO ruling 05c98e1f — the blackbody-thermostat pattern):
89
+ // EMISSION-CAP GATE as DECLARED DATA (the blackbody-thermostat pattern):
90
90
  // emissionCap + gateCounter compile at CONSTRUCTION into a host tick-fn reading
91
91
  // Wall.getLiveCount on the background counter named 'population' (placed below — the by-name
92
92
  // reference resolves lazily on the first tick). The closed loop has NO sink, so the gate pauses
@@ -113,8 +113,8 @@ export default function buildExperiment(exp) {
113
113
  name: 'm' + (i + 1), color: PAL[i], hooks: ['recolor'] }));
114
114
  }
115
115
  if (IS3D) {
116
- // SCENE Z-COLLIMATOR (CEO drive ruling 2026-07-26 — 'the z is letting things pass through,
117
- // not reflect'): the legs' z-braid diffuses lap over lap; any quantum beyond the mirrors'
116
+ // SCENE Z-COLLIMATOR (without it the z lets things pass through instead of
117
+ // reflecting): the legs' z-braid diffuses lap over lap; any quantum beyond the mirrors'
118
118
  // z-band would sail BESIDE a plate on the leg line — reading as a beam passing THROUGH the
119
119
  // mirror. Two INVISIBLE full-canvas destroy boundaries flush with the slab z-band clamp the
120
120
  // scene to the mirror faces (the universe z-edge moved inward — the sanctioned
@@ -124,7 +124,7 @@ export default function buildExperiment(exp) {
124
124
  exp.addObject('Wall', { rect: [0, 0, W, H], z: -Math.round(SD / 2) - 40, depth: 40,
125
125
  collisionBehavior: 'destroy', name: 'zClipNear', visible: false });
126
126
  }
127
- // BACKGROUND POPULATION COUNTER (CEO 2026-07-25 — the canonical objects approach): an INVISIBLE
127
+ // BACKGROUND POPULATION COUNTER (the canonical objects approach): an INVISIBLE
128
128
  // full-canvas Wall with collisionBehavior 'nothing' + the count hook. Every live leaf inside its
129
129
  // rect collides every tick, so its per-tick collided-frame count (Wall.getLiveCount, bench LO7
130
130
  // mechanics) IS the live population — the ONE 'how many live' authority. In 3D it must contain
@@ -14,7 +14,7 @@ import { SphereEmitter } from '@descix/frqtl-web/parts';
14
14
 
15
15
  export default function buildExperiment(exp) {
16
16
  // Collision Lab 1A (Mirror) — a collimated LASER aimed at a rotatable Bounce/Reflect
17
- // Wall. LASER TUNING (CEO 2026-07-25): particle-walk pins PURE +x momentum (the
17
+ // Wall. LASER TUNING: particle-walk pins PURE +x momentum (the
18
18
  // tightest constrained-angle the emitter supports — zero angular spread); a SINGLE
19
19
  // (positive) charge removes the random transverse braiding; wavelength 1 → the
20
20
  // minimal transverse wiggle; fundamentalWaveLength 4 → wavelengthScale 1 (the
@@ -13,7 +13,7 @@
13
13
  // ── Shared physics recipe SOURCES (ONE authority per physics setup) ──────────
14
14
  // The render-variant rungs REFERENCE these consts (never copy-paste) and express
15
15
  // ONLY a renderState delta — so a future change to a base tuple flows to its
16
- // variants automatically (no config mirror). CEO restructure 2026-07-21.
16
+ // variants automatically (no config mirror).
17
17
  // The classic self-interference field (Rung 4). Reused VERBATIM by Rung 5
18
18
  // (Fountain Pool) with only a water renderState delta.
19
19
 
@@ -18,7 +18,7 @@
18
18
  * Order (it seeds the run): world → brownian/collision flags → the smoke ladder → the muzzle →
19
19
  * the wind-down tick-fn → the bullet → its flight tick-fn → the gun body.
20
20
  *
21
- * Card text (the CEO's what / why / how for this scene, verbatim; the scene is not on the
21
+ * Card text (this scene's what / why / how, verbatim; the scene is not on the
22
22
  * showcase roster, lib/shim/registry/exhibits.js, so no front-page tile or GYM card shows it):
23
23
  * What you are seeing:
24
24
  * Explore how you can create CGI-like effects out of emergent physics - if you are a ThreeJS
@@ -10,8 +10,8 @@
10
10
  * (rung r8-sun).
11
11
  */
12
12
 
13
- // The sun — the 3D omni POINT source at the sun.png panel-visible regime (CEO
14
- // 2026-07-21, supersedes the bare r-code-a-sun reuse for THIS rung). Panel knobs:
13
+ // The sun — the 3D omni POINT source at the sun.png panel-visible regime
14
+ // (supersedes the bare r-code-a-sun reuse for THIS rung). Panel knobs:
15
15
  // dim 2, virtual mass 16 (mass/cap 16/16, fullness 1 — the density driver, ~25012
16
16
  // activeQuanta) via wavelength arg 1 (mass = max(1, capacity 16 / 1) = 16, verified
17
17
  // vs the factory clamp); λ scale (wavelengthScale) 16 via fundamentalWaveLength 64
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * lib/shim/bundle/frqnb.js — the `.frqnb` teaching/gallery projection of a
5
- * recipe bundle (ws-experiments-walkthrough Bite 2).
5
+ * recipe bundle.
6
6
  *
7
7
  * Builds a notebook OBJECT (never hand-emitted `<cell>` markup) and serializes
8
8
  * it THROUGH `lib/shim/notebook/format.js` `serialize` — the ONE notebook
@@ -15,7 +15,7 @@
15
15
  * normalized renderState bag.
16
16
  *
17
17
  * Because it serializes through format.js, ANY new CELL_ATTR added there flows
18
- * through this projection automatically — the Bite-2 conformance gate asserts it.
18
+ * through this projection automatically — the conformance gate asserts it.
19
19
  *
20
20
  * The canvas cell carries `shape="recipe"` (the CELL_ATTRS discriminator owned by format.js):
21
21
  * the module's default export is a RecipeContext recipe (its co-init call + `exp.addObject`), and
@@ -83,7 +83,7 @@ export function buildFrqnb(args) {
83
83
  type: 'canvas',
84
84
  id: CANVAS_ID,
85
85
  setup: MODULE_NAME,
86
- // Bite 5c: the module's DEFAULT export is a `buildExperiment(exp)` RECIPE (RecipeContext
86
+ // The module's DEFAULT export is a `buildExperiment(exp)` RECIPE (RecipeContext
87
87
  // form), NOT a `(frqtl,universe,options)` setup factory — declare it so the
88
88
  // shim synthesizes the RecipeContext path (a recipe canvas names no export).
89
89
  shape: 'recipe',
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * lib/shim/bundle/index.js — the recipe-bundle assembler + importer
5
- * (ws-experiments-walkthrough Bite 2). The canonical owner of the bundle format
5
+ * The canonical owner of the bundle format
6
6
  * (design §2): a folder that zips for download —
7
7
  *
8
8
  * experiment.js ← THE source of truth (the buildExperiment(exp) recipe)
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * lib/shim/bundle/manifest.js — the bundle manifest as an ENVELOPE FERRY
5
- * (ws-experiments-walkthrough Bite 2, CEO ruling E1).
5
+ * (E1).
6
6
  *
7
7
  * ── The rule (E1): manifest = the Module envelope minus `source` ─────────────
8
8
  *
@@ -44,7 +44,7 @@ export var BUNDLE_ONLY_KEYS = ['sdkVersion', 'preview', 'descix'];
44
44
  * @param {object} envelope — a `lib/shim/storage/modules.js` Module envelope
45
45
  * (MUST carry `source`; every other field is ferried verbatim).
46
46
  * @param {object} opts
47
- * @param {string} opts.sdkVersion — REQUIRED; the CDN pin (e.g. '0.6.0-p0.1').
47
+ * @param {string} opts.sdkVersion — REQUIRED; the CDN pin (e.g. '0.6.0-p0.2').
48
48
  * @param {string|null} [opts.preview] — preview filename ref, or null/omitted.
49
49
  * @returns {object} the manifest (JSON-serializable).
50
50
  */
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * lib/shim/bundle/zip.js — a hand-rolled STORE-only ZIP writer + reader
5
- * (ws-experiments-walkthrough Bite 2, architect ruling R2).
5
+ * (R2).
6
6
  *
7
7
  * ── Why hand-rolled + STORE-only ─────────────────────────────────────────────
8
8
  *
@@ -3,8 +3,8 @@
3
3
  /**
4
4
  * lib/shim/controls — The control-descriptor schema contract.
5
5
  *
6
- * Single authority for "what shape is a live control knob" (WS gym-controls-as-sugar
7
- * Bite 1 ratified decisions).
6
+ * Single authority for "what shape is a live control knob" (gym-controls-as-sugar
7
+ * ratified decisions).
8
8
  * Peer of `lib/shim/frame-data` (the data-bubble schema) and `lib/shim/expr/ast-schema`
9
9
  * (the op-program AST schema) — same file/export layout convention (a closed vocabulary
10
10
  * + a throw-or-apply `normalize`, named ES-module exports).
@@ -29,12 +29,12 @@
29
29
  * of every consumer re-deriving "does this look like a camera control?" by hand
30
30
  * (the schema-mirror-drift anti-pattern root `CLAUDE.md` calls out).
31
31
  *
32
- * ── Scope (Bite 1 — contract only) ───────────────────────────────────────────
32
+ * ── Scope (contract only) ────────────────────────────────────────────────────
33
33
  *
34
34
  * This module ships the SCHEMA + normalize. It does NOT:
35
- * - render any UI panel (that is Bite 3's `frqtl-control-*.js` family),
36
- * - touch the GYM/CompareView.jsx (Bite 2 — still duck-types these capabilities
37
- * ad hoc; migrating it to `normalizeControlDescriptor` is a later bite's job),
35
+ * - render any UI panel (that is the `frqtl-control-*.js` family),
36
+ * - touch the GYM/CompareView.jsx (it still duck-types these capabilities
37
+ * ad hoc; migrating it to `normalizeControlDescriptor` is later work),
38
38
  * - migrate any existing experiment page's `CONTROLS = [...]` literal onto this
39
39
  * module (byte-identical arrays remain valid input to `normalizeControlDescriptor`
40
40
  * — normalizing is OPT-IN for a new consumer, not a retrofit requirement).
@@ -67,8 +67,8 @@
67
67
  // loop — a periodic runner.setup() re-run control. THE PROVEN fx-experiment.js
68
68
  // _buildLoopControl() shape: {enabled,ticks,setEnabled,setTicks}.
69
69
  //
70
- // The three kinds below are NEW (WS Studio Controls Realignment S1, design §2.2 /
71
- // gap-census #1,#4,#6,#10 — architect-ratified: "only these three are genuinely new
70
+ // The three kinds below are NEW (Studio Controls Realignment S1, design §2.2 /
71
+ // gap-census #1,#4,#6,#10 — ratified: "only these three are genuinely new
72
72
  // value-shapes"):
73
73
  //
74
74
  // enum — select-one from a closed candidate set. Covers Studio's
@@ -91,7 +91,7 @@
91
91
  // an array the SAME LENGTH as `value` (a per-component bound, e.g. a
92
92
  // rect's `w`/`h` needing a different range than `left`/`top`).
93
93
  //
94
- // The two kinds below are NEW (presentation pass Item 2, CEO-ratified E-P2a) —
94
+ // The two kinds below are NEW (presentation pass Item 2, E-P2a) —
95
95
  // the two value shapes no existing kind holds:
96
96
  //
97
97
  // text — a STRING-valued control: {id,label,value,fmt,onChange} (+ optional
@@ -105,7 +105,7 @@
105
105
  // deliberately NOT expressed as a `bind` — a bind is a property
106
106
  // read/write pair, and `get()` of "restart" is meaningless.
107
107
  //
108
- // Deliberately NOT separate kinds (architect ruling, closed-union discipline —
108
+ // Deliberately NOT separate kinds (closed-union discipline —
109
109
  // do not propose adding these):
110
110
  // - `bool`/`toggle` — a toggle IS a `scalar` with min:0,max:1,step:1 (matches
111
111
  // the pre-existing scalar-toggle convention above; no shape distinction).
@@ -144,7 +144,7 @@ var DEFAULT_PLACE_ANCHOR = 'top-left';
144
144
 
145
145
  // ── Widget seam (optional, kind-ORTHOGONAL) ────────────────────────────────────
146
146
  //
147
- // The schema's standing ruling above ("a toggle IS a scalar 0/1"; "a color IS a
147
+ // The schema's rule above ("a toggle IS a scalar 0/1"; "a color IS a
148
148
  // vector-3") requires a place to say WHICH widget renders a given descriptor
149
149
  // without inventing a kind for it. `widget` is that seam: a closed name list,
150
150
  // validated here, resolved to an actual renderer by the ONE widget table
@@ -267,7 +267,7 @@ var REQUIRED_KEYS_BY_KIND = Object.freeze({
267
267
 
268
268
  /**
269
269
  * BIND_KEYS — required keys on a scalar/enum/flags/vector descriptor's optional
270
- * `bind` object (WS gym-controls-as-sugar binds+ControlSync FINAL design,
270
+ * `bind` object (gym-controls-as-sugar binds+ControlSync FINAL design,
271
271
  * converged 2026-07-04: "Declarative binds + triggered sync"; extended to
272
272
  * enum/flags/vector by S1 — bind's DATA SHAPE is the SAME `{object, prop}` pair regardless
273
273
  * of kind, e.g. a `vector` bind on a LargeObject's `rect` writes the WHOLE
@@ -279,12 +279,12 @@ var REQUIRED_KEYS_BY_KIND = Object.freeze({
279
279
  * handle-kind dispatch) is OBJECTS-SIDE — it lives with the sugar that
280
280
  * already has the registry/accessor references
281
281
  * (`lib/frqtl/parts/FrqtlControlsPanel.js`, `controlBind.js`, and
282
- * `frqtl-control-sync.js`), never here (arrow ruling: shim owns the DATA
282
+ * `frqtl-control-sync.js`), never here (arrow rule: shim owns the DATA
283
283
  * shape only). Bind's DATA SHAPE is uniform across channels AND kinds —
284
284
  * `channel` is a SIBLING field on the descriptor, already validated above; a
285
285
  * render-channel bind still carries `{object, prop}` here, even though the
286
286
  * render channel has no read-back (objects-side execution detail, not a shape
287
- * distinction — see the runtime doc's "non-uniform get()" ruling).
287
+ * distinction — see the runtime doc's "non-uniform get()" rule).
288
288
  */
289
289
  var BIND_KEYS = Object.freeze(['object', 'prop']);
290
290
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * lib/shim/controls/registry — the runtime-registerable instance registry
5
- * (WS gym-controls-as-sugar Bite 1, "Instance addressing" ruling).
5
+ * ("Instance addressing").
6
6
  *
7
7
  * Sugar objects (`SphereEmitter`, `Tube`, a future `*Layer` class, …) and their
8
8
  * declared control descriptors (`lib/shim/controls/index.js` shapes) need a
@@ -119,7 +119,7 @@ import * as ControlsSchema from './index.js';
119
119
  }
120
120
 
121
121
  /**
122
- * Resolve a registered object's `kind` label (WS gym-controls-as-sugar
122
+ * Resolve a registered object's `kind` label (gym-controls-as-sugar
123
123
  * binds+ControlSync FINAL design — objects-side bind execution needs BOTH
124
124
  * the instance (`getObject`, unchanged) AND its kind, to route a scalar
125
125
  * descriptor's `bind.object` to the correct property-accessor family
@@ -242,7 +242,7 @@ import * as ControlsSchema from './index.js';
242
242
  /**
243
243
  * allControls() — a snapshot map `{ name: descriptor[] }` of every
244
244
  * registered controls array (for a future host that enumerates
245
- * everything without knowing names ahead of time — e.g. Bite 3's
245
+ * everything without knowing names ahead of time — e.g. the
246
246
  * control panel).
247
247
  * @returns {Object<string, object[]>}
248
248
  */
@@ -1,8 +1,7 @@
1
1
  /* Copyright 2023-2026 by Essam Abadir */
2
2
 
3
3
  /**
4
- * artifact-shell.js — pure generator for the claude.ai Artifact host shell
5
- * (ws-artifact-showcase Bite A2, docs/design/frqtl-artifact-showcase-scoping-2026-07-10.md).
4
+ * artifact-shell.js — pure generator for the claude.ai Artifact host shell.
6
5
  *
7
6
  * The "artifact host shell" is a SINGLE self-contained HTML file a user pastes
8
7
  * into a claude.ai chat as an Artifact. It has no server, no build step, no
@@ -11,9 +11,8 @@
11
11
  * baked into the dist pages at build time by `sdk/frqtl-web/build.js`).
12
12
  * - `CDN_PROFILE` — the SAME dist layout, resolved to ABSOLUTE jsdelivr URLs
13
13
  * (`https://cdn.jsdelivr.net/npm/@descix/frqtl-web@<ver>/dist/...`) for static hosting
14
- * with no server process at all (ws-artifact-showcase, CEO 2026-07-10). CDN_PROFILE is
15
- * a DISTINCT profile object, not a DIST_PROFILE parameterization (locked ruling —
16
- * docs/design/frqtl-artifact-showcase-scoping-2026-07-10.md §5.2): DIST_PROFILE's
14
+ * with no server process at all. CDN_PROFILE is
15
+ * a DISTINCT profile object, not a DIST_PROFILE parameterization: DIST_PROFILE's
17
16
  * relative bases are meaningless outside the exact dist/experiments/{id}/ page
18
17
  * context they were computed for, whereas CDN_PROFILE's
19
18
  * absolute bases resolve correctly from ANY host page (a claude.ai Artifact iframe has
@@ -90,7 +89,7 @@ var DEV_CORE_PROFILE = {
90
89
  // presets.js hardcoding a '/notebooks/' literal (dev-only, 404s in dist).
91
90
  '__notebookBase': '/notebooks',
92
91
  // Placed vendor libs (lib/frqtl/assets/vendor/, gitignored artifacts) — the
93
- // STABLE root-level /vendor alias mounts.js exposes (WS-NOTEBOOK-VENDOR §2a.1).
92
+ // STABLE root-level /vendor alias mounts.js exposes (§2a.1).
94
93
  // A realm cell's bare-specifier import (`import * as d3 from 'd3'`) resolves via
95
94
  // a manifest-generated import-map whose base is THIS value (vendor-importmap.js).
96
95
  // Single path authority for the vendor URL space — surfaces NEVER derive '/vendor'
@@ -141,16 +140,15 @@ function buildDistProfile(base) {
141
140
 
142
141
  var DIST_PROFILE = buildDistProfile('../..');
143
142
 
144
- // ── CDN_PROFILE (jsdelivr static hosting — ws-artifact-showcase Bite A1) ────────
143
+ // ── CDN_PROFILE (jsdelivr static hosting) ───────────────────────────────────────
145
144
  //
146
145
  // Pinned-version constants — the "one constant" the packet's absolute jsdelivr
147
- // bases resolve from (docs/design/frqtl-artifact-showcase-scoping-2026-07-10.md
148
- // §3b). These are hardcoded (not read from package.json — this module runs in
146
+ // bases resolve from. These are hardcoded (not read from package.json — this module runs in
149
147
  // the browser, no fs access) and MUST be bumped alongside each npm publish;
150
148
  // lib/shim/engine/test/router.test.mjs asserts them against the two
151
149
  // package.json#version fields so a forgotten bump fails `make verify`, not a
152
150
  // silent stale-CDN-URL bug.
153
- var CDN_SDK_VERSION = '0.6.0-p0.1'; // sdk/frqtl-web/package.json#version (the ONE version owner) — bound by router.test.mjs
151
+ var CDN_SDK_VERSION = '0.6.0-p0.2'; // sdk/frqtl-web/package.json#version (the ONE version owner) — bound by router.test.mjs
154
152
  var CDN_MATH_SDK_VERSION = '0.3.2'; // sdk/egpt-math-sdk/package.json#version — bound by router.test.mjs; bumped with each npm publish
155
153
 
156
154
  /**
@@ -182,8 +180,8 @@ var CDN_MATH_BASE = 'https://cdn.jsdelivr.net/npm/@descix/egpt-math-sdk@' + CDN_
182
180
  // different published package.
183
181
  //
184
182
  // `base` anchors the dist layout at an absolute dist root. With no base it is CDN_BASE (the
185
- // published jsdelivr copy). With one, it is the SELF-HOSTED form (eabadir/fraqtl#165 GAP 6, CEO
186
- // approved at 4321684c item 9): any URL serving an UNMODIFIED copy of the package's dist/ tree —
183
+ // published jsdelivr copy). With one, it is the SELF-HOSTED form: any URL serving an
184
+ // UNMODIFIED copy of the package's dist/ tree —
187
185
  // every file dist/dist-manifest.json lists, byte for byte, at its relative path. A hand-picked
188
186
  // subset is not supported: the profile below addresses every subtree of the dist, and which files
189
187
  // a scene reaches is the game layer's business, not the host's. Callers: bootScene/bootRecipe
@@ -241,7 +239,7 @@ function buildCdnProfile(base) {
241
239
  // build.js's imports) gets a byte-identical object to before this refactor.
242
240
  var CDN_PROFILE = buildCdnProfile(CDN_BASE);
243
241
 
244
- // ── The static site profile (self-contained same-origin static host — ws-egpt-frqtl-site-deploy) ──
242
+ // ── The static site profile (self-contained same-origin static host) ──────────────────────────────
245
243
  //
246
244
  // The React FraqtlIde deployed as a dumb-static, no-backend, WASM-only site (DeSciX
247
245
  // CodeSite / any GCS-backed host — no fraqtlServe, no lib/server/server.js). The host serves the
@@ -265,7 +263,7 @@ var CDN_PROFILE = buildCdnProfile(CDN_BASE);
265
263
  // DOCUMENT-RELATIVE values, for a BUILD-TIME consumer whose output the document resolves
266
264
  // (the import map baked into index.html).
267
265
  //
268
- // THE DELIBERATE DIVERGENCE FROM CDN_PROFILE (architect design §A.3 / §E flag 4):
266
+ // THE DELIBERATE DIVERGENCE FROM CDN_PROFILE (design §A.3 / §E flag 4):
269
267
  // CDN_PROFILE's math + notebook bases are hardwired CROSS-ORIGIN at CDN_MATH_BASE; the
270
268
  // static-site semantic is "everything self-contained under ONE origin prefix": the math SDK
271
269
  // is co-served at graphBase + '/egpt-math-sdk/...' and the curated notebooks ride the
@@ -296,7 +294,7 @@ function buildStaticProfile(graphBase, entryBase) {
296
294
  '__mathWasmModuleUrl': graphBase + '/egpt-math-sdk/wasm/egpt_math_sdk_wasm.js',
297
295
  '__mathBackend': 'wasm-math',
298
296
  // Notebooks come from the frqtl-web dist's OWN copy (build.js copyDir
299
- // lib/notebooks → dist/notebooks) — NOT under egpt-math-sdk (architect §A.3/§B.1).
297
+ // lib/notebooks → dist/notebooks) — NOT under egpt-math-sdk (design §A.3/§B.1).
300
298
  '__notebookBase': graphBase + '/notebooks',
301
299
  // Vendor import-map root — frqtl-web's OWN dist/vendor/ (same as CDN, self-
302
300
  // sufficient), just same-origin instead of jsdelivr.
@@ -416,7 +414,7 @@ var _assertProfileParity = (function () {
416
414
  // The vendor base (__vendorBase) is a PRIVATE key but it MUST exist in ALL
417
415
  // FOUR profiles (the single path authority for the /vendor URL space — every
418
416
  // host resolves a realm import-map base through it). Assert it explicitly so a
419
- // profile can never half-define it (WS-NOTEBOOK-VENDOR §2a.4).
417
+ // profile can never half-define it (§2a.4).
420
418
  if (!DEV_CORE_PROFILE.__vendorBase || !DIST_PROFILE.__vendorBase ||
421
419
  !CDN_PROFILE.__vendorBase || !STATIC_SAMPLE.__vendorBase) {
422
420
  throw new Error('[engineRouter] Profile parity FAIL: __vendorBase must be defined in ALL FOUR profiles.');
@@ -451,7 +449,7 @@ var _assertProfileParity = (function () {
451
449
  * `'dev-core'` uses the `lib/server` plugin mounts (`/frqtl`, `/fat`).
452
450
  * `'dist'` uses the flat `sdk/frqtl-web/dist` layout, same-origin RELATIVE paths.
453
451
  * `'cdn'` uses the SAME dist layout resolved to ABSOLUTE jsdelivr URLs (static
454
- * hosting with no server — ws-artifact-showcase).
452
+ * hosting with no server).
455
453
  * `'static'` uses the SAME dist layout resolved to ABSOLUTE URLs under the site's
456
454
  * build-stamped `./pub/<build>` directory (experiment entries at `./pub/experiments/`),
457
455
  * anchored at the document (`opts.documentBaseURI`, default `document.baseURI`), with the
@@ -509,7 +507,7 @@ var _assertProfileParity = (function () {
509
507
  * // CDN mode (static hosting — the artifact host shell has no server, no page anchor):
510
508
  * const cdnRouter = engineRouter({ mode: 'cdn', engine: 'wasm' });
511
509
  * console.log(cdnRouter.resolve('compat/engine.js'));
512
- * // 'https://cdn.jsdelivr.net/npm/@descix/frqtl-web@0.6.0-p0.1/dist/frqtl/compat/engine.js'
510
+ * // 'https://cdn.jsdelivr.net/npm/@descix/frqtl-web@0.6.0-p0.2/dist/frqtl/compat/engine.js'
513
511
  *
514
512
  * // CDN mode, self-hosted: a copy of dist/ served from the consumer's own origin:
515
513
  * const selfHosted = engineRouter({ mode: 'cdn', engine: 'wasm', base: 'https://example.org/vendor/frqtl-web/dist' });
@@ -573,7 +571,7 @@ export function engineRouter(opts) {
573
571
  var mode = opts.mode || 'dev-core';
574
572
  var engine = opts.engine || 'wasm';
575
573
  // FRQTL physics is WASM-only. An explicit 'js' request FAILS LOUD — the JS
576
- // reference engine is archived (internal/archive/frqtl-js-reference/), not a runtime backend.
574
+ // reference engine is archived, not a runtime backend.
577
575
  if (engine === 'js') {
578
576
  throw new Error('[engineRouter] JS reference engine archived — FRQTL is WASM-only. ' +
579
577
  'Remove engine:"js"; the only FRQTL physics engine is the compiled Rust/WASM engine.');
@@ -13,7 +13,7 @@
13
13
  * and by the dual-native evaluators in the JS reference and Rust engines.
14
14
  * Arrow-legality: lib/frqtl/objects imports lib/shim (downward — legal).
15
15
  *
16
- * Gate-2 architect binding (2026-06-21, slice 3):
16
+ * Gate-2 binding (slice 3):
17
17
  * • Rust NEVER parses — AST-only payload; this schema is the data shape.
18
18
  * • NODE_KINDS and vocab lists are the conformance iteration surface
19
19
  * (binding item 3 — conformance iterates these lists).
@@ -57,7 +57,7 @@
57
57
  * whose target is `<handle>.data.<key>` (a string-map write).
58
58
  * MUST throw (JS) / panic (Rust) if used as a child of Bin, Cmp,
59
59
  * Fn, or Cond.test — eval_expr stays numeric-pure (INTEGER-FIRST
60
- * ruling; Gate-2 2026-06-21 item 2). The op-apply layer
60
+ * rule; Gate-2 item 2). The op-apply layer
61
61
  * (_runOpProgram / apply_set_op) detects StrLit before calling
62
62
  * eval_expr and routes it to the string-map writer.
63
63
  *
@@ -126,7 +126,7 @@
126
126
  * NOTE on StrLit (item 7): StrLit is ONLY valid as the `to` value of a `set`
127
127
  * op targeting `<handle>.data.<key>` (a string-map write). Using StrLit as a
128
128
  * child of Bin, Cmp, Fn, or Cond.test MUST throw/panic — eval_expr is
129
- * numeric-pure (INTEGER-FIRST ruling, Gate-2 2026-06-21 item 2).
129
+ * numeric-pure (INTEGER-FIRST rule, Gate-2 item 2).
130
130
  *
131
131
  * @type {string[]}
132
132
  */
@@ -154,7 +154,7 @@ var NODE_KINDS = Object.freeze([
154
154
  * - Frame removal → set 0.is_alive=0 + dead-parent GC
155
155
  * - Dimension alloc → universe.addDimension(n) / add_dimension engine method
156
156
  *
157
- * Gate-2 architect binding (2026-06-21, §10.8 B3):
157
+ * Gate-2 binding (§10.8 B3):
158
158
  * • B3.2 — 'collect' is NOT a 2nd op. It compiles to:
159
159
  * { kind:'set', set:'1.count', to: Bin('+', Ref(HANDLE_SELF,'count'), Lit(1)) }
160
160
  * i.e. a plain 'set' op on the LO's 'count' property. No special sink.
@@ -220,7 +220,7 @@ var CMP_OPS = Object.freeze(['<', '>', '==']);
220
220
  *
221
221
  * This is the canonical overlap test for op-programs (replaces the native
222
222
  * overlaps/past_wall gate that was deleted from process_large_object_collisions in
223
- * G2b). The JS reference (EGPTfrqtl.js) is FROZEN — intersects is a WASM-canonical
223
+ * G2b). The JS reference engine is FROZEN — intersects is a WASM-canonical
224
224
  * addition only (JS reference keeps the old native gate).
225
225
  *
226
226
  * Draw discipline: intersects draws ZERO RNG values (deterministic geometry).
@@ -3,8 +3,7 @@
3
3
  /**
4
4
  * lib/shim/field-descriptor — the shared FIELD-SHAPE vocabulary contract.
5
5
  *
6
- * WS Studio Controls Realignment §7 r2 CEO call C1 (ratified 2026-07-07): the architect's
7
- * escalation was that a single FIELD shape — `{name, type, constraint, unit,
6
+ * Studio Controls Realignment §7 r2, C1: a single FIELD shape — `{name, type, constraint, unit,
8
7
  * description, engineVisible, widgetHint, widgetConfig, default}` — and its
9
8
  * closed TYPE vocabulary were about to be re-derived THREE times (physics
10
9
  * object schema, the new render-capability descriptors, and a future Rosetta
@@ -175,13 +174,13 @@ function normalizeFieldDescriptor(partial) {
175
174
  return bag;
176
175
  }
177
176
 
178
- // ── UX presentation vocabulary (ws-experiments-walkthrough Bite 5b A0) ──────
177
+ // ── UX presentation vocabulary ──────────────────────────────────────────────
179
178
  //
180
179
  // A per-KIND `ux:{}` block rides ON the ObjectSchema descriptor (peer of `fields`
181
- // — a presentation contract, NOT a parallel `UxSchema`; architect Q-A0). Its
180
+ // — a presentation contract, NOT a parallel `UxSchema`; Q-A0). Its
182
181
  // closed value vocabularies live HERE, the PEER of FIELD_TYPES, so STUDIO's
183
182
  // overlay AND a headless game consume ONE list (the SAME hooks a game uses
184
- // programmatically — CEO §9). The vocab is READ DOWNWARD ONLY (shim → objects/
183
+ // programmatically). The vocab is READ DOWNWARD ONLY (shim → objects/
185
184
  // features); no lib/frqtl/objects file re-lists these strings, and
186
185
  // author-bbox-overlay.js (lib/features) FERRIES `UX_HANDLE_ZONES` (asserting its
187
186
  // own returned zone names are members) instead of being a second owner.
@@ -204,10 +203,10 @@ var UX_HANDLE_ZONES = Object.freeze([
204
203
  // (reposition is the aim + SPACE carry), so there is no per-object 3D knob to declare.
205
204
  var UX_DRAGGABLE_MODES = Object.freeze(['2d']);
206
205
 
207
- // When a manipulable object's visual shell renders (generalizes the Bite-4b
206
+ // When a manipulable object's visual shell renders (generalizes the
208
207
  // `_designMarker` boolean at the ONE _visibleLargeObjects authority):
209
- // design — only while authoring (Design mode). The Bite-4b marker default.
210
- // run — always visible (the CEO's "red light bulb" opt-in).
208
+ // design — only while authoring (Design mode). The marker default.
209
+ // run — always visible (the "red light bulb" opt-in).
211
210
  // never — never drawn.
212
211
  var UX_SHELL_RENDER = Object.freeze(['design', 'run', 'never']);
213
212
 
@@ -4,7 +4,7 @@
4
4
  * lib/shim/frame-data — The data-bubble schema contract.
5
5
  *
6
6
  * Single authority for the FrameData.data bag shape (§6 of
7
- * docs/internal/engine/ENGINE_CONTRACT.md). The bubble is GENERIC and engine-opaque:
7
+ * the engine contract). The bubble is GENERIC and engine-opaque:
8
8
  * SECTION_KEYS = ['detection', 'string_map']. The engine interprets NOTHING in
9
9
  * string_map — it ferries every key verbatim across the JS↔WASM boundary.
10
10
  *
@@ -133,10 +133,10 @@ function normalizeDetection(partial) {
133
133
  * local override of the experiment-wide setRenderOption('meshScale',…)). OPEN-ID.
134
134
  * render.meshRotation— per-frame euler rotation for the frame's render.mesh clone, a CSV of THREE radians
135
135
  * 'rx,ry,rz' (same unit as a LargeObject's lo.meshRotation → clone.rotation.set). OPEN-ID.
136
- * (Bite 5b R3-3: previously written ad-hoc but undeclared + unread; declared
136
+ * (R3-3: previously written ad-hoc but undeclared + unread; declared
137
137
  * here at the owner and read per-clone in three-provider's _layoutMeshClones.)
138
138
  *
139
- * Two contract shapes (architect ruling 2026-06-30):
139
+ * Two contract shapes:
140
140
  * ENUM key — has a RENDER_INTENT_VALUES[] array; decoders ferry the array (no re-listing); conformance-validated.
141
141
  * OPEN-ID key — has NO RENDER_INTENT_VALUES entry → assertRenderIntentConformance accepts any string; the
142
142
  * decoder/resolver owns load-time validation and fails loud. Covers render.color and render.mesh.
@@ -37,20 +37,20 @@ export { engineRouter, DEV_CORE_PROFILE, DIST_PROFILE } from './engine/router.js
37
37
  // canonical URL — there is only one MathBackendRegistry instance. The registry
38
38
  // module has zero imports; the JS reference core never enters this graph.
39
39
  export { MathBackendRegistry, MathBackendNotAvailableError } from '../egpt/js/model/backend/MathBackendRegistry.js';
40
- // Notebook spine (WS-NOTEBOOK-A1): the native format parser/serializer and the
40
+ // Notebook spine: the native format parser/serializer and the
41
41
  // per-notebook kernel. The kernel calls Runtime.runCell directly (no Bus
42
42
  // executor). Consumers (the A2 notebook pane) import these from the barrel.
43
43
  export { parse, serialize, normalize } from './notebook/format.js';
44
44
  export { NotebookKernel, NOTEBOOK_CELL_STATUS } from './notebook/kernel.js';
45
- // Cell-as-module resolver (WS-NOTEBOOK-IMPORT B2) — the host-neutral in-memory
45
+ // Cell-as-module resolver (B2) — the host-neutral in-memory
46
46
  // blob closure logic. Re-exported so tests + any host can build the closure
47
47
  // (Runtime injects the browser blob minter; the resolver itself is DOM-free and
48
- // must NOT assume a pane exists — model-gate ruling 6).
48
+ // must NOT assume a pane exists — model-gate rule 6).
49
49
  export {
50
50
  canonKey, resolveRelativeKey, hasImport, splitImportsAndBody,
51
51
  rewriteRelativeToSiblingBlobs, buildModuleClosure, compileEntryModuleSource
52
52
  } from './notebook/module-resolver.js';
53
- // Notebook webview-realm model (WS-NOTEBOOK-REALM): the FOURTH BYO pluggable
53
+ // Notebook webview-realm model: the FOURTH BYO pluggable
54
54
  // surface. ONE registry authority + the frozen view-handle contract + the in-app
55
55
  // transport (same-origin direct fast path). A realm pre-load
56
56
  // is an above-the-shim renderer env; the frqtl pre-load co-locates the engine.
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * canvas-guard — the SOLE C8 migration-guard authority for a DECLARED canvas cell
5
- * (WS-NOTEBOOK-REALM-KERNEL-BINDING). PURE module — NO DOM / engine / Runtime / Bus
5
+ * PURE module — NO DOM / engine / Runtime / Bus
6
6
  * import. The notebook-pane's `_resolveDeclaredCanvas` imports this one helper so no
7
7
  * host re-derives the legality test (DRY — one guard).
8
8
  *
@@ -4,8 +4,8 @@
4
4
  * firstContactNotebook — the ONE reader of the notebook catalog's first-contact default.
5
5
  *
6
6
  * The catalog (lib/notebooks/notebooks.json) owns the notebook roster AND, beside it, the
7
- * `firstContact` id: the notebook FAT opens on when no `?notebook=` is named (CEO 2026-10-13:
8
- * the Entropy-Log Bijection). Declared beside the roster, as the walkthrough registry
7
+ * `firstContact` id: the notebook FAT opens on when no `?notebook=` is named (the
8
+ * Entropy-Log Bijection). Declared beside the roster, as the walkthrough registry
9
9
  * declares FIRST_CONTACT_WALKTHROUGH_ID beside its rungs. A deep link naming a notebook wins;
10
10
  * that branch never reaches this reader.
11
11
  *