mlx-bun 0.5.0 → 1.0.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 (640) hide show
  1. package/README.md +1449 -109
  2. package/THIRD_PARTY_NOTICES.md +882 -0
  3. package/bin/mlx-bun.convert.mjs +4 -0
  4. package/bin/mlx-bun.fuse.mjs +4 -0
  5. package/bin/mlx-bun.generate.mjs +4 -0
  6. package/bin/mlx-bun.lora.mjs +4 -0
  7. package/bin/mlx-bun.mjs +13 -21
  8. package/bin/mlx-bun.server.mjs +4 -0
  9. package/bin/mlx-bun.upload.mjs +4 -0
  10. package/dist/web/app.js +9584 -0
  11. package/package.json +50 -53
  12. package/src/cli/ane-install.ts +76 -0
  13. package/src/cli/args.ts +179 -0
  14. package/src/cli/engine-entry.ts +68 -0
  15. package/src/cli/inference.ts +214 -0
  16. package/src/cli/job-entry.ts +97 -0
  17. package/src/cli/library-host.ts +117 -0
  18. package/src/cli/main.ts +57 -0
  19. package/src/cli/memory-engine.ts +163 -0
  20. package/src/cli/memory.ts +36 -0
  21. package/src/cli/mlx-lm-aliases.ts +309 -0
  22. package/src/cli/model-choice.ts +33 -0
  23. package/src/cli/model-selection.ts +84 -0
  24. package/src/cli/module-host.ts +11 -0
  25. package/src/cli/module-verbs.ts +50 -0
  26. package/src/cli/numerical-policy.ts +12 -0
  27. package/src/cli/perplexity.ts +89 -0
  28. package/src/cli/serve-host.ts +423 -0
  29. package/src/cli/serve-isolated.ts +217 -0
  30. package/src/cli/serve-options.ts +106 -0
  31. package/src/cli/serve-state.ts +205 -0
  32. package/src/cli/serve.ts +500 -0
  33. package/src/cli/served-model-host.ts +102 -0
  34. package/src/cli/server-entry.ts +148 -0
  35. package/src/cli/serving-unit.ts +177 -0
  36. package/src/{tui.ts → cli/terminal.ts} +13 -8
  37. package/src/cli/worker-adapters.ts +34 -0
  38. package/src/cli/worker-entry.ts +272 -0
  39. package/src/cli/worker-unit.ts +179 -0
  40. package/src/engine/adapter-operation.ts +26 -0
  41. package/src/engine/cache-services.ts +114 -0
  42. package/src/engine/completion.ts +39 -0
  43. package/src/engine/generation-gateway.ts +358 -0
  44. package/src/engine/index.ts +59 -0
  45. package/src/engine/kv-budget.ts +120 -0
  46. package/src/engine/media-preparation.ts +232 -0
  47. package/src/engine/model-binding.ts +24 -0
  48. package/src/engine/model-host.ts +513 -0
  49. package/src/engine/model-serving.ts +89 -0
  50. package/src/{serve → engine}/preparation.ts +7 -5
  51. package/src/{serve → engine}/session-completion-engine.ts +6 -6
  52. package/src/engine/telemetry.ts +109 -0
  53. package/src/hub/downloads.ts +116 -0
  54. package/src/jobs/db.ts +16 -7
  55. package/src/jobs/events.ts +29 -0
  56. package/src/jobs/executable.ts +5 -0
  57. package/src/jobs/host.ts +51 -0
  58. package/src/jobs/in-process.ts +55 -0
  59. package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
  60. package/src/jobs/runner.ts +150 -231
  61. package/src/jobs/service.ts +75 -0
  62. package/src/jobs/sse.ts +59 -23
  63. package/src/jobs/worker-memory.ts +46 -0
  64. package/src/jobs/worker-process.ts +163 -0
  65. package/src/jobs/worker-supervisor.ts +258 -0
  66. package/src/modules.ts +58 -0
  67. package/src/publishing/catalog-hub.ts +18 -0
  68. package/src/publishing/credentials.ts +31 -0
  69. package/src/publishing/upload.ts +37 -0
  70. package/src/residency/leased-adapters.ts +21 -0
  71. package/src/residency/local-records.ts +16 -0
  72. package/src/residency/model-residency.ts +405 -0
  73. package/src/residency/record-index.ts +28 -0
  74. package/src/residency/resident-estimate.ts +50 -0
  75. package/src/{anthropic.ts → server/anthropic.ts} +3 -81
  76. package/src/server/cache-routes.ts +36 -0
  77. package/src/{serve → server}/chat-request.ts +10 -10
  78. package/src/{serve → server}/chat-stage.ts +14 -14
  79. package/src/{client.ts → server/client.ts} +28 -2
  80. package/src/{serve → server}/completion-executor.ts +33 -41
  81. package/src/server/decision-body.ts +55 -0
  82. package/src/server/decision-routes.ts +134 -0
  83. package/src/server/decision-wire.ts +228 -0
  84. package/src/{serve → server}/discovery-routes.ts +25 -82
  85. package/src/{serve → server}/http.ts +25 -13
  86. package/src/{serve → server}/inference-request.ts +5 -5
  87. package/src/server/job-routes.ts +20 -0
  88. package/src/server/media-prompt.ts +63 -0
  89. package/src/server/memory-completion-client.ts +46 -0
  90. package/src/server/model-routes.ts +192 -0
  91. package/src/{serve → server}/openai-wire.ts +3 -2
  92. package/src/{serve → server}/pipeline.ts +1 -1
  93. package/src/server/prompt-builder.ts +13 -0
  94. package/src/server/prompt-contracts.ts +17 -0
  95. package/src/server/proxy-routes.ts +187 -0
  96. package/src/server/publishing-routes.ts +41 -0
  97. package/src/{serve → server}/request-plan.ts +6 -8
  98. package/src/{serve → server}/request-prep.ts +47 -50
  99. package/src/{serve → server}/responses-client.ts +30 -13
  100. package/src/{responses.ts → server/responses.ts} +12 -93
  101. package/src/server/routes.ts +205 -0
  102. package/src/server/start.ts +72 -0
  103. package/src/server/status-routes.ts +108 -0
  104. package/src/{serve → server}/text-completion-stage.ts +25 -4
  105. package/src/server/text-prompt.ts +12 -0
  106. package/src/{serve → server}/token-streams.ts +36 -38
  107. package/src/server/worker-routes.ts +311 -0
  108. package/src/storage/paths.ts +61 -0
  109. package/src/web/assets.ts +37 -0
  110. package/src/web/{src → browser}/api.ts +5 -23
  111. package/src/web/browser/chat-host.ts +17 -0
  112. package/src/web/browser/installed-panels.ts +6 -0
  113. package/src/web/browser/main.ts +55 -0
  114. package/src/web/browser/markdown.ts +279 -0
  115. package/src/web/browser/memory-panel.ts +9 -0
  116. package/src/web/browser/palette.ts +64 -0
  117. package/src/web/browser/protocol.ts +13 -0
  118. package/src/web/browser/shell.ts +467 -0
  119. package/src/web/{src → browser}/status.ts +32 -36
  120. package/src/web/build.ts +51 -0
  121. package/src/web/public/app.html +1054 -0
  122. package/src/web/{sw.js → public/sw.js} +4 -3
  123. package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
  124. package/src/web/{vendor → public/vendor}/hljs.js +2 -2
  125. package/THIRD_PARTY_LICENSES.md +0 -51
  126. package/docs/README.md +0 -107
  127. package/docs/archive/hlg-sampling.md +0 -350
  128. package/docs/archive/investigations/audio-input-plan.md +0 -356
  129. package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
  130. package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
  131. package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
  132. package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
  133. package/docs/archive/investigations/curve-bisector-routing.md +0 -123
  134. package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
  135. package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
  136. package/docs/archive/investigations/dspark-handoff.md +0 -224
  137. package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
  138. package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
  139. package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
  140. package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
  141. package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
  142. package/docs/archive/investigations/lab-build-journal.md +0 -157
  143. package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
  144. package/docs/archive/investigations/openjarvis-fit.md +0 -198
  145. package/docs/archive/investigations/openwiki-evaluation.md +0 -249
  146. package/docs/archive/investigations/optimization_plan.md +0 -346
  147. package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
  148. package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
  149. package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
  150. package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
  151. package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
  152. package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
  153. package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
  154. package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
  155. package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
  156. package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
  157. package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
  158. package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
  159. package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
  160. package/docs/archive/planning/chat-ui-vision.md +0 -50
  161. package/docs/archive/planning/chunk-task-roadmap.md +0 -77
  162. package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
  163. package/docs/archive/planning/journal.md +0 -316
  164. package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
  165. package/docs/archive/planning/pi-integration-review.md +0 -178
  166. package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
  167. package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
  168. package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
  169. package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
  170. package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
  171. package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
  172. package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
  173. package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
  174. package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
  175. package/docs/archive/planning/web-ui-pass-plan.md +0 -213
  176. package/docs/archive/planning/website-readme-pass-plan.md +0 -224
  177. package/docs/design/batching.md +0 -2054
  178. package/docs/design/decode-speed-program.md +0 -2404
  179. package/docs/design/dreaming-nightly-pipeline.md +0 -684
  180. package/docs/design/generic-model-support.md +0 -821
  181. package/docs/design/kv-cache.md +0 -993
  182. package/docs/design/orpo-training.md +0 -680
  183. package/docs/design/speculative-decoding.md +0 -2129
  184. package/docs/design/turboquant.md +0 -2225
  185. package/docs/design/unified-engine-frontier-plan.md +0 -1987
  186. package/docs/design/web-chat-redesign.md +0 -695
  187. package/docs/planning/PRODUCT_ROADMAP.md +0 -593
  188. package/docs/planning/ResearchTopics.md +0 -119
  189. package/docs/planning/public-readiness-handoff.md +0 -244
  190. package/docs/planning/public-readiness.md +0 -149
  191. package/docs/planning/video-series.md +0 -421
  192. package/docs/reference/benchmarks.md +0 -3587
  193. package/docs/reference/cli.md +0 -646
  194. package/docs/reference/distribution.md +0 -380
  195. package/docs/reference/environment.md +0 -494
  196. package/docs/reference/glossary.md +0 -39
  197. package/docs/reference/library-api.md +0 -688
  198. package/docs/reference/memory.md +0 -260
  199. package/docs/reference/models.md +0 -346
  200. package/docs/reference/server-api.md +0 -1945
  201. package/docs/reference/server-config.md +0 -973
  202. package/docs/reference/training.md +0 -462
  203. package/docs/reference/troubleshooting.md +0 -158
  204. package/src/admission-plan.ts +0 -18
  205. package/src/audio/audiotoolbox.ts +0 -112
  206. package/src/audio/conformer.ts +0 -655
  207. package/src/audio/decode.ts +0 -133
  208. package/src/audio/features.ts +0 -202
  209. package/src/audio/mic-capture.ts +0 -98
  210. package/src/audio/silero-vad.ts +0 -379
  211. package/src/audio/transcode.ts +0 -67
  212. package/src/audio/whisper-decode.ts +0 -774
  213. package/src/audio/whisper-fast.ts +0 -732
  214. package/src/audio/whisper-format.ts +0 -73
  215. package/src/audio/whisper-mel.ts +0 -185
  216. package/src/audio/whisper-timing.ts +0 -274
  217. package/src/audio/whisper-tokenizer.ts +0 -239
  218. package/src/audio/whisper-transcribe.ts +0 -410
  219. package/src/backends/mlx/assistant-target.ts +0 -46
  220. package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
  221. package/src/backends/mlx/autoregressive.ts +0 -129
  222. package/src/backends/mlx/batch-group.ts +0 -1874
  223. package/src/backends/mlx/cache-attachment.ts +0 -67
  224. package/src/backends/mlx/cache-layout.ts +0 -31
  225. package/src/backends/mlx/checkpoint-state.ts +0 -53
  226. package/src/backends/mlx/continuation-persistence.ts +0 -107
  227. package/src/backends/mlx/continuation-request.ts +0 -43
  228. package/src/backends/mlx/continuation.ts +0 -77
  229. package/src/backends/mlx/diffusion.ts +0 -39
  230. package/src/backends/mlx/draft-target.ts +0 -32
  231. package/src/backends/mlx/encoder-cache.ts +0 -25
  232. package/src/backends/mlx/evaluation.ts +0 -105
  233. package/src/backends/mlx/fill-append.ts +0 -58
  234. package/src/backends/mlx/fill-group.ts +0 -497
  235. package/src/backends/mlx/full-kv-row-append.ts +0 -32
  236. package/src/backends/mlx/full-kv-row-donor.ts +0 -54
  237. package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
  238. package/src/backends/mlx/gateway-binding.ts +0 -174
  239. package/src/backends/mlx/graph.ts +0 -38
  240. package/src/backends/mlx/kv-codec.ts +0 -9
  241. package/src/backends/mlx/kv-maintenance.ts +0 -161
  242. package/src/backends/mlx/kv-tensor-rows.ts +0 -212
  243. package/src/backends/mlx/memory-client.ts +0 -189
  244. package/src/backends/mlx/methods.ts +0 -90
  245. package/src/backends/mlx/mixed-iteration.ts +0 -62
  246. package/src/backends/mlx/model-prompt.ts +0 -178
  247. package/src/backends/mlx/model-serving.ts +0 -80
  248. package/src/backends/mlx/paged-cache-codec.ts +0 -27
  249. package/src/backends/mlx/prefill-cohort.ts +0 -100
  250. package/src/backends/mlx/prefill-policy.ts +0 -26
  251. package/src/backends/mlx/prefill-rows.ts +0 -244
  252. package/src/backends/mlx/prefill.ts +0 -33
  253. package/src/backends/mlx/projected-context-rows.ts +0 -72
  254. package/src/backends/mlx/prompt-input.ts +0 -29
  255. package/src/backends/mlx/qwen-prompt-input.ts +0 -40
  256. package/src/backends/mlx/request-policy.ts +0 -20
  257. package/src/backends/mlx/request-state-policy.ts +0 -54
  258. package/src/backends/mlx/rollback.ts +0 -92
  259. package/src/backends/mlx/row-sampling.ts +0 -49
  260. package/src/backends/mlx/serial-executor.ts +0 -251
  261. package/src/backends/mlx/speculative-group.ts +0 -438
  262. package/src/backends/mlx/speculative-round.ts +0 -161
  263. package/src/backends/mlx/speculative.ts +0 -131
  264. package/src/backends/mlx/state-rows.ts +0 -104
  265. package/src/backends/mlx/state-views.ts +0 -46
  266. package/src/backends/mlx/target-layout-capability.ts +0 -35
  267. package/src/backends/mlx/text-engine.ts +0 -73
  268. package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
  269. package/src/chat-template.ts +0 -382
  270. package/src/cli.ts +0 -3490
  271. package/src/config.ts +0 -399
  272. package/src/contracts/completion.ts +0 -16
  273. package/src/contracts/execution.ts +0 -70
  274. package/src/contracts/generation.ts +0 -103
  275. package/src/contracts/host.ts +0 -7
  276. package/src/contracts/object-cache.ts +0 -8
  277. package/src/contracts/pi-provider.ts +0 -30
  278. package/src/contracts/pi.ts +0 -261
  279. package/src/contracts/prefix-cache.ts +0 -33
  280. package/src/contracts/resources.ts +0 -25
  281. package/src/contracts/sampling.ts +0 -23
  282. package/src/contracts/scheduling.ts +0 -54
  283. package/src/contracts/tsconfig.json +0 -14
  284. package/src/dataset/generators.ts +0 -1087
  285. package/src/dataset/index.ts +0 -12
  286. package/src/dataset/job.ts +0 -81
  287. package/src/dataset/llm.ts +0 -71
  288. package/src/dataset/registry.ts +0 -528
  289. package/src/diffusion/diffusion-generate.ts +0 -507
  290. package/src/download.ts +0 -505
  291. package/src/embed.ts +0 -77
  292. package/src/engine/admission.ts +0 -59
  293. package/src/engine/cancellation.ts +0 -38
  294. package/src/engine/engine.ts +0 -56
  295. package/src/engine/execution-coordinator.ts +0 -70
  296. package/src/engine/execution-plan.ts +0 -64
  297. package/src/engine/execution-tasks.ts +0 -44
  298. package/src/engine/namespaced-cache.ts +0 -13
  299. package/src/engine/resources.ts +0 -53
  300. package/src/engine/scheduler.ts +0 -92
  301. package/src/engine/session.ts +0 -247
  302. package/src/eval/README.md +0 -130
  303. package/src/eval/ifeval.ts +0 -81
  304. package/src/eval/kl-prompts.ts +0 -29
  305. package/src/eval/kl.ts +0 -590
  306. package/src/eval/perplexity.ts +0 -164
  307. package/src/eval/quality-db.ts +0 -92
  308. package/src/eval/reference-logits.ts +0 -207
  309. package/src/eval/runner.ts +0 -124
  310. package/src/eval/score.ts +0 -49
  311. package/src/eval/tasks/bfcl.ts +0 -535
  312. package/src/eval/tasks/gsm8k.ts +0 -98
  313. package/src/eval/tasks/hashhop.ts +0 -139
  314. package/src/eval/tasks/humaneval.ts +0 -275
  315. package/src/eval/tasks/ifeval.ts +0 -525
  316. package/src/eval/tasks/mmlu.ts +0 -157
  317. package/src/eval/ultrafeedback.ts +0 -60
  318. package/src/evaldb.ts +0 -199
  319. package/src/expert-io.ts +0 -393
  320. package/src/expert-offload-build.ts +0 -77
  321. package/src/expert-offload.ts +0 -76
  322. package/src/expert-residency.ts +0 -1134
  323. package/src/expert-usage.ts +0 -415
  324. package/src/fill/echo-index.ts +0 -188
  325. package/src/fill/fill-session.ts +0 -463
  326. package/src/fill/proposal.ts +0 -68
  327. package/src/fill/schema-rows.ts +0 -506
  328. package/src/fill/tool-boundary.ts +0 -103
  329. package/src/fit.ts +0 -249
  330. package/src/generate.ts +0 -1352
  331. package/src/grammar.ts +0 -604
  332. package/src/harness-pi.ts +0 -184
  333. package/src/hf-push.ts +0 -628
  334. package/src/hub-rest.ts +0 -242
  335. package/src/index.ts +0 -63
  336. package/src/inference/denoising.ts +0 -17
  337. package/src/inference/draft-acceptance.ts +0 -41
  338. package/src/inference/draft-output.ts +0 -49
  339. package/src/inference/graph.ts +0 -33
  340. package/src/inference/prefill.ts +0 -45
  341. package/src/inference/rollback.ts +0 -7
  342. package/src/jobs/index.ts +0 -31
  343. package/src/jobs/job-entry.ts +0 -107
  344. package/src/jobs/task-client.ts +0 -19
  345. package/src/jobs/types.ts +0 -2
  346. package/src/kv-scheme.ts +0 -279
  347. package/src/kv-store.ts +0 -1135
  348. package/src/lab/README.md +0 -22
  349. package/src/lab/curve/curve-designer.html +0 -303
  350. package/src/lab/curve/curve-sampler.ts +0 -122
  351. package/src/lab/expert-trace/expert-trace.ts +0 -69
  352. package/src/lab/paged-kv/paged-attention.ts +0 -117
  353. package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
  354. package/src/lab/paged-kv/paged-kv.ts +0 -336
  355. package/src/library.ts +0 -40
  356. package/src/lora.ts +0 -408
  357. package/src/md-modules.d.ts +0 -54
  358. package/src/media-fetch.ts +0 -442
  359. package/src/memory/article.ts +0 -558
  360. package/src/memory/chunk-validation.ts +0 -150
  361. package/src/memory/chunk.ts +0 -318
  362. package/src/memory/cluster.ts +0 -351
  363. package/src/memory/coverage.ts +0 -134
  364. package/src/memory/crosslink.ts +0 -0
  365. package/src/memory/db.ts +0 -253
  366. package/src/memory/entity.ts +0 -203
  367. package/src/memory/gate.ts +0 -187
  368. package/src/memory/history.ts +0 -152
  369. package/src/memory/ingest.ts +0 -335
  370. package/src/memory/model.ts +0 -183
  371. package/src/memory/normalize.ts +0 -671
  372. package/src/memory/parse.ts +0 -22
  373. package/src/memory/pipeline.ts +0 -275
  374. package/src/memory/prompts.ts +0 -65
  375. package/src/memory/query.ts +0 -334
  376. package/src/memory/reconcile.ts +0 -734
  377. package/src/memory/redirect.ts +0 -108
  378. package/src/memory/reindex.ts +0 -325
  379. package/src/memory/resolve.ts +0 -307
  380. package/src/memory/rest.ts +0 -245
  381. package/src/memory/route.ts +0 -272
  382. package/src/memory/schedule.ts +0 -165
  383. package/src/memory/stages.ts +0 -777
  384. package/src/memory/synthesize.ts +0 -1638
  385. package/src/memory/tools.ts +0 -749
  386. package/src/memory/vault.ts +0 -1194
  387. package/src/memory/wikify.ts +0 -1064
  388. package/src/mlx/array.ts +0 -425
  389. package/src/mlx/autograd.ts +0 -304
  390. package/src/mlx/checkpoint.ts +0 -149
  391. package/src/mlx/compile.ts +0 -168
  392. package/src/mlx/custom-vjp.ts +0 -188
  393. package/src/mlx/ffi.ts +0 -531
  394. package/src/mlx/materialize.ts +0 -23
  395. package/src/mlx/metal-kernel.ts +0 -159
  396. package/src/mlx/normalized-argmax.ts +0 -116
  397. package/src/mlx/ops.ts +0 -1108
  398. package/src/mlx/quantized-rows.ts +0 -36
  399. package/src/mlx/token-bitmask.ts +0 -52
  400. package/src/mlx/turboquant-kv-decode.ts +0 -82
  401. package/src/mlx/turboquant-kv-inverse.ts +0 -122
  402. package/src/mlx/turboquant-ops.ts +0 -861
  403. package/src/mlx/turboquant-tables.ts +0 -237
  404. package/src/mmap.ts +0 -90
  405. package/src/model/artifact-identity.ts +0 -73
  406. package/src/model/batched-kv.ts +0 -235
  407. package/src/model/batched-mask.ts +0 -279
  408. package/src/model/batched-quant.ts +0 -212
  409. package/src/model/batched-quantized-kv.ts +0 -144
  410. package/src/model/batched-rotating-quant.ts +0 -353
  411. package/src/model/batched-rotating-state.ts +0 -149
  412. package/src/model/batched-rotating.ts +0 -338
  413. package/src/model/batched-row-storage.ts +0 -179
  414. package/src/model/batched-ssm.ts +0 -52
  415. package/src/model/batched-turboquant-kv.ts +0 -94
  416. package/src/model/compiled-decode.ts +0 -712
  417. package/src/model/decoded-kv-donor.ts +0 -12
  418. package/src/model/delayed-quantized-kv.ts +0 -72
  419. package/src/model/delayed-rotating-quantized-kv.ts +0 -93
  420. package/src/model/delayed-turboquant-kv.ts +0 -57
  421. package/src/model/diffusion-gemma.ts +0 -1026
  422. package/src/model/factory.ts +0 -215
  423. package/src/model/fingerprint.ts +0 -45
  424. package/src/model/flash-attention.ts +0 -694
  425. package/src/model/full-prefill-padding.ts +0 -56
  426. package/src/model/full-prefill-row.ts +0 -105
  427. package/src/model/gemma4-base.ts +0 -2370
  428. package/src/model/gemma4.ts +0 -1395
  429. package/src/model/generated/gemma4-12b.ts +0 -429
  430. package/src/model/generated/gemma4-26b.ts +0 -448
  431. package/src/model/generated/gemma4-e4b.ts +0 -717
  432. package/src/model/generated/index.ts +0 -18
  433. package/src/model/glm52-atlas.ts +0 -511
  434. package/src/model/glm52-cache.ts +0 -792
  435. package/src/model/glm52-config.ts +0 -262
  436. package/src/model/glm52-container.ts +0 -305
  437. package/src/model/glm52-coupling.ts +0 -388
  438. package/src/model/glm52-dsa.ts +0 -606
  439. package/src/model/glm52-expert-layout.ts +0 -253
  440. package/src/model/glm52-layout.ts +0 -152
  441. package/src/model/glm52-memory.ts +0 -500
  442. package/src/model/glm52-mla.ts +0 -792
  443. package/src/model/glm52-moe.ts +0 -223
  444. package/src/model/glm52-pilot.ts +0 -537
  445. package/src/model/glm52-reference.ts +0 -445
  446. package/src/model/glm52-residency.ts +0 -557
  447. package/src/model/glm52-resident-weights.ts +0 -135
  448. package/src/model/glm52-streamed-experts.ts +0 -453
  449. package/src/model/glm52-streamed-metal.ts +0 -610
  450. package/src/model/glm52-weights.ts +0 -503
  451. package/src/model/glm52.ts +0 -1132
  452. package/src/model/implementation.ts +0 -69
  453. package/src/model/kv-attention-view.ts +0 -70
  454. package/src/model/minicpm5.ts +0 -376
  455. package/src/model/profile.ts +0 -468
  456. package/src/model/quantized-append-attention.ts +0 -31
  457. package/src/model/qwen-append.ts +0 -12
  458. package/src/model/qwen-conv.ts +0 -52
  459. package/src/model/qwen3-delta-state.ts +0 -74
  460. package/src/model/qwen3-delta.ts +0 -451
  461. package/src/model/qwen3-moe.ts +0 -404
  462. package/src/model/qwen3-mrope.ts +0 -250
  463. package/src/model/qwen3.ts +0 -277
  464. package/src/model/qwen3_5-checkpoint.ts +0 -164
  465. package/src/model/qwen3_5.ts +0 -881
  466. package/src/model/rotating-kv-donor.ts +0 -35
  467. package/src/model/rotating-kv-layout.ts +0 -262
  468. package/src/model/rotating-row-transaction.ts +0 -35
  469. package/src/model/speculative-rotating-kv.ts +0 -101
  470. package/src/model/ssm-prefill-padding.ts +0 -39
  471. package/src/model/support.ts +0 -110
  472. package/src/model/token-groups.ts +0 -66
  473. package/src/model/trellis-balanced-scatter.ts +0 -51
  474. package/src/model/trellis-linear.ts +0 -672
  475. package/src/model/trellis-shared-m.ts +0 -151
  476. package/src/model/trellis-shared-scatter.ts +0 -144
  477. package/src/model/trellis-splitk-prefill.ts +0 -158
  478. package/src/model/trellis-tiled-prefill.ts +0 -136
  479. package/src/model/trellis-vector-expand.ts +0 -62
  480. package/src/model/trellis-wide-prefill.ts +0 -94
  481. package/src/model/turboquant-codec.ts +0 -89
  482. package/src/model/universal/archs.ts +0 -332
  483. package/src/model/universal/dense.ts +0 -612
  484. package/src/model/universal/modules.ts +0 -170
  485. package/src/model/universal/rope.ts +0 -381
  486. package/src/model/whisper.ts +0 -435
  487. package/src/native/expert_io.c +0 -523
  488. package/src/native/frame_extract.swift +0 -140
  489. package/src/native/mic_capture.swift +0 -92
  490. package/src/native-pack.ts +0 -163
  491. package/src/pi-provider.ts +0 -53
  492. package/src/pi-session.ts +0 -81
  493. package/src/pi-terminal.ts +0 -274
  494. package/src/pi-web.ts +0 -1940
  495. package/src/preflight.ts +0 -158
  496. package/src/prompt-cache.ts +0 -682
  497. package/src/quantize/allocator.ts +0 -627
  498. package/src/quantize/atomic-output.ts +0 -38
  499. package/src/quantize/calibration.ts +0 -181
  500. package/src/quantize/config-writer.ts +0 -145
  501. package/src/quantize/index.ts +0 -84
  502. package/src/quantize/job.ts +0 -162
  503. package/src/quantize/quantizer.ts +0 -666
  504. package/src/quantize/rotate.ts +0 -603
  505. package/src/quantize/safetensors-writer.ts +0 -249
  506. package/src/quantize/sensitivity.ts +0 -216
  507. package/src/quantize/trellis.ts +0 -586
  508. package/src/quantize/weight-transform.ts +0 -292
  509. package/src/registry.ts +0 -602
  510. package/src/runtime-config.ts +0 -77
  511. package/src/safetensors.ts +0 -165
  512. package/src/sampler.ts +0 -1012
  513. package/src/serve/admin-routes.ts +0 -184
  514. package/src/serve/assets/curve-terrain.html +0 -105
  515. package/src/serve/assets/training-inference-map.html +0 -575
  516. package/src/serve/audio-routes.ts +0 -323
  517. package/src/serve/aux-routes.ts +0 -132
  518. package/src/serve/batch-scheduler.ts +0 -8
  519. package/src/serve/checkpoint-identity.ts +0 -64
  520. package/src/serve/generation-gateway.ts +0 -537
  521. package/src/serve/isolate.ts +0 -609
  522. package/src/serve/kv-budget.ts +0 -14
  523. package/src/serve/lab-routes.ts +0 -341
  524. package/src/serve/lane-registry.ts +0 -45
  525. package/src/serve/model-admin-routes.ts +0 -155
  526. package/src/serve/model-binding.ts +0 -49
  527. package/src/serve/model-host.ts +0 -511
  528. package/src/serve/parent-application.ts +0 -56
  529. package/src/serve/prompt-response-trace.ts +0 -161
  530. package/src/serve/response-lease.ts +0 -24
  531. package/src/serve/session-search.ts +0 -326
  532. package/src/serve/static-routes.ts +0 -101
  533. package/src/serve/transcription-server.ts +0 -64
  534. package/src/serve/transcription-service.ts +0 -502
  535. package/src/server.ts +0 -1282
  536. package/src/spec/assistant-rows.ts +0 -93
  537. package/src/spec/assistant-source.ts +0 -126
  538. package/src/spec/cache-identity.ts +0 -22
  539. package/src/spec/deepspec-rows.ts +0 -29
  540. package/src/spec/deepspec-source.ts +0 -145
  541. package/src/spec/dflash-source.ts +0 -149
  542. package/src/spec/drafter.ts +0 -304
  543. package/src/spec/dspark/ab-stats.ts +0 -136
  544. package/src/spec/dspark/calibration.ts +0 -112
  545. package/src/spec/dspark/data-dflash.ts +0 -156
  546. package/src/spec/dspark/data.ts +0 -201
  547. package/src/spec/dspark/deepspec-module.ts +0 -776
  548. package/src/spec/dspark/generate-dflash.ts +0 -245
  549. package/src/spec/dspark/generate.ts +0 -290
  550. package/src/spec/dspark/loader.ts +0 -23
  551. package/src/spec/dspark/loss.ts +0 -213
  552. package/src/spec/dspark/module-dflash.ts +0 -560
  553. package/src/spec/dspark/module.ts +0 -540
  554. package/src/spec/dspark/quantize-drafter.ts +0 -91
  555. package/src/spec/dspark/sample.ts +0 -112
  556. package/src/spec/generate.ts +0 -276
  557. package/src/spec/glm52-mtp-graph.ts +0 -29
  558. package/src/spec/glm52-mtp-rows.ts +0 -132
  559. package/src/spec/glm52-mtp-source.ts +0 -318
  560. package/src/spec/glm52-mtp-state.ts +0 -33
  561. package/src/spec/ngram-source.ts +0 -226
  562. package/src/spec/projected-draft-rows.ts +0 -73
  563. package/src/spec/qwen-mtp-module.ts +0 -171
  564. package/src/spec/qwen-mtp-rows.ts +0 -230
  565. package/src/spec/qwen-mtp-source.ts +0 -386
  566. package/src/spec/qwen-mtp-state.ts +0 -30
  567. package/src/spec/serve-loop.ts +0 -587
  568. package/src/spec/source.ts +0 -228
  569. package/src/spec/two-model-rows.ts +0 -62
  570. package/src/spec/two-model.ts +0 -113
  571. package/src/ssd-cache.ts +0 -431
  572. package/src/ssd-durability.ts +0 -209
  573. package/src/storage/host-buffer.ts +0 -24
  574. package/src/storage/kv-writer.ts +0 -83
  575. package/src/storage/kv-writer.worker.js +0 -264
  576. package/src/storage/retention-policy.ts +0 -37
  577. package/src/tiered-prompt-cache.ts +0 -45
  578. package/src/tokenizer.ts +0 -335
  579. package/src/tool-approvals.ts +0 -131
  580. package/src/tool-call.ts +0 -695
  581. package/src/train/dataset.ts +0 -484
  582. package/src/train/diffusion-lora.ts +0 -216
  583. package/src/train/export.ts +0 -32
  584. package/src/train/flash-cce.ts +0 -1234
  585. package/src/train/forward.ts +0 -266
  586. package/src/train/fuse.ts +0 -243
  587. package/src/train/index.ts +0 -46
  588. package/src/train/job.ts +0 -205
  589. package/src/train/lora-params.ts +0 -254
  590. package/src/train/loss.ts +0 -1591
  591. package/src/train/merge.ts +0 -195
  592. package/src/train/optimizer.ts +0 -183
  593. package/src/train/prefix-shared.ts +0 -490
  594. package/src/train/rank.ts +0 -137
  595. package/src/train/segmented.ts +0 -1828
  596. package/src/train/steel-qmm-header.ts +0 -1461
  597. package/src/train/trainer.ts +0 -1221
  598. package/src/train/watch.ts +0 -542
  599. package/src/vision/diffusion-vision.ts +0 -620
  600. package/src/vision/embedder.ts +0 -176
  601. package/src/vision/preprocess.ts +0 -247
  602. package/src/vision/prompt.ts +0 -409
  603. package/src/vision/qwen3vl-preprocess.ts +0 -409
  604. package/src/vision/qwen3vl-prompt.ts +0 -233
  605. package/src/vision/qwen3vl-tower.ts +0 -566
  606. package/src/vision/siglip.ts +0 -607
  607. package/src/vision/video-frames.ts +0 -148
  608. package/src/web/app.html +0 -2155
  609. package/src/web/app.js +0 -5863
  610. package/src/web/skills/memory/SKILL.md +0 -120
  611. package/src/web/skills/web-research/SKILL.md +0 -46
  612. package/src/web/skills.ts +0 -97
  613. package/src/web/src/adapters-panel.ts +0 -288
  614. package/src/web/src/assistant.ts +0 -451
  615. package/src/web/src/chat.ts +0 -1060
  616. package/src/web/src/composer.ts +0 -962
  617. package/src/web/src/dataset.ts +0 -132
  618. package/src/web/src/finetune.ts +0 -267
  619. package/src/web/src/hub.ts +0 -428
  620. package/src/web/src/main.ts +0 -98
  621. package/src/web/src/markdown.ts +0 -0
  622. package/src/web/src/memory-panel.ts +0 -572
  623. package/src/web/src/model-picker.ts +0 -159
  624. package/src/web/src/palette.ts +0 -346
  625. package/src/web/src/protocol.ts +0 -26
  626. package/src/web/src/quantize.ts +0 -167
  627. package/src/web/src/rag.ts +0 -274
  628. package/src/web/src/sessions.ts +0 -469
  629. package/src/web/src/shell.ts +0 -804
  630. package/src/web/src/ui-catalog.ts +0 -78
  631. package/src/web/src/voice.ts +0 -141
  632. package/src/web/vendor/README.md +0 -61
  633. package/src/web-assets.ts +0 -47
  634. package/src/web-tools.ts +0 -478
  635. package/src/weights.ts +0 -255
  636. /package/src/{serve → server}/completion-sink.ts +0 -0
  637. /package/src/{serve → server}/generated-token-history.ts +0 -0
  638. /package/src/web/{icon.svg → public/icon.svg} +0 -0
  639. /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
  640. /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
@@ -1,331 +0,0 @@
1
- # Curve sampler — preregistered research plan (distinctness track)
2
-
3
- *2026-07-01. Status: PREREGISTERED — hypotheses and analysis fixed BEFORE the
4
- fresh runs. Mandate (Josh): "I am not ready to give up on the curve sampler.
5
- I think there ARE outputs that cannot be reached by just p, k and temp — temp
6
- means you cannot control different areas of prob." The old experiments are not
7
- trusted as-is (audit in §6); this plan replaces them. The distinctness track is
8
- being PURSUED, not folded into the assessment's "honest negative" framing
9
- (reports/curve-designer-paper-assessment-2026-07-01.md) — the assessment's
10
- venue advice (workshop/demo tier unless the empirical section lands) is noted,
11
- not contested.*
12
-
13
- Object under study: `src/curve-sampler.ts` — the v2 monotone-cubic (PCHIP)
14
- log-prob transfer curve, `p_out ∝ exp(curve(log p_in))`, replacing
15
- temperature+top-p/top-k when active.
16
-
17
- ---
18
-
19
- ## 1. The theorem (in hand — pure math, section-ready)
20
-
21
- **Setup.** Base next-token logprobs ℓ ∈ ℝ^V, base probs p = softmax(ℓ). Call a
22
- sampler a **single-slope truncation sampler** if its output is
23
-
24
- q_i ∝ exp(ℓ_i / T) for i ∈ S, q_i = 0 otherwise,
25
-
26
- for some temperature T > 0 and survivor set S. This family contains, exactly:
27
-
28
- | method | survivor set S | S is a rank prefix? | slope on S |
29
- |---|---|---|---|
30
- | temperature | V | yes (trivially) | 1/T |
31
- | top-k | k highest | yes | 1/T |
32
- | top-p | smallest prefix with mass ≥ p | yes | 1/T |
33
- | min-p | {i : p_i ≥ α·p_max} | yes | 1/T |
34
- | top-nσ | {i : ℓ_i ≥ ℓ_max − n·σ(ℓ)} | yes | 1/T |
35
- | ε / η (desmoothing) | absolute / entropy-scaled floor | yes | 1/T |
36
- | typical | surprisal closest to H | **not necessarily** | 1/T |
37
- | mirostat | feedback-chosen k per step | yes (per step) | 1/T |
38
-
39
- Every published truncation sampler differs only in HOW it picks S — on the
40
- survivors, all of them apply ONE global slope.
41
-
42
- **Gap-ratio invariant.** For any a, b, c ∈ S with distinct ℓ values:
43
-
44
- R(q) := (ln q_a − ln q_b) / (ln q_b − ln q_c)
45
- = (ℓ_a − ℓ_b) / (ℓ_b − ℓ_c) = R(p).
46
-
47
- Proof: ln q_i = ℓ_i/T − ln Z_S; the normalizer cancels in differences, T
48
- cancels in the ratio. So **no choice of T and no choice of survivor set can
49
- change the log-gap ratios of surviving tokens** — one scalar cannot set
50
- different sharpness in different probability regions.
51
-
52
- **The curve breaks it.** A monotone map w with slope s₁ on one log-prob region
53
- and s₂ ≠ s₁ on another gives R(q) = (s₁/s₂)·R(p) for tokens straddling the
54
- regions — order preserved (monotonicity), ratios changed. Hence a curve
55
- distribution with mismatched gap ratios is unreachable EXACTLY by any member of
56
- the family above; the witness (§2) shows the inexact gap is also structurally
57
- large where it matters. Truncating the mismatched region instead costs its
58
- whole mass in TV — so TV_min ≳ min(ratio-mismatch cost, lifted-band mass / 2).
59
-
60
- **Honest boundary (both directions).** The curve is a FIXED pointwise map of
61
- the token's own value: it cannot express distribution-ADAPTIVE head selection
62
- (min-p's α·p_max, top-nσ's σ(ℓ), typical's H, mirostat's feedback) nor
63
- non-monotone re-ranking (XTC). The two families intersect exactly on
64
- {temperature + absolute-threshold gates}; **neither contains the other**. The
65
- claim being pursued is "the curve reaches per-step distributions the standard
66
- family cannot", not "the curve subsumes it". (The fork-routing impossibility —
67
- fork-ness is a trajectory property invisible to any local warp — stands as the
68
- other half of the characterization; see curve-bisector-routing.md, strengthened
69
- per §6 F5.)
70
-
71
- ## 2. The witness (in hand — measured 2026-07-01)
72
-
73
- `scripts/experiments/curve-distinctness.ts` (this session; MiniCPM5-1B-OptiQ-
74
- 4bit, M1 Max 32 GB). 20 real next-token distributions (5 prompts × {start,
75
- max-entropy "fork", min-entropy, after-comma}); per position, a witness curve
76
- that (i) keeps the top-2 gap EXACTLY as sharp as T=0.7 and (ii) lifts the
77
- p∈[0.001, 0.02] band's total mass to 2× its T=0.7 value (or the largest
78
- feasible factor on flat distributions). Fit = exhaustive (T ∈ [0.05, 3] step
79
- 0.001-refined, survivor-prefix m ∈ {1..300, 325..2000, V}) minimizing total
80
- variation — since every (p, k, min-p, top-nσ, ε) survivor set is a rank
81
- prefix, the m-sweep covers ALL of them jointly, any application order.
82
-
83
- | pos | kind | H (nats) | band mass ref→witness | TV_min | (T*, k*) |
84
- |---|---|---|---|---|---|
85
- | creative start | start | 1.67 | 0.011→0.022 (×2.0) | 0.0105 | (0.73, 1773) |
86
- | creative fork | max-H | 4.94 | 0.270→0.512 (×1.9) | **0.187** | (1.73, 168) |
87
- | creative comma | after-comma | 4.12 | 0.068→0.136 (×2.0) | 0.0630 | (0.77, 402) |
88
- | advice start | start | 1.10 | 0.010→0.021 (×2.0) | 0.0075 | (0.74, 798) |
89
- | advice fork | max-H | 3.99 | 0.204→0.408 (×2.0) | **0.167** | (0.88, 265) |
90
- | advice comma | after-comma | 1.15 | 0.002→0.004 (×2.0) | 0.0020 | (0.70, 1773) |
91
- | factual start | start | 1.16 | 0.015→0.030 (×2.0) | 0.0096 | (0.77, 94) |
92
- | factual fork | max-H | 3.43 | 0.072→0.143 (×2.0) | 0.0593 | (0.76, 243) |
93
- | factual comma | after-comma | 1.92 | 0.028→0.056 (×2.0) | 0.0265 | (0.74, 101) |
94
- | continuation start | start | 1.01 | 0.009→0.017 (×2.0) | 0.0067 | (0.74, 1323) |
95
- | continuation fork | max-H | 5.19 | 0.369→0.568 (×1.5) | **0.119** | (1.23, 235) |
96
- | continuation comma | after-comma | 2.13 | 0.032→0.064 (×2.0) | 0.0165 | (0.78, 500) |
97
- | brainstorm start | start | 2.16 | 0.014→0.029 (×2.0) | 0.0142 | (0.72, 1723) |
98
- | brainstorm fork | max-H | 5.76 | 0.434→0.585 (×1.35) | **0.114** | (1.20, 264) |
99
- | brainstorm comma | after-comma | 1.73 | 0.016→0.033 (×2.0) | 0.0177 | (0.73, 1148) |
100
-
101
- (5 min-entropy positions skipped: band empty — near-deterministic steps have
102
- nothing to lift; the theorem is about positions where sampling matters.)
103
-
104
- - **Irreducible TV: min 0.0020, median 0.0177, mean 0.0547, max 0.187.**
105
- - **Fitter control: refitting plain T=0.7 gives max TV 0.008** (mostly
106
- ≤0.002) — the gaps are real, 10–20× above fitter slack at forks.
107
- - **The gap concentrates exactly at forks** (high-entropy positions): TV
108
- 0.11–0.19 — no (T, p, k, min-p, top-nσ) combination gets within 11–19% total
109
- variation of the witness there. Best fits either keep T≈0.7-sharp heads and
110
- miss the band, or go hot (T*=1.2–1.7) to buy band mass and give up the top-2
111
- gap. Full-support pure temperature is worse still (TV 0.17–0.28 at forks).
112
- - The witness is realizable by the shipped designer: the PCHIP spline through
113
- the printed knots reproduces the analytic piecewise-linear witness to mean
114
- TV 0.0083; the curve JSON is printed by the script for pasting into
115
- `/curves`.
116
- - **Text-level (directional, N=30/arm, 3 prompts, not preregistered):** under
117
- a fixed global witness curve vs its best global match (T=0.77, k=750),
118
- per-step TV along generated trajectories averaged 0.024–0.061 (max 0.24),
119
- but distinct-1/2/3 and junk were indistinguishable at this N. Honest read:
120
- **per-step distinctness is proven; whether it produces measurably different
121
- TEXT distributions is exactly H2 below, and is open.**
122
-
123
- Reproduce: `bun scripts/experiments/curve-distinctness.ts` (flags:
124
- `--model`, `--positions-per-prompt`, `--gen-n`, `--gen-tokens`, `--skip-text`).
125
-
126
- ## 3. Hypotheses (fixed before the fresh runs)
127
-
128
- - **H1 — per-step distinctness. PROVEN** (§1 theorem + §2 witness). The curve
129
- family reaches next-token distributions with TV ≥ 0.05 (median-fork ≥ 0.1)
130
- from the entire single-slope truncation family, at matched top-2 sharpness.
131
- Remaining H1 work is replication breadth only: same probe on e4b + 12B
132
- (262k vocab) and 20 → 100 positions. *Null outcome possible:* larger-vocab
133
- models could shrink the band-lift headroom; report whatever comes out.
134
- - **H2 — text-level distributional distinctness at matched coherence.** There
135
- exists a curve (the §2 global witness is the preregistered candidate) such
136
- that the distribution of its generations differs from EVERY tuned
137
- single-slope baseline's at equal coherence: MAUVE(curve, baseline) <
138
- MAUVE(baseline-seed-A, baseline-seed-B) − δ, with δ set by the bootstrap CI.
139
- *Null outcome is live:* per-step TV of 0.02–0.06 per token may wash out in
140
- 60-token texts (the directional N=30 probe saw no distinct-n separation).
141
- A null here = "per-step distinctness does not surface in text statistics at
142
- this scale" — publishable as the boundary of claim 1, and the method paper
143
- stays closed.
144
- - **H3 — a task/regime where curve-reachable points lie OUTSIDE the
145
- (T,p,k)+min-p+top-nσ Pareto front** (quality × diversity at matched
146
- coherence). Candidate regimes (fixed now): (a) constrained-form generation
147
- where the head must stay sharp while mid-band alternatives carry the
148
- variety (structured lists, fixed-opening continuations); (b) fork-dense
149
- creative prompts (the §2 fork TV is largest there); (c) repeated-sampling
150
- best-of-N settings where band mass controls candidate coverage. *Null
151
- outcome is live* and would land exactly on the assessment's analysis-paper
152
- framing.
153
-
154
- ## 4. Preregistered protocol (the referee-grade run)
155
-
156
- **Models:** MiniCPM5-1B (73k vocab), gemma-4-e4b (262k), gemma-4-12B (262k) —
157
- all cached OptiQ-4bit builds; the vocab split is a known moderator (hlg
158
- investigation §15).
159
-
160
- **Arms (per model, per prompt):**
161
- 1. `default` — the model's own generation_config recipe (temperature/top-p/top-k).
162
- 2. `best-Tpk` — (T, p, k) tuned on a held-out prompt set for the target
163
- coherence level (grid: T ∈ {0.5..1.5 step 0.1} × p ∈ {0.85, 0.9, 0.95, 1} ×
164
- k ∈ {0, 40, 64, 100, 200}).
165
- 3. `min-p` — α ∈ {0.02, 0.05, 0.1, 0.2} × T ∈ {0.7..1.5}.
166
- 4. `top-nσ` — n ∈ {1, 1.5, 2, 3} × T ∈ {0.7..1.5}.
167
- 5. `mirostat` — τ ∈ {3, 4, 5} (implement or mark N/A if not landed; absence
168
- documented, not silently dropped).
169
- 6. `curve-witness` — the §2 global witness curve (knots frozen in the script
170
- output, checked into the plan by hash once the run starts).
171
- 7. `curve-tuned` — ONE curve hand-tuned in the designer per model BEFORE
172
- scoring (tuning prompts disjoint from eval prompts), then frozen.
173
-
174
- **Prompts:** 30 prompts, 10 per pole {creative/open, advice/constrained,
175
- factual} — fixed list checked in before the run; disjoint 10-prompt tuning set.
176
-
177
- **N and power.** N = 100 continuations per (arm × prompt-pole × model) cell,
178
- 64 tokens each. Basis: the old N=10 runs put the sd of a cell's self-BLEU
179
- run-mean at ≈0.06 (runO swing 0.083 between two seed bands), i.e. a minimum
180
- detectable effect ≈ 0.17 at N=10 — bigger than every effect ever claimed. At
181
- N=100 the run-mean sd scales to ≈0.019, MDE ≈ 0.053 at α=.05/power .8; for
182
- Δ≈0.05 effects run the planned replication (below) and pool. MAUVE gets
183
- bootstrap CIs (1000 resamples); LLM-judge cells get binomial CIs.
184
-
185
- **Seed discipline.** Explicit integer seeds only — no wall-clock seeding
186
- anywhere (the batch same-ms collision class). Disjoint bands per arm:
187
- arm i uses seeds `10000·(i+1) + {0..N−1}`. The WHOLE grid is run TWICE with
188
- band offset +5000 (built-in fresh-seed replication — the discipline that
189
- caught both premature verdicts in hlg §14). No cross-arm seed pairing (arms
190
- are different distributions; pairing buys nothing and invites accidental
191
- correlation stories).
192
-
193
- **Metrics (all fixed now):**
194
- - **Coherence gate (per sample, gates everything else):** (a) non-Latin
195
- letter ratio < 1% AND (b) mean per-token logprob under the model's OWN
196
- default recipe ≥ (pole-median of the default arm − 1.5 nats) AND (c) no
197
- 4-gram repeated ≥ 3× within the sample. (b)/(c) close the F4 hole — Latin
198
- word-salad and repetition-degeneration currently pass the gate.
199
- - **Diversity:** coherence-GATED distinct-1/2/3 (computed only over gate
200
- survivors, reported with survivor rate) + self-BLEU (leave-one-out, so it
201
- has per-sample values and a real variance estimate).
202
- - **Distributional:** MAUVE between arm outputs and (i) the default arm and
203
- (ii) each other, per pole; embedding model = a real sentence encoder (not
204
- the LM's own hidden states — a known weak proxy).
205
- - **Quality:** LLM-judge per the dreaming eval methodology (cloud judge;
206
- hand-curated gold anchors drafted before scoring; surface-variant dedup;
207
- judge the artifacts, blind to arm, position-flipped pairs). Judge prompt
208
- frozen in the harness before the run.
209
- - **Per-step (mechanism):** mean TV along trajectories between the curve arm
210
- and its best-fit single-slope arm (already implemented in the witness
211
- script) — connects H2 outcomes back to H1 magnitude.
212
-
213
- **Pareto construction (H3):** per pole × model, plot (coherence-gated
214
- diversity, judge quality) for every arm-cell; H3 is supported iff a curve
215
- cell sits outside the convex hull of ALL single-slope cells with
216
- non-overlapping bootstrap CIs, in ≥2 of 3 models.
217
-
218
- **Commands (harnesses to extend from the existing probe):**
219
- ```bash
220
- # H1 replication breadth (exists today):
221
- bun scripts/experiments/curve-distinctness.ts --model gemma-4-e4b-it-OptiQ-4bit --skip-text
222
- bun scripts/experiments/curve-distinctness.ts --model gemma-4-12B-it-OptiQ-4bit --skip-text
223
- # H2/H3 (to build: curve-frontier.ts = hlg-frontier.ts skeleton + arms above,
224
- # N=100, gate (a)+(b)+(c), leave-one-out self-BLEU, MAUVE export):
225
- bun scripts/experiments/curve-frontier.ts --model <m> --n 100 --seed-band 10000
226
- bun scripts/experiments/curve-frontier.ts --model <m> --n 100 --seed-band 15000 # replication
227
- # LLM-judge pass: reuse the dreaming judge protocol (docs/design/* memory-synthesis eval).
228
- ```
229
- Machine note: label every result with host/chip/RAM (two laptops in rotation —
230
- M1 Max 32 GB / M4 Pro 24 GB; neither canonical). Nothing here is a perf claim,
231
- but the labeling rule stands.
232
-
233
- **Decision rules (fixed now).**
234
- - H2 supported → the paper gains an empirical section 4; method-adjacent
235
- framing becomes defensible at workshop+.
236
- - H2 null, H3 null → ship the assessment's analysis paper (theorem + witness +
237
- falsification methodology + tool); the distinctness result stays as the
238
- per-step section. No re-running with new metrics until a NEW preregistered
239
- amendment is written.
240
- - Any post-hoc metric additions are labeled exploratory, never headline.
241
-
242
- ## 5. Paper skeleton this feeds
243
-
244
- 1. The curve designer (tool, live demo). 2. Expressivity: the gap-ratio
245
- invariant + the two-sided boundary (§1) + fork-routing locality impossibility.
246
- 3. The witness — per-step unreachability, quantitative (§2). 4. Text-level
247
- results (H2/H3, whatever they are). 5. Sampler-evaluation hygiene (fresh-seed
248
- repeats catching both false negative and false dominance; coherence-gated
249
- diversity; the audit below as methods material).
250
-
251
- ## 6. Why the old data is not trusted — audit of the prior experiments
252
-
253
- Committed artifacts checked: `docs/archive/investigations/curve-runs/*.json`,
254
- `docs/archive/investigations/hlg-runs/*`, harness sources. Severity: **INVALIDATES** /
255
- **WEAKENS** / cosmetic.
256
-
257
- - **F1 — INVALIDATES (the old distinctness claim).** The curve-temp family
258
- (`scripts/experiments/curve-temp-match.ts:53-69`, `curve-temp-seedsearch.ts:23-47`,
259
- `curve-temp-grid.ts:26-41`, `curve-temp-weights.ts:28-52`) tests whether pure
260
- temperature EXACTLY reproduces a specific 64–90-token curve-generated string
261
- across ~924 samples. (a) No control arm: a temperature-generated string would
262
- also never be reproduced at other seeds — P(specific sequence) =
263
- e^(−Σ per-token surprisal) ≈ 0 for ANY stochastic sampler, so "0 exact
264
- matches" is the guaranteed outcome and distinguishes nothing. (b) With
265
- top_p=0/top_k=0 the support is FULL — every string is reachable by
266
- temperature with p>0, so "temperature won't go there" is a category error at
267
- the string level; the meaningful object is the per-step distribution (now
268
- measured properly in §2). (c) The headline "0 crossed the fork" is
269
- conditioned on first reproducing the 84-char prefix exactly
270
- (`curve-temp-grid.ts:11,31`; `curve-temp-seedsearch.ts:28-30`) — essentially
271
- only the curve's own seed ever reached the fork, so the fork test had
272
- effective N≈0. Consequence: `curve-bisector-routing.md` §1's "the curve still
273
- reaches outputs temperature can't" (repeated in its §3 conclusion) is
274
- unsupported by those runs. The claim happens to be TRUE per §1–2 here, but
275
- for the per-step reason, not the exact-string one.
276
- - **F2 — INVALIDATES (transfer of the "wash" verdict to the v2 curve).** The
277
- only terrain map of the v2 designer family, `scripts/experiments/curve-terrain.ts:18`
278
- (`--n` default 2, max 5), ran at **N=2 samples/cell, 48 tokens, 2 prompts**
279
- (committed artifact `curve-runs/curve-terrain.json`: n=2) — self-BLEU at N=2
280
- is meaningless. Every N=10 frontier number (hlg-frontier/runK-runO) measured
281
- the **v1 HLGShaper** — a different sampler (adaptive windowed-anchor, i.e.
282
- distribution-dependent, OUTSIDE the fixed-curve family). **The v2 drawn-curve
283
- family has never been competitively evaluated at any usable N.** The
284
- assessment's "method paper closed by own data" inherits this gap.
285
- - **F3 — WEAKENS (every diversity comparison at N=10).** From the
286
- investigation's own runO: a cell's self-BLEU run-mean moved 0.083 between
287
- seed bands → sd(run-mean) ≈ 0.06 → minimum detectable effect ≈ 0.17 at N=10
288
- with one run/cell. Every delta ever claimed (0.05–0.11) is below MDE. The doc
289
- ultimately landed there honestly ("wash at this N"), but intermediate
290
- verdicts (§12 "conclusive", §13 "definitive", §14 "DOMINANCE") each
291
- overran the resolution; ~200+ samples/cell is the floor for Δ≈0.05 (§4 N).
292
- - **F4 — WEAKENS (coherence gates).** All automated verdicts gate coherence on
293
- non-Latin-script ratio alone (`hlg-map.ts:51-56`, `hlg-frontier.ts:55-59`,
294
- `curve-terrain.ts:94-98`): Latin-script incoherence ("the planet' adorable
295
- axis", "—aving purpose", repetition loops) passes as 0% junk, so
296
- diversity-vs-coherence frontiers can be bought with undetected degeneration.
297
- The doc's "read the text" discipline patched this manually; the §4 gate
298
- (logprob + repetition + script) mechanizes it.
299
- - **F5 — WEAKENS (the fork-routing "falsification").** `bisector-route.ts:16`
300
- — 20 seeds × 1 prompt/pole; the FORK/REMERGE hazard ratios rest on 3–16
301
- fork-departure events per policy (`curve-runs/bisector-route.json` cohN);
302
- binomial SE on the rates is ±0.1–0.2, so "router 0.79 ≈ identity 0.77" is an
303
- equivalence claim an underpowered test cannot establish (it could not
304
- distinguish a 1.5–2× real ratio). The point estimates being identical is
305
- suggestive, and the locality argument is sound a priori — but the doc's
306
- headline "Falsified" and the assessment's "falsified with a proper control"
307
- overstate; the doc's own caveats (5 prompts/pole, more seeds, user-drawn 5th
308
- policy) are the fix and move into this protocol.
309
- - **F6 — cosmetic (seeding).** No wall-clock/same-ms seeding in any audited
310
- harness — all fixed explicit seeds (curve-temp 100+i / 0..299 / 200+i;
311
- curve-terrain 7300; hlg-map 1234+i, canary 7+i; hlg-frontier 1000+i;
312
- hlg-grid 2000+i; bisector-route 1..20) and `/generate` derives per-sample
313
- seeds as base+i (`src/server.ts:1680`). The batch same-ms collision bug does
314
- not taint these. Arms share seed bases (paired design) with only runO as a
315
- fresh-seed repeat — §4 makes replication structural instead.
316
- - **F7 — cosmetic.** `bisector-trace.ts` computes rank-2 labels via
317
- `forwardHidden+logitsFromHidden` while the greedy reference comes from
318
- `generate()` — the two are known to diverge on near-ties
319
- (`src/eval/runner.ts:109-113`), and near-ties are forks; the committed
320
- artifact shows tfMismatch 0/1/0, so no material impact, but the assert
321
- should stay.
322
-
323
- ## 7. Doc map
324
-
325
- - This plan: `docs/planning/curve-sampler-research-plan.md` (preregistration —
326
- amend by appending, never by silent edit).
327
- - Witness probe: `scripts/experiments/curve-distinctness.ts`.
328
- - Assessment: `reports/curve-designer-paper-assessment-2026-07-01.md`.
329
- - Prior investigations (superseded on the points in §6):
330
- `docs/archive/investigations/hlg-sampling-investigation.md`,
331
- `docs/archive/investigations/curve-bisector-routing.md`.
@@ -1,316 +0,0 @@
1
- # Engineering Journal
2
-
3
- Ongoing, chronological record of AI/agent decisions, investigations, and
4
- corrections — newest work appended under a dated heading. Purpose: bring
5
- a fresh agent up to speed on *why* the code is the way it is. PLAN.md is
6
- the what/when (phases, exit criteria); this is the narrative behind it.
7
-
8
- ## 2026-06-13 — MiniCPM5 starter port (branch `codex-minicpm5-starter-port`)
9
-
10
- - Created a dedicated branch for the MiniCPM5 starter-model port.
11
- - Attempted `codex/minicpm5-starter-port`, but git ref creation was blocked by the sandbox/ref layout.
12
- - Used `codex-minicpm5-starter-port`.
13
- - Corrected the execution order per Josh's direction:
14
- - Goldens first.
15
- - Build the port second.
16
- - Compare implementation against the goldens continuously.
17
- - Downloaded `mlx-community/MiniCPM5-1B-OptiQ-4bit`.
18
- - Snapshot: `~/.cache/huggingface/hub/models--mlx-community--MiniCPM5-1B-OptiQ-4bit/snapshots/664aabaed233c653f82716d8dc822234d0091f78`.
19
- - Verified by the repo downloader.
20
- - Added MiniCPM5 snapshot constants to `tests/paths.ts`.
21
- - Added `scripts/regen-minicpm5-goldens.ts`.
22
- - Uses `MLX_BUN_ORACLE_VENV=/Users/joshrossi/Code/mlx-lm-example/.venv`.
23
- - Drives stock `mlx_lm.load()` against the MiniCPM5 snapshot.
24
- - Writes `minicpm5-parity.json` and `minicpm5-logits-step*.bin`.
25
- - Generated oracle goldens before porting.
26
- - Output dir on this machine: `goldens/apple-m1-max/`.
27
- - Prompt: `The capital of France is`.
28
- - Prompt ids: `[0, 608, 4894, 304, 6918, 357]`.
29
- - Logit steps: 4.
30
- - Greedy tokens: 100.
31
- - Inspected MiniCPM5 config and tensor layout.
32
- - `model_type: "llama"`.
33
- - 24 full-attention layers.
34
- - Hidden size 1536.
35
- - 16 query heads, 2 KV heads.
36
- - Head dim 128.
37
- - RoPE theta 5,000,000.
38
- - RMS norm epsilon `1e-6`.
39
- - SiLU/SwiGLU MLP.
40
- - Untied embeddings with quantized `lm_head`.
41
- - Weight paths are standard `model.layers.N.*`, plus `model.embed_tokens`, `model.norm`, and `lm_head`.
42
- - Decision: first implementation is the naive Llama path only.
43
- - No compiled decode.
44
- - No fused custom kernels.
45
- - No speculative decode.
46
- - No vision path.
47
- - Compare against goldens before optimizing.
48
- - Added initial Llama port edits.
49
- - `src/config.ts`: flat Llama config defaults, full-attention layer types, default RoPE params.
50
- - `src/mlx/ffi.ts` / `src/mlx/ops.ts`: `mlx_sigmoid` binding for SwiGLU.
51
- - `src/model/minicpm5.ts`: concrete MiniCPM5 graph mirroring `mlx_lm.models.llama`.
52
- - `src/model/factory.ts`: dispatch this known `model_type === "llama"` artifact to `MiniCPM5Model`.
53
- - `src/generate.ts`: widen runtime model type and gate compiled decode to Gemma-only.
54
- - Added `tests/minicpm5-parity.test.ts`.
55
- - Reads the MiniCPM5 goldens.
56
- - Runs the new `MiniCPM5Model`.
57
- - Initially required 12 greedy ids and the first 4 logit vectors; expanded to the full 100-token golden after the first green run.
58
- - First MiniCPM5 parity run passed immediately.
59
- - Command: `bun test tests/minicpm5-parity.test.ts`.
60
- - Result: 12/12 greedy ids matched; first 4 full-logit vectors were bit-exact.
61
- - Decision: expand the test to the full 100-token golden before starter wiring.
62
- - Expanded MiniCPM5 parity to 100 greedy tokens.
63
- - Command: `bun test tests/minicpm5-parity.test.ts`.
64
- - Result: 100/100 greedy ids matched; first 4 full-logit vectors remained bit-exact.
65
- - Decision: naive Llama graph is correct enough to proceed to integration wiring.
66
- - Added shared supported-model predicate.
67
- - `src/model/support.ts`: supports `gemma4*` and `llama`.
68
- - CLI and server library support checks now use the same predicate.
69
- - Swapped the first-run starter repo to `mlx-community/MiniCPM5-1B-OptiQ-4bit`.
70
- - Recommended Gemma download still runs in the background for the machine profile.
71
- - Widened server context model type to `RuntimeModel`.
72
- - Updated public/library/docs surfaces.
73
- - `src/index.ts` exports `MiniCPM5Model` and `RuntimeModel`.
74
- - `src/lora.ts` accepts `RuntimeModel` so server construction is type-consistent.
75
- - README quickstart and supported-model table now include MiniCPM5.
76
- - PLAN Phase 16 and publishing gate now record MiniCPM5 Track A as chosen/ported.
77
- - Process/testing note from Josh:
78
- - Running the full sharded suite can start Bun test processes that load large models and in-process servers.
79
- - Do not run the full suite again casually during this branch; use focused MiniCPM5 parity/smokes unless Josh explicitly wants the full model-loading suite.
80
- - The suspected large Bun process was already killed before inspection; `ps` showed no remaining Bun processes afterward.
81
- - Test-proof correction:
82
- - Josh called out that the `bun:test` pass looked suspiciously fast and was not good enough evidence as presented.
83
- - Verified with an explicit one-off script that config/weights/model construction occurs and first eval touches the model (`weightsBytes` about 0.907 GB, first argmax token 8181).
84
- - Added `scripts/check-minicpm5-port.ts`: hard check, no skip guards, requires snapshot + goldens, prints open/construct/eval timings, and compares 100 oracle tokens plus first 4 logit vectors.
85
- - Hard-check result:
86
- - `open`: 4.1 ms.
87
- - `construct`: 2.0 ms.
88
- - `first eval`: 81.7 ms.
89
- - `decode`: 100 tokens in 691.8 ms.
90
- - `parity`: 100/100 greedy ids, 100/100 full-logit vectors bit-exact.
91
- - Explanation: `Weights.open` and model construction are lazy/mmap-backed; the model is actually touched at eval time, not construction time.
92
- - Oracle-strength correction:
93
- - Josh clarified that oracle parity means bit-for-bit comparison against oracle logits, not just token agreement plus a few early logits.
94
- - Changed MiniCPM5 golden regeneration to dump full last-position logits for all 100 decode steps.
95
- - Changed the hard check and parity test to require/compare all 100 logit binaries.
96
- - MiniCPM5 parity matrix:
97
- - Standard bf16 KV mode must match stock `mlx-lm`.
98
- - Mixed precision KV mode using the shipped `kv_config.json` must match `mlx-optiq`.
99
- - Server default should use the shipped mixed-KV config.
100
- - `--kv-quant off` must remain the standard-cache mode.
101
- - Added `scripts/regen-minicpm5-kv-goldens.ts` and `tests/minicpm5-kv-parity.test.ts` for the OptiQ mixed-KV path.
102
- - Strengthened `tests/minicpm5-parity.test.ts` after Josh's pushback.
103
- - Removed skip guards for this MiniCPM5 proof.
104
- - Requires the downloaded snapshot and MiniCPM5 goldens.
105
- - Constructs the model inside the test body, asserts `weightsBytes > 900 MB`, and prints open/construct/first-eval/decode timings.
106
- - The logit comparison is full-vector last-position logits from the same golden prompt; `lastPositionLogits()` forces evaluation via `toFloat32()`.
107
- - Live chat failure diagnosis:
108
- - Josh opened `/chat`, sent `hi there`, and saw an empty assistant bubble.
109
- - Direct curl to `/v1/chat/completions` returned `QuantizedKVCache: use updateAndFetchQuantized`.
110
- - Cause: MiniCPM5 ships `kv_config.json`; the server applied mixed KV quant by default, but `MiniCPM5Model` only supports bf16 KV so far.
111
- - Temporary workaround was to serve MiniCPM5 bf16 KV only; this was later reverted once MiniCPM5 got QuantizedKVCache parity.
112
- - Also fixed `/chat` to surface streamed `{ error }` SSE payloads instead of swallowing them into an empty assistant bubble.
113
- - Verified with a temporary in-process server on an ephemeral port:
114
- - `/stats` reported KV mode `bf16`, 24 bf16 layers.
115
- - `/v1/chat/completions` for `hi there` returned HTTP 200 with assistant text.
116
- - Observed default MiniCPM5 behavior includes `<think>`; non-thinking starter UX still needs template/config handling.
117
- - Naming/scope correction from Josh:
118
- - This branch should not become a generic Llama platform.
119
- - Renamed the concrete model file/class to `src/model/minicpm5.ts` / `MiniCPM5Model`.
120
- - The config still says `model_type: "llama"` because that is the upstream artifact; factory dispatch treats that as this known MiniCPM5 starter artifact for now.
121
- - Re-ran focused parity after the rename: 100/100 greedy ids matched; first 4 logits bit-exact.
122
- - Tightened support recognition so this is not generic Llama support.
123
- - Registry/library support uses repo id `MiniCPM5-1B-OptiQ-4bit` plus `model_type: "llama"`.
124
- - Factory dispatch checks the known MiniCPM5 config shape before constructing `MiniCPM5Model`.
125
- - Other Llama configs throw unsupported instead of silently using the MiniCPM5 graph.
126
- - Re-ran focused parity after this tightening: 100/100 greedy ids matched; first 4 logits bit-exact.
127
- - Completed the oracle-strength MiniCPM5 parity matrix.
128
- - Standard cache mode matches stock `mlx-lm`: 100/100 greedy ids and 100/100 full last-position logit vectors are bit-exact.
129
- - Mixed precision cache mode matches `mlx-optiq` with the shipped `kv_config.json`: 100/100 greedy ids and 100/100 full last-position logit vectors are bit-exact.
130
- - `MiniCPM5Model` now consumes `QuantizedKVCache` directly and routes quantized triples through `quantizedSdpa`.
131
- - Production generation now mirrors OptiQ's quantization order: first prompt prefill runs bf16, then populated caches are quantized before decode.
132
- - Restored MiniCPM5 server default to mixed KV from `kv_config.json`.
133
- - Temporary in-process server `/stats` reported `mixed (kv_config.json)`, 6 kv8 layers and 18 kv4 layers.
134
- - `kvQuant: off` reported 24 bf16 layers and still served chat correctly.
135
- - Non-streaming and streaming `/v1/chat/completions` returned HTTP 200 without the prior `QuantizedKVCache: use updateAndFetchQuantized` error.
136
- - Read the MiniCPM5 OptiQ manual.
137
- - MiniCPM5's template contract is `chat_template_kwargs.enable_thinking`.
138
- - Default starter behavior is no-think (`enable_thinking=false`), matching the manual's fast direct-answer mode.
139
- - Explicit `chat_template_kwargs: { "enable_thinking": true }` opens the `<think>` reasoning channel.
140
- - Server prompt rendering now forwards that flag and defaults MiniCPM5 to no-think when absent.
141
- - Pi harness correction after Josh's pushback:
142
- - Mistake: briefly changed branch code toward `~/.pi/agent/models.json` upsert and described the generated extension as stale.
143
- - Correction: reverted branch code/docs/tests back to the existing extension-based live-discovery methodology; the generated extension is the path that worked for Gemma and must remain first-class.
144
- - Note: I had already run the harness while debugging, which modified Josh's local pi config outside the repo. Do not mutate that again without explicit instruction.
145
- - MiniCPM5 tool-call corruption fix:
146
- - Reproduced Josh's broken output: `name="read"> name="path">...`.
147
- - Root cause: the server applied Gemma's tool sentinel token ids globally. In MiniCPM5, token 49 decodes to literal `<`, and `<function` / `<param` are added special tokens stripped by `decode(..., true)`.
148
- - Ported the OptiQ behavior: tool parsing is decoded-text based and active only when tools are declared. Gemma keeps its family sentinel path; MiniCPM5 tool-active decoding preserves special tokens and parses native `<function name="..."><param name="...">...` XML into OpenAI `tool_calls`.
149
- - Added `tests/minicpm5-tools.test.ts`, covering non-streaming and streaming tool calls with the real MiniCPM5 snapshot.
150
- - Full-branch review pass after Josh reported "a lot of bugs" vs the Gemma 4 port quality. Four real defects found and fixed:
151
- 1. **Multi-turn tool conversations crashed at render time.** MiniCPM5's template uses `[a, b]|min` in its assistant tool-call-history branch; `@huggingface/jinja` 0.5.9 has no `min`/`max` array filter, so every second round of an agent loop returned 400 `prompt build failed: Unknown ArrayValue filter: min`. This is why pi looked broken. Fix: `ChatTemplate.load` rewrites `[a, b]|min`/`|max` into conditional expressions. Verified byte-for-byte against the oracle venv's `apply_chat_template` for the agent round-trip case (`tests/minicpm5-template.test.ts`); Gemma template parity stays bit-exact.
152
- 2. **Streaming with tools declared buffered the entire response.** `buffered-text` mode returned "" for every token and dumped everything at flush — pi streams nothing until the end, and prose before a tool call was dropped entirely when a call parsed. Fix: ported the oracle's incremental behavior (`_QwenXMLToolCallStreamParser` buffers only from the tool marker on): content streams live with a StopMatcher-style hold-back on `<tool_call>`/`<function` prefixes; only the markup is withheld; parse-failure falls back to releasing the raw text.
153
- 3. **Tool param values were JSON-coerced regardless of schema.** `<param name="path">2025</param>` became the number 2025. Oracle (`_decode_tool_parameter_value` + `_tool_parameter_schema`) keeps string-typed params as raw text. Ported; also made the `<param>` regex CDATA-safe (a `</param>` inside CDATA no longer truncates the value). Unit tests added.
154
- 4. **Sampling ignored the model's `generation_config.json`.** The server hardcoded temp 0.7 / no top-p; optiq serve injects the author-recommended sampling (`optiq/runtime/gen_config.py`) as defaults. Ported: `loadContext` reads `generation_config.json` (MiniCPM5: temp 0.9, top_p 0.95; Gemma: temp 1.0, top_k 64, top_p 0.95) and `toOptions` uses it when the request omits the field. Explicit request values still win. This was the likely "quality" gap on a 1B model.
155
- - Verification: MiniCPM5 parity (bf16 + mixed-KV) still 100/100 bit-exact; minicpm5-tools, tool-call, chat-template, tools-template, parity (Gemma 12B), server-tools, and server suites all green. Live two-turn agent round-trip (tool call → tool result → final answer) confirmed working in-process.
156
-
157
- ## 2026-06-16 — Segmented-backward LoRA training (PRs #9–10)
158
-
159
- Long-context LoRA training was OOMing: MiniCPM5 @4096 spiked to ~25.5 GB full
160
- backward because all activations had to stay live simultaneously. The
161
- segmented-backward design threads the backward segment-by-segment so only one
162
- segment's activations are resident at a time.
163
-
164
- The key implementation decision was to drive the per-segment backward with
165
- `mlx_vjp` (a new `Vjp` binding in `autograd.ts`) rather than a surrogate
166
- `value_and_grad` over a reconstructed loss. The surrogate path leaked roughly
167
- one activation buffer per segment per step because mlx `eval` does not detach;
168
- `mlx_vjp` is explicit about what it differentiates and stops the leak.
169
- Segment-boundary tensors are materialized as graph-free leaves via
170
- `fromBytesCopy` for the same reason.
171
-
172
- Phase A (MiniCPM5, PR #9) landed first: grads bit-exact vs the full backward
173
- (relNorm 0.000%), peak 10.91 → 3.29 GB @2048, no leak, trains end-to-end via
174
- `TrainConfig.segmentSize`. The default training attention is `ops.sdpa`
175
- (correct gradients, one fused kernel); `MLX_BUN_TRAIN_ATTN=flash` is an
176
- opt-in for bit-exact grad comparison against the full backward only, because
177
- `ops.sdpa` has a pre-existing eager-vs-autograd asymmetry in bf16 (~6%) that
178
- is unrelated to the segmentation mechanism — the segmented path works
179
- correctly under either setting.
180
-
181
- Phase B (e4b / Gemma4, PR #10) was harder: e4b's KV-shared donor pattern
182
- means multiple sharer segments reference the same K/V tensors produced by a
183
- single producer segment, requiring cotangent accumulation across sharers before
184
- the producer vjp can run. Implemented `SegmentedBackwardGemma4` with a
185
- two-boundary stream (per-layer-input + donor K/V) and a multi-output producer
186
- vjp `[h, donorK, donorV]` with accumulated `[dh, dKV.k, dKV.v]` cotangents.
187
- Grads are bit-exact for single-consumer donor reuse and 0.97% bf16-class for
188
- multi-consumer accumulation (confirmed the full backward also sums in bf16, so
189
- this is order-of-operations noise, not a logic bug). e4b trains at 8 K context
190
- (~17.5 GB, segSize=2) where the full backward would OOM (~70 GB).
191
-
192
- A contiguity fix was also required: donor K/V are transposed views, so
193
- `detachLeaf` must row-major-copy them before `rawBytes` reads linearly.
194
-
195
- ## 2026-06-16 — Qwen3.5 / MiniCPM5 reasoning-channel fix (PR #12)
196
-
197
- Two serving-layer bugs left reasoning-capable models unusable in chat:
198
-
199
- The first was a role-name mismatch. pi-ai renames the system role to
200
- `developer` for reasoning models. Our chat templates only accepted
201
- system/user/assistant/tool and returned 400. The turn completed with
202
- `stopReason: "error"` without throwing, so the browser saw an empty turn with no
203
- error shown. Fix: `normalizeMessages` maps developer→system (genuine OpenAI
204
- compat — OpenAI itself uses the developer role), and `mapEventToFrames` surfaces
205
- a `stopReason:"error"` turn as a visible error frame instead of silently
206
- discarding it.
207
-
208
- The second was reasoning leaking into content. Qwen3.5 and MiniCPM5 templates
209
- prime an *open* `<think>` tag in the generation prompt, so the model's first
210
- token is the closing `</think>` — the opening tag never appears in the decoded
211
- stream. `ThinkingTagSplitter` was waiting for the open tag before routing
212
- reasoning content into the OpenAI `reasoning_content` channel, so all of it
213
- leaked into `content` instead. Fix: `promptEndsInOpenThink` detects this
214
- condition and seeds `ThinkingTagSplitter` via `startInThinking` so the splitter
215
- begins in the reasoning state.
216
-
217
- ## 2026-06-16 — Adapters end-to-end (PR #13)
218
-
219
- The goal was to make LoRA adapter switching a first-class operation in both the
220
- web chat UI and the Pi CLI, without building a custom protocol — lean on Pi's
221
- `before_provider_request` hook instead.
222
-
223
- Server-side: `GET /v1/adapters/available` scans the two adapter stores
224
- (`~/.cache/mlx-bun-finetunes`, `~/.cache/mlx-bun/adapters`) and returns
225
- `{id, path, rank, scale, mounted}` for weight-bearing checkpoints (dataset-only
226
- dirs are skipped). `lora.ts` gained `listAvailableAdapters` for the scan and
227
- base-model detection so the web selector can filter to compatible adapters only.
228
-
229
- Pi hook: `pi-web.ts` registers `pi.on("before_provider_request")` to inject the
230
- per-connection selected adapter into every outgoing provider payload using the
231
- existing inline-extension pattern. A `set_adapter` WebSocket message sets the
232
- selection; default none leaves the payload unchanged so the base model runs.
233
-
234
- Web chat: an adapter dropdown was added next to the Thinking pill, populated
235
- from `/v1/adapters/available` on ready. Selecting fires an idempotent `POST
236
- /v1/adapters` then a `set_adapter` WS message.
237
-
238
- CLI: `extensions/mlx-bun-adapter.ts` is a shipped Pi extension exposing
239
- `/adapter <id> | off | list` and the same hook. Both UIs control adapters
240
- through Pi; no separate plumbing.
241
-
242
- ## 2026-06-17 — First-run onboarding UX
243
-
244
- The previous startup story required knowing the right model ID, running a
245
- separate download command, and manually opening a browser. The new path:
246
- `mlx-bun serve` (or bare `mlx-bun`) auto-downloads the starter if absent,
247
- starts the server, and opens the chat UI. If a localhost tab is already open it
248
- focuses that tab rather than opening a duplicate (`--no-open` to skip).
249
-
250
- The web chat empty state was updated with mlx-bun-centric starter chips and a
251
- download-aware greeting. A live background-download pill shows progress. The
252
- system prompt briefs the model on mlx-bun and its own identity, with framing
253
- appropriate to MiniCPM5 being a fast starter while a larger model optionally
254
- loads in the background.
255
-
256
- `chat-template.ts` also tightened `supportsThinking` to require the `<think>`
257
- channel we actually split, so e4b / harmony-format models no longer leak raw
258
- reasoning markers into content for users who haven't configured a thinkingFormat.
259
-
260
- The runtime-isolation design doc (`docs/design/runtime-isolation.md`) was also
261
- written this session: inference running in-process on the Bun event loop is a
262
- known UI-lag footgun when the GPU is busy. The doc proposes moving inference to
263
- a subprocess; the work is explicitly deferred (design, not started) — written
264
- now so the root-cause analysis is available cold.
265
-
266
- ## 2026-06-17 — SigLIP vision sidecar for gemma-4 e4b
267
-
268
- Ported optiq's `vlm/gemma4` SigLIP encoder as `src/vision/siglip.ts`: a 16-layer
269
- vision transformer with clippable linears (trained clip bounds), manual-f32
270
- RMS norms on q/k/v, on-device 2D RoPE, fused SDPA at scale=1.0, and GeGLU →
271
- 3×3 avg-pool → `MultimodalEmbedder` → `/embed_scale`.
272
-
273
- The tower selection is driven by `vision_config.model_type`: e2b/e4b get
274
- SigLIP, the 12B gets the existing encoder-free tower. Lazy loading means
275
- text-only sessions never pay for it. `gemma4.ts`'s `forwardEmbeddings` was
276
- extended to support per-layer-input models (e2b/e4b) — it previously threw for
277
- that path — threading zeroed image-token ids into the per-layer forward matching
278
- optiq's `where(text_mask, ids, 0)`.
279
-
280
- Parity: every mlx primitive is bit-exact vs the optiq oracle (verified
281
- model-free via `op-parity-{dump.py,check.ts}` — rms_norm, gelu, matmul, clip,
282
- cos, sin, full multidim RoPE, sdpa, pool). The residual ~1% feature divergence
283
- is sub-bf16 full-graph composition order amplified by the encoder's scale=1.0
284
- peaked softmax (the topped-out softmax distribution is highly sensitive to small
285
- pre-softmax shifts in bf16). The acceptance bar was exact spliced ids + greedy
286
- prefix + grounded output, which passes. Driving the residual to zero would
287
- require matching optiq's exact op ordering across the full encoder; deferred as
288
- a TODO.
289
-
290
- ## 2026-06-17 — Distribution: npm, bunx, Homebrew signed/notarized, direct download
291
-
292
- The question was how to ship a standalone binary that runs on a user's Mac
293
- without requiring Bun, Python, or anything else. We settled on four parallel
294
- install paths rather than picking one.
295
-
296
- **npm / bunx**: `bunx mlx-bun` for users already in the Bun ecosystem. A
297
- `publish-release.sh` script and `bun run publish` alias handle the npm side.
298
- Published as v0.0.4.
299
-
300
- **Homebrew**: `scripts/release-binary.sh` builds a standalone binary, signs it
301
- with a Developer ID (nested Mach-O first, then the executable with JIT
302
- entitlements from `packaging/entitlements.plist`), notarizes via `AC_PROFILE`, and
303
- produces a clean tarball + sha256 for the formula.
304
- `packaging/homebrew/mlx-bun.rb` is the formula source of truth (self-contained
305
- `libexec` bundle + `bin` symlink; Bun `realpath`s `execPath` so sibling dylibs
306
- resolve after relocation). The tap lives at `joshuarossi/homebrew-tap`.
307
- `scripts/publish-release.sh` auto-syncs the formula sha256 on each release.
308
- One fix was required: `--disable-library-validation` in the entitlements so
309
- brew-relocated dylibs load without `CS_RESTRICT` blocking them.
310
-
311
- **Direct download**: the notarized tarball passes Gatekeeper even when
312
- downloaded via browser + Finder (quarantine worst case), so a stable versionless
313
- URL (`releases/latest/download/mlx-bun-arm64.tar.gz`) is published alongside the
314
- versioned asset and documented as a one-liner curl install.
315
-
316
- **Embedded library**: existing path, unchanged (`docs/reference/embedding.md`).