mlx-bun 0.2.0 → 0.4.0

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 (433) hide show
  1. package/README.md +71 -588
  2. package/docs/README.md +94 -0
  3. package/docs/{design → archive/investigations}/audio-input-plan.md +4 -4
  4. package/docs/{design → archive/investigations}/diffusion-gemma-port.md +3 -3
  5. package/docs/{design → archive/investigations}/faithful-l1-consolidation.md +4 -4
  6. package/docs/{design → archive/investigations}/minicpm5-decode-megakernel.md +11 -11
  7. package/docs/archive/investigations/openjarvis-fit.md +198 -0
  8. package/docs/{design → archive/investigations}/optimization_plan.md +1 -1
  9. package/docs/{design → archive/investigations}/pre-colibri-stabilization.md +5 -5
  10. package/docs/archive/investigations/qwen38-27b-campaign-log.md +1092 -0
  11. package/docs/{design → archive/investigations}/the-dreaming-handoff.md +2 -2
  12. package/docs/archive/planning/release-notes-v0.3.0.md +35 -0
  13. package/docs/design/batching.md +1841 -0
  14. package/docs/design/decode-speed-program.md +2346 -169
  15. package/docs/design/dreaming-nightly-pipeline.md +675 -282
  16. package/docs/design/generic-model-support.md +655 -334
  17. package/docs/design/kv-cache.md +824 -0
  18. package/docs/design/orpo-training.md +673 -1239
  19. package/docs/design/speculative-decoding.md +1990 -0
  20. package/docs/design/turboquant.md +2212 -0
  21. package/docs/design/unified-engine-frontier-plan.md +1833 -727
  22. package/docs/design/web-chat-redesign.md +666 -1083
  23. package/docs/planning/PRODUCT_ROADMAP.md +50 -1
  24. package/docs/planning/release-notes-v0.4.0.md +45 -0
  25. package/docs/planning/video-series.md +2 -2
  26. package/docs/reference/benchmarks.md +3613 -0
  27. package/docs/reference/cli.md +434 -160
  28. package/docs/reference/distribution.md +328 -182
  29. package/docs/reference/environment.md +398 -0
  30. package/docs/reference/glossary.md +39 -0
  31. package/docs/reference/library-api.md +566 -168
  32. package/docs/reference/memory.md +227 -64
  33. package/docs/reference/models.md +113 -6
  34. package/docs/reference/server-api.md +944 -429
  35. package/docs/reference/server-config.md +740 -338
  36. package/docs/reference/training.md +393 -254
  37. package/docs/reference/troubleshooting.md +158 -0
  38. package/package.json +9 -4
  39. package/src/audio/decode.ts +2 -2
  40. package/src/audio/features.ts +2 -2
  41. package/src/backends/mlx/assistant-target.ts +46 -0
  42. package/src/backends/mlx/autoregressive-draft-rows.ts +120 -0
  43. package/src/backends/mlx/autoregressive.ts +108 -0
  44. package/src/backends/mlx/batch-group.ts +1790 -0
  45. package/src/backends/mlx/cache-attachment.ts +67 -0
  46. package/src/backends/mlx/cache-layout.ts +31 -0
  47. package/src/backends/mlx/checkpoint-state.ts +53 -0
  48. package/src/backends/mlx/continuation-persistence.ts +106 -0
  49. package/src/backends/mlx/continuation-request.ts +43 -0
  50. package/src/backends/mlx/continuation.ts +77 -0
  51. package/src/backends/mlx/diffusion.ts +39 -0
  52. package/src/backends/mlx/draft-target.ts +32 -0
  53. package/src/backends/mlx/evaluation.ts +105 -0
  54. package/src/backends/mlx/fill-append.ts +45 -0
  55. package/src/backends/mlx/full-kv-row-append.ts +32 -0
  56. package/src/backends/mlx/full-kv-row-donor.ts +54 -0
  57. package/src/backends/mlx/full-transitioning-kv-rows.ts +65 -0
  58. package/src/backends/mlx/gateway-binding.ts +130 -0
  59. package/src/backends/mlx/graph.ts +38 -0
  60. package/src/backends/mlx/kv-codec.ts +9 -0
  61. package/src/backends/mlx/kv-maintenance.ts +133 -0
  62. package/src/backends/mlx/kv-tensor-rows.ts +212 -0
  63. package/src/backends/mlx/memory-client.ts +189 -0
  64. package/src/backends/mlx/methods.ts +90 -0
  65. package/src/backends/mlx/model-prompt.ts +164 -0
  66. package/src/backends/mlx/model-serving.ts +79 -0
  67. package/src/backends/mlx/prefill-cohort.ts +89 -0
  68. package/src/backends/mlx/prefill-rows.ts +200 -0
  69. package/src/backends/mlx/prefill.ts +33 -0
  70. package/src/backends/mlx/projected-context-rows.ts +72 -0
  71. package/src/backends/mlx/request-policy.ts +20 -0
  72. package/src/backends/mlx/request-state-policy.ts +41 -0
  73. package/src/backends/mlx/rollback.ts +89 -0
  74. package/src/backends/mlx/row-sampling.ts +49 -0
  75. package/src/backends/mlx/serial-executor.ts +242 -0
  76. package/src/backends/mlx/speculative-group.ts +359 -0
  77. package/src/backends/mlx/speculative-round.ts +161 -0
  78. package/src/backends/mlx/speculative.ts +114 -0
  79. package/src/backends/mlx/state-rows.ts +104 -0
  80. package/src/backends/mlx/state-views.ts +46 -0
  81. package/src/backends/mlx/target-layout-capability.ts +35 -0
  82. package/src/backends/mlx/text-engine.ts +73 -0
  83. package/src/backends/mlx/transitioning-kv-rows.ts +165 -0
  84. package/src/cli.ts +66 -58
  85. package/src/client.ts +66 -0
  86. package/src/config.ts +21 -4
  87. package/src/contracts/completion.ts +16 -0
  88. package/src/contracts/execution.ts +60 -0
  89. package/src/contracts/generation.ts +103 -0
  90. package/src/contracts/host.ts +7 -0
  91. package/src/contracts/jobs.ts +66 -0
  92. package/src/contracts/pi-provider.ts +30 -0
  93. package/src/contracts/pi.ts +259 -0
  94. package/src/contracts/prefix-cache.ts +23 -0
  95. package/src/contracts/resources.ts +25 -0
  96. package/src/contracts/sampling.ts +23 -0
  97. package/src/contracts/scheduling.ts +45 -0
  98. package/src/contracts/tsconfig.json +14 -0
  99. package/src/diffusion/diffusion-generate.ts +218 -153
  100. package/src/embed.ts +1 -1
  101. package/src/engine/admission.ts +59 -0
  102. package/src/engine/cancellation.ts +38 -0
  103. package/src/engine/engine.ts +56 -0
  104. package/src/engine/execution-coordinator.ts +70 -0
  105. package/src/engine/execution-plan.ts +53 -0
  106. package/src/engine/resources.ts +53 -0
  107. package/src/engine/scheduler.ts +72 -0
  108. package/src/engine/session.ts +247 -0
  109. package/src/eval/README.md +44 -1
  110. package/src/eval/kl.ts +236 -3
  111. package/src/eval/reference-logits.ts +207 -0
  112. package/src/eval/runner.ts +8 -96
  113. package/src/fill/echo-index.ts +188 -0
  114. package/src/fill/fill-session.ts +452 -0
  115. package/src/fill/proposal.ts +68 -0
  116. package/src/fill/schema-rows.ts +506 -0
  117. package/src/fill/tool-boundary.ts +103 -0
  118. package/src/fit.ts +30 -16
  119. package/src/generate.ts +709 -417
  120. package/src/grammar.ts +12 -7
  121. package/src/harness-pi.ts +14 -33
  122. package/src/hub-rest.ts +4 -4
  123. package/src/index.ts +7 -0
  124. package/src/inference/denoising.ts +17 -0
  125. package/src/inference/draft-acceptance.ts +41 -0
  126. package/src/inference/draft-output.ts +49 -0
  127. package/src/inference/graph.ts +33 -0
  128. package/src/inference/prefill.ts +39 -0
  129. package/src/inference/rollback.ts +7 -0
  130. package/src/jobs/db.ts +4 -0
  131. package/src/jobs/index.ts +2 -0
  132. package/src/jobs/job-entry.ts +12 -12
  133. package/src/jobs/runner.ts +98 -13
  134. package/src/jobs/task-client.ts +19 -0
  135. package/src/jobs/types.ts +2 -58
  136. package/src/kv-scheme.ts +70 -12
  137. package/src/kv-store.ts +177 -63
  138. package/src/lab/README.md +18 -0
  139. package/src/{assets → lab/curve}/curve-designer.html +2 -2
  140. package/src/{curve-sampler.ts → lab/curve/curve-sampler.ts} +2 -2
  141. package/src/{expert-trace.ts → lab/expert-trace/expert-trace.ts} +5 -5
  142. package/src/lab/paged-kv/paged-kv-rows.ts +83 -0
  143. package/src/{model → lab/paged-kv}/paged-kv.ts +32 -15
  144. package/src/library.ts +40 -0
  145. package/src/lora.ts +18 -0
  146. package/src/media-fetch.ts +1 -1
  147. package/src/memory/article.ts +1 -1
  148. package/src/memory/chunk.ts +1 -1
  149. package/src/memory/model.ts +30 -169
  150. package/src/memory/prompts.ts +1 -1
  151. package/src/memory/rest.ts +1 -1
  152. package/src/memory/schedule.ts +1 -1
  153. package/src/memory/stages.ts +4 -1
  154. package/src/memory/vault.ts +1 -3
  155. package/src/mlx/array.ts +11 -11
  156. package/src/mlx/compile.ts +12 -2
  157. package/src/mlx/ffi.ts +58 -11
  158. package/src/mlx/materialize.ts +23 -0
  159. package/src/mlx/metal-kernel.ts +10 -11
  160. package/src/mlx/ops.ts +33 -13
  161. package/src/mlx/quantized-rows.ts +36 -0
  162. package/src/mlx/token-bitmask.ts +52 -0
  163. package/src/mlx/turboquant-kv-decode.ts +82 -0
  164. package/src/mlx/turboquant-kv-inverse.ts +122 -0
  165. package/src/mlx/turboquant-ops.ts +33 -3
  166. package/src/mlx/turboquant-tables.ts +2 -2
  167. package/src/model/artifact-identity.ts +73 -0
  168. package/src/model/batched-kv.ts +235 -0
  169. package/src/model/batched-mask.ts +20 -6
  170. package/src/model/batched-quant.ts +9 -3
  171. package/src/model/batched-quantized-kv.ts +144 -0
  172. package/src/model/batched-rotating-quant.ts +78 -17
  173. package/src/model/batched-rotating-state.ts +76 -0
  174. package/src/model/batched-rotating.ts +65 -23
  175. package/src/model/batched-row-storage.ts +52 -0
  176. package/src/model/batched-ssm.ts +52 -0
  177. package/src/model/batched-turboquant-kv.ts +93 -0
  178. package/src/model/compiled-decode.ts +8 -2
  179. package/src/model/decoded-kv-donor.ts +12 -0
  180. package/src/model/delayed-quantized-kv.ts +72 -0
  181. package/src/model/delayed-rotating-quantized-kv.ts +93 -0
  182. package/src/model/delayed-turboquant-kv.ts +55 -0
  183. package/src/model/diffusion-gemma.ts +8 -8
  184. package/src/model/factory.ts +76 -33
  185. package/src/model/fingerprint.ts +1 -1
  186. package/src/model/flash-attention.ts +3 -3
  187. package/src/model/full-prefill-padding.ts +56 -0
  188. package/src/model/full-prefill-row.ts +105 -0
  189. package/src/model/gemma4-base.ts +179 -80
  190. package/src/model/gemma4.ts +40 -32
  191. package/src/model/generated/gemma4-12b.ts +6 -3
  192. package/src/model/generated/gemma4-26b.ts +6 -3
  193. package/src/model/generated/gemma4-e4b.ts +6 -3
  194. package/src/model/glm52-cache.ts +80 -4
  195. package/src/model/glm52-dsa.ts +13 -9
  196. package/src/model/glm52-memory.ts +1 -1
  197. package/src/model/glm52-mla.ts +12 -6
  198. package/src/model/glm52.ts +19 -40
  199. package/src/model/implementation.ts +69 -0
  200. package/src/model/kv-attention-view.ts +67 -0
  201. package/src/model/minicpm5.ts +17 -15
  202. package/src/model/profile.ts +12 -2
  203. package/src/model/qwen-append.ts +12 -0
  204. package/src/model/qwen-conv.ts +52 -0
  205. package/src/model/qwen3-delta-state.ts +74 -0
  206. package/src/model/qwen3-delta.ts +59 -36
  207. package/src/model/qwen3_5-checkpoint.ts +164 -0
  208. package/src/model/qwen3_5.ts +202 -78
  209. package/src/model/rotating-kv-donor.ts +35 -0
  210. package/src/model/rotating-kv-layout.ts +262 -0
  211. package/src/model/rotating-row-transaction.ts +35 -0
  212. package/src/model/speculative-rotating-kv.ts +101 -0
  213. package/src/model/ssm-prefill-padding.ts +39 -0
  214. package/src/model/support.ts +1 -1
  215. package/src/model/trellis-balanced-scatter.ts +51 -0
  216. package/src/model/trellis-linear.ts +672 -0
  217. package/src/model/trellis-shared-m.ts +151 -0
  218. package/src/model/trellis-shared-scatter.ts +144 -0
  219. package/src/model/trellis-splitk-prefill.ts +158 -0
  220. package/src/model/trellis-tiled-prefill.ts +136 -0
  221. package/src/model/trellis-vector-expand.ts +62 -0
  222. package/src/model/trellis-wide-prefill.ts +94 -0
  223. package/src/model/turboquant-codec.ts +83 -0
  224. package/src/model/universal/dense.ts +15 -14
  225. package/src/model/universal/modules.ts +8 -1
  226. package/src/native-pack.ts +6 -5
  227. package/src/pi-provider.ts +6 -64
  228. package/src/pi-web.ts +8 -315
  229. package/src/preflight.ts +31 -15
  230. package/src/prompt-cache.ts +110 -69
  231. package/src/quantize/allocator.ts +1 -1
  232. package/src/quantize/config-writer.ts +10 -3
  233. package/src/quantize/rotate.ts +4 -4
  234. package/src/quantize/trellis.ts +586 -0
  235. package/src/responses.ts +28 -1
  236. package/src/runtime-config.ts +18 -4
  237. package/src/sampler.ts +40 -29
  238. package/src/serve/batch-scheduler.ts +8 -1671
  239. package/src/serve/chat-request.ts +391 -0
  240. package/src/serve/chat-stage.ts +195 -0
  241. package/src/serve/checkpoint-identity.ts +64 -0
  242. package/src/serve/completion-executor.ts +15 -7
  243. package/src/serve/discovery-routes.ts +12 -13
  244. package/src/serve/generation-gateway.ts +183 -213
  245. package/src/serve/http.ts +159 -0
  246. package/src/serve/inference-request.ts +79 -0
  247. package/src/serve/isolate.ts +297 -105
  248. package/src/serve/lab-routes.ts +3 -0
  249. package/src/serve/lane-registry.ts +2 -1
  250. package/src/serve/model-admin-routes.ts +7 -5
  251. package/src/serve/model-binding.ts +43 -0
  252. package/src/serve/model-host.ts +511 -0
  253. package/src/serve/openai-wire.ts +103 -0
  254. package/src/serve/parent-application.ts +56 -0
  255. package/src/serve/pipeline.ts +33 -0
  256. package/src/serve/preparation.ts +33 -0
  257. package/src/serve/request-plan.ts +23 -18
  258. package/src/serve/request-prep.ts +344 -0
  259. package/src/serve/response-lease.ts +24 -0
  260. package/src/serve/responses-client.ts +69 -0
  261. package/src/serve/session-completion-engine.ts +110 -0
  262. package/src/serve/session-search.ts +1 -1
  263. package/src/serve/static-routes.ts +5 -5
  264. package/src/serve/text-completion-stage.ts +104 -0
  265. package/src/serve/token-streams.ts +519 -0
  266. package/src/server.ts +335 -2711
  267. package/src/spec/assistant-rows.ts +92 -0
  268. package/src/spec/assistant-source.ts +31 -55
  269. package/src/spec/cache-identity.ts +22 -0
  270. package/src/spec/deepspec-rows.ts +29 -0
  271. package/src/spec/deepspec-source.ts +16 -14
  272. package/src/spec/dflash-source.ts +36 -12
  273. package/src/spec/drafter.ts +153 -142
  274. package/src/spec/dspark/ab-stats.ts +3 -3
  275. package/src/spec/dspark/calibration.ts +2 -2
  276. package/src/spec/dspark/deepspec-module.ts +97 -122
  277. package/src/spec/dspark/generate-dflash.ts +2 -2
  278. package/src/spec/dspark/generate.ts +2 -2
  279. package/src/spec/dspark/loader.ts +1 -1
  280. package/src/spec/dspark/module-dflash.ts +129 -172
  281. package/src/spec/dspark/module.ts +3 -3
  282. package/src/spec/dspark/quantize-drafter.ts +1 -1
  283. package/src/spec/generate.ts +1 -1
  284. package/src/spec/glm52-mtp-graph.ts +29 -0
  285. package/src/spec/glm52-mtp-rows.ts +132 -0
  286. package/src/spec/glm52-mtp-source.ts +54 -137
  287. package/src/spec/glm52-mtp-state.ts +33 -0
  288. package/src/spec/ngram-source.ts +93 -21
  289. package/src/spec/projected-draft-rows.ts +73 -0
  290. package/src/spec/qwen-mtp-module.ts +171 -0
  291. package/src/spec/qwen-mtp-rows.ts +219 -0
  292. package/src/spec/qwen-mtp-source.ts +147 -195
  293. package/src/spec/qwen-mtp-state.ts +30 -0
  294. package/src/spec/serve-loop.ts +201 -201
  295. package/src/spec/source.ts +110 -13
  296. package/src/spec/two-model-rows.ts +61 -0
  297. package/src/spec/two-model.ts +44 -102
  298. package/src/ssd-cache.ts +99 -19
  299. package/src/ssd-durability.ts +36 -20
  300. package/src/tool-call.ts +51 -14
  301. package/src/train/flash-cce.ts +2 -2
  302. package/src/train/forward.ts +6 -0
  303. package/src/train/loss.ts +1 -1
  304. package/src/train/prefix-shared.ts +5 -1
  305. package/src/train/segmented.ts +5 -3
  306. package/src/train/trainer.ts +6 -6
  307. package/src/vision/prompt.ts +1 -1
  308. package/src/vision/qwen3vl-tower.ts +52 -10
  309. package/src/web/app.html +1 -1
  310. package/src/web/app.js +62 -60
  311. package/src/web/src/adapters-panel.ts +3 -3
  312. package/src/web/src/assistant.ts +2 -36
  313. package/src/web/src/chat.ts +4 -4
  314. package/src/web/src/composer.ts +4 -4
  315. package/src/web/src/hub.ts +1 -1
  316. package/src/web/src/markdown.ts +0 -0
  317. package/src/web/src/memory-panel.ts +1 -1
  318. package/src/web/src/model-picker.ts +1 -1
  319. package/src/web/src/palette.ts +1 -1
  320. package/src/web/src/protocol.ts +3 -39
  321. package/src/web/src/sessions.ts +1 -1
  322. package/src/web/src/ui-catalog.ts +4 -18
  323. package/src/web-assets.ts +47 -0
  324. package/src/weights.ts +55 -9
  325. package/docs/archive/investigations/curve-runs/bisector-route.json +0 -98
  326. package/docs/archive/investigations/curve-runs/bisector-trace.json +0 -1393
  327. package/docs/archive/investigations/curve-runs/curve-terrain.json +0 -1179
  328. package/docs/archive/investigations/curve-runs/curve-terrain.svg +0 -42
  329. package/docs/archive/investigations/hlg-ab.html +0 -34
  330. package/docs/archive/investigations/hlg-explorer.html +0 -238
  331. package/docs/archive/investigations/hlg-figs/cliff.svg +0 -1
  332. package/docs/archive/investigations/hlg-figs/cross.svg +0 -1
  333. package/docs/archive/investigations/hlg-figs/edges.svg +0 -1
  334. package/docs/archive/investigations/hlg-figs/k20-grids.svg +0 -1
  335. package/docs/archive/investigations/hlg-figs/k20-peaks.svg +0 -1
  336. package/docs/archive/investigations/hlg-figs/lw-curve.svg +0 -1
  337. package/docs/archive/investigations/hlg-figs/terrain.svg +0 -1
  338. package/docs/archive/investigations/hlg-report.html +0 -262
  339. package/docs/archive/investigations/hlg-runs/hlg-ab.json +0 -149
  340. package/docs/archive/investigations/hlg-runs/hlg-blind-prompts.md +0 -87
  341. package/docs/archive/investigations/hlg-runs/hlg-blind.json +0 -107
  342. package/docs/archive/investigations/hlg-runs/hlg-cliff.json +0 -197
  343. package/docs/archive/investigations/hlg-runs/hlg-cross.json +0 -505
  344. package/docs/archive/investigations/hlg-runs/hlg-edge.json +0 -388
  345. package/docs/archive/investigations/hlg-runs/hlg-eval1.json +0 -25
  346. package/docs/archive/investigations/hlg-runs/hlg-frontier.json +0 -86
  347. package/docs/archive/investigations/hlg-runs/hlg-grid.json +0 -242
  348. package/docs/archive/investigations/hlg-runs/hlg-grid2.json +0 -343
  349. package/docs/archive/investigations/hlg-runs/hlg-lw-coarse.json +0 -110
  350. package/docs/archive/investigations/hlg-runs/hlg-map.json +0 -383
  351. package/docs/archive/investigations/hlg-runs/run0-original.log +0 -159
  352. package/docs/archive/investigations/hlg-runs/runA-recommended.log +0 -131
  353. package/docs/archive/investigations/hlg-runs/runAA-cliff-cpm5.log +0 -26
  354. package/docs/archive/investigations/hlg-runs/runAB-grid2-e4b.log +0 -18
  355. package/docs/archive/investigations/hlg-runs/runAC-peak-e4b-partial.log +0 -25
  356. package/docs/archive/investigations/hlg-runs/runAD-ab-samples.log +0 -8
  357. package/docs/archive/investigations/hlg-runs/runAE-edge-e4b.log +0 -51
  358. package/docs/archive/investigations/hlg-runs/runAF-logit-calibration.log +0 -10
  359. package/docs/archive/investigations/hlg-runs/runAG-eval-config2.log +0 -16
  360. package/docs/archive/investigations/hlg-runs/runB-gain-variants.log +0 -192
  361. package/docs/archive/investigations/hlg-runs/runC-pivots.log +0 -162
  362. package/docs/archive/investigations/hlg-runs/runD-oetf.log +0 -132
  363. package/docs/archive/investigations/hlg-runs/runE-eotf.log +0 -162
  364. package/docs/archive/investigations/hlg-runs/runF-shaper-working.log +0 -86
  365. package/docs/archive/investigations/hlg-runs/runG-shaper-sweep.log +0 -101
  366. package/docs/archive/investigations/hlg-runs/runH-wsweep.log +0 -176
  367. package/docs/archive/investigations/hlg-runs/runI-asweep.log +0 -176
  368. package/docs/archive/investigations/hlg-runs/runJ-knobmap.log +0 -49
  369. package/docs/archive/investigations/hlg-runs/runK-frontier.log +0 -19
  370. package/docs/archive/investigations/hlg-runs/runL-widemap.log +0 -65
  371. package/docs/archive/investigations/hlg-runs/runM-frontier-emb.log +0 -15
  372. package/docs/archive/investigations/hlg-runs/runN-verify.log +0 -116
  373. package/docs/archive/investigations/hlg-runs/runO-frontier-seed5000.log +0 -15
  374. package/docs/archive/investigations/hlg-runs/runP-grid-AxSm.log +0 -15
  375. package/docs/archive/investigations/hlg-runs/runQ-grid-tgW.log +0 -15
  376. package/docs/archive/investigations/hlg-runs/runR-blind-transcript.log +0 -79
  377. package/docs/archive/investigations/hlg-runs/runS-cross-coherence.log +0 -33
  378. package/docs/archive/investigations/hlg-runs/runT-cross-cpm5.log +0 -33
  379. package/docs/archive/investigations/hlg-runs/runU-cross-12b.log +0 -33
  380. package/docs/archive/investigations/hlg-runs/runV-lw-e4b.log +0 -22
  381. package/docs/archive/investigations/hlg-runs/runW-lw-12b.log +0 -22
  382. package/docs/archive/investigations/hlg-runs/runX-lw-cpm5.log +0 -22
  383. package/docs/archive/investigations/hlg-runs/runY-cliff-e4b.log +0 -26
  384. package/docs/archive/investigations/hlg-runs/runZ-cliff-12b.log +0 -26
  385. package/docs/archive/mlx-bun-lab-report.html +0 -275
  386. package/docs/archive/wwdc-mlx-bun.html +0 -848
  387. package/docs/design/adapters-end-to-end.md +0 -205
  388. package/docs/design/batching-perf-path.md +0 -255
  389. package/docs/design/batching-v2-plan.md +0 -529
  390. package/docs/design/bucketing-stage.md +0 -197
  391. package/docs/design/compat-cli-surface-design.md +0 -230
  392. package/docs/design/docs-reorg-plan.md +0 -165
  393. package/docs/design/dspark-serving-program.md +0 -371
  394. package/docs/design/dspark-speculative-decoding.md +0 -318
  395. package/docs/design/grammar-spec-batching-integration.md +0 -301
  396. package/docs/design/memory-inference-path.md +0 -422
  397. package/docs/design/memory-synthesis.md +0 -287
  398. package/docs/design/memory-system.md +0 -237
  399. package/docs/design/mlx-lm-serving-execution-seam.md +0 -81
  400. package/docs/design/mlx-lm-tool-parity-plan.md +0 -545
  401. package/docs/design/omlx-adoption-map.md +0 -98
  402. package/docs/design/orpo-dynamic-lambda.md +0 -220
  403. package/docs/design/orpo-future-enhancements.md +0 -340
  404. package/docs/design/paged-kv-cache.md +0 -214
  405. package/docs/design/parallel-slots.md +0 -567
  406. package/docs/design/parity-tier-dag.md +0 -161
  407. package/docs/design/repo-cleanup-plan.md +0 -231
  408. package/docs/design/runtime-isolation.md +0 -263
  409. package/docs/design/segmented-backward-training.md +0 -543
  410. package/docs/design/spec-decode-larger-targets.md +0 -229
  411. package/docs/design/ssd-kv-cold-tier.md +0 -415
  412. package/docs/design/structured-output.md +0 -484
  413. package/docs/design/tauri-desktop-app.md +0 -127
  414. package/docs/design/the-dreaming-master-plan.md +0 -445
  415. package/docs/design/turboquant-kv.md +0 -235
  416. package/docs/design/turboquant-weights.md +0 -467
  417. package/docs/design/w4a16-compute-precision-spike.md +0 -232
  418. package/docs/design/web-chat-beat-matrix.md +0 -315
  419. package/docs/design/write-pipeline-entity.md +0 -468
  420. package/docs/planning/IDEAS.md +0 -69
  421. package/docs/reference/embedding.md +0 -197
  422. package/docs/reference/features-matrix.md +0 -101
  423. package/docs/reference/orpo-quickstart.md +0 -135
  424. package/src/flags.ts +0 -11
  425. /package/docs/{design → archive/investigations}/colibri-glm52-port.md +0 -0
  426. /package/docs/{planning → archive/planning}/chunk-task-roadmap.md +0 -0
  427. /package/docs/{planning → archive/planning}/curve-sampler-research-plan.md +0 -0
  428. /package/docs/{planning → archive/planning}/memory-docs-and-dag-plan.md +0 -0
  429. /package/docs/{planning → archive/planning}/pi-integration-review.md +0 -0
  430. /package/docs/{planning → archive/planning}/release-notes-v0.2.0.md +0 -0
  431. /package/src/{memory-plan.ts → admission-plan.ts} +0 -0
  432. /package/{docs/archive/investigations → src/serve/assets}/curve-terrain.html +0 -0
  433. /package/{docs/dag → src/serve/assets}/training-inference-map.html +0 -0
@@ -28,8 +28,32 @@ import { Weights } from "../weights";
28
28
  import { MlxArray } from "../mlx/array";
29
29
  import { Dtype } from "../mlx/ffi";
30
30
  import * as ops from "../mlx/ops";
31
+ import { disposeResources } from "../engine/resources";
31
32
  import type { SharedKv } from "../model/gemma4";
32
33
 
34
+ /** The graph borrows donor attention; storage owns validity and encoding. */
35
+ export interface AssistantAttention {
36
+ attend(query: MlxArray, scale: number, window: number | null): MlxArray;
37
+ }
38
+ export interface AssistantDonors { sliding: AssistantAttention; full: AssistantAttention; }
39
+
40
+ /** Legacy plain donor adapter. The common graph never reads cache geometry. */
41
+ export function plainAssistantDonors(shared: { sliding: [MlxArray, MlxArray]; full: [MlxArray, MlxArray] },
42
+ position: number): AssistantDonors {
43
+ const bind = ([keys, values]: [MlxArray, MlxArray]): AssistantAttention => ({
44
+ attend(query, scale, window) {
45
+ const length = keys.shape[2]!;
46
+ const from = window === null ? 0 : Math.max(0, Math.max(0, position - window + 1) - (position - length + 1));
47
+ using floats = from ? MlxArray.fromFloat32(Float32Array.from({ length }, (_, i) => i < from ? -1e9 : 0), [1,1,1,length]) : null;
48
+ using mask = floats?.astype(keys.dtype);
49
+ return ops.sdpa(query, keys, values, scale, mask ? "array" : "", mask ?? null);
50
+ },
51
+ });
52
+ return { sliding: bind(shared.sliding), full: bind(shared.full) };
53
+ }
54
+
55
+ export interface DrafterRowsStep { tokens: MlxArray; nextHidden: MlxArray; }
56
+
33
57
  export interface DrafterStep {
34
58
  /** Drafted token id. */
35
59
  token: number;
@@ -64,6 +88,7 @@ export class GemmaAssistantDrafter {
64
88
  readonly topK: number;
65
89
  readonly vocabPerCentroid: number;
66
90
  #w: Weights;
91
+ #owned: MlxArray[] = [];
67
92
  #blocks: Block[] = [];
68
93
  readonly useCentroids: boolean;
69
94
  #prePT: MlxArray; // pre_projection transposed [in, out]
@@ -84,73 +109,80 @@ export class GemmaAssistantDrafter {
84
109
  this.vocabPerCentroid = Math.floor(t.vocab_size / this.numCentroids);
85
110
  this.#w = w;
86
111
 
87
- const T = (name: string) => w.tensor(name);
88
- const transposed = (name: string): MlxArray => {
89
- const a = ops.transposeAxes(T(name), [1, 0]);
90
- const c = ops.contiguous(a);
91
- a.dispose();
92
- c.eval();
93
- return c;
94
- };
95
- this.#prePT = transposed("pre_projection.weight");
96
- this.#postPT = transposed("post_projection.weight");
97
- this.#embed = T("model.embed_tokens.weight");
98
- this.#norm = T("model.norm.weight");
99
- // Head variant: only the small drafters ship the centroid tensors.
100
- // The 12B/26B artifacts ship a tied embed_tokens head instead (their
101
- // config still declares num_centroids — ignore it, trust the tensors).
102
- this.useCentroids = w.has("masked_embedding.centroids.weight");
103
- if (this.useCentroids) {
104
- this.#centroidsT = transposed("masked_embedding.centroids.weight");
105
- const ord64 = T("masked_embedding.token_ordering");
106
- const ord32 = ord64.astype(Dtype.int32);
107
- this.#ordering = ops.reshape(ord32, [this.numCentroids, this.vocabPerCentroid]);
108
- this.#ordering.eval();
109
- ord32.dispose();
110
- }
112
+ const own = (array: MlxArray) => { this.#owned.push(array); return array; };
113
+ try {
114
+ const T = (name: string) => w.tensor(name);
115
+ // Keep the oracle's strided weight.T: a contiguous transpose changes
116
+ // M4 matmul rounding and allocates a second copy of every linear weight.
117
+ const transposed = (name: string): MlxArray => {
118
+ const c = own(ops.transposeAxes(T(name), [1, 0]));
119
+ c.eval();
120
+ return c;
121
+ };
122
+ this.#prePT = transposed("pre_projection.weight");
123
+ this.#postPT = transposed("post_projection.weight");
124
+ this.#embed = T("model.embed_tokens.weight");
125
+ this.#norm = T("model.norm.weight");
126
+ // Head variant: only the small drafters ship the centroid tensors.
127
+ // The 12B/26B artifacts ship a tied embed_tokens head instead (their
128
+ // config still declares num_centroids — ignore it, trust the tensors).
129
+ this.useCentroids = w.has("masked_embedding.centroids.weight");
130
+ if (this.useCentroids) {
131
+ this.#centroidsT = transposed("masked_embedding.centroids.weight");
132
+ const ord64 = T("masked_embedding.token_ordering");
133
+ const ord32 = ord64.astype(Dtype.int32);
134
+ this.#ordering = own(ops.reshape(ord32, [this.numCentroids, this.vocabPerCentroid]));
135
+ this.#ordering.eval();
136
+ ord32.dispose();
137
+ }
111
138
 
112
- const ropeP = t.rope_parameters ?? {};
113
- for (let i = 0; i < t.num_hidden_layers; i++) {
114
- const layerType = t.layer_types[i];
115
- const isFull = layerType === "full_attention";
116
- const headDim = isFull ? t.global_head_dim : t.head_dim;
117
- const rp = ropeP[layerType] ?? {};
118
- let ropeBase: number | null = rp.rope_theta ?? (isFull ? 1e6 : 1e4);
119
- let ropeFreqs: MlxArray | null = null;
120
- const partial = rp.partial_rotary_factor ?? 1.0;
121
- if (isFull && partial < 1.0) {
122
- // ProportionalRoPE freqs, matching the target's donor-K rope
123
- const rotated = Math.floor(headDim * partial);
124
- const n = headDim / 2;
125
- const freqs = new Float32Array(n).fill(Infinity);
126
- for (let k = 0; k < rotated / 2; k++)
127
- freqs[k] = Math.pow(ropeBase!, (2 * k) / headDim);
128
- ropeFreqs = MlxArray.fromFloat32(freqs, [n]);
129
- ropeBase = null;
139
+ const ropeP = t.rope_parameters ?? {};
140
+ for (let i = 0; i < t.num_hidden_layers; i++) {
141
+ const layerType = t.layer_types[i];
142
+ const isFull = layerType === "full_attention";
143
+ const headDim = isFull ? t.global_head_dim : t.head_dim;
144
+ const rp = ropeP[layerType] ?? {};
145
+ let ropeBase: number | null = rp.rope_theta ?? (isFull ? 1e6 : 1e4);
146
+ let ropeFreqs: MlxArray | null = null;
147
+ const partial = rp.partial_rotary_factor ?? 1.0;
148
+ if (isFull && partial < 1.0) {
149
+ // ProportionalRoPE freqs, matching the target's donor-K rope
150
+ const rotated = Math.floor(headDim * partial);
151
+ const n = headDim / 2;
152
+ const freqs = new Float32Array(n).fill(Infinity);
153
+ for (let k = 0; k < rotated / 2; k++)
154
+ freqs[k] = Math.pow(ropeBase!, (2 * k) / headDim);
155
+ ropeFreqs = own(MlxArray.fromFloat32(freqs, [n]));
156
+ ropeBase = null;
157
+ }
158
+ const p = `model.layers.${i}`;
159
+ this.#blocks.push({
160
+ layerType, headDim, ropeBase, ropeFreqs,
161
+ qProj: transposed(`${p}.self_attn.q_proj.weight`),
162
+ oProj: transposed(`${p}.self_attn.o_proj.weight`),
163
+ qNorm: T(`${p}.self_attn.q_norm.weight`),
164
+ inputNorm: T(`${p}.input_layernorm.weight`),
165
+ postAttnNorm: T(`${p}.post_attention_layernorm.weight`),
166
+ preFfNorm: T(`${p}.pre_feedforward_layernorm.weight`),
167
+ postFfNorm: T(`${p}.post_feedforward_layernorm.weight`),
168
+ gateProj: transposed(`${p}.mlp.gate_proj.weight`),
169
+ upProj: transposed(`${p}.mlp.up_proj.weight`),
170
+ downProj: transposed(`${p}.mlp.down_proj.weight`),
171
+ layerScalar: T(`${p}.layer_scalar`),
172
+ });
130
173
  }
131
- const p = `model.layers.${i}`;
132
- this.#blocks.push({
133
- layerType, headDim, ropeBase, ropeFreqs,
134
- qProj: transposed(`${p}.self_attn.q_proj.weight`),
135
- oProj: transposed(`${p}.self_attn.o_proj.weight`),
136
- qNorm: T(`${p}.self_attn.q_norm.weight`),
137
- inputNorm: T(`${p}.input_layernorm.weight`),
138
- postAttnNorm: T(`${p}.post_attention_layernorm.weight`),
139
- preFfNorm: T(`${p}.pre_feedforward_layernorm.weight`),
140
- postFfNorm: T(`${p}.post_feedforward_layernorm.weight`),
141
- gateProj: transposed(`${p}.mlp.gate_proj.weight`),
142
- upProj: transposed(`${p}.mlp.up_proj.weight`),
143
- downProj: transposed(`${p}.mlp.down_proj.weight`),
144
- layerScalar: T(`${p}.layer_scalar`),
145
- });
146
- }
174
+ } catch (error) { disposeResources(this.#owned.splice(0)); throw error; }
147
175
  }
148
176
 
149
177
  static async load(modelDir: string): Promise<GemmaAssistantDrafter> {
150
178
  const cfg = (await Bun.file(`${modelDir}/config.json`).json()) as Record<string, any>;
151
- return new GemmaAssistantDrafter(await Weights.open(modelDir), cfg);
179
+ const weights = await Weights.open(modelDir);
180
+ try { return new GemmaAssistantDrafter(weights, cfg); }
181
+ catch (error) { weights.dispose(); throw error; }
152
182
  }
153
183
 
184
+ dispose(): void { disposeResources([...this.#owned.splice(0), this.#w]); }
185
+
154
186
  /** f32-internal RMSNorm (reference _RMSNorm casts through float32). */
155
187
  #rms(x: MlxArray, weight: MlxArray): MlxArray {
156
188
  const f = x.astype(Dtype.float32);
@@ -161,49 +193,77 @@ export class GemmaAssistantDrafter {
161
193
  return back;
162
194
  }
163
195
 
164
- /** One draft step. All inputs (1,1,·); sharedKv holds the target's
165
- * donor K/V in chronological order. position = target's last position. */
166
- forward(
167
- lastTokenEmb: MlxArray, targetHidden: MlxArray,
168
- sharedKv: { sliding: [MlxArray, MlxArray]; full: [MlxArray, MlxArray] },
169
- position: number,
170
- ): DrafterStep {
171
- let h = ops.concatAxis([lastTokenEmb, targetHidden], 2); // (1,1,2*backbone)
172
- h = disposing(h, ops.matmul(h, this.#prePT)); // (1,1,256)
196
+ /** The request adapter consumes the same graph as a batch of one.
197
+ * Donors are chronological; position is the target's last position. */
198
+ forward(lastTokenEmb: MlxArray, targetHidden: MlxArray,
199
+ sharedKv: { sliding: [MlxArray, MlxArray]; full: [MlxArray, MlxArray] }, position: number): DrafterStep {
200
+ const result = this.forwardRows(lastTokenEmb, targetHidden, plainAssistantDonors(sharedKv, position), position);
201
+ try { return { token: ops.itemUint32(result.tokens), nextHidden: result.nextHidden }; }
202
+ catch (error) { result.nextHidden.dispose(); throw error; }
203
+ finally { result.tokens.dispose(); }
204
+ }
173
205
 
174
- for (const blk of this.#blocks) {
175
- const [k, v] = blk.layerType === "sliding_attention" ? sharedKv.sliding : sharedKv.full;
176
- const kLen = k.shape[2]!;
206
+ #sampleRows(h: MlxArray, B: number): MlxArray {
207
+ if (this.useCentroids) {
208
+ using scores = ops.matmul(h, this.#centroidsT!);
209
+ using flat = ops.reshape(scores, [B, this.numCentroids]);
210
+ using neg = ops.neg(flat);
211
+ using partition = ops.argpartitionAxis(neg, this.topK - 1, -1);
212
+ using top = partition.slice([0, 0], [B, this.topK]);
213
+ using topFlat = ops.reshape(top, [B * this.topK]);
214
+ using candidates = ops.takeAxis(this.#ordering!, topFlat, 0);
215
+ const count = this.topK * this.vocabPerCentroid;
216
+ using ids = ops.reshape(candidates, [B, count]);
217
+ using flatIds = ops.reshape(ids, [B * count]);
218
+ using embeddings = ops.takeAxis(this.#embed, flatIds, 0);
219
+ using matrix = ops.reshape(embeddings, [B, count, this.hidden]);
220
+ using vector = ops.reshape(h, [B, 1, this.hidden]);
221
+ // The oracle rounds each bf16 product before reduction. Matmul's
222
+ // accumulation changes candidate rankings on M1, even at identical h.
223
+ using products = ops.mul(matrix, vector);
224
+ using candidateScores = ops.sumAxis(products, -1, false);
225
+ using maximum = ops.maxAxis(candidateScores, -1, true);
226
+ using winners = ops.equal(candidateScores, maximum);
227
+ // Sparse full-vocabulary argmax chooses the lowest token ID on a tie.
228
+ // Apply that rule directly to the candidates without a vocab-size scatter.
229
+ using sentinel = ops.fromInt32([this.#embed.shape[0]!], []);
230
+ using eligible = ops.where(winners, ids, sentinel);
231
+ using selected = ops.minAxis(eligible, -1, false);
232
+ return selected.astype(Dtype.uint32);
233
+ }
234
+ using rows = ops.reshape(h, [B, this.hidden]);
235
+ using vector = B === 1 ? ops.reshape(h, [this.hidden, 1]) : ops.transposeAxes(rows, [1, 0]);
236
+ using scores = ops.matmul(this.#embed, vector);
237
+ using flat = B === 1 ? ops.reshape(scores, [1, this.#embed.shape[0]!]) : ops.transposeAxes(scores, [1, 0]);
238
+ return ops.argmaxAxis(flat, -1);
239
+ }
177
240
 
178
- // sliding-window additive mask over cached K positions
179
- let mask: MlxArray | null = null;
180
- if (blk.layerType === "sliding_attention") {
181
- const firstCached = position - kLen + 1;
182
- const windowStart = Math.max(0, position - this.slidingWindow + 1);
183
- const allowedFrom = Math.max(0, windowStart - firstCached);
184
- if (allowedFrom > 0) {
185
- const m = new Float32Array(kLen);
186
- for (let i = 0; i < allowedFrom; i++) m[i] = -1e9;
187
- const mf = MlxArray.fromFloat32(m, [1, 1, 1, kLen]);
188
- mask = mf.astype(k.dtype);
189
- mf.dispose();
190
- }
191
- }
241
+ /** Numerical graph only. Callers supply donor validity masks for different
242
+ * row positions; token selection remains on device across the draft chain. */
243
+ forwardRows(lastTokenEmb: MlxArray, targetHidden: MlxArray,
244
+ donors: AssistantDonors, position: number | MlxArray): DrafterRowsStep {
245
+ const B = lastTokenEmb.shape[0]!;
246
+ let h = ops.concatAxis([lastTokenEmb, targetHidden], 2); // (B,1,2*backbone)
247
+ h = disposing(h, ops.matmul(h, this.#prePT)); // (B,1,256)
192
248
 
249
+ for (const blk of this.#blocks) {
250
+ const donor = blk.layerType === "sliding_attention" ? donors.sliding : donors.full;
193
251
  const residual = h;
194
252
  let x = this.#rms(h, blk.inputNorm);
195
253
  // Q-only attention
196
254
  let q = ops.matmul(x, blk.qProj);
197
255
  x.dispose();
198
- q = disposing(q, ops.reshape(q, [1, 1, this.nHeads, blk.headDim]));
256
+ q = disposing(q, ops.reshape(q, [B, 1, this.nHeads, blk.headDim]));
199
257
  q = disposing(q, this.#rms(q, blk.qNorm));
200
258
  q = disposing(q, ops.transposeAxes(q, [0, 2, 1, 3]));
201
- q = disposing(q, ops.rope(q, blk.headDim, blk.ropeBase, position, blk.ropeFreqs));
202
- let attn = ops.sdpa(q, k, v, Math.pow(blk.headDim, -0.5), mask ? "array" : "", mask);
259
+ q = disposing(q, typeof position === "number"
260
+ ? ops.rope(q, blk.headDim, blk.ropeBase, position, blk.ropeFreqs)
261
+ : ops.ropeDynamic(q, blk.headDim, blk.ropeBase, position, blk.ropeFreqs));
262
+ let attn = donor.attend(q, Math.pow(blk.headDim, -0.5),
263
+ blk.layerType === "sliding_attention" ? this.slidingWindow : null);
203
264
  q.dispose();
204
- mask?.dispose();
205
265
  attn = disposing(attn, ops.transposeAxes(attn, [0, 2, 1, 3]));
206
- attn = disposing(attn, ops.reshape(attn, [1, 1, this.nHeads * blk.headDim]));
266
+ attn = disposing(attn, ops.reshape(attn, [B, 1, this.nHeads * blk.headDim]));
207
267
  attn = disposing(attn, ops.matmul(attn, blk.oProj));
208
268
  attn = disposing(attn, this.#rms(attn, blk.postAttnNorm));
209
269
  h = ops.add(residual, attn);
@@ -231,59 +291,10 @@ export class GemmaAssistantDrafter {
231
291
 
232
292
  h = disposing(h, this.#rms(h, this.#norm));
233
293
 
234
- let token: number;
235
- if (this.useCentroids) {
236
- // centroid decode → drafted token (argmax-equivalent shortcut)
237
- const cScores = ops.matmul(h, this.#centroidsT!); // (1,1,2048)
238
- const flat = ops.reshape(cScores, [1, this.numCentroids]);
239
- cScores.dispose();
240
- const neg = ops.neg(flat);
241
- flat.dispose();
242
- const part = ops.argpartitionAxis(neg, this.topK - 1, -1);
243
- neg.dispose();
244
- const topIdx = part.slice([0, 0], [1, this.topK]); // (1, topK)
245
- part.dispose();
246
- const topFlat = ops.reshape(topIdx, [this.topK]);
247
- topIdx.dispose();
248
- const candIds = ops.takeAxis(this.#ordering!, topFlat, 0); // (topK, vpc) int32
249
- topFlat.dispose();
250
- const candFlat = ops.reshape(candIds, [this.topK * this.vocabPerCentroid]);
251
- candIds.dispose();
252
- const candEmb = ops.takeAxis(this.#embed, candFlat, 0); // (topK*vpc, hidden)
253
- const hVec = ops.reshape(h, [this.hidden, 1]);
254
- const scores = ops.matmul(candEmb, hVec); // (topK*vpc, 1)
255
- candEmb.dispose();
256
- hVec.dispose();
257
- const scoresFlat = ops.reshape(scores, [1, this.topK * this.vocabPerCentroid]);
258
- scores.dispose();
259
- const am = ops.argmaxAxis(scoresFlat, -1);
260
- scoresFlat.dispose();
261
- const winner = ops.itemUint32(am);
262
- am.dispose();
263
- const tokArr = candFlat.slice([winner], [winner + 1]);
264
- candFlat.dispose();
265
- const tokU32 = tokArr.astype(Dtype.uint32);
266
- tokArr.dispose();
267
- token = ops.itemUint32(tokU32);
268
- tokU32.dispose();
269
- } else {
270
- // tied-embedding head: token = argmax_v (embed[v] · h) over the
271
- // full vocab — the dense form the centroid head approximates.
272
- const V = this.#embed.shape[0]!;
273
- const hVec = ops.reshape(h, [this.hidden, 1]);
274
- const scores = ops.matmul(this.#embed, hVec); // (vocab, 1)
275
- hVec.dispose();
276
- const scoresFlat = ops.reshape(scores, [1, V]);
277
- scores.dispose();
278
- const am = ops.argmaxAxis(scoresFlat, -1);
279
- scoresFlat.dispose();
280
- token = ops.itemUint32(am);
281
- am.dispose();
282
- }
283
-
284
- const nextHidden = ops.matmul(h, this.#postPT); // (1,1,backbone)
294
+ const tokens = this.#sampleRows(h, B);
295
+ const nextHidden = ops.matmul(h, this.#postPT); // (B,1,backbone)
285
296
  h.dispose();
286
- return { token, nextHidden };
297
+ return { tokens, nextHidden };
287
298
  }
288
299
  }
289
300
 
@@ -1,6 +1,6 @@
1
1
  // Model-free math for the Phase-1c drafter acceptance A/B
2
- // (docs/design/dspark-serving-program.md; runner:
3
- // scripts/dspark-drafter-ab.ts). THE gate for every drafter-quantization
2
+ // (docs/design/speculative-decoding.md; runner:
3
+ // scripts/dspark.ts ab). THE gate for every drafter-quantization
4
4
  // experiment: same target, same prompts, temp 0 — drafter A vs drafter B.
5
5
  //
6
6
  // Paired design: prompts are the pairing unit, so per-prompt deltas cancel
@@ -76,7 +76,7 @@ export function summarizeArm(results: AbPromptResult[]): AbArmSummary {
76
76
  }
77
77
 
78
78
  /** Phase-1d exit: acceptance drop ≤ maxDropPts absolute AND wall-clock
79
- * strictly improves (docs/design/dspark-serving-program.md 1d). */
79
+ * strictly improves (docs/design/speculative-decoding.md 1d). */
80
80
  export function pairedVerdict(
81
81
  aResults: AbPromptResult[],
82
82
  bResults: AbPromptResult[],
@@ -2,7 +2,7 @@
2
2
  // confidence thresholds from real (confidence, accepted) verify outcomes, so
3
3
  // the scheduler in module-dflash.ts#forwardInfer prunes positions the
4
4
  // confidence head can't actually call. Pure math, no MLX/GPU here: the
5
- // caller (scripts/dspark-calibrate.ts) collects samples off a live model via
5
+ // caller (scripts/dspark.ts calibrate) collects samples off a live model via
6
6
  // dflashGenerate's onRound hook, this module just fits.
7
7
  //
8
8
  // VERIFIED vs the paper + reference (2026-07-06 audit, arXiv:2607.05147 +
@@ -14,7 +14,7 @@
14
14
  // survival products, feeding Alg-1's throughput-maximizing scheduler with a
15
15
  // profiled SPS(B) cost table) — that machinery lives in DeepSeek's UNRELEASED
16
16
  // production serving layer, not in DeepSpec. Paper-faithful STS/Alg-1 is a
17
- // future Lab item; details in docs/design/dspark-speculative-decoding.md
17
+ // future Lab item; details in docs/design/speculative-decoding.md
18
18
  // "DeepSpec ground truth". The isotonic-style "smallest τ meeting a target
19
19
  // precision, Laplace-smoothed" fit below is ours (the reference ships no
20
20
  // calibrator at all — raw sigmoid vs a hand-set threshold).