@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
@@ -95,13 +95,6 @@ These types describe the moving pieces of one playback episode: the public
95
95
  summary returned at the end, the mutable loop bookkeeping used while frames
96
96
  are streaming, and the session context mirrored locally in the browser.
97
97
 
98
- ### PlaybackEpisodeSummary
99
-
100
- Public aggregate playback summary returned after one episode completes.
101
-
102
- The summary captures the headline outcomes of the just-finished population
103
- run without exposing all internal frame-by-frame details.
104
-
105
98
  ### PlaybackChampionChangedEvent
106
99
 
107
100
  Event emitted when the current playback champion changes.
@@ -109,13 +102,19 @@ Event emitted when the current playback champion changes.
109
102
  The event identifies which playback bird is currently highlighted as the red
110
103
  bird so the side-panel network view can stay synchronized with the renderer.
111
104
 
112
- ### PlaybackMutableSummary
105
+ ### PlaybackEpisodeSummary
113
106
 
114
- Mutable playback summary extended with latest leader telemetry fallbacks.
107
+ Public aggregate playback summary returned after one episode completes.
115
108
 
116
- During playback the browser may need temporary "latest known" values before
117
- the worker emits final aggregate statistics, so the mutable form carries both
118
- final fields and rolling fallbacks.
109
+ The summary captures the headline outcomes of the just-finished population
110
+ run without exposing all internal frame-by-frame details.
111
+
112
+ ### PlaybackIterationContext
113
+
114
+ Shared dependencies and mutable state used by one playback iteration.
115
+
116
+ Grouping these fields into one context object keeps the iteration services
117
+ declarative and avoids long parameter lists across the playback loop.
119
118
 
120
119
  ### PlaybackLoopState
121
120
 
@@ -125,6 +124,14 @@ This is the browser-side state machine for the playback loop: how much
125
124
  simulation budget is being requested, whether the episode has finished, and
126
125
  what aggregate summary has been observed so far.
127
126
 
127
+ ### PlaybackMutableSummary
128
+
129
+ Mutable playback summary extended with latest leader telemetry fallbacks.
130
+
131
+ During playback the browser may need temporary "latest known" values before
132
+ the worker emits final aggregate statistics, so the mutable form carries both
133
+ final fields and rolling fallbacks.
134
+
128
135
  ### PlaybackSessionContext
129
136
 
130
137
  Shared mutable playback state mirrored locally while worker playback runs.
@@ -133,13 +140,6 @@ The worker remains the source of truth for simulation, but the browser keeps
133
140
  lightweight mirrored state for rendering, trail accumulation, and loop
134
141
  orchestration.
135
142
 
136
- ### PlaybackIterationContext
137
-
138
- Shared dependencies and mutable state used by one playback iteration.
139
-
140
- Grouping these fields into one context object keeps the iteration services
141
- declarative and avoids long parameter lists across the playback loop.
142
-
143
143
  ## browser-entry/playback/playback.session.services.ts
144
144
 
145
145
  Session initialization and summary-folding helpers for playback.
@@ -149,23 +149,18 @@ These services answer three orchestration questions:
149
149
  2. What local mirror state should exist before the first worker snapshot?
150
150
  3. How should mutable loop state be folded back into a public summary?
151
151
 
152
- ### resolvePlaybackViewportDimensions
152
+ ### createInitialPlaybackLoopState
153
153
 
154
154
  ```ts
155
- resolvePlaybackViewportDimensions(
156
- canvas: HTMLCanvasElement,
157
- ): { visibleWorldWidthPx: number; visibleWorldHeightPx: number; }
155
+ createInitialPlaybackLoopState(): PlaybackLoopState
158
156
  ```
159
157
 
160
- Resolves the current visible playback viewport dimensions from the canvas.
161
-
162
- Playback sizing is derived from the live canvas rather than a hard-coded
163
- constant so resizing can flow into the worker/session boundary cleanly.
158
+ Creates the mutable loop state used while processing playback steps.
164
159
 
165
- Parameters:
166
- - `canvas` - - Target playback canvas.
160
+ This is the browser's running notebook for one episode: budget, completion
161
+ flag, and the latest known aggregate outcome metrics.
167
162
 
168
- Returns: Visible world width and height in pixels.
163
+ Returns: Initialized loop state and aggregate summary values.
169
164
 
170
165
  ### createInitialRenderState
171
166
 
@@ -199,19 +194,6 @@ playback frames are observed.
199
194
 
200
195
  Returns: Empty trail state for all birds.
201
196
 
202
- ### createInitialPlaybackLoopState
203
-
204
- ```ts
205
- createInitialPlaybackLoopState(): PlaybackLoopState
206
- ```
207
-
208
- Creates the mutable loop state used while processing playback steps.
209
-
210
- This is the browser's running notebook for one episode: budget, completion
211
- flag, and the latest known aggregate outcome metrics.
212
-
213
- Returns: Initialized loop state and aggregate summary values.
214
-
215
197
  ### initializePlaybackSessionContext
216
198
 
217
199
  ```ts
@@ -233,43 +215,61 @@ Parameters:
233
215
 
234
216
  Returns: Session context shared across the playback loop.
235
217
 
236
- ### syncPlaybackViewportDimensions
218
+ ### resolvePlaybackEpisodeSummary
237
219
 
238
220
  ```ts
239
- syncPlaybackViewportDimensions(
221
+ resolvePlaybackEpisodeSummary(
222
+ summary: PlaybackMutableSummary,
223
+ ): PlaybackEpisodeSummary
224
+ ```
225
+
226
+ Folds the mutable loop summary into the public playback summary shape.
227
+
228
+ The public summary is intentionally smaller than the internal loop state. It
229
+ exposes the outcome, not the browser's intermediate bookkeeping.
230
+
231
+ Parameters:
232
+ - `summary` - - Mutable loop summary accumulated during playback.
233
+
234
+ Returns: Public playback episode summary.
235
+
236
+ ### resolvePlaybackViewportDimensions
237
+
238
+ ```ts
239
+ resolvePlaybackViewportDimensions(
240
240
  canvas: HTMLCanvasElement,
241
- renderState: PopulationRenderState,
242
- ): void
241
+ ): { visibleWorldWidthPx: number; visibleWorldHeightPx: number; }
243
242
  ```
244
243
 
245
- Synchronizes the render state viewport fields with the current canvas size.
244
+ Resolves the current visible playback viewport dimensions from the canvas.
246
245
 
247
- Playback can continue while the canvas size changes, so the browser refreshes
248
- its local viewport mirror rather than assuming dimensions stay fixed.
246
+ Playback sizing is derived from the live canvas rather than a hard-coded
247
+ constant so resizing can flow into the worker/session boundary cleanly.
249
248
 
250
249
  Parameters:
251
250
  - `canvas` - - Target playback canvas.
252
- - `renderState` - - Mutable render state updated in place.
253
251
 
254
- Returns: Nothing.
252
+ Returns: Visible world width and height in pixels.
255
253
 
256
- ### resolvePlaybackEpisodeSummary
254
+ ### syncPlaybackViewportDimensions
257
255
 
258
256
  ```ts
259
- resolvePlaybackEpisodeSummary(
260
- summary: PlaybackMutableSummary,
261
- ): PlaybackEpisodeSummary
257
+ syncPlaybackViewportDimensions(
258
+ canvas: HTMLCanvasElement,
259
+ renderState: PopulationRenderState,
260
+ ): void
262
261
  ```
263
262
 
264
- Folds the mutable loop summary into the public playback summary shape.
263
+ Synchronizes the render state viewport fields with the current canvas size.
265
264
 
266
- The public summary is intentionally smaller than the internal loop state. It
267
- exposes the outcome, not the browser's intermediate bookkeeping.
265
+ Playback can continue while the canvas size changes, so the browser refreshes
266
+ its local viewport mirror rather than assuming dimensions stay fixed.
268
267
 
269
268
  Parameters:
270
- - `summary` - - Mutable loop summary accumulated during playback.
269
+ - `canvas` - - Target playback canvas.
270
+ - `renderState` - - Mutable render state updated in place.
271
271
 
272
- Returns: Public playback episode summary.
272
+ Returns: Nothing.
273
273
 
274
274
  ## browser-entry/playback/playback.loop.service.ts
275
275
 
@@ -295,135 +295,135 @@ Returns: Promise resolved on next animation frame.
295
295
 
296
296
  ## browser-entry/playback/playback.iteration.services.ts
297
297
 
298
- ### runPlaybackLoop
298
+ ### applyPlaybackStepSnapshot
299
299
 
300
300
  ```ts
301
- runPlaybackLoop(
302
- iterationContext: PlaybackIterationContext,
303
- ): Promise<void>
301
+ applyPlaybackStepSnapshot(
302
+ sessionContext: PlaybackSessionContext,
303
+ snapshot: EvolutionPlaybackStepSnapshot,
304
+ ): void
304
305
  ```
305
306
 
306
- Runs playback iterations until the worker reports that the episode is done.
307
+ Applies the latest worker snapshot to render state and trail caches.
307
308
 
308
309
  Parameters:
309
- - `iterationContext` - - Shared loop dependencies and mutable playback state.
310
+ - `sessionContext` - - Shared mutable playback session state.
311
+ - `snapshot` - - Worker snapshot for the current playback batch.
310
312
 
311
313
  Returns: Nothing.
312
314
 
313
- ### runPlaybackIteration
315
+ ### emitChampionChangedEvent
314
316
 
315
317
  ```ts
316
- runPlaybackIteration(
318
+ emitChampionChangedEvent(
317
319
  iterationContext: PlaybackIterationContext,
318
- ): Promise<void>
320
+ ): void
319
321
  ```
320
322
 
321
- Executes one playback iteration from viewport sync through render pacing.
323
+ Emits a champion-changed event when the red-bird champion changes.
324
+
325
+ The detector compares the newly resolved champion bird index against the
326
+ previously displayed champion index. This keeps the side panel aligned with
327
+ the red bird even when leadership changes because the old champion dies.
322
328
 
323
329
  Parameters:
324
330
  - `iterationContext` - - Shared loop dependencies and mutable playback state.
325
331
 
326
332
  Returns: Nothing.
327
333
 
328
- ### requestPlaybackStepPayload
334
+ ### emitPlaybackChampionChanged
329
335
 
330
336
  ```ts
331
- requestPlaybackStepPayload(
332
- iterationContext: PlaybackIterationContext,
333
- ): Promise<{ requestId: number; snapshot: EvolutionPlaybackStepSnapshot; instrumentation?: { activationCallsPerFrame: number; simulationStepsPerRaf: number; } | undefined; done: boolean; averagePipesPassed?: number | undefined; p90FramesSurvived?: number | undefined; winnerPipesPassed?: number | undefined; winnerFramesSurvived?: number | undefined; }>
337
+ emitPlaybackChampionChanged(
338
+ onChampionChanged: ((event: PlaybackChampionChangedEvent) => void) | undefined,
339
+ championBirdIndex: number,
340
+ ): void
334
341
  ```
335
342
 
336
- Requests one playback step batch from the evolution worker.
343
+ Calls the optional playback champion-changed callback with a structured payload.
337
344
 
338
345
  Parameters:
339
- - `iterationContext` - - Shared loop dependencies and mutable playback state.
346
+ - `onChampionChanged` - - Optional runtime callback.
347
+ - `championBirdIndex` - - Current champion bird index.
340
348
 
341
- Returns: Worker playback step payload for the current iteration.
349
+ Returns: Nothing.
342
350
 
343
- ### applyPlaybackStepSnapshot
351
+ ### emitPlaybackFrameStats
344
352
 
345
353
  ```ts
346
- applyPlaybackStepSnapshot(
347
- sessionContext: PlaybackSessionContext,
348
- snapshot: EvolutionPlaybackStepSnapshot,
354
+ emitPlaybackFrameStats(
355
+ iterationContext: PlaybackIterationContext,
356
+ playbackStepPayload: { requestId: number; snapshot: EvolutionPlaybackStepSnapshot; instrumentation?: { activationCallsPerFrame: number; simulationStepsPerRaf: number; } | undefined; done: boolean; averagePipesPassed?: number | undefined; p90FramesSurvived?: number | undefined; winnerPipesPassed?: number | undefined; winnerFramesSurvived?: number | undefined; },
349
357
  ): void
350
358
  ```
351
359
 
352
- Applies the latest worker snapshot to render state and trail caches.
360
+ Resolves leader telemetry and emits the public frame-stats callback.
353
361
 
354
362
  Parameters:
355
- - `sessionContext` - - Shared mutable playback session state.
356
- - `snapshot` - - Worker snapshot for the current playback batch.
363
+ - `iterationContext` - - Shared loop dependencies and mutable playback state.
364
+ - `playbackStepPayload` - - Worker playback result for the current iteration.
357
365
 
358
366
  Returns: Nothing.
359
367
 
360
- ### emitChampionChangedEvent
368
+ ### requestPlaybackStepPayload
361
369
 
362
370
  ```ts
363
- emitChampionChangedEvent(
371
+ requestPlaybackStepPayload(
364
372
  iterationContext: PlaybackIterationContext,
365
- ): void
373
+ ): Promise<{ requestId: number; snapshot: EvolutionPlaybackStepSnapshot; instrumentation?: { activationCallsPerFrame: number; simulationStepsPerRaf: number; } | undefined; done: boolean; averagePipesPassed?: number | undefined; p90FramesSurvived?: number | undefined; winnerPipesPassed?: number | undefined; winnerFramesSurvived?: number | undefined; }>
366
374
  ```
367
375
 
368
- Emits a champion-changed event when the red-bird champion changes.
369
-
370
- The detector compares the newly resolved champion bird index against the
371
- previously displayed champion index. This keeps the side panel aligned with
372
- the red bird even when leadership changes because the old champion dies.
376
+ Requests one playback step batch from the evolution worker.
373
377
 
374
378
  Parameters:
375
379
  - `iterationContext` - - Shared loop dependencies and mutable playback state.
376
380
 
377
- Returns: Nothing.
381
+ Returns: Worker playback step payload for the current iteration.
378
382
 
379
- ### emitPlaybackFrameStats
383
+ ### runPlaybackIteration
380
384
 
381
385
  ```ts
382
- emitPlaybackFrameStats(
386
+ runPlaybackIteration(
383
387
  iterationContext: PlaybackIterationContext,
384
- playbackStepPayload: { requestId: number; snapshot: EvolutionPlaybackStepSnapshot; instrumentation?: { activationCallsPerFrame: number; simulationStepsPerRaf: number; } | undefined; done: boolean; averagePipesPassed?: number | undefined; p90FramesSurvived?: number | undefined; winnerPipesPassed?: number | undefined; winnerFramesSurvived?: number | undefined; },
385
- ): void
388
+ ): Promise<void>
386
389
  ```
387
390
 
388
- Resolves leader telemetry and emits the public frame-stats callback.
391
+ Executes one playback iteration from viewport sync through render pacing.
389
392
 
390
393
  Parameters:
391
394
  - `iterationContext` - - Shared loop dependencies and mutable playback state.
392
- - `playbackStepPayload` - - Worker playback result for the current iteration.
393
395
 
394
396
  Returns: Nothing.
395
397
 
396
- ### updatePlaybackLoopCompletion
398
+ ### runPlaybackLoop
397
399
 
398
400
  ```ts
399
- updatePlaybackLoopCompletion(
400
- loopState: PlaybackLoopState,
401
- playbackStepPayload: { requestId: number; snapshot: EvolutionPlaybackStepSnapshot; instrumentation?: { activationCallsPerFrame: number; simulationStepsPerRaf: number; } | undefined; done: boolean; averagePipesPassed?: number | undefined; p90FramesSurvived?: number | undefined; winnerPipesPassed?: number | undefined; winnerFramesSurvived?: number | undefined; },
402
- ): void
401
+ runPlaybackLoop(
402
+ iterationContext: PlaybackIterationContext,
403
+ ): Promise<void>
403
404
  ```
404
405
 
405
- Updates the loop summary when the worker reports playback completion.
406
+ Runs playback iterations until the worker reports that the episode is done.
406
407
 
407
408
  Parameters:
408
- - `loopState` - - Mutable playback loop state.
409
- - `playbackStepPayload` - - Worker playback result for the current iteration.
409
+ - `iterationContext` - - Shared loop dependencies and mutable playback state.
410
410
 
411
411
  Returns: Nothing.
412
412
 
413
- ### emitPlaybackChampionChanged
413
+ ### updatePlaybackLoopCompletion
414
414
 
415
415
  ```ts
416
- emitPlaybackChampionChanged(
417
- onChampionChanged: ((event: PlaybackChampionChangedEvent) => void) | undefined,
418
- championBirdIndex: number,
416
+ updatePlaybackLoopCompletion(
417
+ loopState: PlaybackLoopState,
418
+ playbackStepPayload: { requestId: number; snapshot: EvolutionPlaybackStepSnapshot; instrumentation?: { activationCallsPerFrame: number; simulationStepsPerRaf: number; } | undefined; done: boolean; averagePipesPassed?: number | undefined; p90FramesSurvived?: number | undefined; winnerPipesPassed?: number | undefined; winnerFramesSurvived?: number | undefined; },
419
419
  ): void
420
420
  ```
421
421
 
422
- Calls the optional playback champion-changed callback with a structured payload.
422
+ Updates the loop summary when the worker reports playback completion.
423
423
 
424
424
  Parameters:
425
- - `onChampionChanged` - - Optional runtime callback.
426
- - `championBirdIndex` - - Current champion bird index.
425
+ - `loopState` - - Mutable playback loop state.
426
+ - `playbackStepPayload` - - Worker playback result for the current iteration.
427
427
 
428
428
  Returns: Nothing.
429
429
 
@@ -516,6 +516,27 @@ Returns: Nothing.
516
516
 
517
517
  ## browser-entry/playback/playback.render.utils.ts
518
518
 
519
+ ### PlaybackBirdRenderStyle
520
+
521
+ Pure render-style result for one bird body draw pass.
522
+
523
+ ### resolveBirdRenderStyle
524
+
525
+ ```ts
526
+ resolveBirdRenderStyle(
527
+ birdIndex: number,
528
+ championBirdIndex: number,
529
+ ): PlaybackBirdRenderStyle
530
+ ```
531
+
532
+ Resolves opacity, body color, and champion marker for one bird.
533
+
534
+ Parameters:
535
+ - `birdIndex` - - Index of the bird currently being rendered.
536
+ - `championBirdIndex` - - Resolved champion index for the frame.
537
+
538
+ Returns: Pure style payload used by the render service.
539
+
519
540
  ### resolveChampionBirdIndex
520
541
 
521
542
  ```ts
@@ -534,28 +555,26 @@ Parameters:
534
555
 
535
556
  Returns: Champion index or `-1` when no bird is alive.
536
557
 
537
- ### resolveBirdRenderStyle
558
+ ## browser-entry/playback/playback.trail.utils.ts
559
+
560
+ ### clamp01
538
561
 
539
562
  ```ts
540
- resolveBirdRenderStyle(
541
- birdIndex: number,
542
- championBirdIndex: number,
543
- ): PlaybackBirdRenderStyle
563
+ clamp01(
564
+ value: number,
565
+ ): number
544
566
  ```
545
567
 
546
- Resolves opacity, body color, and champion marker for one bird.
547
-
548
- Parameters:
549
- - `birdIndex` - - Index of the bird currently being rendered.
550
- - `championBirdIndex` - - Resolved champion index for the frame.
551
-
552
- Returns: Pure style payload used by the render service.
568
+ Clamps a number to the inclusive [0, 1] range.
553
569
 
554
- ### PlaybackBirdRenderStyle
570
+ The trail renderer combines several normalized fade factors, so keeping this
571
+ utility local to the module makes the intent obvious: every opacity channel
572
+ must remain safe for direct canvas alpha use.
555
573
 
556
- Pure render-style result for one bird body draw pass.
574
+ Parameters:
575
+ - `value` - - Candidate value.
557
576
 
558
- ## browser-entry/playback/playback.trail.utils.ts
577
+ Returns: Clamped value.
559
578
 
560
579
  ### pushChampionTrailPoint
561
580
 
@@ -607,31 +626,12 @@ Parameters:
607
626
 
608
627
  Returns: Nothing.
609
628
 
610
- Example:
611
-
612
- ```ts
613
- const trailPoints = [{ frameIndex: 10, yPx: 140 }];
614
- pushTrailPoint(trailPoints, 11, 136, 2);
615
- ```
616
-
617
- ### clamp01
618
-
619
- ```ts
620
- clamp01(
621
- value: number,
622
- ): number
623
- ```
624
-
625
- Clamps a number to the inclusive [0, 1] range.
626
-
627
- The trail renderer combines several normalized fade factors, so keeping this
628
- utility local to the module makes the intent obvious: every opacity channel
629
- must remain safe for direct canvas alpha use.
630
-
631
- Parameters:
632
- - `value` - - Candidate value.
629
+ Example:
633
630
 
634
- Returns: Clamped value.
631
+ ```ts
632
+ const trailPoints = [{ frameIndex: 10, yPx: 140 }];
633
+ pushTrailPoint(trailPoints, 11, 136, 2);
634
+ ```
635
635
 
636
636
  ### resolveEdgeOpacityFactor
637
637
 
@@ -718,6 +718,14 @@ Shared playback utility types for the browser-entry subsystem.
718
718
  These types support rendering concerns that cut across multiple playback
719
719
  helpers, such as edge-aware trail fading and cached parallax backgrounds.
720
720
 
721
+ ### PlaybackEdgeBounds
722
+
723
+ Axis-aligned visible world bounds used for edge-aware trail fading.
724
+
725
+ Trail rendering needs a quick answer to "is this point still visually inside
726
+ the active world rectangle?" so fading logic can taper paths near the edges
727
+ instead of drawing abrupt cutoffs.
728
+
721
729
  ### PlaybackStarfieldLayerSpec
722
730
 
723
731
  Declarative recipe for building one cached starfield parallax layer.
@@ -735,14 +743,6 @@ parallax backgrounds during playback.
735
743
  Separating the image type from the tile record lets the same starfield logic
736
744
  work with ordinary canvases and `OffscreenCanvas` when available.
737
745
 
738
- ### PlaybackEdgeBounds
739
-
740
- Axis-aligned visible world bounds used for edge-aware trail fading.
741
-
742
- Trail rendering needs a quick answer to "is this point still visually inside
743
- the active world rectangle?" so fading logic can taper paths near the edges
744
- instead of drawing abrupt cutoffs.
745
-
746
746
  ## browser-entry/playback/playback.starfield.types.ts
747
747
 
748
748
  Starfield and parallax rendering contracts for playback backgrounds.
@@ -751,22 +751,12 @@ The playback view uses a cached layered starfield to add depth without paying
751
751
  a large per-frame rendering cost. These types define the tile, layer, and
752
752
  deterministic placement data needed for that effect.
753
753
 
754
- ### StarTileImage
755
-
756
- Shared type contract for starfield tile rendering layers.
757
-
758
- A tile is pre-rendered and repeated horizontally to draw efficient
759
- parallax backgrounds during playback.
760
-
761
- ### StarTile
762
-
763
- Shared type contract for starfield tile rendering layers.
754
+ ### CreateStarTileCanvasOptions
764
755
 
765
- A tile is pre-rendered and repeated horizontally to draw efficient
766
- parallax backgrounds during playback.
756
+ Input contract for pre-rendering one deterministic starfield tile.
767
757
 
768
- Separating the image type from the tile record lets the same starfield logic
769
- work with ordinary canvases and `OffscreenCanvas` when available.
758
+ The generated tile is cached and repeated horizontally during playback,
759
+ so every field here affects both the visual look and the parallax cost.
770
760
 
771
761
  ### PlaybackStarfieldLayerSpec
772
762
 
@@ -775,13 +765,6 @@ Declarative recipe for building one cached starfield parallax layer.
775
765
  Each layer spec describes how dense, bright, blurred, and fast one visual
776
766
  depth plane should feel.
777
767
 
778
- ### CreateStarTileCanvasOptions
779
-
780
- Input contract for pre-rendering one deterministic starfield tile.
781
-
782
- The generated tile is cached and repeated horizontally during playback,
783
- so every field here affects both the visual look and the parallax cost.
784
-
785
768
  ### StarfieldCanvasDimensions
786
769
 
787
770
  Normalized canvas dimensions used by browser and offscreen tile creation.
@@ -797,6 +780,23 @@ Deterministic placement and appearance for one rendered star sprite.
797
780
  Determinism matters here because cached starfield tiles should remain stable
798
781
  across redraws instead of sparkling randomly every frame.
799
782
 
783
+ ### StarTile
784
+
785
+ Shared type contract for starfield tile rendering layers.
786
+
787
+ A tile is pre-rendered and repeated horizontally to draw efficient
788
+ parallax backgrounds during playback.
789
+
790
+ Separating the image type from the tile record lets the same starfield logic
791
+ work with ordinary canvases and `OffscreenCanvas` when available.
792
+
793
+ ### StarTileImage
794
+
795
+ Shared type contract for starfield tile rendering layers.
796
+
797
+ A tile is pre-rendered and repeated horizontally to draw efficient
798
+ parallax backgrounds during playback.
799
+
800
800
  ## browser-entry/playback/playback.starfield.service.ts
801
801
 
802
802
  ### resolveStarfieldTiles
@@ -816,20 +816,20 @@ Returns: Ordered far/mid/near starfield tiles.
816
816
 
817
817
  ## browser-entry/playback/playback.starfield.services.ts
818
818
 
819
- ### createStarTileCanvas
819
+ ### createCanvasSizeFallback
820
820
 
821
821
  ```ts
822
- createStarTileCanvas(
823
- options: CreateStarTileCanvasOptions,
824
- ): StarTileImage
822
+ createCanvasSizeFallback(
823
+ canvasDimensions: StarfieldCanvasDimensions,
824
+ ): HTMLCanvasElement
825
825
  ```
826
826
 
827
- Pre-renders a deterministic tile that can be reused across animation frames.
827
+ Creates a size-only fallback so non-browser tests can skip rendering safely.
828
828
 
829
829
  Parameters:
830
- - `options` - - Declarative drawing recipe for one parallax layer.
830
+ - `canvasDimensions` - - Already-normalized pixel dimensions.
831
831
 
832
- Returns: Canvas image source containing the rendered star strip.
832
+ Returns: Minimal canvas-shaped object cast to the compatible return type.
833
833
 
834
834
  ### createCompatibleCanvas
835
835
 
@@ -848,63 +848,63 @@ Parameters:
848
848
 
849
849
  Returns: Offscreen canvas when supported, otherwise a DOM canvas fallback.
850
850
 
851
- ### resolveStarTileContext
851
+ ### createDocumentCanvasIfSupported
852
852
 
853
853
  ```ts
854
- resolveStarTileContext(
855
- canvas: HTMLCanvasElement | OffscreenCanvas,
856
- ): CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null
854
+ createDocumentCanvasIfSupported(
855
+ canvasDimensions: StarfieldCanvasDimensions,
856
+ ): HTMLCanvasElement | null
857
857
  ```
858
858
 
859
- Resolves the rendering context used for star tile pre-rendering.
859
+ Creates a DOM canvas when document APIs are available.
860
860
 
861
861
  Parameters:
862
- - `canvas` - - Compatible canvas returned by the runtime-specific factory.
862
+ - `canvasDimensions` - - Already-normalized pixel dimensions.
863
863
 
864
- Returns: A 2D drawing context when rendering is supported.
864
+ Returns: DOM canvas instance or `null` when unavailable.
865
865
 
866
- ### initializeStarTileContext
866
+ ### createOffscreenCanvasIfSupported
867
867
 
868
868
  ```ts
869
- initializeStarTileContext(
870
- options: { tileContext: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D; canvas: HTMLCanvasElement | OffscreenCanvas; },
871
- ): void
869
+ createOffscreenCanvasIfSupported(
870
+ canvasDimensions: StarfieldCanvasDimensions,
871
+ ): OffscreenCanvas | null
872
872
  ```
873
873
 
874
- Clears the canvas and applies the neutral settings shared by all rendered stars.
874
+ Creates an offscreen canvas when the current runtime supports it.
875
875
 
876
876
  Parameters:
877
- - `options` - - Context initialization dependencies.
877
+ - `canvasDimensions` - - Already-normalized pixel dimensions.
878
878
 
879
- Returns: Nothing. The provided context is mutated in place.
879
+ Returns: Offscreen canvas instance or `null` when unavailable.
880
880
 
881
- ### renderSeededStars
881
+ ### createStarTileCanvas
882
882
 
883
883
  ```ts
884
- renderSeededStars(
885
- options: { tileContext: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D; seededRandom: () => number; canvasOptions: CreateStarTileCanvasOptions; },
886
- ): void
884
+ createStarTileCanvas(
885
+ options: CreateStarTileCanvasOptions,
886
+ ): StarTileImage
887
887
  ```
888
888
 
889
- Draws all stars for one tile using a seeded random source.
889
+ Pre-renders a deterministic tile that can be reused across animation frames.
890
890
 
891
891
  Parameters:
892
- - `options` - - Drawing context, seed source, and tile recipe.
892
+ - `options` - - Declarative drawing recipe for one parallax layer.
893
893
 
894
- Returns: Nothing. The provided context is mutated in place.
894
+ Returns: Canvas image source containing the rendered star strip.
895
895
 
896
- ### resetStarTileContext
896
+ ### initializeStarTileContext
897
897
 
898
898
  ```ts
899
- resetStarTileContext(
900
- tileContext: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,
899
+ initializeStarTileContext(
900
+ options: { tileContext: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D; canvas: HTMLCanvasElement | OffscreenCanvas; },
901
901
  ): void
902
902
  ```
903
903
 
904
- Restores neutral drawing state so later canvas consumers start from defaults.
904
+ Clears the canvas and applies the neutral settings shared by all rendered stars.
905
905
 
906
906
  Parameters:
907
- - `tileContext` - - 2D context used to render the star tile.
907
+ - `options` - - Context initialization dependencies.
908
908
 
909
909
  Returns: Nothing. The provided context is mutated in place.
910
910
 
@@ -925,65 +925,65 @@ Parameters:
925
925
 
926
926
  Returns: Clamped integer dimensions safe for canvas allocation.
927
927
 
928
- ### createOffscreenCanvasIfSupported
928
+ ### renderSeededStars
929
929
 
930
930
  ```ts
931
- createOffscreenCanvasIfSupported(
932
- canvasDimensions: StarfieldCanvasDimensions,
933
- ): OffscreenCanvas | null
931
+ renderSeededStars(
932
+ options: { tileContext: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D; seededRandom: () => number; canvasOptions: CreateStarTileCanvasOptions; },
933
+ ): void
934
934
  ```
935
935
 
936
- Creates an offscreen canvas when the current runtime supports it.
936
+ Draws all stars for one tile using a seeded random source.
937
937
 
938
938
  Parameters:
939
- - `canvasDimensions` - - Already-normalized pixel dimensions.
939
+ - `options` - - Drawing context, seed source, and tile recipe.
940
940
 
941
- Returns: Offscreen canvas instance or `null` when unavailable.
941
+ Returns: Nothing. The provided context is mutated in place.
942
942
 
943
- ### createDocumentCanvasIfSupported
943
+ ### resetStarTileContext
944
944
 
945
945
  ```ts
946
- createDocumentCanvasIfSupported(
947
- canvasDimensions: StarfieldCanvasDimensions,
948
- ): HTMLCanvasElement | null
946
+ resetStarTileContext(
947
+ tileContext: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,
948
+ ): void
949
949
  ```
950
950
 
951
- Creates a DOM canvas when document APIs are available.
951
+ Restores neutral drawing state so later canvas consumers start from defaults.
952
952
 
953
953
  Parameters:
954
- - `canvasDimensions` - - Already-normalized pixel dimensions.
954
+ - `tileContext` - - 2D context used to render the star tile.
955
955
 
956
- Returns: DOM canvas instance or `null` when unavailable.
956
+ Returns: Nothing. The provided context is mutated in place.
957
957
 
958
- ### createCanvasSizeFallback
958
+ ### resolveStarPlacement
959
959
 
960
960
  ```ts
961
- createCanvasSizeFallback(
962
- canvasDimensions: StarfieldCanvasDimensions,
963
- ): HTMLCanvasElement
961
+ resolveStarPlacement(
962
+ options: { seededRandom: () => number; tileWidthPx: number; tileHeightPx: number; minSizePx: number; maxSizePx: number; minAlpha: number; maxAlpha: number; },
963
+ ): StarPlacement
964
964
  ```
965
965
 
966
- Creates a size-only fallback so non-browser tests can skip rendering safely.
966
+ Resolves one deterministic star placement and appearance from the seeded RNG.
967
967
 
968
968
  Parameters:
969
- - `canvasDimensions` - - Already-normalized pixel dimensions.
969
+ - `options` - - Random source and star placement bounds.
970
970
 
971
- Returns: Minimal canvas-shaped object cast to the compatible return type.
971
+ Returns: Pixel location, square size, and alpha for one rendered star.
972
972
 
973
- ### resolveStarPlacement
973
+ ### resolveStarTileContext
974
974
 
975
975
  ```ts
976
- resolveStarPlacement(
977
- options: { seededRandom: () => number; tileWidthPx: number; tileHeightPx: number; minSizePx: number; maxSizePx: number; minAlpha: number; maxAlpha: number; },
978
- ): StarPlacement
976
+ resolveStarTileContext(
977
+ canvas: HTMLCanvasElement | OffscreenCanvas,
978
+ ): CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null
979
979
  ```
980
980
 
981
- Resolves one deterministic star placement and appearance from the seeded RNG.
981
+ Resolves the rendering context used for star tile pre-rendering.
982
982
 
983
983
  Parameters:
984
- - `options` - - Random source and star placement bounds.
984
+ - `canvas` - - Compatible canvas returned by the runtime-specific factory.
985
985
 
986
- Returns: Pixel location, square size, and alpha for one rendered star.
986
+ Returns: A 2D drawing context when rendering is supported.
987
987
 
988
988
  ## browser-entry/playback/playback.starfield.layer.services.ts
989
989
 
@@ -1155,40 +1155,6 @@ Request payload for one playback-step worker call.
1155
1155
  The browser asks the worker to advance simulation by a small batch of steps
1156
1156
  and to package the result for the current viewport dimensions.
1157
1157
 
1158
- ### ResolvePlaybackStepRequestInput
1159
-
1160
- Input used to resolve the next playback-step request and budget remainder.
1161
-
1162
- Playback uses a fractional frame budget so browser render cadence and worker
1163
- simulation cadence can be smoothed together over time.
1164
-
1165
- ### ResolvePlaybackStepRequestResult
1166
-
1167
- Output for the resolved playback-step request and frame-budget remainder.
1168
-
1169
- The resolved request records both the integer step batch to send now and the
1170
- leftover fractional budget to carry into the next render tick.
1171
-
1172
- ### resolvePlaybackStepRequest
1173
-
1174
- ```ts
1175
- resolvePlaybackStepRequest(
1176
- input: ResolvePlaybackStepRequestInput,
1177
- ): ResolvePlaybackStepRequestResult
1178
- ```
1179
-
1180
- Resolves step count and request payload for the next worker playback batch.
1181
-
1182
- This is the pacing bridge between browser rendering and worker simulation.
1183
- Rather than sending a fixed step count every frame, the loop carries forward
1184
- fractional remainder so long-term playback speed stays closer to the intended
1185
- emulation rate.
1186
-
1187
- Parameters:
1188
- - `input` - - Current frame budget and viewport dimensions.
1189
-
1190
- Returns: Request payload plus carried-over fractional frame budget.
1191
-
1192
1158
  ### resolvePlaybackCompletionSummary
1193
1159
 
1194
1160
  ```ts
@@ -1237,3 +1203,37 @@ Parameters:
1237
1203
  - `leaderFramesSurvived` - - Current frame leader survived frames.
1238
1204
 
1239
1205
  Returns: Normalized per-frame HUD telemetry payload.
1206
+
1207
+ ### resolvePlaybackStepRequest
1208
+
1209
+ ```ts
1210
+ resolvePlaybackStepRequest(
1211
+ input: ResolvePlaybackStepRequestInput,
1212
+ ): ResolvePlaybackStepRequestResult
1213
+ ```
1214
+
1215
+ Resolves step count and request payload for the next worker playback batch.
1216
+
1217
+ This is the pacing bridge between browser rendering and worker simulation.
1218
+ Rather than sending a fixed step count every frame, the loop carries forward
1219
+ fractional remainder so long-term playback speed stays closer to the intended
1220
+ emulation rate.
1221
+
1222
+ Parameters:
1223
+ - `input` - - Current frame budget and viewport dimensions.
1224
+
1225
+ Returns: Request payload plus carried-over fractional frame budget.
1226
+
1227
+ ### ResolvePlaybackStepRequestInput
1228
+
1229
+ Input used to resolve the next playback-step request and budget remainder.
1230
+
1231
+ Playback uses a fractional frame budget so browser render cadence and worker
1232
+ simulation cadence can be smoothed together over time.
1233
+
1234
+ ### ResolvePlaybackStepRequestResult
1235
+
1236
+ Output for the resolved playback-step request and frame-budget remainder.
1237
+
1238
+ The resolved request records both the integer step batch to send now and the
1239
+ leftover fractional budget to carry into the next render tick.