@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
@@ -98,11 +98,11 @@ import { registerKind } from '../objects/kinds.js';
98
98
  * @param {number} [wallWidth=20] - Wall thickness (physics px).
99
99
  * @param {string} [wallName='detector_wall'] - Identifier used to key the
100
100
  * collision histogram in the universe.
101
- * @param {Object} [opts] - WS-DSE-3D Bite B1.
101
+ * @param {Object} [opts]
102
102
  * @param {number} [opts.depth] - When provided, the detector LO is built as a
103
103
  * 6-element `[left,top,z,w,h,d]` rect spanning the FULL z-extent
104
104
  * `[-depth/2, +depth/2]` (Tube.js precedent) — without it, z-spread quanta
105
- * (WS-DSE-3D Bite B0's emitter z-spread) fly past a paper-thin (z=0,d=w)
105
+ * (the emitter z-spread) fly past a paper-thin (z=0,d=w)
106
106
  * detector. OMITTED (default) → legacy 4-element rect, byte-identical.
107
107
  */
108
108
 
@@ -147,7 +147,7 @@ import { registerKind } from '../objects/kinds.js';
147
147
  // NOTE: collect_collided is passed in the spec object that LargeObject forwards
148
148
  // to universe.registerLargeObject(). It is a spec field (not a post-registration
149
149
  // setter), so it is set atomically at registration time and never changes.
150
- // WS-DSE-3D Bite B1: 6-element full-z-depth rect when opts.depth is set
150
+ // 6-element full-z-depth rect when opts.depth is set
151
151
  // (Tube.js precedent); legacy 4-element rect otherwise (byte-identical).
152
152
  var wallRect = (depth !== null)
153
153
  ? [wallX, wallY, -depth / 2, wallWidth, wallHeight, depth]
@@ -172,7 +172,7 @@ import { registerKind } from '../objects/kinds.js';
172
172
  this.detector_wall = this._innerWall.lo;
173
173
  // THE ONE UP-LINK: the detector composed this Wall (which stamps its own LO).
174
174
  this._innerWall._owner = this;
175
- // WS-DSE-3D fix-loop item 1 (render): the Tube.js precedent — a 6-element
175
+ // Render: the Tube.js precedent — a 6-element
176
176
  // rect gives the ENGINE a real z-slab, but _buildLoMesh (three-provider.js)
177
177
  // only builds a 3D BoxGeometry when the LO ALSO carries the render-only
178
178
  // `shape='box'` + `depth` hint (see SlitScreen.js for the identical fix).
@@ -193,7 +193,7 @@ import { registerKind } from '../objects/kinds.js';
193
193
  this._slit1Total = 0;
194
194
  this._slit2Total = 0;
195
195
 
196
- // ── Y×Z grid (WS-DSE-3D Bite B1, ratified §4.2) ───────────────────
196
+ // ── Y×Z grid (§4.2) ───────────────────────────────────────────────
197
197
  // Additive capture alongside the (untouched) Y-marginal above: Map<y, Map<z,count>>.
198
198
  // In 2D (depth omitted), z is always 0 (fd.z defaults to 0 — see the loop below),
199
199
  // so every grid entry has a single z=0 bucket and `DetectorWall.deriveMarginalY(grid)`
@@ -204,7 +204,7 @@ import { registerKind } from '../objects/kinds.js';
204
204
  this._gridSlit1 = new Map();
205
205
  this._gridSlit2 = new Map();
206
206
 
207
- // #61 throw-guard (fraqtl#61, architect-ruled shape: THROW, never silent dedup) —
207
+ // Throw-guard (THROW, never silent dedup) —
208
208
  // the last TickData object consumed by getCollisionHistogram(). Applies in 2D too.
209
209
  this._lastTickData = undefined;
210
210
  }
@@ -256,7 +256,7 @@ import { registerKind } from '../objects/kinds.js';
256
256
  * The returned object holds RUNNING totals across all calls — each call adds
257
257
  * the current tick's hits to the accumulators.
258
258
  *
259
- * #61 throw-guard (fraqtl#61, architect-ruled): THROWS if called twice in a row
259
+ * Throw-guard: THROWS if called twice in a row
260
260
  * with the SAME `tickData` object reference — each tick's data must be consumed
261
261
  * exactly once, or collisions double-count silently. A correct caller (the CLI,
262
262
  * FrqtlApp's onTick, the bench) calls this once per `universe.doTick()`
@@ -276,7 +276,7 @@ import { registerKind } from '../objects/kinds.js';
276
276
  * }}
277
277
  */
278
278
  DetectorWall.prototype.getCollisionHistogram = function (tickData) {
279
- // #61 throw-guard — top of function, before any read (architect-ruled: THROW,
279
+ // Throw-guard — top of function, before any read (THROW,
280
280
  // never silent dedup). Reference equality only; two DIFFERENT tickData objects
281
281
  // (even with identical content, e.g. the TICKS=0 `{objects:{}}` literal) never
282
282
  // trip it — only the exact same object consumed twice in a row does.
@@ -313,7 +313,7 @@ import { registerKind } from '../objects/kinds.js';
313
313
  y = 0;
314
314
  }
315
315
 
316
- // Z bin (WS-DSE-3D Bite B1): stays 0 in every 2D run (fd.z defaults to 0 when
316
+ // Z bin: stays 0 in every 2D run (fd.z defaults to 0 when
317
317
  // the engine never wrote it), so the grid degenerates to one z-bucket per y.
318
318
  var z = (fd.z != null) ? Math.floor(fd.z) : 0;
319
319
 
@@ -375,7 +375,7 @@ import { registerKind } from '../objects/kinds.js';
375
375
  this._total = 0;
376
376
  this._slit1Total = 0;
377
377
  this._slit2Total = 0;
378
- // Y×Z grid (WS-DSE-3D Bite B1) — reset alongside the Y-marginal it derives from.
378
+ // Y×Z grid — reset alongside the Y-marginal it derives from.
379
379
  this._grid = new Map();
380
380
  this._gridSlit1 = new Map();
381
381
  this._gridSlit2 = new Map();
@@ -2,13 +2,13 @@
2
2
 
3
3
  /**
4
4
  * frqtl-controls-panel.js — a placeable host for control collections
5
- * (WS gym-controls-as-sugar Bite 3 Stage 2, Layer A — the panel itself).
5
+ * (gym-controls-as-sugar, Layer A — the panel itself).
6
6
  *
7
7
  * ── Layer 1: API contract ────────────────────────────────────────────────────
8
8
  *
9
9
  * `exposeRegistry(registry, opts)` — REALM side. Call this on the experiment
10
10
  * page, once, after registering the page's OWN control descriptors into a
11
- * `makeControlRegistry()` instance (`lib/shim/controls/registry.js`, Bite 1).
11
+ * `makeControlRegistry()` instance (`lib/shim/controls/registry.js`).
12
12
  * Makes that registry (a) the page's exposed registry (`exposedRegistry()`, read by a host through
13
13
  * the page door `FrqtlPage.controls`) and (b) remotely drivable from a parent frame via `postMessage` (unless
14
14
  * `opts.crossFrame === false`).
@@ -39,7 +39,7 @@
39
39
  * `onChange`), which is exactly how the channel discriminator is "respected"
40
40
  * here — as authored metadata, never as a panel-side dispatch branch.
41
41
  *
42
- * ── Transport wiring (the §2 ruling, applied via lib/shim/rpc) ──────────────
42
+ * ── Transport wiring (§2, applied via lib/shim/rpc) ─────────────────────────
43
43
  *
44
44
  * Same-page (in-app) placement: `ShimRpc.makeInAppRpc(dispatch)` — direct
45
45
  * scripting, no postMessage marshaling (both sides are the SAME window).
@@ -85,7 +85,7 @@ var RPC_TAG = 'frqtl-controls-panel';
85
85
  * @param {object} registry — a makeControlRegistry() instance. Bind execution
86
86
  * reads its bind context off `registry._controlBindCtx` (attached by
87
87
  * `exposeRegistry`'s `opts.universe`/`opts.runner`/`opts.readSnapshot` —
88
- * WS gym-controls-as-sugar FULL CONVERGENCE build) — attaching it to the
88
+ * gym-controls-as-sugar FULL CONVERGENCE build) — attaching it to the
89
89
  * registry itself (rather than threading a second parameter through here)
90
90
  * means the in-app dispatch path (`_buildInAppHandle`, which is handed this
91
91
  * SAME registry instance by `mount({mode:'in-app'})`) sees it for free,
@@ -108,7 +108,7 @@ function _dispatchControlsCall(registry, fn, args) {
108
108
  return descs.map(function (d) {
109
109
  // Bind-based descriptors refresh from LIVE state before serializing —
110
110
  // this is what makes listControls a genuine PULL/reconciliation source
111
- // (frqtl-control-sync.js, WS gym-controls-as-sugar FULL CONVERGENCE
111
+ // (frqtl-control-sync.js, gym-controls-as-sugar FULL CONVERGENCE
112
112
  // Stage ii) rather than a stale cache of the last WRITE. Per the
113
113
  // declared non-uniform get() contract (controlBind.js): Frame binds
114
114
  // read live; LargeObject/backdrop binds read the last TickData
@@ -187,7 +187,7 @@ function _dispatchControlsCall(registry, fn, args) {
187
187
  descs2.map(function (c) { return c.id; }).join(', ') + ']). (FAIL-LOUD.)');
188
188
  }
189
189
  match.value = value;
190
- // Write-authority dispatch (§5 converged ruling — "at least one of
190
+ // Write-authority dispatch (§5 converged — "at least one of
191
191
  // {onChange, bind}", never neither): onChange wins if present (it may
192
192
  // coexist with a READ-only bind); otherwise bind.set() executes via
193
193
  // controlBind.js, routed through the universe/runner exposeRegistry
@@ -222,7 +222,7 @@ function _dispatchControlsCall(registry, fn, args) {
222
222
  * @param {boolean} [opts.crossFrame=true] — install the RPC responder so a
223
223
  * parent frame's panel (mode:'iframe') can drive this page. Set false to
224
224
  * expose in-app access only (e.g. a page with no host frame expected).
225
- * @param {object} [opts.universe] — the live EGPTUniverse (WS gym-controls-as-sugar
225
+ * @param {object} [opts.universe] — the live EGPTUniverse (gym-controls-as-sugar
226
226
  * FULL CONVERGENCE build, signature change): threaded into `controlBind.js`'s
227
227
  * `resolveBind` ctx so a `bind`-only descriptor's `setControlValue` can route
228
228
  * through `setFrameProperty`/`updateObjectProperty`. Required only if the
@@ -249,7 +249,7 @@ function exposeRegistry(registry, opts) {
249
249
  // (FrqtlPage.controls). A same-window panel (mode:'in-app') is handed this SAME instance.
250
250
  _exposedRegistry = registry;
251
251
 
252
- // Bind-execution context (WS gym-controls-as-sugar FULL CONVERGENCE build):
252
+ // Bind-execution context (gym-controls-as-sugar FULL CONVERGENCE build):
253
253
  // attached to the registry INSTANCE (not a fresh object, not a second
254
254
  // parameter threaded through mount()/_buildInAppHandle) so BOTH dispatch
255
255
  // paths — the in-app direct call (which is handed this SAME registry
@@ -356,8 +356,8 @@ function mount(hostEl, opts) {
356
356
  var name = opts.name;
357
357
  hostEl.classList.add('frqtl-controls-panel');
358
358
 
359
- // Rendering is delegated ENTIRELY to frqtl-control-slider.js (Bite 3
360
- // Stage 2 Layer B: "panel = collection host + transport plumbing;
359
+ // Rendering is delegated ENTIRELY to frqtl-control-slider.js
360
+ // (Layer B: "panel = collection host + transport plumbing;
361
361
  // control lib = the widget") — this closure supplies ONLY the
362
362
  // transport-aware onInput, reusing the SAME `handle.call(...)` this
363
363
  // file already builds for either placement mode.
@@ -402,7 +402,7 @@ function mount(hostEl, opts) {
402
402
  // ── Export ────────────────────────────────────────────────────────────────────
403
403
 
404
404
  // `dispatch` publicly exposes the SAME single dispatch point the in-app path
405
- // and the RPC responder already share (WS gym-controls-as-sugar FULL
405
+ // and the RPC responder already share (gym-controls-as-sugar FULL
406
406
  // CONVERGENCE build) — its THIRD consumer is `frqtl-control-sync.js`'s in-app
407
407
  // pull path (`registry` mode), which reuses `dispatch(registry, 'listControls',
408
408
  // [name])` rather than re-deriving a parallel listing implementation, and its
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * FrqtlVision.js — the reusable "video camera that takes stills" sugar object, and the
5
- * consumer-facing surface of the normalized capture format (CEO-named 2026-07-30).
5
+ * consumer-facing surface of the normalized capture format.
6
6
  *
7
7
  * Peer of `CameraControls.js` in this directory, and deliberately DISJOINT from it:
8
8
  * `CameraControls` drives the VIEWPOINT (`runner.cameraControl` — where the camera looks);
@@ -2,8 +2,7 @@
2
2
 
3
3
  /**
4
4
  * GraphingDetectorWall — a Detector Screen that PAINTS ITS OWN HIT GRID onto its
5
- * own faces (ws-experiments-walkthrough, presentation pass Item 1; CEO ruling
6
- * "the spatial hitmap IS the chart").
5
+ * own faces (presentation pass Item 1: the spatial hitmap IS the chart).
7
6
  *
8
7
  * var screen = new GraphingDetectorWall(universe, {
9
8
  * rect: [236, 0, -77, 20, 600, 154], name: 'screen', binPx: 12
@@ -388,8 +387,8 @@ import { registerKind, kindOf } from '../objects/kinds.js';
388
387
 
389
388
  /**
390
389
  * GraphingDetectorWall — a Detector Screen that PAINTS ITS OWN HIT GRID onto
391
- * its own faces (presentation pass Item 1; CEO ruling "the spatial hitmap IS
392
- * the chart"). A SUGAR kind that EXTENDS `Wall` (prototype chain): the
390
+ * its own faces (presentation pass Item 1: the spatial hitmap IS
391
+ * the chart). A SUGAR kind that EXTENDS `Wall` (prototype chain): the
393
392
  * physics authority — counting, `Wall.gridAdd`, the once-per-tick drain
394
393
  * discipline — is Wall's, verbatim and untouched. What it adds is a
395
394
  * sugar-side painter that reads the SAME grid and paints pure bin rectangles
@@ -13,7 +13,7 @@
13
13
  * - reposition: literal string including 'closest'
14
14
  * All engine-specific wire-format translation lives in the shim providers
15
15
  * (compat/providers/js-engine.js and compat/providers/wasm-engine.js).
16
- * No engine-sniffing above the shim (WS-A §2 invariant).
16
+ * No engine-sniffing above the shim (§2 invariant).
17
17
  */
18
18
 
19
19
  import * as ct from './CollisionTypes.js';
@@ -108,8 +108,8 @@ import { SCOPE_DESCRIPTORS } from '../objects/schema/scopes.js';
108
108
  * prefer passing a single layer number via the `layer` property after construction,
109
109
  * or pass [layer] here). null = object is visible to all dimensions.
110
110
  * @param {number} search_padding - RESERVED / UNUSED positional placeholder. The engine no
111
- * longer reads it: the collision search rect expands by the dimension's `mb_w`
112
- * (EGPTfrqtl.js::update). Kept as positional arg #8 so `color` (#9) stays in place for the
111
+ * longer reads it: the collision search rect expands by the dimension's `mb_w`.
112
+ * Kept as positional arg #8 so `color` (#9) stays in place for the
113
113
  * ~50 positional callers. Do not wire new behavior to it.
114
114
  * @param {Array} color - RGB color [r, g, b]
115
115
  * @param {boolean} [collectCollided=false] - G1: when true, the engine accumulates a
@@ -277,10 +277,9 @@ import { SCOPE_DESCRIPTORS } from '../objects/schema/scopes.js';
277
277
 
278
278
  /**
279
279
  * Recompile this LargeObject's collision op-program from a NEW
280
- * collision_type/actions pair and PUSH it to the running engine (WS Studio
281
- * Controls Realignment S4, design §2.3.5 / CEO-ratified §4 call #7 —
282
- * "flipping a wall into a detector mid-run is exactly the live-drive
283
- * wonder"). `collision_type`/`actions` are compile-ONCE sugar inputs
280
+ * collision_type/actions pair and PUSH it to the running engine (Studio
281
+ * Controls Realignment S4, design §2.3.5 — flipping a wall into a detector
282
+ * mid-run is exactly the live-drive wonder). `collision_type`/`actions` are compile-ONCE sugar inputs
284
283
  * (actionCompiler.js lowers them to an op-program at REGISTRATION,
285
284
  * `engineVisible:false` — see the schema field docs) — a bare
286
285
  * `updateObjectProperty` mirror-write to either field updates ONLY this JS
@@ -331,7 +330,7 @@ import { SCOPE_DESCRIPTORS } from '../objects/schema/scopes.js';
331
330
  };
332
331
 
333
332
  /**
334
- * Full teardown (WS Studio Controls Realignment S4, design item 1): unregister
333
+ * Full teardown (Studio Controls Realignment S4, design item 1): unregister
335
334
  * this LargeObject engine-side, removing its compiled collision op-program
336
335
  * (actionCompiler.js's output) and its collision registration from the
337
336
  * RUNNING engine — not just this JS wrapper's render-list membership.
@@ -112,7 +112,7 @@ import chroma from '../assets/vendor/chroma.mjs';
112
112
  * not read as dim. The wider default range (0.35..1.0) lets sparse quanta in the
113
113
  * LOW×LOW lane of the collision matrix visually signal their sparsity.
114
114
  *
115
- * FRQTL-MAINT (2026-07-02, CEO render-tier-table ruling): `floor` is now an OPTIONAL
115
+ * FRQTL-MAINT (the render-tier table): `floor` is now an OPTIONAL
116
116
  * second parameter (default 0.35 — every existing call site that omits it is
117
117
  * byte-identical). This is the "extend, don't bypass" answer to the render-tier
118
118
  * table's need for a true-invisible-below-a-mass-gate tier (e.g. air, Dim 2, mass≤2):
@@ -149,7 +149,7 @@ import chroma from '../assets/vendor/chroma.mjs';
149
149
  return _chromaRoygbiv(v01);
150
150
  }
151
151
 
152
- // ── greyscale ramp (FRQTL-MAINT 2026-07-02, CEO render-tier-table ruling) ────────
152
+ // ── greyscale ramp (FRQTL-MAINT, the render-tier table) ──────────────────────────
153
153
  // §1 Dim→visual table: smoke/haze (the high-dim tiers) are "greyscale + alpha by
154
154
  // density" — a neutral (no hue) ramp from dark (sparse) to near-white (dense), so
155
155
  // density reads on BOTH channels (darker+more-transparent = sparse edges, brighter+
@@ -247,7 +247,7 @@ import { registerKind } from '../objects/kinds.js';
247
247
  // Orientation: explicit 0|90 wins; else DEFAULT a detectorHistogram chart to 90 (the
248
248
  // GYM detector-aligned horizontal-bar presentation — a detector column-profile stacks
249
249
  // along y beside the vertical detector wall), any other projector (e.g. absorberStats,
250
- // a 3-bar ledger) to 0 (standard vertical bars). CEO ruling 2026-07-24 (Living Log df36a229).
250
+ // a 3-bar ledger) to 0 (standard vertical bars).
251
251
  var orientation;
252
252
  if (props.orientation === 90 || props.orientation === '90') { orientation = 90; }
253
253
  else if (props.orientation === 0 || props.orientation === '0') { orientation = 0; }
@@ -23,7 +23,7 @@
23
23
  * (`INTERPRETER_ARCHITECTURE.md`), not a new engine concept.
24
24
  *
25
25
  * ── WHY A POWERED (VALVE) GATE AND NOT A CURRENT-SUMMING ONE ────────────────
26
- * Both were measured (`docs/internal/physics-lab/logic-gate-bench/`). Currents DO
26
+ * Both were measured. Currents DO
27
27
  * add at a directed junction, so a wired threshold gate is buildable — but its
28
28
  * output level is a multiple of its INPUT level, so levels decay down a chain and
29
29
  * a two-deep circuit needs re-tuned thresholds at every stage. The valve gate's
@@ -117,9 +117,7 @@
117
117
  * ── Layer 2: physics behavior ────────────────────────────────────────────────
118
118
  * ZERO physics of its own (SU1). Everything below is the emergent behaviour of the
119
119
  * stock parts, MEASURED on this construction (WASM engine, 2D, fundamental dim 0,
120
- * inter-quantum collisions OFF, 3 seeds; the rigs are
121
- * `docs/internal/physics-lab/logic-gate-bench/characterize.cjs` and
122
- * `gate-acceptance.cjs`, and the numbers are quoted from `LogicGate.MEASURED`):
120
+ * inter-quantum collisions OFF, 3 seeds; the numbers are quoted from `LogicGate.MEASURED`):
123
121
  *
124
122
  * THE INPUT IS AN AMMETER AND IT IS LINEAR. A `Wall{destroy,count}` terminal
125
123
  * reads I = G·V with G = 1.01 ± 0.01 and no knee from V = 1 to V = 16, and reads
@@ -387,9 +385,8 @@ import { registerKind } from '../objects/kinds.js';
387
385
  /**
388
386
  * The measured datasheet AS DATA, so a circuit (or a half-adder) can budget
389
387
  * levels, margins and settling time without re-running the bench. Every figure
390
- * is from `docs/internal/physics-lab/logic-gate-bench/` (pkg-node WASM, 2D,
391
- * fundamental dim 0, inter-quantum collisions OFF, 3 seeds); the README there
392
- * carries the prediction each one was measured against.
388
+ * is measured (pkg-node WASM, 2D, fundamental dim 0, inter-quantum collisions OFF,
389
+ * 3 seeds), each against a recorded prediction.
393
390
  */
394
391
  LogicGate.MEASURED = {
395
392
  /** Terminal current vs source voltage: I = inputGain * V, no knee, I(0)=0 exactly. */
@@ -76,7 +76,6 @@
76
76
  *
77
77
  * OBSERVED (seed 42, tick 600, engine=js): temperature 300–4000 transitions
78
78
  * the cavity from sparse leaf dots to near-saturated compound-frame packing.
79
- * See `docs/internal/records/physics-lab/2026-06-16-blackbody-temperature.md`.
80
79
  */
81
80
 
82
81
  import { Box } from '../objects/objects/Box.js';
@@ -130,7 +129,7 @@ import { registerKind } from '../objects/kinds.js';
130
129
  for (var ei = 0; ei < ejectOps.length; ei++) ops.push(ejectOps[ei]);
131
130
 
132
131
  // ── L4: velocity-flip op ─────────────────────────────────────────
133
- // Q-L1-4 DRY: shared authority (native BOUNCE flip formula, EGPTfrqtl.js:1159-1168).
132
+ // Q-L1-4 DRY: shared authority (native BOUNCE flip formula).
134
133
  if (withBounce) {
135
134
  var flipOp = ejectFlip.buildVelocityFlipOp(wallName, HANDLE_FRAME, Lit, Ref, Bin);
136
135
  if (flipOp) ops.push(flipOp);
@@ -8,9 +8,9 @@
8
8
  *
9
9
  * Engine-agnostic: works with both the JS reference engine and the Rust/WASM engine.
10
10
  * Emits raw canonical charge; providers translate to engine wire-format.
11
- * No engine-sniffing above the shim (WS-A §2 invariant).
11
+ * No engine-sniffing above the shim (§2 invariant).
12
12
  *
13
- * chargeMode / random_direction (sugar-layer modes, WS emitter-modes-sugar):
13
+ * chargeMode / random_direction (sugar-layer modes, emitter-modes-sugar):
14
14
  * chargeMode ∈ 'random' | 'positive' | 'negative' | 'both'
15
15
  * random_direction ∈ boolean
16
16
  *
@@ -107,8 +107,7 @@ import { declaredCount } from '../objects/ObjectFactory.js';
107
107
  * (`EGPTfrqtl` / `universe.init(...)`), NOT by this constructor:
108
108
  * `wavelength = floor((capacity / mass) × WAVELENGTH_CONSTANT)`. OBSERVED
109
109
  * (seed 42): raising it 2 → 32 widens the fringes from a near-uniform dense
110
- * cloud to sparse, widely-separated radial spokes. Figure + data:
111
- * `docs/internal/records/physics-lab/2026-06-16-wave-interference-wavelengthScale.md`.
110
+ * cloud to sparse, widely-separated radial spokes.
112
111
  * - **`angle_increment`** sets the number of emission rays = `floor(360 / inc)`
113
112
  * (5° → 72 rays). Smaller increment = denser angular coverage = a smoother
114
113
  * radial field; larger = visible discrete spokes.
@@ -138,7 +137,7 @@ import { declaredCount } from '../objects/ObjectFactory.js';
138
137
  * @param {Object} [opts] - `{ wavelength, color, minRadius, emergentPhysics, zMin, zDepth }`.
139
138
  * @param {number} [opts.wavelength] - Per-emitter wavelength → particle mass
140
139
  * (see Physics, above). Omitted → engine default leaf mass.
141
- * @param {number} [opts.zMin] - WS-DSE-3D Bite B0: when provided (with `opts.zDepth`), every
140
+ * @param {number} [opts.zMin] - when provided (with `opts.zDepth`), every
142
141
  * emitted leaf's z is drawn UNIFORMLY from `[zMin, zMin+zDepth)` (one extra `random()` draw
143
142
  * per leaf, opt-in only — see `emitterProgram.js`'s DRAW-ORDER CONTRACT). Omitted (default)
144
143
  * → no z is ever written, byte-identical to pre-3D behavior. The caller (e.g.
@@ -165,7 +164,7 @@ import { declaredCount } from '../objects/ObjectFactory.js';
165
164
  var color = opts.color || null;
166
165
  // Optional wavelength for mass computation (affects wave behavior at dim > 0)
167
166
  var wavelength = opts.wavelength || null;
168
- // WS-DSE-3D Bite B0: optional uniform z-spread (opt-in; null = no z ever written).
167
+ // Optional uniform z-spread (opt-in; null = no z ever written).
169
168
  var zMin = opts.zMin !== undefined ? opts.zMin : null;
170
169
  var zDepth = opts.zDepth !== undefined ? opts.zDepth : null;
171
170
 
@@ -180,7 +179,7 @@ import { declaredCount } from '../objects/ObjectFactory.js';
180
179
  // colorOverride: render-only attribute for emitted particle color.
181
180
  // Set via updateObjectProperty(lo, 'colorOverride', [r,g,b]) from the IDE.
182
181
  this.colorOverride = color || null;
183
- // renderShape / renderOutline (Bite 5b R3-1): render-only per-emitted-frame overrides,
182
+ // renderShape / renderOutline (R3-1): render-only per-emitted-frame overrides,
184
183
  // peers of colorOverride (same per-frame reach SphereEmitter3D has). null → no key stamped.
185
184
  this.renderShape = null;
186
185
  this.renderOutline = null;
@@ -283,11 +282,11 @@ import { declaredCount } from '../objects/ObjectFactory.js';
283
282
  wrap: false,
284
283
  wavelength: wavelength || null,
285
284
  fundamentalDim: null, // null → engine uses the universe's fundamental-dim as the leaf level
286
- zMin: zMin, // WS-DSE-3D Bite B0: null (default) → no z draw/write at all
285
+ zMin: zMin, // null (default) → no z draw/write at all
287
286
  zDepth: zDepth,
288
287
  };
289
288
  var tickFn = buildEmitterTickFn(universe, em);
290
- // Back-reference so dispose() (WS Studio Controls Realignment S4) can
289
+ // Back-reference so dispose() (Studio Controls Realignment S4) can
291
290
  // find and splice OUT exactly the tick-fn(s) belonging to this
292
291
  // PointSource, mirroring QuantumEmitter's own `_emState` convention.
293
292
  tickFn._emState = em;
@@ -524,8 +523,8 @@ import { declaredCount } from '../objects/ObjectFactory.js';
524
523
  };
525
524
 
526
525
  /**
527
- * Full teardown (WS Studio Controls Realignment S4, design item 1 — the
528
- * SAME "delete leaves the tick-fn running" defect class the CEO found on
526
+ * Full teardown (Studio Controls Realignment S4, design item 1 — the
527
+ * SAME "delete leaves the tick-fn running" defect class found on
529
528
  * QuantumEmitter, closed here too for the sibling composite emitter type).
530
529
  * Tombstones + deactivates every emState across ALL registered (charge, rd)
531
530
  * groups (active or not — a re-activated inactive group must not resurrect),
@@ -60,14 +60,14 @@ import { V1_REPLACEMENTS } from '../objects/v1-replacements.js';
60
60
  * the emitter stops.
61
61
  * @param {number} [delay=1] - Ticks between emission bursts per angle. 0 = every
62
62
  * tick; 1 = every other tick.
63
- * @param {Object} [opts] - WS-DSE-3D Bite B1.
63
+ * @param {Object} [opts]
64
64
  * @param {number} [opts.depth] - When provided, threads `zMin=-depth/2,
65
65
  * zDepth=depth` into the inner `PointSource`'s opts — the IDENTICAL shared
66
- * z-spread mechanism WS-DSE-3D Bite B0 built for `setupWaveInterference`
66
+ * z-spread mechanism built for `setupWaveInterference`
67
67
  * (`emitterProgram.js`'s opt-in `em.zMin`/`em.zDepth`). REUSE, not a fork —
68
68
  * SlitLightSource is a thin PointSource wrapper (see module docstring), so
69
69
  * this is the only line needed to make the DSE light source illuminate the
70
- * full z-depth of the SLOT-shaped 3D slits (Bite B1's SlitScreen `depth`).
70
+ * full z-depth of the SLOT-shaped 3D slits (SlitScreen's `depth`).
71
71
  * OMITTED (default) → `zMin`/`zDepth` stay `undefined` on the PointSource
72
72
  * opts object, which PointSource itself treats as `null` (byte-identical
73
73
  * 2D behavior — zero extra `random()` draws, per `emitterProgram.js`).
@@ -97,7 +97,7 @@ import { V1_REPLACEMENTS } from '../objects/v1-replacements.js';
97
97
  var charge = null; // random +/- per particle
98
98
  var speed = 1;
99
99
 
100
- // LAB DRIVE FIX BATCH item 1 (2026-07-13, CEO): color OFF by default —
100
+ // Color OFF by default —
101
101
  // this used to hardcode `color: [0, 255, 0]` (devsdk parity green),
102
102
  // which OVERRIDES the render layer's colorScheme (LightColor ramp;
103
103
  // "an explicit render.color OVERRIDES colorScheme, so ROYGBIV never
@@ -105,8 +105,8 @@ import { V1_REPLACEMENTS } from '../objects/v1-replacements.js';
105
105
  // That override made every double-slit-family page render a fixed green
106
106
  // regardless of physics, while setupWaveInterference's PointSources
107
107
  // pass NO color at all (colorless -> colorScheme-driven, genuine
108
- // fullness/frequency-driven presentation) — the exact asymmetry the
109
- // CEO flagged (WI shows real physics color; the Lab showed a flat
108
+ // fullness/frequency-driven presentation) — the exact asymmetry
109
+ // flagged (WI shows real physics color; the Lab showed a flat
110
110
  // override). `opts.color` is now an EXPLICIT opt-in (default `null` —
111
111
  // colorless, PointSource's own `opts.color || null` already handles
112
112
  // this correctly) so any caller that WANTS the old green back can
@@ -8,7 +8,7 @@
8
8
  * - 2 slit segments (slit1, slit2) with optional detection
9
9
  * - 4 slit liners (top/bottom of each slit) for edge diffraction
10
10
  *
11
- * 3D (depth set — WS-DSE-3D CEO geometry amendment, 2026-07-12, "floor to ceiling
11
+ * 3D (depth set — the geometry amendment, "floor to ceiling
12
12
  * with cubic holes"): the screen spans the FULL universe cross-section — the SAME
13
13
  * floor-to-ceiling y-extent as 2D (unchanged: wall1 starts at y=0, wall3 ends at
14
14
  * canvasHeight) PLUS the full z-depth (the fix-loop item-1 render/collision fix) —
@@ -107,10 +107,10 @@ import { ObjectSchema } from '../objects/schema/index.js';
107
107
  * (default: `floor(wavelength * 0.8)`).
108
108
  * @param {number} [gapHeight] - Override inter-slit wall height
109
109
  * (default: `floor(wavelength * 0.8)`).
110
- * @param {number} [depth] - WS-DSE-3D: when provided, the screen becomes a 3D
110
+ * @param {number} [depth] - when provided, the screen becomes a 3D
111
111
  * floor-to-ceiling wall (full z-depth `[-depth/2, +depth/2]`) tiled around two
112
- * CUBIC HOLE apertures (CEO geometry amendment, 2026-07-12 — supersedes the
113
- * Bite B1 full-depth-SLOT construction). `wall1`/`wall2`/`wall3` (no hole in
112
+ * CUBIC HOLE apertures (the geometry amendment — supersedes the earlier
113
+ * full-depth-SLOT construction). `wall1`/`wall2`/`wall3` (no hole in
114
114
  * their y-band) become 6-element rects spanning the FULL z-depth; `slit1`/
115
115
  * `slit2` (still the detection identity) become 6-element rects bounded in
116
116
  * BOTH y (unchanged from 2D) AND z (`holeDepth`, centered on z=0) — plus two
@@ -122,7 +122,7 @@ import { ObjectSchema } from '../objects/schema/index.js';
122
122
  * (centered on z=0, i.e. `[-holeDepth/2, +holeDepth/2)`). Default: the
123
123
  * EFFECTIVE `slit_height` (respects a `slitHeight` override), so the default
124
124
  * aperture is square-ish in the y×z plane (e.g. wavelength=64 → slit_height=51
125
- * → a 51×51 hole) — state-your-choice per the CEO's ask; pass an explicit
125
+ * → a 51×51 hole); pass an explicit
126
126
  * value to decouple the hole's z-extent from its y-extent. Ignored when
127
127
  * `depth` is omitted.
128
128
  * @param {'current'|'noreset'|'symmetric'|'combined'|'bounce'|'ejectY'|'ejectYReflect'} [linerScatter='current']
@@ -130,7 +130,7 @@ import { ObjectSchema } from '../objects/schema/index.js';
130
130
  * `LEGACY_VARIANT_MAP` (the ONE authority for the behavior×resetLocalTime
131
131
  * decomposition; see that module's docstring). `'current'` (default, OMIT to
132
132
  * keep it) is the no-op sentinel — today's exact compiled `RANDOM_XY`,
133
- * byte-identical, the CEO-ratified 2D golden depends on it. The other
133
+ * byte-identical, the ratified 2D golden depends on it. The other
134
134
  * variants push a composed replacement op-program LIVE via
135
135
  * `universe.updateObjectProperty` — the SAME mechanism the `dse-lab` page's
136
136
  * LIVE `behavior`/`resetLocalTime` controls use (DSE LAB, 2026-07-13).
@@ -145,7 +145,7 @@ import { ObjectSchema } from '../objects/schema/index.js';
145
145
  this.linerScatter = linerScatter || 'current';
146
146
 
147
147
  // ── Geometry (y-axis) — UNCHANGED by the cubic-hole amendment in EITHER
148
- // mode: the CEO's "floor to ceiling" ask was already satisfied here (wall1
148
+ // mode: "floor to ceiling" was already satisfied here (wall1
149
149
  // starts at y=0, wall3 ends at canvasHeight — confirmed by ground-truth,
150
150
  // fix-loop item 1); only the APERTURE shape changes in 3D (§ below).
151
151
  this.slit_height = (slitHeight !== undefined) ? slitHeight : Math.floor(wavelength * 0.8);
@@ -160,7 +160,7 @@ import { ObjectSchema } from '../objects/schema/index.js';
160
160
  this.slit_width = wallWidth;
161
161
  this.bottom_wall_height = canvasHeight - this.slit2_bottom;
162
162
 
163
- // WS-DSE-3D CEO geometry amendment (2026-07-12): cubic-hole z-extent, centered
163
+ // The geometry amendment: cubic-hole z-extent, centered
164
164
  // on z=0. Default = the EFFECTIVE slit_height (square-ish aperture at the
165
165
  // default wavelength=64 -> slit_height=51 -> a 51x51 hole) — overridable to
166
166
  // decouple the hole's z-extent from its y-extent. 2D-inert (unused).
@@ -285,7 +285,7 @@ import { ObjectSchema } from '../objects/schema/index.js';
285
285
  ];
286
286
 
287
287
  } else {
288
- // ═══ 3D — CUBIC HOLES (CEO geometry amendment, 2026-07-12) ═══
288
+ // ═══ 3D — CUBIC HOLES (the geometry amendment) ═══
289
289
  // Tile the wall around each hole: wall1/wall2/wall3 (no hole in their
290
290
  // y-band) span the FULL z-depth; each hole's own y-band splits into
291
291
  // THREE z-tiles — a solid "_near" side (z < holeZmin), the hole itself
@@ -407,8 +407,8 @@ import { ObjectSchema } from '../objects/schema/index.js';
407
407
  ];
408
408
  }
409
409
 
410
- // ── Render shape (renderer-only hint; physics unaffected) — WS-DSE-3D
411
- // fix-loop item 1, the Tube.js precedent (FRQTL-MAINT 2026-07-01): a
410
+ // ── Render shape (renderer-only hint; physics unaffected)
411
+ // The Tube.js precedent (FRQTL-MAINT 2026-07-01): a
412
412
  // 6-element rect gives the ENGINE a real z-slab, but `_buildLoMesh`
413
413
  // (three-provider.js) only wraps an LO in a 3D BoxGeometry when it
414
414
  // ALSO carries the render-only `lo.shape='box'` + `lo.depth` hint —
@@ -438,7 +438,7 @@ import { ObjectSchema } from '../objects/schema/index.js';
438
438
  };
439
439
 
440
440
  /**
441
- * LAB DRIVE FIX BATCH item 3 (2026-07-13, CEO): LIVE slit-gap update — recomputes
441
+ * LIVE slit-gap update — recomputes
442
442
  * every affected 2D wall/slit/liner rect (mirroring the constructor's OWN 2D
443
443
  * geometry formulas, one authority, no schema-mirror) and pushes each via
444
444
  * `runner.updateObjectProperty(lo, 'rect', [left,top,w,h])` — the SAME S3/S4
@@ -455,9 +455,9 @@ import { ObjectSchema } from '../objects/schema/index.js';
455
455
  * compute for that `gapHeight` from scratch.
456
456
  *
457
457
  * 3D (`this.depth !== null`) is NOT supported live — the cubic-hole z-tiling
458
- * (WS-DSE-3D CEO amendment) adds ~13 LOs (near/far z-tiles per hole, wall1-3
458
+ * (the geometry amendment) adds ~13 LOs (near/far z-tiles per hole, wall1-3
459
459
  * z-spanning tiles) whose z-partition math would need the identical live-update
460
- * treatment; out of scope for this bite. Returns `false` so the caller falls
460
+ * treatment; not built. Returns `false` so the caller falls
461
461
  * back to a reinit reload — name this explicitly rather than silently no-op.
462
462
  *
463
463
  * @param {number} newGapHeight - the new `slit_wall_gap_height` (px).