@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
@@ -2,8 +2,8 @@
2
2
 
3
3
  /**
4
4
  * SphereEmitter — a p5/three-familiar OBJECT-CONSTRUCTOR facing over the
5
- * existing `setupSphereEmitter3D` setup factory (ws-emitter-wave "Option B",
6
- * CEO-approved 2026-07-20). It exists so a programmer can write the object idiom
5
+ * existing `setupSphereEmitter3D` setup factory ("Option B"). It exists so a
6
+ * programmer can write the object idiom
7
7
  *
8
8
  * var sun = new SphereEmitter([x, y], opts).addTo(universe);
9
9
  * sun.setCenter([x2, y2]); // reposition live
@@ -174,8 +174,8 @@ import { CollisionTypes } from './CollisionTypes.js';
174
174
  this.universe = null;
175
175
  this._active = true; // mirror of control state (control exposes no getActive)
176
176
 
177
- // ── Declared EMISSION GATE (emissionCap/gateCounter — CEO ruling 05c98e1f,
178
- // architect circulation-emission-gate-contract §2) ──────────────────────
177
+ // ── Declared EMISSION GATE (emissionCap/gateCounter —
178
+ // circulation-emission-gate-contract §2) ──────────────────────────────────
179
179
  // The Blackbody-thermostat pattern as DECLARED DATA: `emissionCap` is a
180
180
  // self-throttle target — the emitter deactivates when the live population
181
181
  // measured by the counting Wall NAMED by `gateCounter` reaches the cap, and
@@ -269,7 +269,7 @@ import { CollisionTypes } from './CollisionTypes.js';
269
269
  };
270
270
 
271
271
  /**
272
- * ── The compiled EMISSION-GATE host tick-fn (architect §3/§4 firm rulings) ───
272
+ * ── The compiled EMISSION-GATE host tick-fn (contract §3/§4) ──────────────────
273
273
  *
274
274
  * Layer 1 (API): registered on `universe.experimentTickFunctions` (the Phase-A
275
275
  * `fn(universe)` seam — the SAME seam as the emit tick-fn, the blackbody
@@ -443,7 +443,7 @@ import { CollisionTypes } from './CollisionTypes.js';
443
443
  get: function () { return this._control ? this._control.controls : null; }
444
444
  });
445
445
 
446
- // ── Descriptor-field GETTERS (Bite 4b — captureProps read surface) ───────
446
+ // ── Descriptor-field GETTERS (captureProps read surface) ─────────────────
447
447
  // captureProps(sphereObj, SphereEmitterDescriptor) reads `sphereObj[field.name]`
448
448
  // DIRECTLY for every descriptor field (a getter satisfies it). These expose the
449
449
  // LIVE resolved value (from the factory's control) so a dragged/edited emitter
@@ -499,7 +499,7 @@ import { CollisionTypes } from './CollisionTypes.js';
499
499
  Object.defineProperty(SphereEmitter.prototype, 'fundamentalWaveLength', {
500
500
  get: function () { return (this._opts && this._opts.fundamentalWaveLength !== undefined) ? this._opts.fundamentalWaveLength : 64; }
501
501
  });
502
- // ── Live-edit WRITE ROUTER (Bite 4b — FrqtlApp.updateObjectProperty) ─
502
+ // ── Live-edit WRITE ROUTER (FrqtlApp.updateObjectProperty) ───────────
503
503
  /**
504
504
  * Route ONE schema-prop write to the matching factory-control setter (the
505
505
  * mechanism-A write path — the Inspector / coupled-move calls this via
@@ -535,7 +535,7 @@ import { CollisionTypes } from './CollisionTypes.js';
535
535
  case 'innerR': c.setInnerR(value); break;
536
536
  case 'renderColor': c.setRenderColor(value); break;
537
537
  case 'renderShape': c.setRenderShape(value); break;
538
- // LIVE "Emit Dimension" (Bite 5b A2) — host-side addDimension + closure flip;
538
+ // LIVE "Emit Dimension" — host-side addDimension + closure flip;
539
539
  // next emitted leaf is born at the new per-emitter dimension (M5). See
540
540
  // setupSphereEmitter3D.setLeafDimension for the ratchet side effect (S1).
541
541
  case 'leafDimension': c.setLeafDimension(value); break;
@@ -580,7 +580,7 @@ import { CollisionTypes } from './CollisionTypes.js';
580
580
 
581
581
  /**
582
582
  * SphereEmitter — the manipulable palette face over the setupSphereEmitter3D
583
- * setup factory (ws-experiments-walkthrough Bite 4b). A SUGAR kind (peer of
583
+ * setup factory. A SUGAR kind (peer of
584
584
  * QuantumEmitter/PointSource — NOT a new engine kind): the ObjectFactory
585
585
  * builder composes a LargeObject-visual marker + the factory's host emit
586
586
  * tick-fn (SU1 — the visual LO is NONE-collision, non-leaf, zero physics).
@@ -589,14 +589,14 @@ import { CollisionTypes } from './CollisionTypes.js';
589
589
  * makeControlsForObject (the Inspector), and FrqtlApp.updateObjectProperty
590
590
  * (the live-edit write path) ALL drive off it — no hand-list anywhere.
591
591
  *
592
- * Per-field `live` attribute (Bite 4b, consumed by makeControlsForObject):
592
+ * Per-field `live` attribute (consumed by makeControlsForObject):
593
593
  * live:true → a LIVE Inspector control; the write goes through
594
594
  * updateObjectProperty(sphereObj, prop, v) → the control setter
595
595
  * (mechanism A — NOT resolveBind; the SphereEmitter kind is
596
596
  * deliberately outside controlBind's bind-executable allowlist).
597
597
  * live:false → a read-only DISPLAY row (boot-level / derived fields that
598
598
  * need a reload to change — same class as the renderer-swap
599
- * reload ruling). captureProps STILL captures its VALUE for
599
+ * reload rule). captureProps STILL captures its VALUE for
600
600
  * round-trip; the Inspector just renders it read-only.
601
601
  *
602
602
  * FIELD SET is COMPLETE w.r.t. every scene-affecting setupSphereEmitter3D opt
@@ -611,15 +611,15 @@ import { CollisionTypes } from './CollisionTypes.js';
611
611
  'setupSphereEmitter3D setup factory: pure sugar (a NONE-collision visual marker + a host ' +
612
612
  'emit tick-fn), zero physics of its own. Drag the marker to move the emission center live; ' +
613
613
  'edit burst/rate/wavelength/charge/preset/shell live; dimension/is2D are boot-level (reload).',
614
- // ── STUDIO UX presentation contract (Bite 5b A0) ──────────────────────
615
- // A sugar object DECLARES its own STUDIO UX (CEO §9 "the design question").
614
+ // ── STUDIO UX presentation contract ───────────────────────────────────
615
+ // A sugar object DECLARES its own STUDIO UX.
616
616
  // The vocab is owned once at lib/shim/field-descriptor (UX_HANDLE_ZONES /
617
617
  // UX_DRAGGABLE_MODES / UX_SHELL_RENDER); this block is read via
618
618
  // ObjectSchema.ux('SphereEmitter'). resizable:false — a SphereEmitter has
619
- // TWO radii (inner+outer); a single-box resize gesture is ambiguous, so the
620
- // CEO ruled it NOT resizable (individually, per object). draggable 2D (a 3D
619
+ // TWO radii (inner+outer); a single-box resize gesture is ambiguous, so
620
+ // it is NOT resizable (individually, per object). draggable 2D (a 3D
621
621
  // scene never cursor-drags). handles: ['move'] — it only moves, never scales.
622
- // shellRender:'design' — the marker paints only while authoring (Bite-4b
622
+ // shellRender:'design' — the marker paints only while authoring (the
623
623
  // default; the "red light bulb" flips a per-instance shellRender override).
624
624
  ux: {
625
625
  resizable: false,
@@ -694,8 +694,8 @@ import { CollisionTypes } from './CollisionTypes.js';
694
694
  description: 'Ticks between bursts (sustained-emission cadence). LIVE (affects the next burst).'
695
695
  },
696
696
  {
697
- // ── Declared EMISSION GATE (CEO ruling 05c98e1f — the Blackbody-thermostat
698
- // pattern; architect circulation-emission-gate-contract §2 field shapes).
697
+ // ── Declared EMISSION GATE (the Blackbody-thermostat
698
+ // pattern; circulation-emission-gate-contract §2 field shapes).
699
699
  // Sensor = a placeable counting Wall (name in gateCounter); regulation =
700
700
  // emitter-side sugar compiled at CONSTRUCTION into a host tick-fn (the
701
701
  // Restart-safe host-tick-fn rule — codegen captures these two fields and
@@ -812,11 +812,11 @@ import { CollisionTypes } from './CollisionTypes.js';
812
812
  engineVisible: false,
813
813
  live: true,
814
814
  // Field NAME stays `leafDimension` (codegen/capture key; a rename = round-trip
815
- // break + a second name = schema mirror — architect Q-A2). The Inspector shows
815
+ // break + a second name = schema mirror — Q-A2). The Inspector shows
816
816
  // the display LABEL "Emit Dimension"; the write routes through applyProp →
817
817
  // control.setLeafDimension (host-side addDimension + closure var flip; the NEXT
818
- // emitted leaf is born at the new dimension). Theorist CLEARED mid-run addDimension
819
- // as SAFE (2026-07-22 verdict). SIDE EFFECT (S1): a value BELOW the current
818
+ // emitted leaf is born at the new dimension). Mid-run addDimension is
819
+ // SAFE (cleared 2026-07-22). SIDE EFFECT (S1): a value BELOW the current
820
820
  // fundamental floor self-lowers the floor UNIVERSE-GLOBALLY and is a ONE-WAY
821
821
  // RATCHET (no removeDimension) — the Inspector surfaces a hint when crossing below
822
822
  // floor. fundamentalDimension stays display-only (universe base = reinit-class).
@@ -853,7 +853,7 @@ import { CollisionTypes } from './CollisionTypes.js';
853
853
  };
854
854
 
855
855
  //
856
- // The manipulable palette face over setupSphereEmitter3D (Bite 4b). Mirrors the
856
+ // The manipulable palette face over setupSphereEmitter3D. Mirrors the
857
857
  // QuantumEmitter/PointSource pattern: build the emitter, then a NONE-collision
858
858
  // circle LargeObject "marker" the emitter OWNS (attachMarker), and return the
859
859
  // emitter — the declared object STUDIO picks, drags and carries. SU1:
@@ -926,9 +926,9 @@ import { CollisionTypes } from './CollisionTypes.js';
926
926
  'closest', null, 1,
927
927
  [240, 200, 80]);
928
928
  vis.drawAsCircle = true;
929
- // Shell render defaults (Bite 5b R2-3) so the Inspector's Shell section seeds live
929
+ // Shell render defaults (R2-3) so the Inspector's Shell section seeds live
930
930
  // controls (render-only; no visual change — alpha 255 = opaque, shellRender 'design'
931
- // = the Bite-4b marker default, shellShape 'circle' = the current drawAsCircle look).
931
+ // = the marker default, shellShape 'circle' = the current drawAsCircle look).
932
932
  vis.alpha = 255;
933
933
  vis.shellRender = 'design';
934
934
  vis.shellShape = 'circle';
@@ -1,8 +1,8 @@
1
1
  /* Copyright 2023-2026 by Essam Abadir */
2
2
 
3
3
  /**
4
- * Tunnel — TWO parallel MIRROR Walls forming a corridor (ws-experiments-walkthrough,
5
- * CEO ruling 2026-07-26: "we implement a tunnel using two mirrors"). The waveguide /
4
+ * Tunnel — TWO parallel MIRROR Walls forming a corridor (a tunnel is implemented
5
+ * with two mirrors). The waveguide /
6
6
  * light-pipe primitive: a beam travelling down the bore bounces off the two facing
7
7
  * mirror walls (the guarded reflection law), staying collimated inside the channel.
8
8
  *
@@ -49,7 +49,7 @@
49
49
  * (`<name>_A` = the first mirror, `<name>_B` = the second).
50
50
  * @param {'mirror'|'directed'} [opts.mode='mirror'] — the corridor's COLLISION MODE.
51
51
  * `'mirror'` (DEFAULT) is the pre-existing guarded-bounce waveguide, unchanged and
52
- * byte-identical. `'directed'` is the DIRECTED TUNNEL (CEO 2026-07-28): a wall hit
52
+ * byte-identical. `'directed'` is the DIRECTED TUNNEL: a wall hit
53
53
  * re-emits the quantum in a random FORWARD direction within a 180° fan about the
54
54
  * corridor's own axis — the tunnel behaves as a semi-circular emitter rather than a
55
55
  * mirror. See `opts.directedAngle` / `opts.redirectSpread` and the Layer-2 note.
@@ -63,7 +63,7 @@
63
63
  * axis-aligned (a Tunnel is two AABB walls); this angle drives the redirect only —
64
64
  * the same v1 split `DirectedTunnel.orientation` documents.
65
65
  * @param {number} [opts.redirectSpread=90] — `'directed'` mode fan HALF-WIDTH, DEGREES.
66
- * The default `90` IS the CEO's ask: a full 180° forward fan (`directedAngle ± 90°`).
66
+ * The default `90` is a full 180° forward fan (`directedAngle ± 90°`).
67
67
  * `0` collapses to a perfectly collimated re-emission along `directedAngle`.
68
68
  * @param {boolean} [opts.exitCollapse=false] — THE POINT-EXIT GATE (D3). Adds a THIRD
69
69
  * LargeObject spanning the last 2 columns of the bore at the corridor's OUTPUT mouth,
@@ -103,10 +103,10 @@
103
103
  * mirror is reflected back into the bore (vy flipped for a horizontal tunnel, vx
104
104
  * for a vertical one) by the compiled bounce op-program — no random scatter, no
105
105
  * leak through the wall (the guarded reflect law), so the beam stays collimated
106
- * down the channel. This is the physical difference the CEO's rebuild targets vs
106
+ * down the channel. This is the physical difference the rebuild targets vs
107
107
  * the legacy RANDOM_XY slit liners (which scatter randomly and can leak).
108
108
  *
109
- * `mode:'directed'` swaps that ONE emergent effect for the other one the CEO named:
109
+ * `mode:'directed'` swaps that ONE emergent effect for the other one:
110
110
  * instead of reflecting the incidence axis, each wall hit RE-EMITS the quantum into a
111
111
  * uniformly-drawn direction inside the forward 180°, so the corridor reads as a
112
112
  * semi-circular (semi-spherical) emitter rather than a mirror. It is still ZERO new
@@ -254,7 +254,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
254
254
  var color = opts.color || [90, 120, 200];
255
255
  var name = opts.name || 'tunnel';
256
256
 
257
- // ── Collision MODE (D2, CEO 2026-07-28) ──────────────────────────────
257
+ // ── Collision MODE (D2) ──────────────────────────────────────────────
258
258
  // 'mirror' (default) = the pre-existing guarded-bounce waveguide, untouched.
259
259
  // 'directed' = eject-only walls + the host 180° forward re-emission.
260
260
  // FAIL-LOUD on anything else (never a silent fallback to mirror).
@@ -267,13 +267,13 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
267
267
  // derived from `axis` — never a hand-typed default per call site.
268
268
  var directedAngleDeg = (typeof opts.directedAngle === 'number')
269
269
  ? opts.directedAngle : (axis === 'y' ? 90 : 0);
270
- // FAN HALF-WIDTH: 90° ⇒ the full 180° forward fan (the CEO's ask).
270
+ // FAN HALF-WIDTH: 90° ⇒ the full 180° forward fan.
271
271
  var redirectSpreadDeg = (typeof opts.redirectSpread === 'number') ? opts.redirectSpread : 90;
272
272
  // POLAR half-width: 0 even on a 3D corridor — a non-zero value is polar-uniform,
273
273
  // NOT solid-angle-uniform (see the module docstring). Opt in deliberately.
274
274
  var polarSpreadDeg = (typeof opts.polarSpread === 'number') ? opts.polarSpread : 0;
275
275
 
276
- // ── EXIT-GATE COLLAPSE (D3, CEO 2026-07-29) ──────────────────────────
276
+ // ── EXIT-GATE COLLAPSE (D3) ──────────────────────────────────────────
277
277
  // A third LargeObject at the corridor's OUTPUT mouth that pins every crossing
278
278
  // quantum to the bore's mid-line, turning the mouth into a one-pixel POINT SOURCE.
279
279
  // Orthogonal to `mode` (it composes with either), default OFF.
@@ -312,7 +312,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
312
312
  this.left = left; this.top = top; this.length = length; this.bore = bore;
313
313
  this.wallThickness = wallThickness; this.axis = axis; this.color = color;
314
314
  this.name = name;
315
- // `mode` is ALWAYS stashed (unlike the optional z/depth pair): it is the CEO-facing
315
+ // `mode` is ALWAYS stashed (unlike the optional z/depth pair): it is the user-facing
316
316
  // knob, so the Inspector must render its selector on every tunnel, which needs a
317
317
  // defined value to read. The three directed-only tunables follow the z/depth
318
318
  // OPT-IN precedent instead — left undefined in mirror mode so captureProps skips
@@ -439,7 +439,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
439
439
  SlitLinerScatter.applyLinerScatter(this.wallB.lo, universe, intoBoreB,
440
440
  { behavior: 'ejectY', resetLocalTime: false });
441
441
  // resetLocalTime stays FALSE: bundling the `local_time=0` phase reset into a
442
- // scatter phase-locks the ensemble (the measured spurious-coherent-drift ruling).
442
+ // scatter phase-locks the ensemble (the measured spurious coherent drift).
443
443
  // Decoherence is a separable op set and is deliberately not armed here.
444
444
 
445
445
  // (2) BETWEEN TICKS: ONE host applier over BOTH walls. speed:null ⇒ direction-only.
@@ -529,7 +529,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
529
529
  // PHASE ONLY — the single op. NEVER `_buildDecoherenceOps`: that bundle is TWO ops
530
530
  // and its second redraws CHARGE with an RNG draw, which is a rider nobody asked for
531
531
  // AND shifts every downstream seeded stream. The corridor WALLS keep
532
- // resetLocalTime:false regardless (standing ruling) — this reset lives at the exit
532
+ // resetLocalTime:false regardless — this reset lives at the exit
533
533
  // gate and nowhere else.
534
534
  ops.push({ set: HF + '.local_time', to: ast.Lit(0) });
535
535
  }
@@ -893,7 +893,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
893
893
  'out to both mirrors (the `_owner` fan-out in updateObjectProperty).'
894
894
  },
895
895
  {
896
- // D2 (CEO 2026-07-28) — the corridor's collision MODE. Enum values are
896
+ // D2 — the corridor's collision MODE. Enum values are
897
897
  // ferried from Tunnel.MODES (the object's own authority), never re-listed.
898
898
  name: 'mode',
899
899
  type: 'enum',
@@ -937,7 +937,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
937
937
  'perfectly collimated re-emission along directedAngle.'
938
938
  },
939
939
  {
940
- // D3 (CEO 2026-07-29) — the point-exit gate.
940
+ // D3 — the point-exit gate.
941
941
  name: 'exitCollapse',
942
942
  type: 'boolean',
943
943
  engineVisible: true,
@@ -951,7 +951,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
951
951
  'otherwise, because with collisions ON the collapse pixel serializes and kills quanta.'
952
952
  },
953
953
  {
954
- // D4 (CEO 2026-07-29) — recentering becomes optional so the two exit effects
954
+ // D4 — recentering becomes optional so the two exit effects
955
955
  // can be driven independently.
956
956
  name: 'exitRecenter',
957
957
  type: 'boolean',
@@ -960,7 +960,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
960
960
  // op-program and pushes it — it never reaches setFrameProperty or a LargeObject
961
961
  // bool ABI. Declared engineVisible:true it was DEMOTED to a read-only Inspector
962
962
  // row by the documented safety rule for engine-visible booleans (whose bind-only
963
- // write path would send a bare 0/1 where serde wants a JSON bool), so the CEO
963
+ // write path would send a bare 0/1 where serde wants a JSON bool), so a user
964
964
  // could see the flag and not flip it. `Wall.collisionBehavior` is the precedent:
965
965
  // also op-program-compiled, also live, correctly engineVisible:false.
966
966
  engineVisible: false,
@@ -981,7 +981,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
981
981
  // op-program and pushes it — it never reaches setFrameProperty or a LargeObject
982
982
  // bool ABI. Declared engineVisible:true it was DEMOTED to a read-only Inspector
983
983
  // row by the documented safety rule for engine-visible booleans (whose bind-only
984
- // write path would send a bare 0/1 where serde wants a JSON bool), so the CEO
984
+ // write path would send a bare 0/1 where serde wants a JSON bool), so a user
985
985
  // could see the flag and not flip it. `Wall.collisionBehavior` is the precedent:
986
986
  // also op-program-compiled, also live, correctly engineVisible:false.
987
987
  engineVisible: false,
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * Wall — the first-class, palette-exposed WALL primitive
5
- * (ws-experiments-walkthrough W1, CEO ruling E-W1a). It stands to the wall family
5
+ * (W1). It stands to the wall family
6
6
  * exactly as `SphereEmitter` stands to the emitter family: a THIN, named, UX-
7
7
  * declaring FACADE over the ONE engine-facing primitive that already exists — a
8
8
  * single `LargeObject` whose collision behavior is the Collision LEXICON v2
@@ -140,7 +140,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
140
140
  var slab = SlabFace.resolveSlabFace({
141
141
  w: wh.w, h: wh.h, orientationDeg: orientationDeg, d: depth, pitchDeg: pitchDeg
142
142
  });
143
- // R2AX — a PITCHED plate (two-axis mirror, CEO ruling 2026-07-26) has NO engine
143
+ // R2AX — a PITCHED plate (two-axis mirror) has NO engine
144
144
  // region (the ObbRegion contract is z-theta-only): the broad phase is the plate's
145
145
  // full 3D AABB (SlabFace plate3.aabb — the one derivation) and the compiled guard
146
146
  // trigger is the narrow phase. Engine two-angle OBB = flagged Gate-1 follow-up.
@@ -249,7 +249,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
249
249
  // when the caller does not state one, so the ONE default lives in absorbRadiation.js.
250
250
  self.emissivity = (typeof opts.emissivity === 'number') ? opts.emissivity : undefined;
251
251
  self.orientationDeg = (typeof opts.orientationDeg === 'number') ? opts.orientationDeg : 0;
252
- // R2AX (CEO two-axis ruling 2026-07-26) — up/down tilt about the plate's own long
252
+ // R2AX (two-axis mirror) — up/down tilt about the plate's own long
253
253
  // axis. 0/absent ⇒ byte-identical un-pitched wall. Requires a 3D wall (validated
254
254
  // below once the rect is resolved; SlabFace + compileWallV2 double-guard).
255
255
  self.pitchDeg = (typeof opts.pitchDeg === 'number') ? opts.pitchDeg : 0;
@@ -298,7 +298,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
298
298
  self._collectCollided = collectCollided;
299
299
  self._radiation = v2.radiation;
300
300
 
301
- // SWEPT-OBB geometry (circulation §2 + MIRROR broad-phase-superset ruling): resolve
301
+ // SWEPT-OBB geometry (circulation §2 + MIRROR broad-phase-superset rule): resolve
302
302
  // BOTH the narrow-phase region AND the broad-phase rect from the ONE SlabFace authority.
303
303
  // The JS wrapper LO keeps the TRUE slab rect (render draws the thin rotated face + the
304
304
  // renderer/eject stay byte-identical); the ENGINE's registered rect is EXPANDED to the
@@ -467,7 +467,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
467
467
  /**
468
468
  * setOrientation(deg) — live re-aim (B7). Normalizes to [0,360) and routes through
469
469
  * the SAME setV2Prop recompile path the Inspector slider uses (explicit re-bake of the
470
- * directional cone — the theorist-sanctioned "a wall that should re-aim must recompile"
470
+ * directional cone — the "a wall that should re-aim must recompile"
471
471
  * path; NOT a per-tick re-capture). SU1 at deg=0. THROWS on a wall-shaped object with no
472
472
  * collisionBehavior: the constructor requires one, so such an object was not built by Wall
473
473
  * and has no op-program to re-aim — turning it silently would show a turn that never happened.
@@ -538,7 +538,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
538
538
  };
539
539
 
540
540
  /**
541
- * R2AX — live PITCH (up/down, two-axis mirror; CEO ruling 2026-07-26). Degrees in
541
+ * R2AX — live PITCH (up/down, two-axis mirror). Degrees in
542
542
  * [-90, 90], rotation about the plate's own long axis; routes through the SAME
543
543
  * setV2Prop recompile path as orientation (re-bakes the 3-space reflection about the
544
544
  * SlabFace plate normal + the n-dot guard + the 3D-AABB broad rect). Requires a 3D
@@ -616,7 +616,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
616
616
  hooks: nextHooks, markTag: (prop === 'markTag') ? value : this.markTag,
617
617
  capacity: (prop === 'capacity') ? value : this.capacity,
618
618
  // B7: a live orientation edit re-bakes the directional cone (explicit recompile —
619
- // the theorist-sanctioned re-aim path). Use the NEW value for the probe (the
619
+ // the sanctioned re-aim path). Use the NEW value for the probe (the
620
620
  // generic commit below sets this.orientationDeg AFTER the probe is built).
621
621
  orientationDeg: (prop === 'orientationDeg') ? value : this.orientationDeg,
622
622
  // R2AX — a live pitch edit re-bakes the 3-space reflection + guard the same way
@@ -627,7 +627,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
627
627
  // Z1 — preserve the wall's 3D-ness across a live recompile (else an orientation
628
628
  // edit on a 3D wall would drop the z-incidence reflect + the closest3d eject).
629
629
  is3D: this.is3D === true,
630
- // MIRROR ruling — the TRUE slab dims (from _trueRect) so a live orientation edit
630
+ // MIRROR rule — the TRUE slab dims (from _trueRect) so a live orientation edit
631
631
  // re-bakes the OBB-normal eject for the new angle (cardinal → AABB eject, SU1).
632
632
  slabW: _trueWH.w, slabH: _trueWH.h
633
633
  });
@@ -765,7 +765,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
765
765
  };
766
766
 
767
767
  /**
768
- * LIVE-POPULATION readout (loop-polish B, CEO 2026-07-25): the number of frames
768
+ * LIVE-POPULATION readout (loop-polish B): the number of frames
769
769
  * that collided with THIS wall on the sampled tick. For a FULL-AREA background
770
770
  * wall (collisionBehavior 'nothing' + the count hook, intersects trigger) every
771
771
  * live leaf inside the rect collides every tick, so this per-tick collided-frame
@@ -848,8 +848,8 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
848
848
  // ── The kind (objects/kinds.js): descriptor, construction defaults, palette, builder ──────────
849
849
 
850
850
  /**
851
- * Wall — the first-class WALL primitive (ws-experiments-walkthrough W1, CEO
852
- * ruling E-W1a). A SUGAR kind (peer of SphereEmitter — NOT a new engine kind):
851
+ * Wall — the first-class WALL primitive (W1). A SUGAR kind (peer of
852
+ * SphereEmitter — NOT a new engine kind):
853
853
  * a thin facade over ONE LargeObject whose collision behavior is a friendly
854
854
  * Collision LEXICON v2 (`collisionBehavior`: nothing | block | bounce | absorb |
855
855
  * destroy, + bounceDirection + hooks) compiled to op-programs
@@ -898,20 +898,20 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
898
898
  // ── Rotation (Collision Lab; R1 UX-pass upgrade) — a live orientation the
899
899
  // sugar owns. Layer 1: number, degrees, [0,360), live, render+op-owned
900
900
  // (engineVisible:false — the engine LO search region stays AXIS-ALIGNED,
901
- // the honest AABB catch zone; nothing in lo_to_scope_bag — theorist v2 §1b).
901
+ // the honest AABB catch zone; nothing in lo_to_scope_bag — v2 §1b).
902
902
  // A live edit EXPLICITLY recompiles (setV2Prop → compileWallV2) AND the
903
903
  // renderer draws the shell rotated (no outline of the un-rotated rect).
904
904
  //
905
905
  // Layer 2 (what the knob DOES): orientationDeg is the mirror SURFACE angle.
906
906
  // For a bounce/reflect mirror the compiled reflection law is now
907
- // ORIENTATION-AWARE (R1, theorist-proven exact):
907
+ // ORIENTATION-AWARE (R1, proven exact):
908
908
  // • 0/90/180/270 → the axis-aligned incidence BOX reflector (both faces;
909
909
  // byte-identical at 0 — SU1).
910
910
  // • 45/135/225/315 → the exact swap / swap+negate (+x → +y / +x → −y).
911
911
  // • any α → the fixed tilted-plane reflection R=[cos2α,sin2α;sin2α,−cos2α].
912
912
  // STANDARD OPTICS 2θ LAW: a mirror surface at angle θ DEFLECTS the beam by
913
913
  // 2θ, so a +x beam exits at angle 2θ (slope tan2θ). Rotate the mirror to 45°
914
- // and a +x beam exits +y (the CEO routing landmark); 15° → slope tan30°;
914
+ // and a +x beam exits +y (the routing landmark); 15° → slope tan30°;
915
915
  // 67.5° → (−0.7071, 0.7071). For a constrained-random ("laser-gate") wall,
916
916
  // orientation instead re-bakes the scatter CONE endpoints
917
917
  // (cos/sin(orientation ± angleConstraint)) — the scatter axis follows the spin.
@@ -930,7 +930,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
930
930
  'rotation target.'
931
931
  },
932
932
  {
933
- // ── R2AX — two-axis mirror (CEO ruling 2026-07-26, Living Log ce4fb0c9):
933
+ // ── R2AX — two-axis mirror:
934
934
  // Layer 1 (API): up/down tilt in degrees [-90, 90] about the plate's OWN
935
935
  // long axis (the drawn face line). 3D walls only (needs a real z/depth —
936
936
  // visible in the Inspector only when depth > 0); a 2D wall THROWS. Live:
@@ -957,7 +957,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
957
957
  'z-component and always leaves on the incident side (never through the mirror). ' +
958
958
  '0 = the flat in-plane mirror (vz passes through).'
959
959
  },
960
- // ── Z-slab (Z1, CEO UX-pass 2026-07-24) — a wall's 3D depth/placement. A
960
+ // ── Z-slab (Z1) — a wall's 3D depth/placement. A
961
961
  // 6-element rect (RECT_TUPLE[6]) gives the wall a real z-slab: the
962
962
  // engine's collision region covers the depth, the wall reflects/ejects on all
963
963
  // SIX faces (the 3-axis incidence lift, WASM), and the three renderer draws it
@@ -983,7 +983,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
983
983
  description: 'The wall\'s z placement (near-face … far-face CENTER) in physics pixels ' +
984
984
  '(0 for a 2D wall). Derived from the 6-element rect. Edit via the rect field.'
985
985
  },
986
- // ── Collision LEXICON v2 (CEO 3e2016aa) — the nested behavior/direction/
986
+ // ── Collision LEXICON v2 — the nested behavior/direction/
987
987
  // modifier/hook surface. Enum values are FERRIED from WallBehaviors.js
988
988
  // (never hand-listed). `visibleWhen` (evaluated live at Inspector render
989
989
  // against the captured props) reveals the dependent fields only when
@@ -10,7 +10,7 @@
10
10
  * (rung dse-one-emitter).
11
11
  */
12
12
 
13
- // ── H1 AT THE CANONICAL DETECTOR LEG (CEO 2026-08-03) ────────────────────────
13
+ // ── H1 AT THE CANONICAL DETECTOR LEG ─────────────────────────────────────────
14
14
  //
15
15
  // The competence baseline: the most basic thing, done right, seen with eyes. One
16
16
  // emitter, then two, with the plate PRE-COMPUTED at the leg the ring formula was
@@ -10,7 +10,7 @@
10
10
  * (rung dse-one-slit).
11
11
  */
12
12
 
13
- // ── ONE SLIT AT THE CANONICAL LEG (frqtl-visual-bite, 2026-08-04) ────────────
13
+ // ── ONE SLIT AT THE CANONICAL LEG ────────────────────────────────────────────
14
14
  //
15
15
  // The companion arm to `dse-two-slits`: the IDENTICAL apparatus (same emitter, same
16
16
  // barrier x-position, same slit-1 aperture at y=120, same leg D, same plate, same
@@ -29,7 +29,7 @@
29
29
  // (120-240=-120) falls off the 400px canvas and does not exist.
30
30
  // PREDICTED: three bands at y=40, y=200, y=360; a dip/minimum on either side of
31
31
  // each; NO claim about height relative to `dse-two-slits` — degree of
32
- // reinforcement is a different question this bite does not ask. The claim under
32
+ // reinforcement is a different question this scene does not ask. The claim under
33
33
  // test is PRESENCE AND POSITION: does structure appear at all with one aperture,
34
34
  // and does it land on this specific off-centre ladder rather than smearing into
35
35
  // a single broad structureless lobe centred on y=120 (the naive "single-slit
@@ -10,13 +10,13 @@
10
10
  * (rung dse-photoelectric).
11
11
  */
12
12
 
13
- // ── DSE Lab (CEO 2026-07-24, DSE-rebuild-before-republish; consolidated 2026-07-26)
13
+ // ── DSE Lab
14
14
  // — the photoelectric experiment + THE double-slit, built on the full new
15
15
  // component set (SphereEmitter chargeMode random, v2 Walls + presets, in-scene
16
16
  // LiveChart). The single canonical double-slit is 2C (on the Tunnel object); the
17
17
  // old Light-Lab r9 and DSE 2A double-slit rungs were retired.
18
- // 2B — the photoelectric effect on the new component set (CEO ruling 2026-07-24:
19
- // "leave as is now" = the CURRENT absorb/radiate drip, NO workFunction threshold).
18
+ // 2B — the photoelectric effect on the new component set (the CURRENT absorb/radiate
19
+ // drip, NO workFunction threshold).
20
20
  // An incoming light stream charges an ABSORBING Wall (ABSORB v2 real backing-frame mass:
21
21
  // fills to capacity, then per-tick radiates lower-dimension leaves out its back with
22
22
  // p=1/capacity, mass conserved). A LiveChart on the absorber's absorb-stats series shows
@@ -19,7 +19,7 @@
19
19
  // stochastic near-field walk; the ray-optics λL/d Fraunhofer regime needs L >> d²/λ ≈ 580px,
20
20
  // larger than a 600px canvas allows).
21
21
  //
22
- // ONE MODE-AWARE SOURCE (S3/W2, CEO-ratified 2026-07-26; CEO Q21 2026-10-12). The mode strip
22
+ // ONE MODE-AWARE SOURCE (S3/W2). The mode strip
23
23
  // selects the RENDERER the host boots (renderState.renderer), and this scene reads it ONCE,
24
24
  // before its world: `three` ⇒ exp.createScene (a 3D world), else exp.createCanvas (2D). `IS3D`
25
25
  // then guards the dimensional deltas — there is NO second (`-3d`) source file:
@@ -70,8 +70,7 @@ export default function buildExperiment(exp) {
70
70
  var L = wl * 1.5, W = wl; // slit-group left 96, width 64 (wall front..back = [96,160])
71
71
  // THE DETECTOR LEG, DERIVED FROM THE RING LADDER (zero free parameters).
72
72
  // A phase-locked POINT source lays down density rings at r_m = (lambda/4)*sqrt((2m+1)^2+1)
73
- // measured from the emission point (guide row r3-radius-stall-shells;
74
- // docs/internal/records/2026-07-30-dse-ring-campaign.md). Each slit exit below
73
+ // measured from the emission point (guide row r3-radius-stall-shells). Each slit exit below
75
74
  // IS such a source, so the plate should be placed where
76
75
  // a NAMED ring crosses it rather than at a symmetric figure. Put the MIDLINE on ring m=2
77
76
  // of BOTH slits: with the exits at +/-halfSep from the midline, that needs a leg of
@@ -155,7 +154,7 @@ export default function buildExperiment(exp) {
155
154
  // only ever project two beams. Re-emission is what gives each slit its own angular
156
155
  // spread to interfere with. Mirror mode stays available on the object (mode:'mirror',
157
156
  // still the default) for the waveguide/light-pipe case it was built for.
158
- // THE TUNNEL IS A CONFIGURED EMITTER (CEO 2026-07-30). The exit gate's flags are not
157
+ // THE TUNNEL IS A CONFIGURED EMITTER. The exit gate's flags are not
159
158
  // plumbing details — they ARE the emitter vocabulary, one-to-one:
160
159
  // exitRecenter ON + exitPhaseReset ON -> a POINT SOURCE (every quantum leaves the
161
160
  // same pixel with the same phase) — what this rung uses, and what makes the ring
@@ -167,7 +166,7 @@ export default function buildExperiment(exp) {
167
166
  // In 3D the recenter pins the TRANSVERSE axis only, so the slot stays extended in z:
168
167
  // each slit is a LINE source and the bands extrude along z — the plate picture.
169
168
  // Unifying this with the SphereEmitter preset vocabulary (one owner, ferried — never a
170
- // second preset list) is a contract design flagged for architect + CEO ratification;
169
+ // second preset list) is an open contract design;
171
170
  // this rung uses the existing flags and documents the mapping.
172
171
  exp.addObject('Tunnel', Object.assign({ left: L, top: s1Top + linerH, length: W, bore: bore, wallThickness: linerH, axis: 'x' }, Z3, { mode: 'directed', exitCollapse: true, exitRecenter: true, exitPhaseReset: true, name: 'slit1_channel', color: [80, 140, 220] }));
173
172
  exp.addObject('Tunnel', Object.assign({ left: L, top: s2Top + linerH, length: W, bore: bore, wallThickness: linerH, axis: 'x' }, Z3, { mode: 'directed', exitCollapse: true, exitRecenter: true, exitPhaseReset: true, name: 'slit2_channel', color: [80, 140, 220] }));
@@ -200,7 +199,7 @@ export default function buildExperiment(exp) {
200
199
  collisionBehavior: 'destroy', name: 'zClipFar', visible: false });
201
200
  exp.addObject('Wall', { rect: [0, 0, CW, H], z: -zHalf - 40, depth: 40,
202
201
  collisionBehavior: 'destroy', name: 'zClipNear', visible: false });
203
- // THE SWITCH (CEO 2026-10-13): god-rays computed from the light particles only (godraySource
202
+ // THE SWITCH: god-rays computed from the light particles only (godraySource
204
203
  // 'leaf'), at the sun's settings — the ONE owner of those numbers is lib/shim/render/sun-look.js
205
204
  // (SunLook); this file types none of them. Default OFF (the first-contact picture is
206
205
  // unchanged). OFF restores EXACTLY what was live before the last ON (a host row, a STUDIO
@@ -10,7 +10,7 @@
10
10
  * (rung dse-two-emitters).
11
11
  */
12
12
 
13
- // ── H1 AT THE CANONICAL DETECTOR LEG (CEO 2026-08-03) ────────────────────────
13
+ // ── H1 AT THE CANONICAL DETECTOR LEG ─────────────────────────────────────────
14
14
  //
15
15
  // The competence baseline: the most basic thing, done right, seen with eyes. One
16
16
  // emitter, then two, with the plate PRE-COMPUTED at the leg the ring formula was
@@ -10,7 +10,7 @@
10
10
  * (rung dse-two-slits).
11
11
  */
12
12
 
13
- // ── TWO SLITS AT THE CANONICAL LEG (frqtl-visual-bite, 2026-08-03) ───────────
13
+ // ── TWO SLITS AT THE CANONICAL LEG ───────────────────────────────────────────
14
14
  //
15
15
  // The SAME apparatus as `dse-two-emitters` — same λ, same separation, same leg,
16
16
  // same detector, same chart — but the two point sources are now SLIT EXITS in
@@ -18,7 +18,7 @@
18
18
  // barrier and feeds BOTH slit channels; each channel is a `directed` Tunnel
19
19
  // with the exit gate COLLAPSED + PHASE-RESET, exactly the composition
20
20
  // `dse-tunnel-rebuild` already uses to make a slit's own mouth stand in for a
21
- // point source ("THE TUNNEL IS A CONFIGURED EMITTER", CEO 2026-07-30, see that
21
+ // point source ("THE TUNNEL IS A CONFIGURED EMITTER", see that
22
22
  // rung's source comment for the flag-by-flag mapping). Composed only: Wall +
23
23
  // Tunnel, zero new parts, zero engine code.
24
24
  //
@@ -10,7 +10,7 @@
10
10
  * (rung r4b-laser-buildup).
11
11
  */
12
12
 
13
- // LASER BUILD-UP (D4, CEO 2026-07-29: "It will be the build up of a Laser") — the three
13
+ // LASER BUILD-UP (D4) — the three
14
14
  // components of a laser assembled one at a time on top of the earlier Light Lab rungs:
15
15
  // 1. a GAIN SOURCE — the hemisphere emitter (rung 3's omni source, restricted forward)
16
16
  // 2. a RESONANT BORE — the directed corridor, which re-aims every wall hit forward
@@ -15,9 +15,9 @@ import { SphereEmitter } from '@descix/frqtl-web/parts';
15
15
  export default function buildExperiment(exp) {
16
16
  // Collision Lab 1A · 3D — a collimated LASER (particle-walk pins PURE +x in 2D AND
17
17
  // 3D) into a 3D mirror SLAB (depth → z-slab containing z=0), rendered as a box;
18
- // orbit to view. Same LASER tuning as the 2D 1A (CEO 2026-07-25): single positive
18
+ // orbit to view. Same LASER tuning as the 2D 1A: single positive
19
19
  // charge, wavelength 1, wavelengthScale 1 (fundamentalWaveLength 4), tiny burst.
20
- // FACE-ON default (CEO drive ruling 2026-07-26): orientation 0 presents the full
20
+ // FACE-ON default: orientation 0 presents the full
21
21
  // drawn face to the beam → retro-reflection (beam straight back, recolored) — the
22
22
  // one mirror visual that reads correctly from EVERY camera azimuth. (A tilted
23
23
  // default's L-shaped 2th exit is correct optics but its mirror-flipped projection
@@ -39,8 +39,8 @@ export default function buildExperiment(exp) {
39
39
  collisionBehavior: 'bounce', bounceDirection: 'reflect', orientationDeg: 0,
40
40
  name: 'mirror', color: [255, 120, 0], hooks: ['recolor']
41
41
  });
42
- // SCENE Z-COLLIMATOR (CEO drive ruling 2026-07-26 — 'the z is letting things
43
- // pass through, not reflect'): the beam's z-tail DIFFUSES over time (measured:
42
+ // SCENE Z-COLLIMATOR (without it the z lets things pass through instead of
43
+ // reflecting): the beam's z-tail DIFFUSES over time (measured:
44
44
  // |z| at the wall trending 68 of the 80 rim within seconds), and any quantum
45
45
  // beyond the plate's z-band would sail BESIDE the plate — reading as pass-
46
46
  // through from rooftop. Two INVISIBLE full-canvas destroy boundaries flush with