mlx-bun 0.2.0 → 0.3.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 (364) hide show
  1. package/README.md +71 -588
  2. package/docs/README.md +91 -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/{design → archive/investigations}/optimization_plan.md +1 -1
  8. package/docs/{design → archive/investigations}/pre-colibri-stabilization.md +5 -5
  9. package/docs/{design → archive/investigations}/the-dreaming-handoff.md +2 -2
  10. package/docs/design/batching.md +569 -0
  11. package/docs/design/decode-speed-program.md +3178 -169
  12. package/docs/design/dreaming-nightly-pipeline.md +675 -282
  13. package/docs/design/generic-model-support.md +579 -334
  14. package/docs/design/kv-cache.md +680 -0
  15. package/docs/design/orpo-training.md +673 -1239
  16. package/docs/design/speculative-decoding.md +1627 -0
  17. package/docs/design/turboquant.md +2102 -0
  18. package/docs/design/unified-engine-frontier-plan.md +1831 -727
  19. package/docs/design/web-chat-redesign.md +666 -1083
  20. package/docs/planning/PRODUCT_ROADMAP.md +34 -1
  21. package/docs/planning/release-notes-v0.3.0.md +35 -0
  22. package/docs/planning/video-series.md +2 -2
  23. package/docs/reference/benchmarks.md +1162 -0
  24. package/docs/reference/cli.md +394 -159
  25. package/docs/reference/distribution.md +321 -182
  26. package/docs/reference/environment.md +348 -0
  27. package/docs/reference/glossary.md +39 -0
  28. package/docs/reference/library-api.md +566 -168
  29. package/docs/reference/memory.md +227 -64
  30. package/docs/reference/models.md +104 -6
  31. package/docs/reference/server-api.md +886 -425
  32. package/docs/reference/server-config.md +638 -330
  33. package/docs/reference/training.md +393 -254
  34. package/docs/reference/troubleshooting.md +166 -0
  35. package/package.json +9 -4
  36. package/src/audio/decode.ts +2 -2
  37. package/src/audio/features.ts +2 -2
  38. package/src/backends/mlx/autoregressive.ts +108 -0
  39. package/src/backends/mlx/batch-group.ts +1646 -0
  40. package/src/backends/mlx/diffusion.ts +39 -0
  41. package/src/backends/mlx/draft-target.ts +47 -0
  42. package/src/backends/mlx/evaluation.ts +105 -0
  43. package/src/backends/mlx/fill-append.ts +45 -0
  44. package/src/backends/mlx/gateway-binding.ts +71 -0
  45. package/src/backends/mlx/graph.ts +38 -0
  46. package/src/backends/mlx/memory-client.ts +189 -0
  47. package/src/backends/mlx/memory-guard.ts +40 -0
  48. package/src/backends/mlx/methods.ts +90 -0
  49. package/src/backends/mlx/model-prompt.ts +164 -0
  50. package/src/backends/mlx/model-serving.ts +79 -0
  51. package/src/backends/mlx/prefill.ts +33 -0
  52. package/src/backends/mlx/request-policy.ts +20 -0
  53. package/src/backends/mlx/rollback.ts +51 -0
  54. package/src/backends/mlx/serial-executor.ts +273 -0
  55. package/src/backends/mlx/speculative.ts +114 -0
  56. package/src/backends/mlx/state-views.ts +26 -0
  57. package/src/backends/mlx/text-engine.ts +73 -0
  58. package/src/cli.ts +58 -25
  59. package/src/client.ts +66 -0
  60. package/src/config.ts +21 -4
  61. package/src/contracts/completion.ts +16 -0
  62. package/src/contracts/execution.ts +49 -0
  63. package/src/contracts/generation.ts +103 -0
  64. package/src/contracts/host.ts +7 -0
  65. package/src/contracts/jobs.ts +66 -0
  66. package/src/contracts/pi-provider.ts +30 -0
  67. package/src/contracts/pi.ts +259 -0
  68. package/src/contracts/resources.ts +18 -0
  69. package/src/contracts/scheduling.ts +27 -0
  70. package/src/contracts/tsconfig.json +14 -0
  71. package/src/diffusion/diffusion-generate.ts +218 -153
  72. package/src/embed.ts +1 -1
  73. package/src/engine/admission.ts +59 -0
  74. package/src/engine/cancellation.ts +38 -0
  75. package/src/engine/engine.ts +56 -0
  76. package/src/engine/execution-coordinator.ts +70 -0
  77. package/src/engine/execution-plan.ts +51 -0
  78. package/src/engine/resources.ts +42 -0
  79. package/src/engine/scheduler.ts +67 -0
  80. package/src/engine/session.ts +247 -0
  81. package/src/eval/README.md +44 -1
  82. package/src/eval/kl.ts +236 -3
  83. package/src/eval/reference-logits.ts +207 -0
  84. package/src/eval/runner.ts +8 -96
  85. package/src/fill/echo-index.ts +188 -0
  86. package/src/fill/fill-session.ts +452 -0
  87. package/src/fill/proposal.ts +68 -0
  88. package/src/fill/schema-rows.ts +506 -0
  89. package/src/fill/tool-boundary.ts +103 -0
  90. package/src/fit.ts +1 -1
  91. package/src/generate.ts +656 -268
  92. package/src/grammar.ts +12 -7
  93. package/src/harness-pi.ts +14 -33
  94. package/src/hub-rest.ts +4 -4
  95. package/src/index.ts +7 -0
  96. package/src/inference/denoising.ts +17 -0
  97. package/src/inference/graph.ts +33 -0
  98. package/src/inference/prefill.ts +39 -0
  99. package/src/inference/rollback.ts +7 -0
  100. package/src/jobs/db.ts +4 -0
  101. package/src/jobs/index.ts +2 -0
  102. package/src/jobs/job-entry.ts +12 -12
  103. package/src/jobs/runner.ts +98 -13
  104. package/src/jobs/task-client.ts +19 -0
  105. package/src/jobs/types.ts +2 -58
  106. package/src/kv-store.ts +109 -49
  107. package/src/lab/README.md +18 -0
  108. package/src/{assets → lab/curve}/curve-designer.html +2 -2
  109. package/src/{curve-sampler.ts → lab/curve/curve-sampler.ts} +2 -2
  110. package/src/{expert-trace.ts → lab/expert-trace/expert-trace.ts} +5 -5
  111. package/src/{model → lab/paged-kv}/paged-kv.ts +9 -6
  112. package/src/library.ts +40 -0
  113. package/src/lora.ts +18 -0
  114. package/src/media-fetch.ts +1 -1
  115. package/src/memory/article.ts +1 -1
  116. package/src/memory/chunk.ts +1 -1
  117. package/src/memory/model.ts +30 -169
  118. package/src/memory/prompts.ts +1 -1
  119. package/src/memory/rest.ts +1 -1
  120. package/src/memory/schedule.ts +1 -1
  121. package/src/memory/stages.ts +4 -1
  122. package/src/memory/vault.ts +1 -3
  123. package/src/mlx/array.ts +9 -10
  124. package/src/mlx/compile.ts +12 -2
  125. package/src/mlx/ffi.ts +58 -11
  126. package/src/mlx/materialize.ts +23 -0
  127. package/src/mlx/metal-kernel.ts +10 -11
  128. package/src/mlx/ops.ts +33 -13
  129. package/src/mlx/quantized-rows.ts +36 -0
  130. package/src/mlx/token-bitmask.ts +52 -0
  131. package/src/mlx/turboquant-kv-decode.ts +82 -0
  132. package/src/mlx/turboquant-kv-inverse.ts +122 -0
  133. package/src/mlx/turboquant-ops.ts +33 -3
  134. package/src/mlx/turboquant-tables.ts +2 -2
  135. package/src/model/batched-mask.ts +8 -2
  136. package/src/model/batched-quant.ts +1 -1
  137. package/src/model/batched-rotating-quant.ts +2 -2
  138. package/src/model/batched-rotating.ts +1 -1
  139. package/src/model/compiled-decode.ts +1 -1
  140. package/src/model/diffusion-gemma.ts +8 -8
  141. package/src/model/factory.ts +76 -33
  142. package/src/model/fingerprint.ts +1 -1
  143. package/src/model/flash-attention.ts +3 -3
  144. package/src/model/gemma4-base.ts +26 -9
  145. package/src/model/gemma4.ts +6 -6
  146. package/src/model/generated/gemma4-12b.ts +2 -2
  147. package/src/model/generated/gemma4-26b.ts +2 -2
  148. package/src/model/generated/gemma4-e4b.ts +2 -2
  149. package/src/model/glm52-dsa.ts +13 -9
  150. package/src/model/glm52-memory.ts +1 -1
  151. package/src/model/implementation.ts +69 -0
  152. package/src/model/minicpm5.ts +6 -8
  153. package/src/model/profile.ts +12 -2
  154. package/src/model/qwen-append.ts +12 -0
  155. package/src/model/qwen-conv.ts +52 -0
  156. package/src/model/qwen3_5-checkpoint.ts +164 -0
  157. package/src/model/qwen3_5.ts +140 -56
  158. package/src/model/support.ts +1 -1
  159. package/src/model/trellis-balanced-scatter.ts +51 -0
  160. package/src/model/trellis-linear.ts +672 -0
  161. package/src/model/trellis-shared-m.ts +151 -0
  162. package/src/model/trellis-shared-scatter.ts +144 -0
  163. package/src/model/trellis-splitk-prefill.ts +158 -0
  164. package/src/model/trellis-tiled-prefill.ts +136 -0
  165. package/src/model/trellis-vector-expand.ts +62 -0
  166. package/src/model/trellis-wide-prefill.ts +94 -0
  167. package/src/model/universal/dense.ts +1 -1
  168. package/src/model/universal/modules.ts +8 -1
  169. package/src/native-pack.ts +6 -5
  170. package/src/pi-provider.ts +6 -64
  171. package/src/pi-web.ts +8 -315
  172. package/src/prompt-cache.ts +96 -53
  173. package/src/quantize/allocator.ts +1 -1
  174. package/src/quantize/config-writer.ts +10 -3
  175. package/src/quantize/rotate.ts +4 -4
  176. package/src/quantize/trellis.ts +586 -0
  177. package/src/responses.ts +28 -1
  178. package/src/runtime-config.ts +18 -4
  179. package/src/sampler.ts +4 -4
  180. package/src/serve/batch-scheduler.ts +8 -1671
  181. package/src/serve/chat-request.ts +391 -0
  182. package/src/serve/chat-stage.ts +195 -0
  183. package/src/serve/checkpoint-identity.ts +64 -0
  184. package/src/serve/completion-executor.ts +15 -7
  185. package/src/serve/discovery-routes.ts +12 -13
  186. package/src/serve/generation-gateway.ts +154 -193
  187. package/src/serve/http.ts +159 -0
  188. package/src/serve/inference-request.ts +79 -0
  189. package/src/serve/isolate.ts +297 -105
  190. package/src/serve/lab-routes.ts +3 -0
  191. package/src/serve/lane-registry.ts +2 -1
  192. package/src/serve/model-admin-routes.ts +7 -5
  193. package/src/serve/model-binding.ts +43 -0
  194. package/src/serve/model-host.ts +512 -0
  195. package/src/serve/openai-wire.ts +103 -0
  196. package/src/serve/parent-application.ts +56 -0
  197. package/src/serve/pipeline.ts +33 -0
  198. package/src/serve/preparation.ts +33 -0
  199. package/src/serve/request-plan.ts +19 -15
  200. package/src/serve/request-prep.ts +346 -0
  201. package/src/serve/response-lease.ts +24 -0
  202. package/src/serve/responses-client.ts +69 -0
  203. package/src/serve/session-completion-engine.ts +110 -0
  204. package/src/serve/session-search.ts +1 -1
  205. package/src/serve/static-routes.ts +5 -5
  206. package/src/serve/text-completion-stage.ts +104 -0
  207. package/src/serve/token-streams.ts +519 -0
  208. package/src/server.ts +317 -2649
  209. package/src/spec/assistant-source.ts +10 -44
  210. package/src/spec/deepspec-source.ts +6 -6
  211. package/src/spec/dflash-source.ts +8 -8
  212. package/src/spec/dspark/ab-stats.ts +3 -3
  213. package/src/spec/dspark/calibration.ts +2 -2
  214. package/src/spec/dspark/deepspec-module.ts +2 -2
  215. package/src/spec/dspark/generate-dflash.ts +2 -2
  216. package/src/spec/dspark/generate.ts +2 -2
  217. package/src/spec/dspark/loader.ts +1 -1
  218. package/src/spec/dspark/module-dflash.ts +4 -3
  219. package/src/spec/dspark/module.ts +3 -3
  220. package/src/spec/dspark/quantize-drafter.ts +1 -1
  221. package/src/spec/generate.ts +1 -1
  222. package/src/spec/glm52-mtp-source.ts +1 -1
  223. package/src/spec/ngram-source.ts +1 -1
  224. package/src/spec/prefix-state.ts +45 -0
  225. package/src/spec/qwen-mtp-source.ts +166 -69
  226. package/src/spec/serve-loop.ts +154 -156
  227. package/src/spec/source.ts +42 -10
  228. package/src/spec/two-model.ts +1 -1
  229. package/src/ssd-cache.ts +80 -12
  230. package/src/ssd-durability.ts +25 -13
  231. package/src/tool-call.ts +51 -14
  232. package/src/train/flash-cce.ts +2 -2
  233. package/src/train/forward.ts +6 -0
  234. package/src/train/loss.ts +1 -1
  235. package/src/train/prefix-shared.ts +5 -1
  236. package/src/train/segmented.ts +5 -3
  237. package/src/train/trainer.ts +6 -6
  238. package/src/vision/prompt.ts +1 -1
  239. package/src/vision/qwen3vl-tower.ts +52 -10
  240. package/src/web/app.html +1 -1
  241. package/src/web/app.js +5 -3
  242. package/src/web/src/adapters-panel.ts +3 -3
  243. package/src/web/src/assistant.ts +2 -36
  244. package/src/web/src/chat.ts +4 -4
  245. package/src/web/src/composer.ts +4 -4
  246. package/src/web/src/hub.ts +1 -1
  247. package/src/web/src/markdown.ts +0 -0
  248. package/src/web/src/memory-panel.ts +1 -1
  249. package/src/web/src/model-picker.ts +1 -1
  250. package/src/web/src/palette.ts +1 -1
  251. package/src/web/src/protocol.ts +3 -39
  252. package/src/web/src/sessions.ts +1 -1
  253. package/src/web/src/ui-catalog.ts +4 -18
  254. package/src/web-assets.ts +47 -0
  255. package/src/weights.ts +55 -9
  256. package/docs/archive/investigations/curve-runs/bisector-route.json +0 -98
  257. package/docs/archive/investigations/curve-runs/bisector-trace.json +0 -1393
  258. package/docs/archive/investigations/curve-runs/curve-terrain.json +0 -1179
  259. package/docs/archive/investigations/curve-runs/curve-terrain.svg +0 -42
  260. package/docs/archive/investigations/hlg-ab.html +0 -34
  261. package/docs/archive/investigations/hlg-explorer.html +0 -238
  262. package/docs/archive/investigations/hlg-figs/cliff.svg +0 -1
  263. package/docs/archive/investigations/hlg-figs/cross.svg +0 -1
  264. package/docs/archive/investigations/hlg-figs/edges.svg +0 -1
  265. package/docs/archive/investigations/hlg-figs/k20-grids.svg +0 -1
  266. package/docs/archive/investigations/hlg-figs/k20-peaks.svg +0 -1
  267. package/docs/archive/investigations/hlg-figs/lw-curve.svg +0 -1
  268. package/docs/archive/investigations/hlg-figs/terrain.svg +0 -1
  269. package/docs/archive/investigations/hlg-report.html +0 -262
  270. package/docs/archive/investigations/hlg-runs/hlg-ab.json +0 -149
  271. package/docs/archive/investigations/hlg-runs/hlg-blind-prompts.md +0 -87
  272. package/docs/archive/investigations/hlg-runs/hlg-blind.json +0 -107
  273. package/docs/archive/investigations/hlg-runs/hlg-cliff.json +0 -197
  274. package/docs/archive/investigations/hlg-runs/hlg-cross.json +0 -505
  275. package/docs/archive/investigations/hlg-runs/hlg-edge.json +0 -388
  276. package/docs/archive/investigations/hlg-runs/hlg-eval1.json +0 -25
  277. package/docs/archive/investigations/hlg-runs/hlg-frontier.json +0 -86
  278. package/docs/archive/investigations/hlg-runs/hlg-grid.json +0 -242
  279. package/docs/archive/investigations/hlg-runs/hlg-grid2.json +0 -343
  280. package/docs/archive/investigations/hlg-runs/hlg-lw-coarse.json +0 -110
  281. package/docs/archive/investigations/hlg-runs/hlg-map.json +0 -383
  282. package/docs/archive/investigations/hlg-runs/run0-original.log +0 -159
  283. package/docs/archive/investigations/hlg-runs/runA-recommended.log +0 -131
  284. package/docs/archive/investigations/hlg-runs/runAA-cliff-cpm5.log +0 -26
  285. package/docs/archive/investigations/hlg-runs/runAB-grid2-e4b.log +0 -18
  286. package/docs/archive/investigations/hlg-runs/runAC-peak-e4b-partial.log +0 -25
  287. package/docs/archive/investigations/hlg-runs/runAD-ab-samples.log +0 -8
  288. package/docs/archive/investigations/hlg-runs/runAE-edge-e4b.log +0 -51
  289. package/docs/archive/investigations/hlg-runs/runAF-logit-calibration.log +0 -10
  290. package/docs/archive/investigations/hlg-runs/runAG-eval-config2.log +0 -16
  291. package/docs/archive/investigations/hlg-runs/runB-gain-variants.log +0 -192
  292. package/docs/archive/investigations/hlg-runs/runC-pivots.log +0 -162
  293. package/docs/archive/investigations/hlg-runs/runD-oetf.log +0 -132
  294. package/docs/archive/investigations/hlg-runs/runE-eotf.log +0 -162
  295. package/docs/archive/investigations/hlg-runs/runF-shaper-working.log +0 -86
  296. package/docs/archive/investigations/hlg-runs/runG-shaper-sweep.log +0 -101
  297. package/docs/archive/investigations/hlg-runs/runH-wsweep.log +0 -176
  298. package/docs/archive/investigations/hlg-runs/runI-asweep.log +0 -176
  299. package/docs/archive/investigations/hlg-runs/runJ-knobmap.log +0 -49
  300. package/docs/archive/investigations/hlg-runs/runK-frontier.log +0 -19
  301. package/docs/archive/investigations/hlg-runs/runL-widemap.log +0 -65
  302. package/docs/archive/investigations/hlg-runs/runM-frontier-emb.log +0 -15
  303. package/docs/archive/investigations/hlg-runs/runN-verify.log +0 -116
  304. package/docs/archive/investigations/hlg-runs/runO-frontier-seed5000.log +0 -15
  305. package/docs/archive/investigations/hlg-runs/runP-grid-AxSm.log +0 -15
  306. package/docs/archive/investigations/hlg-runs/runQ-grid-tgW.log +0 -15
  307. package/docs/archive/investigations/hlg-runs/runR-blind-transcript.log +0 -79
  308. package/docs/archive/investigations/hlg-runs/runS-cross-coherence.log +0 -33
  309. package/docs/archive/investigations/hlg-runs/runT-cross-cpm5.log +0 -33
  310. package/docs/archive/investigations/hlg-runs/runU-cross-12b.log +0 -33
  311. package/docs/archive/investigations/hlg-runs/runV-lw-e4b.log +0 -22
  312. package/docs/archive/investigations/hlg-runs/runW-lw-12b.log +0 -22
  313. package/docs/archive/investigations/hlg-runs/runX-lw-cpm5.log +0 -22
  314. package/docs/archive/investigations/hlg-runs/runY-cliff-e4b.log +0 -26
  315. package/docs/archive/investigations/hlg-runs/runZ-cliff-12b.log +0 -26
  316. package/docs/archive/mlx-bun-lab-report.html +0 -275
  317. package/docs/archive/wwdc-mlx-bun.html +0 -848
  318. package/docs/design/adapters-end-to-end.md +0 -205
  319. package/docs/design/batching-perf-path.md +0 -255
  320. package/docs/design/batching-v2-plan.md +0 -529
  321. package/docs/design/bucketing-stage.md +0 -197
  322. package/docs/design/compat-cli-surface-design.md +0 -230
  323. package/docs/design/docs-reorg-plan.md +0 -165
  324. package/docs/design/dspark-serving-program.md +0 -371
  325. package/docs/design/dspark-speculative-decoding.md +0 -318
  326. package/docs/design/grammar-spec-batching-integration.md +0 -301
  327. package/docs/design/memory-inference-path.md +0 -422
  328. package/docs/design/memory-synthesis.md +0 -287
  329. package/docs/design/memory-system.md +0 -237
  330. package/docs/design/mlx-lm-serving-execution-seam.md +0 -81
  331. package/docs/design/mlx-lm-tool-parity-plan.md +0 -545
  332. package/docs/design/omlx-adoption-map.md +0 -98
  333. package/docs/design/orpo-dynamic-lambda.md +0 -220
  334. package/docs/design/orpo-future-enhancements.md +0 -340
  335. package/docs/design/paged-kv-cache.md +0 -214
  336. package/docs/design/parallel-slots.md +0 -567
  337. package/docs/design/parity-tier-dag.md +0 -161
  338. package/docs/design/repo-cleanup-plan.md +0 -231
  339. package/docs/design/runtime-isolation.md +0 -263
  340. package/docs/design/segmented-backward-training.md +0 -543
  341. package/docs/design/spec-decode-larger-targets.md +0 -229
  342. package/docs/design/ssd-kv-cold-tier.md +0 -415
  343. package/docs/design/structured-output.md +0 -484
  344. package/docs/design/tauri-desktop-app.md +0 -127
  345. package/docs/design/the-dreaming-master-plan.md +0 -445
  346. package/docs/design/turboquant-kv.md +0 -235
  347. package/docs/design/turboquant-weights.md +0 -467
  348. package/docs/design/w4a16-compute-precision-spike.md +0 -232
  349. package/docs/design/web-chat-beat-matrix.md +0 -315
  350. package/docs/design/write-pipeline-entity.md +0 -468
  351. package/docs/planning/IDEAS.md +0 -69
  352. package/docs/reference/embedding.md +0 -197
  353. package/docs/reference/features-matrix.md +0 -101
  354. package/docs/reference/orpo-quickstart.md +0 -135
  355. package/src/flags.ts +0 -11
  356. /package/docs/{design → archive/investigations}/colibri-glm52-port.md +0 -0
  357. /package/docs/{planning → archive/planning}/chunk-task-roadmap.md +0 -0
  358. /package/docs/{planning → archive/planning}/curve-sampler-research-plan.md +0 -0
  359. /package/docs/{planning → archive/planning}/memory-docs-and-dag-plan.md +0 -0
  360. /package/docs/{planning → archive/planning}/pi-integration-review.md +0 -0
  361. /package/docs/{planning → archive/planning}/release-notes-v0.2.0.md +0 -0
  362. /package/src/{memory-plan.ts → admission-plan.ts} +0 -0
  363. /package/{docs/archive/investigations → src/serve/assets}/curve-terrain.html +0 -0
  364. /package/{docs/dag → src/serve/assets}/training-inference-map.html +0 -0
@@ -0,0 +1,348 @@
1
+ # Reference environment and platform facts
2
+
3
+ The canonical home for the oracle setup and the hard-won platform facts that
4
+ agents and contributors need. CLAUDE.md points here; do not duplicate these
5
+ facts elsewhere. Each fact is one paragraph with the evidence path that proves
6
+ it — when you change the code, update the paragraph.
7
+
8
+ User-facing symptoms live in [troubleshooting.md](./troubleshooting.md).
9
+
10
+ ## Machines
11
+
12
+ There are TWO development machines and neither is canonical. One is a MacBook
13
+ Pro M1 Max with 32 GB (`hw.model MacBookPro18,2`); the other is a MacBook Pro
14
+ M4 Pro with 24 GB, the machine PLAN.md's "Reference environment" section
15
+ describes (unified memory, ~273 GB/s). Every measured number is labeled with
16
+ host / chip / RAM — `docs/reference/benchmarks.md` carries "M1 Max 32 GB"
17
+ section headings for exactly this reason, and its TurboQuant section carries an
18
+ explicit "measured on an M1 Max 32 GB, not this file's M4 Pro reference" note.
19
+ Before asserting anything about RAM, OOM, or bandwidth, run
20
+ `sysctl hw.memsize hw.model` — never assume which laptop you are on. The
21
+ reference `serve.sh` (below) hard-codes a 28 GB wired limit "of 32 GB", so it
22
+ is written for the M1 Max.
23
+
24
+ For the current M4 Pro optimization campaign, Josh specifies internal SSD
25
+ storage for active models. The external SSD stores artifacts to copy when
26
+ needed; external-drive loading performance is outside normal acceptance for
27
+ the 12–17 GB models. Stage each needed artifact under `~/models/`, verify
28
+ every file against its archive, and record that path in both benchmark arms.
29
+ Preserve earlier external-drive measurements as a separate cohort. The local
30
+ active-model manifests live under `reports/qwen38-rd/`.
31
+
32
+ Perf claims get a number on the machine they were measured on, recorded in the
33
+ user-local eval DB (`~/.cache/mlx-bun/evals.sqlite`) and promoted to
34
+ `docs/reference/benchmarks.md` deliberately. `bun scripts/bench-serve.ts all`
35
+ is the benchmark harness; it writes Markdown and raw JSON under `reports/`
36
+ as gitignored outputs. Numbers on a loaded machine are
37
+ garbage — run-to-run spread is the stability signal, and the harness retries
38
+ unstable cells (`scripts/bench-serve.ts`; `benchmarks.md`, "Running the
39
+ benchmark").
40
+
41
+ ## External storage loading
42
+
43
+ On the M4 Pro with MLX 0.32.2, two RTN4 first-request warmups from
44
+ `/Volumes/MLX-Models`, an external USB SSD using APFS, hit Metal GPU timeouts
45
+ before any committed-token append. One occurred with fill disabled. The
46
+ system log confirms the first timeout; neither establishes an allocation
47
+ leak or an append-kernel failure. Three attention tests, a fresh four-response
48
+ external HTTP control, and a separate four-response internal-SSD control pass.
49
+ The internal copy contains the same 25 files and 15,849,971,577 bytes, each
50
+ SHA-256 verified. Its responses and final active allocation match the external
51
+ control. Copying and hashing may warm the OS file cache, so this comparison
52
+ alone does not prove that the drive caused the failures.
53
+
54
+ [MLX issue #3803](https://github.com/ml-explore/mlx/issues/3803) reports the
55
+ same failure with external storage on a different machine and much larger
56
+ models. A [maintainer recommends evaluating weights before GPU inference](https://github.com/ml-explore/mlx/issues/3803#issuecomment-4898914127)
57
+ so disk-loading tasks finish first. Our loader already assigns safetensors
58
+ loads to the CPU stream, but leaves them lazy. A research preload evaluates
59
+ each requested canonical weight once during construction. Two balanced
60
+ external-drive pairs complete all sixteen responses exactly, with identical
61
+ final active allocation. Both eager arms take longer from process start to
62
+ first complete response; moving work before readiness is not a startup-speed
63
+ win. Both ordinary arms also pass, so reliability remains unproven. This
64
+ loading change is not integrated, and further external-drive tuning is
65
+ deferred under the active-storage policy above. Evidence under `reports/qwen38-rd/`:
66
+ `fill-append-http-final-partial-review.json`, `rtn4-storage-control-manifest.json`,
67
+ `fill-append-storage-control-review.json` and `weights-loading-http.json`.
68
+
69
+ ## The Python oracle
70
+
71
+ Logit parity with mlx-lm is the correctness oracle; mixed-precision KV and the
72
+ vision sidecar verify against mlx-optiq. The current working tree requires
73
+ MLX and MLX-Metal 0.32.2. On the M4 Pro, the default reference is
74
+ `/Users/joshrossi/Code/mlx-lm/.venv-mlx-0.32.2-macos14`; invoke its
75
+ `bin/python` for reference scripts. MLX-LM remains 0.31.3. The shared resolver
76
+ checks installed MLX/Metal versions and rejects an incompatible explicit
77
+ `MLX_BUN_ORACLE_VENV` instead of silently selecting another environment.
78
+
79
+ The earlier reference at `/Users/joshrossi/Code/mlx-lm/.venv` remains an
80
+ old-runtime control. Its historical pins were verified
81
+ from the installed `dist-info` directories in
82
+ `.venv/lib/python3.14/site-packages/`: mlx 0.31.2 (with mlx-metal 0.31.2),
83
+ mlx-lm 0.31.3, mlx-optiq 0.2.15, pillow 12.2.0. PLAN.md records that optiq was
84
+ bumped from 0.2.4 to 0.2.15 on 2026-07-06 and the mixed-KV goldens stayed
85
+ byte-identical across the bump. The venv directory holds no project source —
86
+ just the venv and `serve.sh`.
87
+
88
+ The Qwen MTP compatibility test accepts explicit local artifact paths through
89
+ `MLX_BUN_TEST_MTP_TARGET` and `MLX_BUN_TEST_MTP_DRAFT`, alongside
90
+ `MLX_BUN_TEST_QWEN38_MTP=1`. It compares speculative and ordinary greedy
91
+ generation on that same target and prints both paths. This does not substitute
92
+ one quant for another in the pinned logit-oracle tests.
93
+
94
+ **M4 Pro installation checked 2026-09-04:** the same venv path on
95
+ `Joshs-MBP-2025.local` currently uses `lib/python3.13/site-packages`, with
96
+ mlx/metal 0.31.2, mlx-lm 0.31.3 and mlx-optiq **0.2.7** from installed
97
+ dist-info metadata. The older python3.14/OptiQ 0.2.15 record above is not the
98
+ installed stack on this Mac. Record actual interpreter/package/native-library
99
+ versions for every comparison; preserve this oracle as the 0.31.2 control.
100
+ Qwen artifacts are also present under
101
+ `/Volumes/MLX-Models/models/{Qwen,mjriii}/`; header-only inventories under
102
+ `reports/qwen38-rd/` are machine-local and do not load the GPU.
103
+
104
+ **Authorized M4 Pro runtime update, staged 2026-09-07:** MLX 0.32.2 with
105
+ MLX-C `c74db5307cc8ce122f48d97ef951b30578674e7f` is built under
106
+ `reports/qwen38-rd/mlx-upgrade-0.32.2/install/lib/`. Explicit
107
+ `MLX_BUN_LIBMLXC=<that-directory>/libmlxc.dylib` selects it per process.
108
+ The original Homebrew MLX 0.31.2 and MLX-C 0.6.0 revision 2 remain installed.
109
+ The staged core uses the official macOS 26 arm64 MLX-Metal wheel, with verified
110
+ archive hashes and relocatable library dependencies. This local artifact does
111
+ not change the published native pack or its minimum supported macOS version.
112
+ The source-build attempt failed because the offline Metal toolchain is absent;
113
+ building the C wrapper against the official native libraries succeeded.
114
+
115
+ The matching reference is `/Users/joshrossi/Code/mlx-lm/.venv-mlx-0.32.2`,
116
+ selected through `MLX_BUN_ORACLE_VENV`. Its Python remains 3.13.5; MLX and
117
+ MLX-Metal change to 0.32.2 while all other 62 package pins match the old venv,
118
+ including MLX-LM 0.31.3 and OptiQ 0.2.7. Installation and dependency checks pass.
119
+ Keep runtime and reference overrides paired. The macOS 26 build remains an
120
+ explicit comparison build. The working tree now selects the macOS 14 package
121
+ candidate described below. Build manifests, package freezes and gate results
122
+ live under the upgrade report directory.
123
+
124
+ The package candidate also has an official macOS 14 build of MLX-Metal 0.32.2,
125
+ with MLX-C compiled for 14.0 under `install-macos14/lib/`. Its matching Python
126
+ reference is `/Users/joshrossi/Code/mlx-lm/.venv-mlx-0.32.2-macos14`, with the
127
+ same 64 package versions as the macOS 26 reference and a passing dependency
128
+ check. Both builds pass the twelve-cell RTN4 same-version logit/state oracle
129
+ comparison. The macOS 14 candidate additionally passes the actual 4K prompt
130
+ and 8K extension, with complete logits and live cache state checked against
131
+ its matching reference. After the Trellis arithmetic port, the model-free
132
+ suite passes 1,882 tests with ten skips on the new core and 1,881 tests with
133
+ eleven skips on the old core. The local native-pack
134
+ candidate under `native-pack-candidate/` extracts into `native-pack-extracted/`;
135
+ all five Mach-O files target 14.0, have valid ad-hoc signatures and load their
136
+ non-system dependencies from siblings. These checks ran on macOS 27, not an
137
+ actual macOS 14 host. The production native-pack manifest now targets this
138
+ 0.4.0 candidate and the verified local cache is
139
+ `/Users/joshrossi/Library/Caches/mlx-bun/native-v0.4.0-arm64`. The candidate
140
+ has not been published. The consolidated source passes 52 complete Qwen
141
+ forward/state/continuation cases and six Trellis generations, with fixed
142
+ source/runtime/reference hashes and clean worker exits. The consolidated
143
+ model-free suite passes 1,875 tests with ten skips; all typechecks pass.
144
+ Integrated inverse-KV serving response gates also pass. The broader
145
+ same-version reference gate passes all eighteen MiniCPM5, Llama 1B and Gemma
146
+ e4b cases after matching MLX-LM's compiled MiniCPM5 prefill activation.
147
+ Run `MLX_BUN_TEST_RUNTIME_ORACLE=1 bun test tests/parity/runtime-oracle.test.ts`
148
+ to repeat these logit, live-cache and continuation comparisons against the
149
+ matching reference. It skips unavailable artifacts, runs the Bun and Python
150
+ children sequentially and does not rewrite goldens. Combined/pressure
151
+ acceptance remains.
152
+ The frozen old source lives outside Bun's
153
+ test discovery at
154
+ `/Users/joshrossi/.cache/mlx-bun/runtime-controls/mlx-0.31.2-before-0.32.2/`.
155
+ Preserve its `snapshot.json` and source for old-runtime comparisons when
156
+ simplifying production bindings. The build directories are under the upgrade
157
+ report directory, whose `control-location.json` records the verified move.
158
+ The accepted new-core source before binding consolidation is also frozen at
159
+ `/Users/joshrossi/.cache/mlx-bun/runtime-controls/mlx-0.32.2-before-consolidation/`.
160
+ Its 932 files and the six locally installed native files were hash-verified;
161
+ `consolidation-preparation.json` records the copy and local installation.
162
+
163
+ The small DeltaNet fixture also depends on the oracle/runtime. On the M4 Pro
164
+ with the pins above, both Bun and Python differ from the June fixture at one
165
+ prefill output; their gate values, outputs and complete recurrent states agree
166
+ exactly. The fixture was explicitly replayed on 2026-09-05 with unchanged
167
+ inputs. It now records package/device/source provenance and exact state hashes.
168
+ No numerical tolerance changed. `scripts/oracle/gen-qwen-delta-golden.py
169
+ --replay tests/fixtures/qwen-delta-golden.json --output <review-file>` reproduces
170
+ the comparison under the pinned Python. Without `--output`, the M4 Pro writes
171
+ the reference fixture; other chips write a `goldens/<chip>/` override, which
172
+ the test resolves before the reference. Earlier oracle comparisons and the
173
+ single-value diff are in `reports/qwen38-rd/delta-*.json`.
174
+
175
+ CI explicitly replays those unchanged inputs through MLX-LM 0.31.3 on
176
+ MLX/MLX-Metal 0.32.2 before testing, saving a runner-chip override and its
177
+ provenance as a workflow artifact. This avoids comparing the macOS 14 runner
178
+ against an M4 Pro output fixture. The test still requires exact output and
179
+ state hashes; Python runs only the external reference. Trellis variant
180
+ matrix tests allow 30 seconds for first-use kernel compilation on CI.
181
+
182
+ Readable oracle source, in that `site-packages/`: `mlx_lm/models/gemma3.py`
183
+ and `mlx_lm/server.py` for the port targets; `mlx_lm/models/cache.py` for the
184
+ cache classes; `mlx_lm/tokenizer_utils.py` for prompt rendering;
185
+ `optiq/runtime/fused_quant_sdpa.py` and `optiq/runtime/streaming_kv_quant.py`
186
+ for quantized-KV attention; `optiq/vlm/` for the vision sidecar wiring;
187
+ `optiq/auth.py` for the server's API-key rule.
188
+
189
+ The reference server is `/Users/joshrossi/Code/mlx-lm/serve.sh`. It runs
190
+ `optiq serve` on `mlx-community/Qwen3.6-27B-OptiQ-4bit` with `--mtp`, the
191
+ snapshot's `kv_config.json`, `--max-tokens 32768`, and
192
+ `--prompt-cache-bytes` = 5 GiB, inside a restart loop (mlx-lm still aborts the
193
+ process on an uncatchable Metal OOM, ml-explore/mlx-lm#854). It first raises
194
+ `iogpu.wired_limit_mb` to 28672 via `sudo sysctl` (resets on reboot). optiq's
195
+ default port is 8080 (`optiq/cli.py`). Never start it, or any long-running
196
+ server or multi-GB download, from an agent session — Josh runs servers
197
+ himself; testing against an already-running server with curl is fine.
198
+
199
+ Oracle weights for the Gemma parity work: `gemma-4-12B-it-OptiQ-4bit` at
200
+ `~/.cache/huggingface/hub/models--mlx-community--gemma-4-12B-it-OptiQ-4bit/snapshots/5b1101065d2094c8f12aa87fee80e0afa5b292b7/`
201
+ — two safetensors shards, `model.safetensors.index.json`, `kv_config.json`,
202
+ `optiq_metadata.json`, `optiq_vision.safetensors`, `chat_template.jinja`,
203
+ `config.json`, `generation_config.json` (listing verified on disk; PLAN.md
204
+ records 8.3 GB). Measured baselines for it are in PLAN.md's "Reference
205
+ environment" section and `benchmarks.md`; compare direct-vs-direct only — the
206
+ early 14.1 tok/s figure was server-inflated (PLAN.md, Phase 3 finding).
207
+
208
+ ## Oracle-side hazards
209
+
210
+ **Xet stalls.** Hugging Face's Xet transfer path stalls on this network. Set
211
+ `HF_HUB_DISABLE_XET=1` before any Python-side `hf download`; our own
212
+ downloader speaks plain HTTPS and never touches Xet (`src/download.ts`
213
+ header comment; `src/memory/model.ts` prints the `HF_HUB_DISABLE_XET=1` form
214
+ in its fetch hint; `scripts/oracle/export-datasets.py`,
215
+ `scripts/turboquant/farm-setup.sh`, and `scripts/memory/eval-northstar.ts`
216
+ all set it). HF auth is configured (`hf auth login`); `src/download.ts`
217
+ `hfToken()` reads `HF_TOKEN`, else `~/.cache/huggingface/token`.
218
+
219
+ **optiq wants paths, not repo ids.** optiq tooling treats `--model` as a
220
+ filesystem path in places, so pass the local snapshot directory (the path
221
+ above), not `mlx-community/...` (PLAN.md "Reference environment"; serve.sh
222
+ passes the snapshot path for `--kv-config`).
223
+
224
+ **The vision sidecar.** `optiq_vision.safetensors` (bf16, ~105 MB per PLAN
225
+ and CLAUDE history) auto-enables in `optiq serve` when present beside the
226
+ weights and needs pillow in Python land (installed in the venv). Our registry
227
+ records the sidecar's size and notes that the shipped file actually carries
228
+ `audio_tower.*` tensors too (`src/registry.ts`, `optiq_vision` comments).
229
+
230
+ **mlx-lm's prompt cache is byte-capped.** In the pinned mlx-lm 0.31.3,
231
+ `LRUPromptCache` (`mlx_lm/models/cache.py`) takes `max_size` (default 10) AND
232
+ `max_bytes`, evicting through a typed `CacheOrder` LRU; `server.py` exposes
233
+ `--prompt-cache-bytes`. The older count-capped cache was the OOM footgun that
234
+ `serve.sh`'s 5 GiB cap works around. Ours is byte-capped too: `--prompt-cache`
235
+ (GB, default 8) is a byte-capped LRU (`server-config.md`).
236
+
237
+ **TokenizerWrapper injects `enable_thinking=True`.** mlx-lm's
238
+ `apply_chat_template` sets `kwargs["enable_thinking"] = self.has_thinking`
239
+ whenever the caller did not pass it (`mlx_lm/tokenizer_utils.py`, around
240
+ line 336). Any cross-stack parity or bench prompt must pin `enable_thinking`
241
+ explicitly or the rendered prompts drift — `scripts/bench-serve.ts` pins it
242
+ on every arm via `chat_template_kwargs`.
243
+
244
+ **pi client config.** `~/.pi/agent/models.json` currently defines an
245
+ `mlx-bun` provider at `http://localhost:8080/v1` with
246
+ `apiKey: "sk-mlx-bun-local"` (mlx-bun does not validate the key). optiq
247
+ servers DO validate: the Bearer token must start with `sk-optiq-`
248
+ (`optiq/auth.py`, `_REQUIRED_PREFIX`), so a pi provider pointed at
249
+ `serve.sh` needs such a key.
250
+
251
+ ## Bun and FFI facts
252
+
253
+ **Bun ≥ 1.4.0.** `package.json` `engines.bun` is `>=1.4.0`. `Bun.Image`
254
+ (native OS codecs via ImageIO, EXIF auto-orient, off-thread) is the vision
255
+ decode path (`src/vision/preprocess.ts`); `Bun.Image.resize` is deliberately
256
+ not used. The FFI ABI fix below is the other reason for the pin.
257
+
258
+ **bun:ffi stack-argument ABI (fixed in 1.4).** Through Bun 1.3.14, `bun:ffi`
259
+ wrote one 8-byte stack slot per argument, but Apple's arm64 ABI packs stack
260
+ args at natural size, so a binding whose 9th+ int-class args put an `i32`
261
+ before more args handed the callee shifted garbage (mlx_conv2d's segfault at
262
+ 0x1: the bogus value landed in the stream arg). Filed as oven-sh/bun#33672;
263
+ repro in `lab/repro/bun-ffi-stack-args/` (`repro.c` + `repro.ts`,
264
+ `ISSUE.md`). Bun 1.4.0 returns the expected values, so bindings now use
265
+ their natural mlx-c signatures — `ops.conv2d` in `src/mlx/ops.ts` passes all
266
+ eleven args plainly and the packed-u64 workaround is gone. `ISSUE.md` keeps
267
+ the original report as the regression record.
268
+
269
+ **bun:ffi symbol `.ptr` is fixed in 1.4.** Direct function addresses match
270
+ `dlsym` on both 1.4.0 and the isolated 1.4.2 runtime. `src/mlx/array.ts` now
271
+ uses the numeric `free.ptr`, with a validity guard and a process-lifetime
272
+ library handle. Native destructor ownership remains unchanged.
273
+
274
+ **FFI typed-array readback still needs `read.*`.** The standalone
275
+ `lab/repro/bun-ffi-f64/` hot-loop repro still produces stale indexed reads on
276
+ 1.4.0 and 1.4.2, despite the upstream issue being closed. Keep the native
277
+ out-param read helpers. The stack-argument repro passes on both versions.
278
+ Raw runtime binaries, hashes and outcomes are recorded in
279
+ `reports/qwen38-rd/bun-runtime-audit/`; the installed runtime and pinned Python
280
+ oracle were not upgraded. Bun's [1.4 release notes](https://bun.com/blog/bun-v1.4)
281
+ describe its new FFI implementation, while [1.4.2](https://bun.com/blog/bun-v1.4.2)
282
+ fixes the intervening AsyncLocalStorage regression. Release claims do not
283
+ replace these local regression checks.
284
+
285
+ **`Bun.mmap` SIGTRAPs above 4 GB.** JSC ArrayBuffers cap at 2^32 bytes, so
286
+ `Bun.mmap` panics on weight shards larger than that (observed on Bun 1.3.3,
287
+ still true at 1.3.14). `src/mmap.ts` binds libc `mmap`/`munmap`/`madvise`
288
+ from `/usr/lib/libSystem.B.dylib` and hands mlx raw base+offset pointers;
289
+ only small ranges (headers) are ever viewed from JS.
290
+
291
+ **Never give mlx a JS-callback destructor.** mlx releases the last
292
+ `array::Data` reference from the Metal completion thread (`gpu::eval`
293
+ retains buffers until the command buffer completes, past `dispose()`). A
294
+ `JSCallback` dtor on that thread deadlocks when the JS thread is inside a
295
+ blocking FFI eval and SIGTRAPs mid-GC (the 2026-07-06 restart-restore hang).
296
+ `src/mlx/array.ts` therefore gives every zero-copy array (`fromPointer` and
297
+ `fromView`) the native no-op dtor — libc `free` with payload 0 — and makes
298
+ host-buffer lifetime the caller's contract: weight mmaps live for the
299
+ process, restored KV is copied at load (`src/kv-store.ts` `loadKvCache`,
300
+ since 2026-07-07), and `unpinHostBuffer` runs only on the JS thread.
301
+
302
+ ## Metal and mlx-c facts
303
+
304
+ **`mlx_copy` shares storage.** In pinned MLX 0.31.2, `Copy::eval` calls
305
+ `copy_shared_buffer`. Neither `ops.copyOf` nor `contiguous` guarantees a
306
+ small independent allocation for a contiguous view. Explicit disposal drops
307
+ handles but a surviving view can retain its entire source allocation.
308
+ `src/mlx/materialize.ts` uses the stock dynamic-slice kernel, which allocates
309
+ the output's logical size and supports gradients. The Qwen convolution state
310
+ uses it to release large prefill buffers. Byte, pointer, retained-memory,
311
+ compiled execution and gradient gates live in `tests/unit/materialize.test.ts`;
312
+ the direct storage probe is `reports/qwen38-rd/copy-alias-probe.json`.
313
+
314
+ **Non-page-aligned host pointers read garbage on the GPU.** Metal cannot
315
+ no-copy-wrap a host pointer that is not page-aligned: GPU ops silently read
316
+ garbage while CPU-stream ops are fine (PLAN.md Phase 1 finding, restated in
317
+ the `src/weights.ts` header). Safetensors tensor offsets are arbitrary, so
318
+ weights load through mlx's own `mlx_load_safetensors` on the CPU stream
319
+ (`src/weights.ts`, `src/lora.ts`; Load has no GPU kernel) into mlx-owned,
320
+ page-aligned buffers. Everything we DO wrap ourselves is page-aligned by
321
+ construction: the KV store file layout (`src/kv-store.ts`) and the
322
+ expert-offload file (`src/expert-offload.ts`, `src/expert-offload-build.ts`).
323
+
324
+ **Read the full mlx-c signature before binding.** A missed trailing optional
325
+ parameter shifts the stream argument and produces "There is no Stream(...)"
326
+ errors at eval time. `src/mlx/ffi.ts` is the single binding table and cites
327
+ the header each group comes from (`io.h`, `map.h`, `transforms.h`); the
328
+ `mlx_load_safetensors` row shows the shape — `(out, meta_out, path, stream)`.
329
+
330
+ **libmlxc resolution order.** `MLX_BUN_LIBMLXC` env → beside the executable
331
+ (sidecar layout, `docs/reference/distribution.md`) → `~/Library/Caches/mlx-bun/native-v<ver>-<arch>/`
332
+ (downloaded on first run, sha256-verified) → `/opt/homebrew/lib` →
333
+ `/usr/local/lib`. Dev trees and embedders never download anything. The order
334
+ is defined twice and must stay in sync: `resolveLibmlxc()` in
335
+ `src/mlx/ffi.ts` and `nativeRuntimeDir()` in `src/native-pack.ts`. Publishing
336
+ a new native pack means pasting the tarball's sha256/size into
337
+ `src/native-pack.ts` before tagging (comment block "RELEASE-TIME BAKE").
338
+
339
+ ## Repo hygiene that follows from the above
340
+
341
+ `scripts/` holds production tooling only (bench-*, regen-*, parity-*, gen-*,
342
+ build/release, eval/serve) plus `scripts/{oracle,memory,turboquant}/` for
343
+ venv-side oracles, the Dreaming suite, and live TurboQuant research; research
344
+ one-offs are deleted once their finding is written into a doc. `lab/repro/`
345
+ holds self-contained reproductions for upstream bug reports (the two Bun
346
+ issues above, plus `optiq-mixed-kv-inert` and `vllm-metal-turboquant`); they
347
+ are not part of the build. Committed absolute paths (the venv, the weights
348
+ snapshot, `serve.sh`) are machine-specific on purpose — do not "correct" them.
@@ -0,0 +1,39 @@
1
+ # mlx-bun serving
2
+
3
+ mlx-bun serving runs local model completions and reports how each request uses the inference runtime.
4
+
5
+ ## Language
6
+
7
+ **Completion execution**:
8
+ A single model completion attempt, including its generated output, resource lifetime, usage accounting, and observed scheduling placement.
9
+ _Avoid_: Generation request, serve transaction
10
+
11
+ **Execution composition**:
12
+ The exact combination of model runtime, numeric scheme, acceleration methods, and request features used for a workload. Explicit choices and resolved defaults are authoritative.
13
+ _Avoid_: Configuration bundle, inferred mode
14
+
15
+ **Model profile**:
16
+ A declaration that identifies an external model artifact, the engine capabilities required to run it, and the measured execution composition recommended for a device or workload. The profile does not bundle or own the model weights.
17
+ It selects model construction; request methods such as MTP, KV schemes, adapters, grammar, and sampling remain independent explicit or default-resolved choices.
18
+ _Avoid_: Generic model preset
19
+
20
+ **Fidelity contract**:
21
+ The oracle and verification claim attached to an execution composition, such as bit-exact parity with an external implementation or measured evidence when no matching oracle exists.
22
+ L1 means bit-exact mlx-lm parity, L2 means bit-exact mlx-optiq parity, and L3 means measured evidence without a matching oracle.
23
+ _Avoid_: Execution mode, optimization tier
24
+
25
+ **Artifact fingerprint**:
26
+ An immutable external revision identity used to bind evidence and a model profile to exact weights and metadata. A mutable alias or local directory name is not an artifact fingerprint.
27
+ _Avoid_: Model path, model family
28
+
29
+ **Scheduling mechanism**:
30
+ The executor that receives an already-resolved execution composition. `serial` is the preserved strict or dedicated executor. `continuous` admits the request to the scheduler, which chooses a B=1 fast path or B=N step from its active row count. Placement never changes the composition.
31
+ _Avoid_: Inferred lane, inferred mode
32
+
33
+ **Concurrency cap**:
34
+ The maximum rows admitted to the continuous scheduler. `--batch` declares this cap; `1` pins the serial mechanism. It does not select MTP, a KV scheme, TurboQuant, grammar, adapters, or sampling.
35
+ _Avoid_: Batch method, quality mode
36
+
37
+ **B=1 fast path**:
38
+ The continuous scheduler's one-active-row specialization. It adopts serial-class caches and uses the parity- and latency-gated single-row graph. It is not the strict serial mechanism selected by `--batch 1` or required by a dedicated composition.
39
+ _Avoid_: Serial fallback, batch prediction