@reicek/neataptic-ts 0.1.25 → 0.1.26

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 (210) hide show
  1. package/.github/copilot-instructions.md +11 -0
  2. package/.github/skills/trace-analyzer-extension/SKILL.md +3 -3
  3. package/.github/skills/trace-analyzer-extension/assets/extension-checklist.md +1 -1
  4. package/.github/skills/trace-analyzer-extension/references/analyzer-extension-workflow.md +1 -1
  5. package/.github/skills/trace-audit-reporting/SKILL.md +3 -3
  6. package/.github/skills/trace-audit-reporting/references/trace-analysis-workflow.md +1 -1
  7. package/package.json +19 -13
  8. package/plans/Flappy_Bird_Folder_Documentation_Pass.md +4 -4
  9. package/plans/README.md +24 -0
  10. package/plans/Roadmap.md +62 -40
  11. package/plans/analyze-trace-solid-split.plans.md +66 -0
  12. package/plans/architecture-solid-split.plans.md +9 -15
  13. package/plans/asciiMaze-typescript-repair.plans.md +1 -1
  14. package/plans/generate-docs-solid-split.plans.md +87 -0
  15. package/plans/methods-docs.plans.md +25 -1
  16. package/plans/methods-solid-split.plans.md +14 -14
  17. package/plans/neat-docs.plans.md +9 -1
  18. package/plans/neat-test-surface-repair.plans.md +1 -1
  19. package/plans/render-docs-html-solid-split.plans.md +68 -0
  20. package/plans/src-no-explicit-any-cleanup.plans.md +1 -1
  21. package/plans/utils-docs.plans.md +6 -1
  22. package/scripts/analyze-trace/analyze-trace.analysis.ts +479 -0
  23. package/scripts/analyze-trace/analyze-trace.constants.ts +35 -0
  24. package/scripts/analyze-trace/analyze-trace.io.ts +69 -0
  25. package/scripts/analyze-trace/analyze-trace.report.ts +100 -0
  26. package/scripts/analyze-trace/analyze-trace.shared.ts +116 -0
  27. package/scripts/analyze-trace/analyze-trace.ts +45 -0
  28. package/scripts/analyze-trace/analyze-trace.types.ts +72 -0
  29. package/scripts/assets/theme.css +80 -23
  30. package/scripts/copy-examples.ts +239 -0
  31. package/scripts/export-onnx.ts +223 -0
  32. package/scripts/generate-bench-tables.ts +378 -37
  33. package/scripts/generate-docs/generate-docs.constants.ts +107 -0
  34. package/scripts/generate-docs/generate-docs.order.ts +355 -0
  35. package/scripts/generate-docs/generate-docs.state.ts +31 -0
  36. package/scripts/generate-docs/generate-docs.targets.ts +165 -0
  37. package/scripts/generate-docs/generate-docs.ts +63 -0
  38. package/scripts/generate-docs/generate-docs.types.ts +112 -0
  39. package/scripts/generate-docs/output/generate-docs.output.folder-index.utils.ts +167 -0
  40. package/scripts/generate-docs/output/generate-docs.output.ordering.utils.ts +353 -0
  41. package/scripts/generate-docs/output/generate-docs.output.readme.utils.ts +420 -0
  42. package/scripts/generate-docs/output/generate-docs.output.ts +123 -0
  43. package/scripts/generate-docs/output/generate-docs.output.warnings.utils.ts +219 -0
  44. package/scripts/generate-docs/symbols/generate-docs.symbols.collection.utils.ts +365 -0
  45. package/scripts/generate-docs/symbols/generate-docs.symbols.jsdoc.utils.ts +373 -0
  46. package/scripts/generate-docs/symbols/generate-docs.symbols.normalize.utils.ts +155 -0
  47. package/scripts/generate-docs/symbols/generate-docs.symbols.render.utils.ts +149 -0
  48. package/scripts/generate-docs/symbols/generate-docs.symbols.signature.utils.ts +289 -0
  49. package/scripts/generate-docs/symbols/generate-docs.symbols.ts +11 -0
  50. package/scripts/mermaid-cli.mjs +102 -22
  51. package/scripts/mermaid-cli.ts +736 -0
  52. package/scripts/render-docs-html/render-docs-html.assets.ts +54 -0
  53. package/scripts/render-docs-html/render-docs-html.mermaid.ts +245 -0
  54. package/scripts/{render-docs-html.sidebar.ts → render-docs-html/render-docs-html.navigation.ts} +141 -144
  55. package/scripts/render-docs-html/render-docs-html.pages.ts +333 -0
  56. package/scripts/render-docs-html/render-docs-html.shared.ts +333 -0
  57. package/scripts/render-docs-html/render-docs-html.types.ts +42 -0
  58. package/scripts/render-docs-html.ts +23 -587
  59. package/scripts/run-docs.ts +238 -0
  60. package/scripts/write-dist-docs-pkg.ts +40 -0
  61. package/src/README.md +75 -75
  62. package/src/architecture/connection/README.md +5 -5
  63. package/src/architecture/layer/README.md +508 -508
  64. package/src/architecture/network/README.md +1458 -1458
  65. package/src/architecture/network/activate/README.md +694 -694
  66. package/src/architecture/network/bootstrap/README.md +77 -77
  67. package/src/architecture/network/connect/README.md +74 -74
  68. package/src/architecture/network/deterministic/README.md +135 -135
  69. package/src/architecture/network/evolve/README.md +364 -364
  70. package/src/architecture/network/gating/README.md +130 -130
  71. package/src/architecture/network/genetic/README.md +399 -399
  72. package/src/architecture/network/mutate/README.md +897 -897
  73. package/src/architecture/network/onnx/README.md +720 -720
  74. package/src/architecture/network/onnx/export/README.md +728 -728
  75. package/src/architecture/network/onnx/export/layers/README.md +450 -450
  76. package/src/architecture/network/onnx/import/README.md +618 -618
  77. package/src/architecture/network/onnx/schema/README.md +32 -32
  78. package/src/architecture/network/prune/README.md +245 -245
  79. package/src/architecture/network/remove/README.md +135 -135
  80. package/src/architecture/network/runtime/README.md +106 -106
  81. package/src/architecture/network/serialize/README.md +542 -542
  82. package/src/architecture/network/slab/README.md +608 -608
  83. package/src/architecture/network/standalone/README.md +212 -212
  84. package/src/architecture/network/stats/README.md +84 -84
  85. package/src/architecture/network/topology/README.md +465 -465
  86. package/src/architecture/network/training/README.md +200 -200
  87. package/src/architecture/node/README.md +5 -5
  88. package/src/architecture/nodePool/README.md +14 -14
  89. package/src/methods/README.md +99 -99
  90. package/src/methods/activation/README.md +189 -189
  91. package/src/methods/cost/README.md +131 -131
  92. package/src/methods/rate/README.md +86 -86
  93. package/src/multithreading/README.md +77 -77
  94. package/src/multithreading/workers/browser/README.md +8 -8
  95. package/src/multithreading/workers/node/README.md +8 -8
  96. package/src/neat/README.md +148 -148
  97. package/src/neat/adaptive/README.md +120 -120
  98. package/src/neat/adaptive/acceptance/README.md +40 -40
  99. package/src/neat/adaptive/complexity/README.md +137 -137
  100. package/src/neat/adaptive/core/README.md +197 -197
  101. package/src/neat/adaptive/lineage/README.md +90 -90
  102. package/src/neat/adaptive/mutation/README.md +284 -284
  103. package/src/neat/compat/README.md +43 -43
  104. package/src/neat/compat/core/README.md +90 -90
  105. package/src/neat/diversity/README.md +35 -35
  106. package/src/neat/diversity/core/README.md +88 -88
  107. package/src/neat/evaluate/README.md +85 -85
  108. package/src/neat/evaluate/auto-distance/README.md +75 -75
  109. package/src/neat/evaluate/entropy-compat/README.md +37 -37
  110. package/src/neat/evaluate/entropy-sharing/README.md +43 -43
  111. package/src/neat/evaluate/fitness/README.md +23 -23
  112. package/src/neat/evaluate/novelty/README.md +120 -120
  113. package/src/neat/evaluate/objectives/README.md +17 -17
  114. package/src/neat/evaluate/shared/README.md +94 -94
  115. package/src/neat/evolve/README.md +96 -96
  116. package/src/neat/evolve/adaptive/README.md +60 -60
  117. package/src/neat/evolve/objectives/README.md +63 -63
  118. package/src/neat/evolve/offspring/README.md +56 -56
  119. package/src/neat/evolve/population/README.md +171 -171
  120. package/src/neat/evolve/runtime/README.md +79 -79
  121. package/src/neat/evolve/speciation/README.md +74 -74
  122. package/src/neat/evolve/warnings/README.md +10 -10
  123. package/src/neat/export/README.md +114 -114
  124. package/src/neat/helpers/README.md +50 -50
  125. package/src/neat/init/README.md +9 -9
  126. package/src/neat/lineage/core/README.md +101 -101
  127. package/src/neat/multiobjective/category/README.md +74 -74
  128. package/src/neat/multiobjective/crowding/README.md +272 -272
  129. package/src/neat/multiobjective/dominance/README.md +171 -171
  130. package/src/neat/multiobjective/fronts/README.md +68 -68
  131. package/src/neat/multiobjective/metrics/README.md +43 -43
  132. package/src/neat/multiobjective/objectives/README.md +31 -31
  133. package/src/neat/multiobjective/shared/README.md +27 -27
  134. package/src/neat/mutation/README.md +97 -97
  135. package/src/neat/mutation/add-conn/README.md +115 -115
  136. package/src/neat/mutation/add-node/README.md +126 -126
  137. package/src/neat/mutation/flow/README.md +149 -149
  138. package/src/neat/mutation/repair/README.md +185 -185
  139. package/src/neat/mutation/select/README.md +117 -117
  140. package/src/neat/mutation/shared/README.md +32 -32
  141. package/src/neat/objectives/README.md +25 -25
  142. package/src/neat/objectives/core/README.md +67 -67
  143. package/src/neat/pruning/README.md +40 -40
  144. package/src/neat/pruning/core/README.md +171 -171
  145. package/src/neat/pruning/facade/README.md +32 -32
  146. package/src/neat/rng/README.md +104 -104
  147. package/src/neat/rng/core/README.md +137 -137
  148. package/src/neat/rng/facade/README.md +50 -50
  149. package/src/neat/selection/README.md +111 -111
  150. package/src/neat/selection/core/README.md +227 -227
  151. package/src/neat/selection/facade/README.md +61 -61
  152. package/src/neat/shared/README.md +163 -163
  153. package/src/neat/speciation/README.md +31 -31
  154. package/src/neat/speciation/threshold/README.md +35 -35
  155. package/src/neat/species/README.md +25 -25
  156. package/src/neat/species/core/README.md +20 -20
  157. package/src/neat/species/core/shared/README.md +18 -18
  158. package/src/neat/species/history/context/README.md +22 -22
  159. package/src/neat/telemetry/accessors/README.md +58 -58
  160. package/src/neat/telemetry/exports/README.md +233 -233
  161. package/src/neat/telemetry/facade/README.md +252 -252
  162. package/src/neat/telemetry/facade/archive/README.md +57 -57
  163. package/src/neat/telemetry/facade/buffer/README.md +43 -43
  164. package/src/neat/telemetry/facade/lineage/README.md +12 -12
  165. package/src/neat/telemetry/facade/objectives/README.md +44 -44
  166. package/src/neat/telemetry/facade/runtime/README.md +26 -26
  167. package/src/neat/telemetry/facade/species/README.md +27 -27
  168. package/src/neat/telemetry/metrics/README.md +696 -696
  169. package/src/neat/telemetry/recorder/README.md +57 -57
  170. package/src/neat/telemetry/types/README.md +32 -32
  171. package/src/neat/topology-intent/README.md +75 -75
  172. package/src/utils/README.md +193 -193
  173. package/test/examples/asciiMaze/browser-entry/README.md +92 -92
  174. package/test/examples/asciiMaze/dashboardManager/README.md +109 -109
  175. package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +28 -28
  176. package/test/examples/asciiMaze/evolutionEngine/README.md +1527 -1527
  177. package/test/examples/asciiMaze/mazeMovement/README.md +105 -105
  178. package/test/examples/asciiMaze/mazeMovement/finalization/README.md +16 -16
  179. package/test/examples/asciiMaze/mazeMovement/policy/README.md +57 -57
  180. package/test/examples/asciiMaze/mazeMovement/runtime/README.md +52 -52
  181. package/test/examples/asciiMaze/mazeMovement/shaping/README.md +46 -46
  182. package/test/examples/flappy_bird/browser-entry/README.md +508 -508
  183. package/test/examples/flappy_bird/browser-entry/host/README.md +101 -101
  184. package/test/examples/flappy_bird/browser-entry/host/resize/README.md +144 -144
  185. package/test/examples/flappy_bird/browser-entry/network-view/README.md +194 -194
  186. package/test/examples/flappy_bird/browser-entry/playback/README.md +278 -278
  187. package/test/examples/flappy_bird/browser-entry/playback/background/README.md +129 -129
  188. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +502 -502
  189. package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +139 -139
  190. package/test/examples/flappy_bird/browser-entry/playback/snapshot/README.md +10 -10
  191. package/test/examples/flappy_bird/browser-entry/playback/trail/README.md +43 -43
  192. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/README.md +30 -30
  193. package/test/examples/flappy_bird/browser-entry/runtime/README.md +59 -59
  194. package/test/examples/flappy_bird/browser-entry/visualization/README.md +276 -276
  195. package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +16 -16
  196. package/test/examples/flappy_bird/constants/README.md +1070 -1070
  197. package/test/examples/flappy_bird/environment/README.md +22 -22
  198. package/test/examples/flappy_bird/evaluation/README.md +32 -32
  199. package/test/examples/flappy_bird/evaluation/rollout/README.md +141 -141
  200. package/test/examples/flappy_bird/flappy-evolution-worker/README.md +425 -425
  201. package/test/examples/flappy_bird/simulation-shared/README.md +170 -170
  202. package/test/examples/flappy_bird/simulation-shared/observation/README.md +109 -109
  203. package/test/examples/flappy_bird/trainer/README.md +325 -325
  204. package/test/examples/flappy_bird/trainer/evaluation/README.md +74 -74
  205. package/scripts/analyze-trace.ts +0 -590
  206. package/scripts/copy-examples.mjs +0 -114
  207. package/scripts/export-onnx.mjs +0 -86
  208. package/scripts/generate-bench-tables.mjs +0 -182
  209. package/scripts/generate-docs.ts +0 -2900
  210. package/scripts/write-dist-docs-pkg.mjs +0 -16
@@ -48,40 +48,13 @@ deliberate: the lower-band renderer should respond to camera motion like a
48
48
  piece of scenic lighting, not reach into gameplay entities or playback HUD
49
49
  state.
50
50
 
51
- ### PlaybackGroundGridHorizontalGeometryFactory
52
-
53
- ```ts
54
- PlaybackGroundGridHorizontalGeometryFactory(): PlaybackGroundGridHorizontalGeometry
55
- ```
56
-
57
- Lazy builder used when one horizontal geometry cache entry is missing.
58
-
59
- Horizontal depth bands depend only on stable scene dimensions, so callers can
60
- defer their construction until a cache miss proves the work is actually
61
- needed.
62
-
63
- ### PlaybackGroundGridVerticalGeometryFactory
64
-
65
- ```ts
66
- PlaybackGroundGridVerticalGeometryFactory(): PlaybackGroundGridVerticalGeometry
67
- ```
68
-
69
- Lazy builder used when one vertical geometry cache entry is missing.
70
-
71
- Vertical rays additionally depend on wrapped scroll state, so the cache keeps
72
- a compact builder hook rather than eagerly storing every possible cycle.
73
-
74
- ### PlaybackGroundGridVerticalSceneMetricsFactory
75
-
76
- ```ts
77
- PlaybackGroundGridVerticalSceneMetricsFactory(): PlaybackGroundGridVerticalSceneMetrics
78
- ```
51
+ ### PlaybackBackgroundGroundGridResolvedScene
79
52
 
80
- Lazy builder used when one vertical scene-metrics cache entry is missing.
53
+ Geometry and style package resolved before drawing the ground grid.
81
54
 
82
- Scene metrics such as projected anchor bounds are pure functions of the
83
- viewport, which makes them ideal cache inputs for the performance-sensitive
84
- lower-band renderer.
55
+ Splitting scene resolution from drawing keeps canvas code simple: by the time
56
+ the renderer runs, every geometric and palette decision has already been made
57
+ and packed into one immutable object graph.
85
58
 
86
59
  ### PlaybackBackgroundGroundGridSceneContext
87
60
 
@@ -91,6 +64,14 @@ This is the adapted subset of the shared background scene that the ground
91
64
  grid cares about: horizon position, lower-band bounds, and the centered
92
65
  vanishing point that gives the grid its forced-perspective look.
93
66
 
67
+ ### PlaybackBackgroundGroundGridSourceScene
68
+
69
+ Helper alias used when adapting the shared background scene context.
70
+
71
+ The parent background module owns the full sky-plus-ground scene contract;
72
+ the grid renderer narrows that shape to only the fields needed for the lower
73
+ band so the dependency direction stays clear.
74
+
94
75
  ### PlaybackBackgroundGroundGridStyle
95
76
 
96
77
  Theme-owned style contract for the neon ground grid.
@@ -99,20 +80,47 @@ The ground grid uses three coordinated colors: the structural line work, a
99
80
  fog wash that softens the lower band, and small pulse markers that briefly
100
81
  travel along eligible tracks.
101
82
 
102
- ### PlaybackGroundGridPulseOrientation
83
+ ### PlaybackGroundGridAnchorBounds
103
84
 
104
- Travel orientation used by lightweight pulse overlays.
85
+ Visible horizon bounds projected onto the bottom anchor line.
105
86
 
106
- Horizontal pulses skim along depth bands, while vertical pulses ride the
107
- perspective rays toward or away from the horizon.
87
+ Perspective rays begin conceptually at the horizon and terminate on the floor
88
+ anchor line, so this structure captures the visible lane span after the
89
+ horizon segment has been projected downward.
108
90
 
109
- ### PlaybackBackgroundGroundGridResolvedScene
91
+ ### PlaybackGroundGridAnchorBoundsInput
110
92
 
111
- Geometry and style package resolved before drawing the ground grid.
93
+ Input used when projecting a visible horizon span onto anchor space.
112
94
 
113
- Splitting scene resolution from drawing keeps canvas code simple: by the time
114
- the renderer runs, every geometric and palette decision has already been made
115
- and packed into one immutable object graph.
95
+ ### PlaybackGroundGridAnchorProjectionInput
96
+
97
+ Input used when projecting one horizon x-position onto the floor anchor line.
98
+
99
+ ### PlaybackGroundGridGeometry
100
+
101
+ Pure geometry bundle generated before canvas drawing begins.
102
+
103
+ Horizontal bands, vertical rays, and the optional pulse are resolved into one
104
+ package so the draw layer can stay strictly about paint order.
105
+
106
+ ### PlaybackGroundGridHorizontalGeometry
107
+
108
+ Cached horizontal geometry bundle reused across matching scene sizes.
109
+
110
+ Horizontal depth lines are stable for a given viewport, which makes them the
111
+ cheapest part of the grid to cache aggressively.
112
+
113
+ ### PlaybackGroundGridHorizontalGeometryFactory
114
+
115
+ ```ts
116
+ PlaybackGroundGridHorizontalGeometryFactory(): PlaybackGroundGridHorizontalGeometry
117
+ ```
118
+
119
+ Lazy builder used when one horizontal geometry cache entry is missing.
120
+
121
+ Horizontal depth bands depend only on stable scene dimensions, so callers can
122
+ defer their construction until a cache miss proves the work is actually
123
+ needed.
116
124
 
117
125
  ### PlaybackGroundGridLineSegment
118
126
 
@@ -121,20 +129,28 @@ Declarative line segment model used by the ground-grid renderer.
121
129
  The grid is built as plain data first so batch builders can group segments by
122
130
  shared style before any canvas path or glow work happens.
123
131
 
124
- ### PlaybackGroundGridSegmentBatch
132
+ ### PlaybackGroundGridPulse
125
133
 
126
- Ordered batch of line segments that share one render style.
134
+ One visible pulse square rendered above the grid lines.
127
135
 
128
- Grouping segments by alpha, blur, and thickness reduces canvas state churn
129
- and gives the renderer a natural place to cache `Path2D` instances when the
130
- environment supports them.
136
+ These pulses are tiny accent lights, not gameplay markers. Their job is to
137
+ give the lower band a hint of moving circuitry without competing with birds,
138
+ pipes, or the active network HUD.
131
139
 
132
- ### PlaybackGroundGridVerticalRayInput
140
+ ### PlaybackGroundGridPulseInput
133
141
 
134
- Internal helper contract used while generating vertical-ray sub-segments.
142
+ Input contract used while resolving one deterministic pulse event.
135
143
 
136
- Each vertical ray is split into depth-aware pieces so stroke thickness and
137
- glow can evolve as the ray approaches the viewer instead of staying uniform.
144
+ Pulses are deterministic decoration: given the same frame and scene, the same
145
+ lane should light up. This input bundle gathers the candidate paths needed to
146
+ make that choice without consulting external state.
147
+
148
+ ### PlaybackGroundGridPulseOrientation
149
+
150
+ Travel orientation used by lightweight pulse overlays.
151
+
152
+ Horizontal pulses skim along depth bands, while vertical pulses ride the
153
+ perspective rays toward or away from the horizon.
138
154
 
139
155
  ### PlaybackGroundGridPulsePath
140
156
 
@@ -143,27 +159,43 @@ Simplified path used by one visible pulse event.
143
159
  Pulses do not need the full batch geometry; they only need a single lane to
144
160
  travel along, represented here as a start-end segment plus local thickness.
145
161
 
146
- ### PlaybackGroundGridPulse
162
+ ### PlaybackGroundGridPulseTimingState
147
163
 
148
- One visible pulse square rendered above the grid lines.
164
+ Timing state resolved for one deterministic ground-grid pulse slot.
149
165
 
150
- These pulses are tiny accent lights, not gameplay markers. Their job is to
151
- give the lower band a hint of moving circuitry without competing with birds,
152
- pipes, or the active network HUD.
166
+ The slot model keeps pulse timing legible: each pulse has a start bucket, an
167
+ elapsed time inside that bucket, and a normalized progress value used by the
168
+ position and fade helpers.
153
169
 
154
- ### PlaybackGroundGridGeometry
170
+ ### PlaybackGroundGridPulseTrackThicknessInput
155
171
 
156
- Pure geometry bundle generated before canvas drawing begins.
172
+ Input used when adapting a pulse position into a local track thickness.
157
173
 
158
- Horizontal bands, vertical rays, and the optional pulse are resolved into one
159
- package so the draw layer can stay strictly about paint order.
174
+ Because the grid uses perspective-weighted stroke widths, the pulse size must
175
+ be adjusted to the local lane thickness rather than using one fixed square.
160
176
 
161
- ### PlaybackGroundGridHorizontalGeometry
177
+ ### PlaybackGroundGridPulseTravelRatioInput
162
178
 
163
- Cached horizontal geometry bundle reused across matching scene sizes.
179
+ Direction and timing state used when resolving pulse travel progress.
164
180
 
165
- Horizontal depth lines are stable for a given viewport, which makes them the
166
- cheapest part of the grid to cache aggressively.
181
+ Some pulse lanes feel better moving away from the viewer and others toward
182
+ it, so travel resolution keeps orientation and forward/reverse intent paired
183
+ with the current lifetime progress.
184
+
185
+ ### PlaybackGroundGridSegmentBatch
186
+
187
+ Ordered batch of line segments that share one render style.
188
+
189
+ Grouping segments by alpha, blur, and thickness reduces canvas state churn
190
+ and gives the renderer a natural place to cache `Path2D` instances when the
191
+ environment supports them.
192
+
193
+ ### PlaybackGroundGridVerticalCycleContext
194
+
195
+ Wrapped vertical-cycle state derived from scroll for one frame.
196
+
197
+ The perspective rays repeat on a fixed cycle. Wrapping the scroll state lets
198
+ the renderer reuse cached geometry while still appearing to drift sideways.
167
199
 
168
200
  ### PlaybackGroundGridVerticalGeometry
169
201
 
@@ -173,6 +205,31 @@ Vertical rays move with scroll, but only within a repeating wrapped cycle.
173
205
  Caching at that granularity captures most of the reuse without pretending the
174
206
  rays are globally static.
175
207
 
208
+ ### PlaybackGroundGridVerticalGeometryFactory
209
+
210
+ ```ts
211
+ PlaybackGroundGridVerticalGeometryFactory(): PlaybackGroundGridVerticalGeometry
212
+ ```
213
+
214
+ Lazy builder used when one vertical geometry cache entry is missing.
215
+
216
+ Vertical rays additionally depend on wrapped scroll state, so the cache keeps
217
+ a compact builder hook rather than eagerly storing every possible cycle.
218
+
219
+ ### PlaybackGroundGridVerticalPulseContinuationState
220
+
221
+ Cached continuation state used to keep one vertical pulse on the same ray.
222
+
223
+ Without this continuity state a vertical pulse could jitter between adjacent
224
+ rays across frames, which looks like noise instead of a deliberate light.
225
+
226
+ ### PlaybackGroundGridVerticalRayInput
227
+
228
+ Internal helper contract used while generating vertical-ray sub-segments.
229
+
230
+ Each vertical ray is split into depth-aware pieces so stroke thickness and
231
+ glow can evolve as the ray approaches the viewer instead of staying uniform.
232
+
176
233
  ### PlaybackGroundGridVerticalSceneMetrics
177
234
 
178
235
  Cached scene metrics reused across matching vertical-grid frames.
@@ -181,93 +238,85 @@ These metrics answer the expensive geometric questions once per viewport,
181
238
  such as how wide the visible anchor span is and how many perspective lanes
182
239
  can fit while preserving the intended spacing.
183
240
 
184
- ### PlaybackGroundGridAnchorBounds
241
+ ### PlaybackGroundGridVerticalSceneMetricsFactory
185
242
 
186
- Visible horizon bounds projected onto the bottom anchor line.
243
+ ```ts
244
+ PlaybackGroundGridVerticalSceneMetricsFactory(): PlaybackGroundGridVerticalSceneMetrics
245
+ ```
187
246
 
188
- Perspective rays begin conceptually at the horizon and terminate on the floor
189
- anchor line, so this structure captures the visible lane span after the
190
- horizon segment has been projected downward.
247
+ Lazy builder used when one vertical scene-metrics cache entry is missing.
191
248
 
192
- ### PlaybackGroundGridAnchorBoundsInput
249
+ Scene metrics such as projected anchor bounds are pure functions of the
250
+ viewport, which makes them ideal cache inputs for the performance-sensitive
251
+ lower-band renderer.
193
252
 
194
- Input used when projecting a visible horizon span onto anchor space.
253
+ ## browser-entry/playback/background/ground-grid/playback.background.ground-grid.constants.ts
195
254
 
196
- ### PlaybackGroundGridAnchorProjectionInput
255
+ ### FLAPPY_BACKGROUND_GROUND_GRID_STYLE
197
256
 
198
- Input used when projecting one horizon x-position onto the floor anchor line.
257
+ Frozen neon style bundle reused by the playback ground-grid renderer.
199
258
 
200
- ### PlaybackGroundGridVerticalCycleContext
259
+ The values stay theme-owned but are materialized once so the renderer does
260
+ not allocate a new style object during every frame.
201
261
 
202
- Wrapped vertical-cycle state derived from scroll for one frame.
262
+ ### FLAPPY_GROUND_GRID_APPROX_FRAME_DURATION_MS
203
263
 
204
- The perspective rays repeat on a fixed cycle. Wrapping the scroll state lets
205
- the renderer reuse cached geometry while still appearing to drift sideways.
264
+ Approximate playback frame duration used for deterministic pulse timing.
206
265
 
207
- ### PlaybackGroundGridPulseInput
266
+ The pulse system is designed to feel stable at ordinary browser animation
267
+ cadence without requiring access to wall-clock time in every helper.
208
268
 
209
- Input contract used while resolving one deterministic pulse event.
269
+ ### FLAPPY_GROUND_GRID_DEPTH_CURVE_EXPONENT
210
270
 
211
- Pulses are deterministic decoration: given the same frame and scene, the same
212
- lane should light up. This input bundle gathers the candidate paths needed to
213
- make that choice without consulting external state.
271
+ Non-linear exponent used to compress depth lines toward the horizon.
214
272
 
215
- ### PlaybackGroundGridPulseTimingState
273
+ This is the main perspective stylization control: higher values bunch more of
274
+ the depth bands near the horizon and leave broader spacing near the viewer.
216
275
 
217
- Timing state resolved for one deterministic ground-grid pulse slot.
276
+ ### FLAPPY_GROUND_GRID_FOG_ALPHA
218
277
 
219
- The slot model keeps pulse timing legible: each pulse has a start bucket, an
220
- elapsed time inside that bucket, and a normalized progress value used by the
221
- position and fade helpers.
278
+ Peak opacity used by the lower-band neon fog wash.
222
279
 
223
- ### PlaybackGroundGridPulseTravelRatioInput
280
+ The fog should tint the band, not obscure the line geometry, so the opacity
281
+ is intentionally modest.
224
282
 
225
- Direction and timing state used when resolving pulse travel progress.
283
+ ### FLAPPY_GROUND_GRID_FOG_HEIGHT_RATIO
226
284
 
227
- Some pulse lanes feel better moving away from the viewer and others toward
228
- it, so travel resolution keeps orientation and forward/reverse intent paired
229
- with the current lifetime progress.
285
+ Height ratio reserved for the subtle lower-band neon fog wash.
230
286
 
231
- ### PlaybackGroundGridPulseTrackThicknessInput
287
+ The fog sits in the lower portion of the band so it enriches the foreground
288
+ without muting the crisp horizon seam.
232
289
 
233
- Input used when adapting a pulse position into a local track thickness.
290
+ ### FLAPPY_GROUND_GRID_HORIZONTAL_LINE_COUNT
234
291
 
235
- Because the grid uses perspective-weighted stroke widths, the pulse size must
236
- be adjusted to the local lane thickness rather than using one fixed square.
292
+ Number of horizontal depth bands used by the neon ground grid.
237
293
 
238
- ### PlaybackGroundGridVerticalPulseContinuationState
294
+ More bands increase the sense of depth, but they also thicken the lower band
295
+ visually and add more line work to each frame.
239
296
 
240
- Cached continuation state used to keep one vertical pulse on the same ray.
297
+ ### FLAPPY_GROUND_GRID_MAX_ALPHA
241
298
 
242
- Without this continuity state a vertical pulse could jitter between adjacent
243
- rays across frames, which looks like noise instead of a deliberate light.
299
+ Maximum alpha used by the nearest depth and perspective lines.
244
300
 
245
- ### PlaybackBackgroundGroundGridSourceScene
301
+ ### FLAPPY_GROUND_GRID_MAX_BLUR_PX
246
302
 
247
- Helper alias used when adapting the shared background scene context.
303
+ Blur radius used by the farthest depth lines near the horizon.
248
304
 
249
- The parent background module owns the full sky-plus-ground scene contract;
250
- the grid renderer narrows that shape to only the fields needed for the lower
251
- band so the dependency direction stays clear.
305
+ ### FLAPPY_GROUND_GRID_MAX_THICKNESS_PX
252
306
 
253
- ## browser-entry/playback/background/ground-grid/playback.background.ground-grid.constants.ts
307
+ Maximum stroke width used by near depth lines.
254
308
 
255
- ### FLAPPY_GROUND_GRID_HORIZONTAL_LINE_COUNT
309
+ ### FLAPPY_GROUND_GRID_MIN_ALPHA
256
310
 
257
- Number of horizontal depth bands used by the neon ground grid.
311
+ Minimum alpha used by the farthest horizontal depth lines.
258
312
 
259
- More bands increase the sense of depth, but they also thicken the lower band
260
- visually and add more line work to each frame.
313
+ ### FLAPPY_GROUND_GRID_MIN_BLUR_PX
261
314
 
262
- ### FLAPPY_GROUND_GRID_TARGET_VERTICAL_LINE_SPACING_PX
315
+ Blur radius used by the nearest depth lines at the bottom edge.
263
316
 
264
- Target visible spacing between adjacent vertical rays at the pipe floor.
317
+ ### FLAPPY_GROUND_GRID_MIN_THICKNESS_PX
265
318
 
266
- The lower pipes visually attach to a projected floor band in the grid. The
267
- important invariant is phase repeat, not just raw gap width: each new pipe at
268
- max difficulty should land on the same relative grid position as the previous
269
- one. That requires matching the full pipe-to-pipe pitch, not only the open
270
- edge-to-edge gap between pipe bodies.
319
+ Minimum stroke width used by far depth lines.
271
320
 
272
321
  ### FLAPPY_GROUND_GRID_MIN_VERTICAL_LINE_COUNT
273
322
 
@@ -276,26 +325,16 @@ Minimum visible perspective-ray count used on very narrow viewports.
276
325
  Even on a small canvas, the grid still needs at least a few rays to read as
277
326
  perspective instead of a flat block of horizontal stripes.
278
327
 
279
- ### FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT
280
-
281
- Extra off-screen perspective rays drawn for seamless wrap.
282
-
283
- Overflow rays prevent the parallax cycle from exposing empty gaps when the
284
- wrapped scroll offset lands near a lane boundary.
285
-
286
- ### FLAPPY_GROUND_GRID_TARGET_VERTICAL_SEGMENT_HEIGHT_PX
287
-
288
- Target screen-space height for one vertical-ray style segment (pixels).
328
+ ### FLAPPY_GROUND_GRID_PIPE_CONNECTION_LINE_OFFSET_FROM_BOTTOM
289
329
 
290
- Segmenting the rays lets the renderer vary alpha, thickness, and blur by
291
- depth rather than drawing each ray with one flat style.
330
+ Near-edge horizontal line offset used for the lower-pipe floor illusion.
292
331
 
293
- ### FLAPPY_GROUND_GRID_APPROX_FRAME_DURATION_MS
332
+ `1` targets the first usable grid band above the bottom edge rather than the
333
+ terminal line that coincides with the lower-band boundary itself.
294
334
 
295
- Approximate playback frame duration used for deterministic pulse timing.
335
+ ### FLAPPY_GROUND_GRID_PULSE_ALPHA
296
336
 
297
- The pulse system is designed to feel stable at ordinary browser animation
298
- cadence without requiring access to wall-clock time in every helper.
337
+ Peak opacity used by visible pulse squares.
299
338
 
300
339
  ### FLAPPY_GROUND_GRID_PULSE_INTERVAL_MS
301
340
 
@@ -311,36 +350,18 @@ Lifetime of one pulse as it travels across its chosen line (milliseconds).
311
350
  The lifetime is slightly shorter than the full interval so one pulse fades
312
351
  out before the next slot becomes active.
313
352
 
314
- ### FLAPPY_GROUND_GRID_PULSE_ALPHA
315
-
316
- Peak opacity used by visible pulse squares.
317
-
318
- ### FLAPPY_GROUND_GRID_PULSE_MIN_SIZE_PX
319
-
320
- Smallest visible pulse square size (pixels).
321
-
322
353
  ### FLAPPY_GROUND_GRID_PULSE_MAX_SIZE_PX
323
354
 
324
355
  Largest visible pulse square size (pixels).
325
356
 
326
- ### FLAPPY_GROUND_GRID_VERTICAL_PULSE_START_RATIO
327
-
328
- Earliest progress ratio allowed for vertical pulse travel.
329
-
330
- Vertical pulses start a little away from the horizon so they are visible as
331
- distinct squares instead of immediately disappearing into compressed depth.
332
-
333
- ### FLAPPY_GROUND_GRID_VERTICAL_PULSE_END_RATIO
334
-
335
- Latest progress ratio allowed for vertical pulse travel.
336
-
337
- Ending early keeps the pulse out of the extreme foreground, where its square
338
- would become too large and visually heavy.
339
-
340
357
  ### FLAPPY_GROUND_GRID_PULSE_MIN_ELIGIBLE_THICKNESS_PX
341
358
 
342
359
  Minimum horizontal line thickness eligible for pulse travel.
343
360
 
361
+ ### FLAPPY_GROUND_GRID_PULSE_MIN_SIZE_PX
362
+
363
+ Smallest visible pulse square size (pixels).
364
+
344
365
  ### FLAPPY_GROUND_GRID_PULSE_PREFERRED_HORIZONTAL_START_RATIO
345
366
 
346
367
  Earliest eligible slice of horizontal lines used for visible pulse picks.
@@ -352,26 +373,12 @@ of the compressed lines nearest the horizon.
352
373
 
353
374
  Horizontal inset that keeps vertical pulse picks away from clipped edges.
354
375
 
355
- ### FLAPPY_GROUND_GRID_UNSIGNED_NORMALIZATION_DIVISOR
356
-
357
- Normalization divisor used for deterministic pulse hash generation.
358
-
359
- The pulse selection helpers convert unsigned integer hashes into stable
360
- floating-point picks in the unit interval.
361
-
362
- ### FLAPPY_GROUND_GRID_DEPTH_CURVE_EXPONENT
363
-
364
- Non-linear exponent used to compress depth lines toward the horizon.
365
-
366
- This is the main perspective stylization control: higher values bunch more of
367
- the depth bands near the horizon and leave broader spacing near the viewer.
368
-
369
- ### FLAPPY_GROUND_GRID_PIPE_CONNECTION_LINE_OFFSET_FROM_BOTTOM
376
+ ### FLAPPY_GROUND_GRID_SCROLL_OFFSET_QUANTIZATION_DECIMALS
370
377
 
371
- Near-edge horizontal line offset used for the lower-pipe floor illusion.
378
+ Decimal precision used when quantizing the wrapped vertical-ray offset.
372
379
 
373
- `1` targets the first usable grid band above the bottom edge rather than the
374
- terminal line that coincides with the lower-band boundary itself.
380
+ Quantization stabilizes cache reuse by preventing tiny floating-point drift
381
+ from generating effectively identical geometry variants.
375
382
 
376
383
  ### FLAPPY_GROUND_GRID_SCROLL_RATIO
377
384
 
@@ -380,76 +387,86 @@ Scroll ratio applied to the moving vertical perspective rays.
380
387
  Keeping the rays slower than gameplay motion makes the grid feel like a deep
381
388
  environmental layer rather than a surface glued to the pipes.
382
389
 
383
- ### FLAPPY_GROUND_GRID_SCROLL_OFFSET_QUANTIZATION_DECIMALS
384
-
385
- Decimal precision used when quantizing the wrapped vertical-ray offset.
390
+ ### FLAPPY_GROUND_GRID_TARGET_VERTICAL_LINE_SPACING_PX
386
391
 
387
- Quantization stabilizes cache reuse by preventing tiny floating-point drift
388
- from generating effectively identical geometry variants.
392
+ Target visible spacing between adjacent vertical rays at the pipe floor.
389
393
 
390
- ### FLAPPY_GROUND_GRID_MIN_ALPHA
394
+ The lower pipes visually attach to a projected floor band in the grid. The
395
+ important invariant is phase repeat, not just raw gap width: each new pipe at
396
+ max difficulty should land on the same relative grid position as the previous
397
+ one. That requires matching the full pipe-to-pipe pitch, not only the open
398
+ edge-to-edge gap between pipe bodies.
391
399
 
392
- Minimum alpha used by the farthest horizontal depth lines.
400
+ ### FLAPPY_GROUND_GRID_TARGET_VERTICAL_SEGMENT_HEIGHT_PX
393
401
 
394
- ### FLAPPY_GROUND_GRID_MAX_ALPHA
402
+ Target screen-space height for one vertical-ray style segment (pixels).
395
403
 
396
- Maximum alpha used by the nearest depth and perspective lines.
404
+ Segmenting the rays lets the renderer vary alpha, thickness, and blur by
405
+ depth rather than drawing each ray with one flat style.
397
406
 
398
- ### FLAPPY_GROUND_GRID_MAX_BLUR_PX
407
+ ### FLAPPY_GROUND_GRID_UNSIGNED_NORMALIZATION_DIVISOR
399
408
 
400
- Blur radius used by the farthest depth lines near the horizon.
409
+ Normalization divisor used for deterministic pulse hash generation.
401
410
 
402
- ### FLAPPY_GROUND_GRID_MIN_BLUR_PX
411
+ The pulse selection helpers convert unsigned integer hashes into stable
412
+ floating-point picks in the unit interval.
403
413
 
404
- Blur radius used by the nearest depth lines at the bottom edge.
414
+ ### FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT
405
415
 
406
- ### FLAPPY_GROUND_GRID_MIN_THICKNESS_PX
416
+ Extra off-screen perspective rays drawn for seamless wrap.
407
417
 
408
- Minimum stroke width used by far depth lines.
418
+ Overflow rays prevent the parallax cycle from exposing empty gaps when the
419
+ wrapped scroll offset lands near a lane boundary.
409
420
 
410
- ### FLAPPY_GROUND_GRID_MAX_THICKNESS_PX
421
+ ### FLAPPY_GROUND_GRID_VERTICAL_PULSE_END_RATIO
411
422
 
412
- Maximum stroke width used by near depth lines.
423
+ Latest progress ratio allowed for vertical pulse travel.
413
424
 
414
- ### FLAPPY_GROUND_GRID_FOG_HEIGHT_RATIO
425
+ Ending early keeps the pulse out of the extreme foreground, where its square
426
+ would become too large and visually heavy.
415
427
 
416
- Height ratio reserved for the subtle lower-band neon fog wash.
428
+ ### FLAPPY_GROUND_GRID_VERTICAL_PULSE_START_RATIO
417
429
 
418
- The fog sits in the lower portion of the band so it enriches the foreground
419
- without muting the crisp horizon seam.
430
+ Earliest progress ratio allowed for vertical pulse travel.
420
431
 
421
- ### FLAPPY_GROUND_GRID_FOG_ALPHA
432
+ Vertical pulses start a little away from the horizon so they are visible as
433
+ distinct squares instead of immediately disappearing into compressed depth.
422
434
 
423
- Peak opacity used by the lower-band neon fog wash.
435
+ ## browser-entry/playback/background/ground-grid/playback.background.ground-grid.services.ts
424
436
 
425
- The fog should tint the band, not obscure the line geometry, so the opacity
426
- is intentionally modest.
437
+ ### drawGroundGridFog
427
438
 
428
- ### FLAPPY_BACKGROUND_GROUND_GRID_STYLE
439
+ ```ts
440
+ drawGroundGridFog(
441
+ context: CanvasRenderingContext2D,
442
+ resolvedScene: PlaybackBackgroundGroundGridResolvedScene,
443
+ ): void
444
+ ```
429
445
 
430
- Frozen neon style bundle reused by the playback ground-grid renderer.
446
+ Draws the lower-band atmospheric wash behind the neon line work.
431
447
 
432
- The values stay theme-owned but are materialized once so the renderer does
433
- not allocate a new style object during every frame.
448
+ Parameters:
449
+ - `context` - - Canvas 2D drawing context.
450
+ - `resolvedScene` - - Geometry and style for the current viewport.
434
451
 
435
- ## browser-entry/playback/background/ground-grid/playback.background.ground-grid.services.ts
452
+ Returns: Nothing.
436
453
 
437
- ### drawPlaybackGroundGrid
454
+ ### drawGroundGridPulse
438
455
 
439
456
  ```ts
440
- drawPlaybackGroundGrid(
457
+ drawGroundGridPulse(
441
458
  context: CanvasRenderingContext2D,
442
- resolvedScene: PlaybackBackgroundGroundGridResolvedScene,
443
- geometry: PlaybackGroundGridGeometry,
459
+ pulse: PlaybackGroundGridPulse | null,
460
+ fillColor: string,
444
461
  ): void
445
462
  ```
446
463
 
447
- Draws the resolved neon ground grid inside the lower background band.
464
+ Draws one pulse square above the grid lines and below gameplay entities.
448
465
 
449
466
  Parameters:
450
467
  - `context` - - Canvas 2D drawing context.
451
- - `resolvedScene` - - Geometry and style for the current viewport.
452
- - `geometry` - - Precomputed horizontal and vertical line segments.
468
+ - `pulse` - - Visible pulse square for the current frame.
469
+ - `fillColor` - - Core neon fill color.
453
470
 
454
471
  Returns: Nothing.
455
472
 
@@ -489,39 +506,22 @@ Parameters:
489
506
 
490
507
  Returns: Nothing.
491
508
 
492
- ### drawGroundGridFog
509
+ ### drawPlaybackGroundGrid
493
510
 
494
511
  ```ts
495
- drawGroundGridFog(
512
+ drawPlaybackGroundGrid(
496
513
  context: CanvasRenderingContext2D,
497
514
  resolvedScene: PlaybackBackgroundGroundGridResolvedScene,
515
+ geometry: PlaybackGroundGridGeometry,
498
516
  ): void
499
517
  ```
500
518
 
501
- Draws the lower-band atmospheric wash behind the neon line work.
519
+ Draws the resolved neon ground grid inside the lower background band.
502
520
 
503
521
  Parameters:
504
522
  - `context` - - Canvas 2D drawing context.
505
523
  - `resolvedScene` - - Geometry and style for the current viewport.
506
-
507
- Returns: Nothing.
508
-
509
- ### drawGroundGridPulse
510
-
511
- ```ts
512
- drawGroundGridPulse(
513
- context: CanvasRenderingContext2D,
514
- pulse: PlaybackGroundGridPulse | null,
515
- fillColor: string,
516
- ): void
517
- ```
518
-
519
- Draws one pulse square above the grid lines and below gameplay entities.
520
-
521
- Parameters:
522
- - `context` - - Canvas 2D drawing context.
523
- - `pulse` - - Visible pulse square for the current frame.
524
- - `fillColor` - - Core neon fill color.
524
+ - `geometry` - - Precomputed horizontal and vertical line segments.
525
525
 
526
526
  Returns: Nothing.
527
527
 
@@ -598,54 +598,28 @@ page resize invalidates every cached geometry variant and fog gradient.
598
598
  Parameters:
599
599
  - `sceneContext` - - Current lower-band scene geometry.
600
600
 
601
- Returns: Stable viewport-size cache key for the current frame.
602
-
603
- ### resolveGroundGridViewportCacheKey
604
-
605
- ```ts
606
- resolveGroundGridViewportCacheKey(
607
- sceneContext: PlaybackBackgroundGroundGridSceneContext,
608
- ): string
609
- ```
610
-
611
- Resolves the viewport-size cache key used by the ground-grid caches.
612
-
613
- Parameters:
614
- - `sceneContext` - - Current lower-band scene geometry.
615
-
616
- Returns: Cache key that changes whenever the page size changes.
617
-
618
- ### resolveGroundGridSceneCacheKey
619
-
620
- ```ts
621
- resolveGroundGridSceneCacheKey(
622
- sceneContext: PlaybackBackgroundGroundGridSceneContext,
623
- ): string
624
- ```
625
-
626
- Resolves the stable local-scene cache key for ground-grid geometry.
627
-
628
- Parameters:
629
- - `sceneContext` - - Current lower-band scene geometry.
630
-
631
- Returns: Scene key suitable for static horizontal and vertical cache entries.
601
+ Returns: Stable viewport-size cache key for the current frame.
632
602
 
633
- ### resolveGroundGridVerticalCycleCacheKey
603
+ ### resolveCachedGroundGridFogGradient
634
604
 
635
605
  ```ts
636
- resolveGroundGridVerticalCycleCacheKey(
606
+ resolveCachedGroundGridFogGradient(
607
+ context: CanvasRenderingContext2D,
637
608
  sceneCacheKey: string,
638
- wrappedOffsetPx: number,
639
- ): string
609
+ sceneContext: PlaybackBackgroundGroundGridSceneContext,
610
+ fogColor: string,
611
+ ): CanvasGradient
640
612
  ```
641
613
 
642
- Resolves the cache key for one wrapped vertical-geometry cycle.
614
+ Resolves a cached fog gradient for one canvas and local scene.
643
615
 
644
616
  Parameters:
617
+ - `context` - - Canvas 2D drawing context.
645
618
  - `sceneCacheKey` - - Stable scene key for the active viewport.
646
- - `wrappedOffsetPx` - - Wrapped offset within one lane cycle.
619
+ - `sceneContext` - - Current lower-band scene geometry.
620
+ - `fogColor` - - Theme-owned fog color token.
647
621
 
648
- Returns: Cycle key used for vertical geometry reuse.
622
+ Returns: Cached fog gradient aligned to the lower-band scene.
649
623
 
650
624
  ### resolveCachedGroundGridHorizontalGeometry
651
625
 
@@ -664,6 +638,23 @@ Parameters:
664
638
 
665
639
  Returns: Cached horizontal geometry bundle for the scene.
666
640
 
641
+ ### resolveCachedGroundGridVerticalGeometry
642
+
643
+ ```ts
644
+ resolveCachedGroundGridVerticalGeometry(
645
+ cycleCacheKey: string,
646
+ factory: PlaybackGroundGridVerticalGeometryFactory,
647
+ ): PlaybackGroundGridVerticalGeometry
648
+ ```
649
+
650
+ Resolves cached vertical geometry for one scene and wrapped offset cycle.
651
+
652
+ Parameters:
653
+ - `cycleCacheKey` - - Scene-and-offset cache key for the active frame.
654
+ - `factory` - - Lazy geometry builder used when the cache misses.
655
+
656
+ Returns: Cached vertical geometry bundle for the cycle.
657
+
667
658
  ### resolveCachedGroundGridVerticalSceneMetrics
668
659
 
669
660
  ```ts
@@ -681,79 +672,88 @@ Parameters:
681
672
 
682
673
  Returns: Cached vertical scene metrics for the scene.
683
674
 
684
- ### resolveCachedGroundGridVerticalGeometry
675
+ ### resolveGroundGridSceneCacheKey
685
676
 
686
677
  ```ts
687
- resolveCachedGroundGridVerticalGeometry(
688
- cycleCacheKey: string,
689
- factory: PlaybackGroundGridVerticalGeometryFactory,
690
- ): PlaybackGroundGridVerticalGeometry
678
+ resolveGroundGridSceneCacheKey(
679
+ sceneContext: PlaybackBackgroundGroundGridSceneContext,
680
+ ): string
691
681
  ```
692
682
 
693
- Resolves cached vertical geometry for one scene and wrapped offset cycle.
683
+ Resolves the stable local-scene cache key for ground-grid geometry.
694
684
 
695
685
  Parameters:
696
- - `cycleCacheKey` - - Scene-and-offset cache key for the active frame.
697
- - `factory` - - Lazy geometry builder used when the cache misses.
686
+ - `sceneContext` - - Current lower-band scene geometry.
698
687
 
699
- Returns: Cached vertical geometry bundle for the cycle.
688
+ Returns: Scene key suitable for static horizontal and vertical cache entries.
700
689
 
701
- ### resolveCachedGroundGridFogGradient
690
+ ### resolveGroundGridVerticalCycleCacheKey
702
691
 
703
692
  ```ts
704
- resolveCachedGroundGridFogGradient(
705
- context: CanvasRenderingContext2D,
693
+ resolveGroundGridVerticalCycleCacheKey(
706
694
  sceneCacheKey: string,
707
- sceneContext: PlaybackBackgroundGroundGridSceneContext,
708
- fogColor: string,
709
- ): CanvasGradient
695
+ wrappedOffsetPx: number,
696
+ ): string
710
697
  ```
711
698
 
712
- Resolves a cached fog gradient for one canvas and local scene.
699
+ Resolves the cache key for one wrapped vertical-geometry cycle.
713
700
 
714
701
  Parameters:
715
- - `context` - - Canvas 2D drawing context.
716
702
  - `sceneCacheKey` - - Stable scene key for the active viewport.
703
+ - `wrappedOffsetPx` - - Wrapped offset within one lane cycle.
704
+
705
+ Returns: Cycle key used for vertical geometry reuse.
706
+
707
+ ### resolveGroundGridViewportCacheKey
708
+
709
+ ```ts
710
+ resolveGroundGridViewportCacheKey(
711
+ sceneContext: PlaybackBackgroundGroundGridSceneContext,
712
+ ): string
713
+ ```
714
+
715
+ Resolves the viewport-size cache key used by the ground-grid caches.
716
+
717
+ Parameters:
717
718
  - `sceneContext` - - Current lower-band scene geometry.
718
- - `fogColor` - - Theme-owned fog color token.
719
719
 
720
- Returns: Cached fog gradient aligned to the lower-band scene.
720
+ Returns: Cache key that changes whenever the page size changes.
721
721
 
722
722
  ## browser-entry/playback/background/ground-grid/playback.background.ground-grid.batch.services.ts
723
723
 
724
- ### drawGroundGridSegmentBatches
724
+ ### drawGroundGridSegmentBatch
725
725
 
726
726
  ```ts
727
- drawGroundGridSegmentBatches(
727
+ drawGroundGridSegmentBatch(
728
728
  context: CanvasRenderingContext2D,
729
- batches: readonly PlaybackGroundGridSegmentBatch[],
730
- lineColor: string,
729
+ batch: PlaybackGroundGridSegmentBatch,
731
730
  ): void
732
731
  ```
733
732
 
734
- Draws one ordered collection of neon segment batches.
733
+ Draws one batch of neon line segments that share one render style.
735
734
 
736
735
  Parameters:
737
736
  - `context` - - Canvas 2D drawing context.
738
- - `batches` - - Ordered line-segment batches to render.
739
- - `lineColor` - - Core neon stroke color.
737
+ - `batch` - - Ordered line-segment batch that shares one render style.
740
738
 
741
739
  Returns: Nothing.
742
740
 
743
- ### drawGroundGridSegmentBatch
741
+ ### drawGroundGridSegmentBatches
744
742
 
745
743
  ```ts
746
- drawGroundGridSegmentBatch(
744
+ drawGroundGridSegmentBatches(
747
745
  context: CanvasRenderingContext2D,
748
- batch: PlaybackGroundGridSegmentBatch,
746
+ batches: readonly PlaybackGroundGridSegmentBatch[],
747
+ lineColor: string,
749
748
  ): void
750
749
  ```
751
750
 
752
- Draws one batch of neon line segments that share one render style.
751
+ Draws one ordered collection of neon segment batches.
753
752
 
754
753
  Parameters:
755
754
  - `context` - - Canvas 2D drawing context.
756
- - `batch` - - Ordered line-segment batch that shares one render style.
755
+ - `batches` - - Ordered line-segment batches to render.
756
+ - `lineColor` - - Core neon stroke color.
757
757
 
758
758
  Returns: Nothing.
759
759
 
@@ -812,35 +812,35 @@ Parameters:
812
812
 
813
813
  Returns: Ordered style batches that can be stroked with fewer state changes.
814
814
 
815
- ### resolvePlaybackGroundGridPreferredHorizontalPulsePaths
815
+ ### resolvePlaybackGroundGridBatchPath
816
816
 
817
817
  ```ts
818
- resolvePlaybackGroundGridPreferredHorizontalPulsePaths(
819
- horizontalLines: readonly PlaybackGroundGridLineSegment[],
820
- ): readonly PlaybackGroundGridPulsePath[]
818
+ resolvePlaybackGroundGridBatchPath(
819
+ segments: readonly PlaybackGroundGridLineSegment[],
820
+ ): Path2D | null
821
821
  ```
822
822
 
823
- Prefers the nearer, thicker horizontal tracks when picking a pulse lane.
823
+ Resolves one cached draw-ready path for a grouped segment batch.
824
824
 
825
825
  Parameters:
826
- - `horizontalLines` - - Visible horizontal grid bands.
826
+ - `segments` - - Ordered line segments that belong to one style batch.
827
827
 
828
- Returns: Pulse-eligible horizontal paths biased toward the foreground.
828
+ Returns: Cached Path2D when available, otherwise null.
829
829
 
830
- ### resolvePlaybackGroundGridBatchPath
830
+ ### resolvePlaybackGroundGridPreferredHorizontalPulsePaths
831
831
 
832
832
  ```ts
833
- resolvePlaybackGroundGridBatchPath(
834
- segments: readonly PlaybackGroundGridLineSegment[],
835
- ): Path2D | null
833
+ resolvePlaybackGroundGridPreferredHorizontalPulsePaths(
834
+ horizontalLines: readonly PlaybackGroundGridLineSegment[],
835
+ ): readonly PlaybackGroundGridPulsePath[]
836
836
  ```
837
837
 
838
- Resolves one cached draw-ready path for a grouped segment batch.
838
+ Prefers the nearer, thicker horizontal tracks when picking a pulse lane.
839
839
 
840
840
  Parameters:
841
- - `segments` - - Ordered line segments that belong to one style batch.
841
+ - `horizontalLines` - - Visible horizontal grid bands.
842
842
 
843
- Returns: Cached Path2D when available, otherwise null.
843
+ Returns: Pulse-eligible horizontal paths biased toward the foreground.
844
844
 
845
845
  ## browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.ts
846
846
 
@@ -859,40 +859,6 @@ Parameters:
859
859
 
860
860
  Returns: Stable anchor bounds and lane spacing for vertical-ray reuse.
861
861
 
862
- ### resolvePlaybackGroundGridVerticalCycleContext
863
-
864
- ```ts
865
- resolvePlaybackGroundGridVerticalCycleContext(
866
- safeLaneSpacingPx: number,
867
- lowerBandBottomYPx: number,
868
- scrollBasePx: number,
869
- ): PlaybackGroundGridVerticalCycleContext
870
- ```
871
-
872
- Resolves the wrapped vertical-geometry cycle for the current scroll value.
873
-
874
- Parameters:
875
- - `safeLaneSpacingPx` - - Stable lane spacing used by current viewport metrics.
876
- - `lowerBandBottomYPx` - - Lower edge of the visible ground-grid band.
877
- - `scrollBasePx` - - Shared world scroll used for parallax motion.
878
-
879
- Returns: Quantized wrapped offset and safe lane spacing for cache lookups.
880
-
881
- ### resolvePlaybackGroundGridAnchorBounds
882
-
883
- ```ts
884
- resolvePlaybackGroundGridAnchorBounds(
885
- input: PlaybackGroundGridAnchorBoundsInput,
886
- ): PlaybackGroundGridAnchorBounds
887
- ```
888
-
889
- Projects one visible horizontal span back onto the floor anchor line.
890
-
891
- Parameters:
892
- - `input` - - Visible span bounds and scene geometry.
893
-
894
- Returns: Bottom-anchor bounds required to cover the chosen projected span.
895
-
896
862
  ### isPlaybackGroundGridVerticalPulsePathVisible
897
863
 
898
864
  ```ts
@@ -925,6 +891,21 @@ Parameters:
925
891
 
926
892
  Returns: Bottom anchor x-position whose ray reaches the projected point.
927
893
 
894
+ ### resolvePlaybackGroundGridAnchorBounds
895
+
896
+ ```ts
897
+ resolvePlaybackGroundGridAnchorBounds(
898
+ input: PlaybackGroundGridAnchorBoundsInput,
899
+ ): PlaybackGroundGridAnchorBounds
900
+ ```
901
+
902
+ Projects one visible horizontal span back onto the floor anchor line.
903
+
904
+ Parameters:
905
+ - `input` - - Visible span bounds and scene geometry.
906
+
907
+ Returns: Bottom-anchor bounds required to cover the chosen projected span.
908
+
928
909
  ### resolvePlaybackGroundGridRetainedWidthRatioAtYPx
929
910
 
930
911
  ```ts
@@ -948,7 +929,79 @@ Parameters:
948
929
 
949
930
  Returns: Width-retention ratio in the inclusive `[0, 1]` range.
950
931
 
951
- ## browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.utils.ts
932
+ ### resolvePlaybackGroundGridVerticalCycleContext
933
+
934
+ ```ts
935
+ resolvePlaybackGroundGridVerticalCycleContext(
936
+ safeLaneSpacingPx: number,
937
+ lowerBandBottomYPx: number,
938
+ scrollBasePx: number,
939
+ ): PlaybackGroundGridVerticalCycleContext
940
+ ```
941
+
942
+ Resolves the wrapped vertical-geometry cycle for the current scroll value.
943
+
944
+ Parameters:
945
+ - `safeLaneSpacingPx` - - Stable lane spacing used by current viewport metrics.
946
+ - `lowerBandBottomYPx` - - Lower edge of the visible ground-grid band.
947
+ - `scrollBasePx` - - Shared world scroll used for parallax motion.
948
+
949
+ Returns: Quantized wrapped offset and safe lane spacing for cache lookups.
950
+
951
+ ## browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.utils.ts
952
+
953
+ ### appendPlaybackGroundGridVerticalLineSegments
954
+
955
+ ```ts
956
+ appendPlaybackGroundGridVerticalLineSegments(
957
+ targetSegments: PlaybackGroundGridLineSegment[],
958
+ startIndex: number,
959
+ input: PlaybackGroundGridVerticalRayInput,
960
+ ): number
961
+ ```
962
+
963
+ Appends tapered style segments for one perspective ray.
964
+
965
+ Parameters:
966
+ - `targetSegments` - - Target line-segment buffer.
967
+ - `startIndex` - - Current insertion index within the target buffer.
968
+ - `input` - - Geometry and depth context for one ray.
969
+
970
+ Returns: Next insertion index after all ray segments have been written.
971
+
972
+ ### buildPlaybackGroundGridHorizontalGeometry
973
+
974
+ ```ts
975
+ buildPlaybackGroundGridHorizontalGeometry(
976
+ sceneContext: PlaybackBackgroundGroundGridSceneContext,
977
+ ): PlaybackGroundGridHorizontalGeometry
978
+ ```
979
+
980
+ Builds the screen-horizontal depth bands for the lower neon plane.
981
+
982
+ Parameters:
983
+ - `sceneContext` - - Lower-band geometry for the current viewport.
984
+
985
+ Returns: Ordered far-to-near line segments and pulse subsets.
986
+
987
+ ### buildPlaybackGroundGridVerticalGeometry
988
+
989
+ ```ts
990
+ buildPlaybackGroundGridVerticalGeometry(
991
+ sceneContext: PlaybackBackgroundGroundGridSceneContext,
992
+ verticalSceneMetrics: PlaybackGroundGridVerticalSceneMetrics,
993
+ wrappedOffsetPx: number,
994
+ ): PlaybackGroundGridVerticalGeometry
995
+ ```
996
+
997
+ Builds the perspective rays that converge to the centered horizon point.
998
+
999
+ Parameters:
1000
+ - `sceneContext` - - Lower-band geometry for the current viewport.
1001
+ - `safeLaneSpacingPx` - - Stable lane spacing used for ray anchors.
1002
+ - `wrappedOffsetPx` - - Wrapped offset used for cache reuse and ray placement.
1003
+
1004
+ Returns: Wrapped left-to-right perspective rays and pulse subsets.
952
1005
 
953
1006
  ### resolvePlaybackGroundGridHorizontalGeometry
954
1007
 
@@ -982,75 +1035,70 @@ Parameters:
982
1035
 
983
1036
  Returns: Wrapped left-to-right perspective rays and pulse subsets.
984
1037
 
985
- ### buildPlaybackGroundGridHorizontalGeometry
1038
+ ## browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.ts
1039
+
1040
+ ### interpolatePlaybackGroundGridPoint
986
1041
 
987
1042
  ```ts
988
- buildPlaybackGroundGridHorizontalGeometry(
989
- sceneContext: PlaybackBackgroundGroundGridSceneContext,
990
- ): PlaybackGroundGridHorizontalGeometry
1043
+ interpolatePlaybackGroundGridPoint(
1044
+ startXPx: number,
1045
+ startYPx: number,
1046
+ endXPx: number,
1047
+ endYPx: number,
1048
+ interpolationRatio: number,
1049
+ ): PlaybackGroundGridPoint
991
1050
  ```
992
1051
 
993
- Builds the screen-horizontal depth bands for the lower neon plane.
1052
+ Interpolates one point along a perspective ray.
994
1053
 
995
1054
  Parameters:
996
- - `sceneContext` - - Lower-band geometry for the current viewport.
997
-
998
- Returns: Ordered far-to-near line segments and pulse subsets.
1055
+ - `startXPx` - - Bottom anchor x-position.
1056
+ - `startYPx` - - Bottom anchor y-position.
1057
+ - `endXPx` - - Vanishing-point x-position.
1058
+ - `endYPx` - - Vanishing-point y-position.
1059
+ - `interpolationRatio` - - Normalized 0..1 position along the ray.
999
1060
 
1000
- ### buildPlaybackGroundGridVerticalGeometry
1061
+ Returns: Interpolated point on the perspective ray.
1001
1062
 
1002
- ```ts
1003
- buildPlaybackGroundGridVerticalGeometry(
1004
- sceneContext: PlaybackBackgroundGroundGridSceneContext,
1005
- verticalSceneMetrics: PlaybackGroundGridVerticalSceneMetrics,
1006
- wrappedOffsetPx: number,
1007
- ): PlaybackGroundGridVerticalGeometry
1008
- ```
1063
+ ### PlaybackGroundGridPipeConnectionProfile
1009
1064
 
1010
- Builds the perspective rays that converge to the centered horizon point.
1065
+ Shared pipe-floor projection resolved from the lower ground-grid geometry.
1011
1066
 
1012
- Parameters:
1013
- - `sceneContext` - - Lower-band geometry for the current viewport.
1014
- - `safeLaneSpacingPx` - - Stable lane spacing used for ray anchors.
1015
- - `wrappedOffsetPx` - - Wrapped offset used for cache reuse and ray placement.
1067
+ ### PlaybackGroundGridPoint
1016
1068
 
1017
- Returns: Wrapped left-to-right perspective rays and pulse subsets.
1069
+ Small point value used when interpolating positions along one grid ray.
1018
1070
 
1019
- ### appendPlaybackGroundGridVerticalLineSegments
1071
+ ### resolvePlaybackGroundGridDepthCurve
1020
1072
 
1021
1073
  ```ts
1022
- appendPlaybackGroundGridVerticalLineSegments(
1023
- targetSegments: PlaybackGroundGridLineSegment[],
1024
- startIndex: number,
1025
- input: PlaybackGroundGridVerticalRayInput,
1074
+ resolvePlaybackGroundGridDepthCurve(
1075
+ depthRatio: number,
1026
1076
  ): number
1027
1077
  ```
1028
1078
 
1029
- Appends tapered style segments for one perspective ray.
1079
+ Maps a normalized depth ratio into a stronger synthwave spacing curve.
1030
1080
 
1031
1081
  Parameters:
1032
- - `targetSegments` - - Target line-segment buffer.
1033
- - `startIndex` - - Current insertion index within the target buffer.
1034
- - `input` - - Geometry and depth context for one ray.
1035
-
1036
- Returns: Next insertion index after all ray segments have been written.
1082
+ - `depthRatio` - - Normalized 0..1 depth where 0 is far and 1 is near.
1037
1083
 
1038
- ## browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.ts
1084
+ Returns: Curved depth ratio used for line placement and styling.
1039
1085
 
1040
- ### resolvePlaybackGroundGridDepthCurve
1086
+ ### resolvePlaybackGroundGridDepthFromHorizonDistance
1041
1087
 
1042
1088
  ```ts
1043
- resolvePlaybackGroundGridDepthCurve(
1044
- depthRatio: number,
1089
+ resolvePlaybackGroundGridDepthFromHorizonDistance(
1090
+ distanceToHorizonPx: number,
1091
+ maximumDistanceToHorizonPx: number,
1045
1092
  ): number
1046
1093
  ```
1047
1094
 
1048
- Maps a normalized depth ratio into a stronger synthwave spacing curve.
1095
+ Resolves normalized depth from a vertical distance away from the horizon.
1049
1096
 
1050
1097
  Parameters:
1051
- - `depthRatio` - - Normalized 0..1 depth where 0 is far and 1 is near.
1098
+ - `distanceToHorizonPx` - - Vertical distance from the vanishing horizon.
1099
+ - `maximumDistanceToHorizonPx` - - Largest visible vertical horizon distance.
1052
1100
 
1053
- Returns: Curved depth ratio used for line placement and styling.
1101
+ Returns: Normalized 0..1 depth where 0 is at the horizon and 1 is nearest.
1054
1102
 
1055
1103
  ### resolvePlaybackGroundGridLineAlpha
1056
1104
 
@@ -1097,23 +1145,6 @@ Parameters:
1097
1145
 
1098
1146
  Returns: Stroke width in pixels.
1099
1147
 
1100
- ### resolvePlaybackGroundGridDepthFromHorizonDistance
1101
-
1102
- ```ts
1103
- resolvePlaybackGroundGridDepthFromHorizonDistance(
1104
- distanceToHorizonPx: number,
1105
- maximumDistanceToHorizonPx: number,
1106
- ): number
1107
- ```
1108
-
1109
- Resolves normalized depth from a vertical distance away from the horizon.
1110
-
1111
- Parameters:
1112
- - `distanceToHorizonPx` - - Vertical distance from the vanishing horizon.
1113
- - `maximumDistanceToHorizonPx` - - Largest visible vertical horizon distance.
1114
-
1115
- Returns: Normalized 0..1 depth where 0 is at the horizon and 1 is nearest.
1116
-
1117
1148
  ### resolvePlaybackGroundGridPipeConnectionProfile
1118
1149
 
1119
1150
  ```ts
@@ -1134,38 +1165,39 @@ Parameters:
1134
1165
 
1135
1166
  Returns: Pipe-floor y-position plus the matching vertical-ray scroll ratio.
1136
1167
 
1137
- ### interpolatePlaybackGroundGridPoint
1168
+ ## browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.selection.utils.ts
1169
+
1170
+ ### rememberPlaybackGroundGridVerticalPulseSelection
1138
1171
 
1139
1172
  ```ts
1140
- interpolatePlaybackGroundGridPoint(
1141
- startXPx: number,
1142
- startYPx: number,
1143
- endXPx: number,
1144
- endYPx: number,
1145
- interpolationRatio: number,
1146
- ): PlaybackGroundGridPoint
1173
+ rememberPlaybackGroundGridVerticalPulseSelection(
1174
+ pulseSlotIndex: number,
1175
+ continuationState: PlaybackGroundGridVerticalPulseContinuationState,
1176
+ ): void
1147
1177
  ```
1148
1178
 
1149
- Interpolates one point along a perspective ray.
1179
+ Stores the resolved pulse center for continuation on the next frame.
1150
1180
 
1151
1181
  Parameters:
1152
- - `startXPx` - - Bottom anchor x-position.
1153
- - `startYPx` - - Bottom anchor y-position.
1154
- - `endXPx` - - Vanishing-point x-position.
1155
- - `endYPx` - - Vanishing-point y-position.
1156
- - `interpolationRatio` - - Normalized 0..1 position along the ray.
1182
+ - `pulseSlotIndex` - - Zero-based pulse slot index.
1183
+ - `continuationState` - - Latest visible pulse position for the slot.
1157
1184
 
1158
- Returns: Interpolated point on the perspective ray.
1185
+ Returns: Nothing.
1159
1186
 
1160
- ### PlaybackGroundGridPoint
1187
+ ### resolveContinuedVerticalPulsePath
1161
1188
 
1162
- Small point value used when interpolating positions along one grid ray.
1189
+ ```ts
1190
+ resolveContinuedVerticalPulsePath(
1191
+ input: { candidatePulsePaths: readonly PlaybackGroundGridPulsePath[]; pulseSlotIndex: number; frameIndex: number; travelProgressRatio: number; },
1192
+ ): PlaybackGroundGridPulsePath | null
1193
+ ```
1163
1194
 
1164
- ### PlaybackGroundGridPipeConnectionProfile
1195
+ Resolves the nearest continued vertical pulse path for an active slot.
1165
1196
 
1166
- Shared pipe-floor projection resolved from the lower ground-grid geometry.
1197
+ Parameters:
1198
+ - `input` - - Continuation input for the current frame.
1167
1199
 
1168
- ## browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.selection.utils.ts
1200
+ Returns: Continued pulse path when one can be matched, otherwise null.
1169
1201
 
1170
1202
  ### resolvePlaybackGroundGridVerticalPulseSelection
1171
1203
 
@@ -1192,37 +1224,22 @@ Parameters:
1192
1224
 
1193
1225
  Returns: Vertical pulse path, or null when none are available.
1194
1226
 
1195
- ### rememberPlaybackGroundGridVerticalPulseSelection
1196
-
1197
- ```ts
1198
- rememberPlaybackGroundGridVerticalPulseSelection(
1199
- pulseSlotIndex: number,
1200
- continuationState: PlaybackGroundGridVerticalPulseContinuationState,
1201
- ): void
1202
- ```
1203
-
1204
- Stores the resolved pulse center for continuation on the next frame.
1205
-
1206
- Parameters:
1207
- - `pulseSlotIndex` - - Zero-based pulse slot index.
1208
- - `continuationState` - - Latest visible pulse position for the slot.
1209
-
1210
- Returns: Nothing.
1211
-
1212
- ### resolveContinuedVerticalPulsePath
1227
+ ### resolveStableVerticalPulsePathCandidates
1213
1228
 
1214
1229
  ```ts
1215
- resolveContinuedVerticalPulsePath(
1216
- input: { candidatePulsePaths: readonly PlaybackGroundGridPulsePath[]; pulseSlotIndex: number; frameIndex: number; travelProgressRatio: number; },
1217
- ): PlaybackGroundGridPulsePath | null
1230
+ resolveStableVerticalPulsePathCandidates(
1231
+ verticalPulsePaths: readonly PlaybackGroundGridPulsePath[],
1232
+ visibleVerticalPulsePaths: readonly PlaybackGroundGridPulsePath[],
1233
+ ): readonly PlaybackGroundGridPulsePath[]
1218
1234
  ```
1219
1235
 
1220
- Resolves the nearest continued vertical pulse path for an active slot.
1236
+ Resolves a stable vertical pulse-candidate set for one frame.
1221
1237
 
1222
1238
  Parameters:
1223
- - `input` - - Continuation input for the current frame.
1239
+ - `verticalPulsePaths` - - Full vertical ray paths for the current frame.
1240
+ - `visibleVerticalPulsePaths` - - Midpoint-visible subset used as fallback.
1224
1241
 
1225
- Returns: Continued pulse path when one can be matched, otherwise null.
1242
+ Returns: Stable candidate set for deterministic vertical pulse selection.
1226
1243
 
1227
1244
  ### trimCachedVerticalPulseContinuationState
1228
1245
 
@@ -1239,39 +1256,24 @@ Parameters:
1239
1256
 
1240
1257
  Returns: Nothing.
1241
1258
 
1242
- ### resolveStableVerticalPulsePathCandidates
1243
-
1244
- ```ts
1245
- resolveStableVerticalPulsePathCandidates(
1246
- verticalPulsePaths: readonly PlaybackGroundGridPulsePath[],
1247
- visibleVerticalPulsePaths: readonly PlaybackGroundGridPulsePath[],
1248
- ): readonly PlaybackGroundGridPulsePath[]
1249
- ```
1250
-
1251
- Resolves a stable vertical pulse-candidate set for one frame.
1252
-
1253
- Parameters:
1254
- - `verticalPulsePaths` - - Full vertical ray paths for the current frame.
1255
- - `visibleVerticalPulsePaths` - - Midpoint-visible subset used as fallback.
1256
-
1257
- Returns: Stable candidate set for deterministic vertical pulse selection.
1258
-
1259
1259
  ## browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.timing.utils.ts
1260
1260
 
1261
- ### resolvePlaybackGroundGridPulseTiming
1261
+ ### resolvePlaybackGroundGridHorizontalPulsePath
1262
1262
 
1263
1263
  ```ts
1264
- resolvePlaybackGroundGridPulseTiming(
1265
- frameIndex: number,
1266
- ): PlaybackGroundGridPulseTimingState | null
1264
+ resolvePlaybackGroundGridHorizontalPulsePath(
1265
+ horizontalPulsePaths: readonly PlaybackGroundGridPulsePath[],
1266
+ pulseSlotIndex: number,
1267
+ ): PlaybackGroundGridPulsePath | null
1267
1268
  ```
1268
1269
 
1269
- Resolves timing state for the currently active deterministic pulse slot.
1270
+ Selects one thick-enough horizontal band for the current pulse slot.
1270
1271
 
1271
1272
  Parameters:
1272
- - `frameIndex` - - Current deterministic playback frame index.
1273
+ - `horizontalPulsePaths` - - Cached horizontal pulse paths eligible for travel.
1274
+ - `pulseSlotIndex` - - Zero-based pulse slot index.
1273
1275
 
1274
- Returns: Pulse timing state, or null when no pulse is active in this frame.
1276
+ Returns: Horizontal pulse path, or null when none are suitable.
1275
1277
 
1276
1278
  ### resolvePlaybackGroundGridPulseOrientation
1277
1279
 
@@ -1288,22 +1290,20 @@ Parameters:
1288
1290
 
1289
1291
  Returns: Horizontal or vertical pulse travel orientation.
1290
1292
 
1291
- ### resolvePlaybackGroundGridHorizontalPulsePath
1293
+ ### resolvePlaybackGroundGridPulseTiming
1292
1294
 
1293
1295
  ```ts
1294
- resolvePlaybackGroundGridHorizontalPulsePath(
1295
- horizontalPulsePaths: readonly PlaybackGroundGridPulsePath[],
1296
- pulseSlotIndex: number,
1297
- ): PlaybackGroundGridPulsePath | null
1296
+ resolvePlaybackGroundGridPulseTiming(
1297
+ frameIndex: number,
1298
+ ): PlaybackGroundGridPulseTimingState | null
1298
1299
  ```
1299
1300
 
1300
- Selects one thick-enough horizontal band for the current pulse slot.
1301
+ Resolves timing state for the currently active deterministic pulse slot.
1301
1302
 
1302
1303
  Parameters:
1303
- - `horizontalPulsePaths` - - Cached horizontal pulse paths eligible for travel.
1304
- - `pulseSlotIndex` - - Zero-based pulse slot index.
1304
+ - `frameIndex` - - Current deterministic playback frame index.
1305
1305
 
1306
- Returns: Horizontal pulse path, or null when none are suitable.
1306
+ Returns: Pulse timing state, or null when no pulse is active in this frame.
1307
1307
 
1308
1308
  ### resolvePlaybackGroundGridPulseTravelRatio
1309
1309
 
@@ -1426,6 +1426,25 @@ Parameters:
1426
1426
 
1427
1427
  Returns: Normalized 0..1 depth where 0 is at the horizon and 1 is nearest.
1428
1428
 
1429
+ ### resolvePlaybackGroundGridGeometry
1430
+
1431
+ ```ts
1432
+ resolvePlaybackGroundGridGeometry(
1433
+ sceneContext: PlaybackBackgroundGroundGridSceneContext,
1434
+ frameIndex: number,
1435
+ scrollBasePx: number,
1436
+ ): PlaybackGroundGridGeometry
1437
+ ```
1438
+
1439
+ Builds the line geometry for the neon ground grid.
1440
+
1441
+ Parameters:
1442
+ - `sceneContext` - - Lower-band geometry for the current viewport.
1443
+ - `frameIndex` - - Current deterministic playback frame index.
1444
+ - `scrollBasePx` - - Shared world scroll used for parallax motion.
1445
+
1446
+ Returns: Horizontal depth bands and perspective rays for the current frame.
1447
+
1429
1448
  ### resolvePlaybackGroundGridLineAlpha
1430
1449
 
1431
1450
  ```ts
@@ -1471,25 +1490,6 @@ Parameters:
1471
1490
 
1472
1491
  Returns: Stroke width in pixels.
1473
1492
 
1474
- ### resolvePlaybackGroundGridGeometry
1475
-
1476
- ```ts
1477
- resolvePlaybackGroundGridGeometry(
1478
- sceneContext: PlaybackBackgroundGroundGridSceneContext,
1479
- frameIndex: number,
1480
- scrollBasePx: number,
1481
- ): PlaybackGroundGridGeometry
1482
- ```
1483
-
1484
- Builds the line geometry for the neon ground grid.
1485
-
1486
- Parameters:
1487
- - `sceneContext` - - Lower-band geometry for the current viewport.
1488
- - `frameIndex` - - Current deterministic playback frame index.
1489
- - `scrollBasePx` - - Shared world scroll used for parallax motion.
1490
-
1491
- Returns: Horizontal depth bands and perspective rays for the current frame.
1492
-
1493
1493
  ### resolvePlaybackGroundGridSceneContext
1494
1494
 
1495
1495
  ```ts