mlx-bun 0.4.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 (601) hide show
  1. package/README.md +1453 -88
  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 +10 -8
  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 +12 -10
  78. package/src/{serve → server}/chat-stage.ts +27 -22
  79. package/src/{client.ts → server/client.ts} +28 -2
  80. package/src/{serve → server}/completion-executor.ts +42 -42
  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 +42 -83
  85. package/src/server/generated-token-history.ts +57 -0
  86. package/src/{serve → server}/http.ts +25 -13
  87. package/src/{serve → server}/inference-request.ts +5 -5
  88. package/src/server/job-routes.ts +20 -0
  89. package/src/server/media-prompt.ts +63 -0
  90. package/src/server/memory-completion-client.ts +46 -0
  91. package/src/server/model-routes.ts +192 -0
  92. package/src/{serve → server}/openai-wire.ts +3 -2
  93. package/src/{serve → server}/pipeline.ts +1 -1
  94. package/src/server/prompt-builder.ts +13 -0
  95. package/src/server/prompt-contracts.ts +17 -0
  96. package/src/server/proxy-routes.ts +187 -0
  97. package/src/server/publishing-routes.ts +41 -0
  98. package/src/{serve → server}/request-plan.ts +8 -8
  99. package/src/{serve → server}/request-prep.ts +82 -68
  100. package/src/{serve → server}/responses-client.ts +30 -13
  101. package/src/{responses.ts → server/responses.ts} +12 -93
  102. package/src/server/routes.ts +205 -0
  103. package/src/server/start.ts +72 -0
  104. package/src/server/status-routes.ts +108 -0
  105. package/src/{serve → server}/text-completion-stage.ts +25 -4
  106. package/src/server/text-prompt.ts +12 -0
  107. package/src/{serve → server}/token-streams.ts +36 -38
  108. package/src/server/worker-routes.ts +311 -0
  109. package/src/storage/paths.ts +61 -0
  110. package/src/web/assets.ts +37 -0
  111. package/src/web/{src → browser}/api.ts +5 -23
  112. package/src/web/browser/chat-host.ts +17 -0
  113. package/src/web/browser/installed-panels.ts +6 -0
  114. package/src/web/browser/main.ts +55 -0
  115. package/src/web/browser/markdown.ts +279 -0
  116. package/src/web/browser/memory-panel.ts +9 -0
  117. package/src/web/browser/palette.ts +64 -0
  118. package/src/web/browser/protocol.ts +13 -0
  119. package/src/web/browser/shell.ts +467 -0
  120. package/src/web/{src → browser}/status.ts +32 -36
  121. package/src/web/build.ts +51 -0
  122. package/src/web/public/app.html +1054 -0
  123. package/src/web/{sw.js → public/sw.js} +4 -3
  124. package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
  125. package/src/web/{vendor → public/vendor}/hljs.js +2 -2
  126. package/THIRD_PARTY_LICENSES.md +0 -51
  127. package/docs/README.md +0 -94
  128. package/docs/archive/hlg-sampling.md +0 -350
  129. package/docs/archive/investigations/audio-input-plan.md +0 -356
  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/web-ui-pass-plan.md +0 -213
  174. package/docs/archive/planning/website-readme-pass-plan.md +0 -224
  175. package/docs/design/batching.md +0 -1841
  176. package/docs/design/decode-speed-program.md +0 -2349
  177. package/docs/design/dreaming-nightly-pipeline.md +0 -684
  178. package/docs/design/generic-model-support.md +0 -705
  179. package/docs/design/kv-cache.md +0 -824
  180. package/docs/design/orpo-training.md +0 -680
  181. package/docs/design/speculative-decoding.md +0 -1990
  182. package/docs/design/turboquant.md +0 -2212
  183. package/docs/design/unified-engine-frontier-plan.md +0 -1880
  184. package/docs/design/web-chat-redesign.md +0 -695
  185. package/docs/planning/PRODUCT_ROADMAP.md +0 -594
  186. package/docs/planning/ResearchTopics.md +0 -119
  187. package/docs/planning/release-notes-v0.4.0.md +0 -45
  188. package/docs/planning/video-series.md +0 -421
  189. package/docs/reference/benchmarks.md +0 -3613
  190. package/docs/reference/cli.md +0 -585
  191. package/docs/reference/distribution.md +0 -355
  192. package/docs/reference/environment.md +0 -398
  193. package/docs/reference/glossary.md +0 -39
  194. package/docs/reference/library-api.md +0 -674
  195. package/docs/reference/memory.md +0 -260
  196. package/docs/reference/models.md +0 -334
  197. package/docs/reference/server-api.md +0 -1775
  198. package/docs/reference/server-config.md +0 -846
  199. package/docs/reference/training.md +0 -462
  200. package/docs/reference/troubleshooting.md +0 -158
  201. package/src/admission-plan.ts +0 -18
  202. package/src/audio/conformer.ts +0 -647
  203. package/src/audio/decode.ts +0 -133
  204. package/src/audio/features.ts +0 -202
  205. package/src/audio/transcode.ts +0 -67
  206. package/src/backends/mlx/assistant-target.ts +0 -46
  207. package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
  208. package/src/backends/mlx/autoregressive.ts +0 -108
  209. package/src/backends/mlx/batch-group.ts +0 -1790
  210. package/src/backends/mlx/cache-attachment.ts +0 -67
  211. package/src/backends/mlx/cache-layout.ts +0 -31
  212. package/src/backends/mlx/checkpoint-state.ts +0 -53
  213. package/src/backends/mlx/continuation-persistence.ts +0 -106
  214. package/src/backends/mlx/continuation-request.ts +0 -43
  215. package/src/backends/mlx/continuation.ts +0 -77
  216. package/src/backends/mlx/diffusion.ts +0 -39
  217. package/src/backends/mlx/draft-target.ts +0 -32
  218. package/src/backends/mlx/evaluation.ts +0 -105
  219. package/src/backends/mlx/fill-append.ts +0 -45
  220. package/src/backends/mlx/full-kv-row-append.ts +0 -32
  221. package/src/backends/mlx/full-kv-row-donor.ts +0 -54
  222. package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
  223. package/src/backends/mlx/gateway-binding.ts +0 -130
  224. package/src/backends/mlx/graph.ts +0 -38
  225. package/src/backends/mlx/kv-codec.ts +0 -9
  226. package/src/backends/mlx/kv-maintenance.ts +0 -133
  227. package/src/backends/mlx/kv-tensor-rows.ts +0 -212
  228. package/src/backends/mlx/memory-client.ts +0 -189
  229. package/src/backends/mlx/methods.ts +0 -90
  230. package/src/backends/mlx/model-prompt.ts +0 -164
  231. package/src/backends/mlx/model-serving.ts +0 -79
  232. package/src/backends/mlx/prefill-cohort.ts +0 -89
  233. package/src/backends/mlx/prefill-rows.ts +0 -200
  234. package/src/backends/mlx/prefill.ts +0 -33
  235. package/src/backends/mlx/projected-context-rows.ts +0 -72
  236. package/src/backends/mlx/request-policy.ts +0 -20
  237. package/src/backends/mlx/request-state-policy.ts +0 -41
  238. package/src/backends/mlx/rollback.ts +0 -89
  239. package/src/backends/mlx/row-sampling.ts +0 -49
  240. package/src/backends/mlx/serial-executor.ts +0 -242
  241. package/src/backends/mlx/speculative-group.ts +0 -359
  242. package/src/backends/mlx/speculative-round.ts +0 -161
  243. package/src/backends/mlx/speculative.ts +0 -114
  244. package/src/backends/mlx/state-rows.ts +0 -104
  245. package/src/backends/mlx/state-views.ts +0 -46
  246. package/src/backends/mlx/target-layout-capability.ts +0 -35
  247. package/src/backends/mlx/text-engine.ts +0 -73
  248. package/src/backends/mlx/transitioning-kv-rows.ts +0 -165
  249. package/src/chat-template.ts +0 -382
  250. package/src/cli.ts +0 -3168
  251. package/src/config.ts +0 -399
  252. package/src/contracts/completion.ts +0 -16
  253. package/src/contracts/execution.ts +0 -60
  254. package/src/contracts/generation.ts +0 -103
  255. package/src/contracts/host.ts +0 -7
  256. package/src/contracts/pi-provider.ts +0 -30
  257. package/src/contracts/pi.ts +0 -259
  258. package/src/contracts/prefix-cache.ts +0 -23
  259. package/src/contracts/resources.ts +0 -25
  260. package/src/contracts/sampling.ts +0 -23
  261. package/src/contracts/scheduling.ts +0 -45
  262. package/src/contracts/tsconfig.json +0 -14
  263. package/src/dataset/generators.ts +0 -1087
  264. package/src/dataset/index.ts +0 -12
  265. package/src/dataset/job.ts +0 -81
  266. package/src/dataset/llm.ts +0 -71
  267. package/src/dataset/registry.ts +0 -528
  268. package/src/diffusion/diffusion-generate.ts +0 -507
  269. package/src/download.ts +0 -505
  270. package/src/embed.ts +0 -77
  271. package/src/engine/admission.ts +0 -59
  272. package/src/engine/cancellation.ts +0 -38
  273. package/src/engine/engine.ts +0 -56
  274. package/src/engine/execution-coordinator.ts +0 -70
  275. package/src/engine/execution-plan.ts +0 -53
  276. package/src/engine/resources.ts +0 -53
  277. package/src/engine/scheduler.ts +0 -72
  278. package/src/engine/session.ts +0 -247
  279. package/src/eval/README.md +0 -130
  280. package/src/eval/ifeval.ts +0 -81
  281. package/src/eval/kl-prompts.ts +0 -29
  282. package/src/eval/kl.ts +0 -590
  283. package/src/eval/perplexity.ts +0 -164
  284. package/src/eval/quality-db.ts +0 -92
  285. package/src/eval/reference-logits.ts +0 -207
  286. package/src/eval/runner.ts +0 -124
  287. package/src/eval/score.ts +0 -49
  288. package/src/eval/tasks/bfcl.ts +0 -535
  289. package/src/eval/tasks/gsm8k.ts +0 -98
  290. package/src/eval/tasks/hashhop.ts +0 -139
  291. package/src/eval/tasks/humaneval.ts +0 -275
  292. package/src/eval/tasks/ifeval.ts +0 -525
  293. package/src/eval/tasks/mmlu.ts +0 -157
  294. package/src/eval/ultrafeedback.ts +0 -60
  295. package/src/evaldb.ts +0 -199
  296. package/src/expert-io.ts +0 -393
  297. package/src/expert-offload-build.ts +0 -77
  298. package/src/expert-offload.ts +0 -76
  299. package/src/expert-residency.ts +0 -1134
  300. package/src/expert-usage.ts +0 -415
  301. package/src/fill/echo-index.ts +0 -188
  302. package/src/fill/fill-session.ts +0 -452
  303. package/src/fill/proposal.ts +0 -68
  304. package/src/fill/schema-rows.ts +0 -506
  305. package/src/fill/tool-boundary.ts +0 -103
  306. package/src/fit.ts +0 -249
  307. package/src/generate.ts +0 -1346
  308. package/src/grammar.ts +0 -591
  309. package/src/harness-pi.ts +0 -184
  310. package/src/hf-push.ts +0 -628
  311. package/src/hub-rest.ts +0 -242
  312. package/src/index.ts +0 -63
  313. package/src/inference/denoising.ts +0 -17
  314. package/src/inference/draft-acceptance.ts +0 -41
  315. package/src/inference/draft-output.ts +0 -49
  316. package/src/inference/graph.ts +0 -33
  317. package/src/inference/prefill.ts +0 -39
  318. package/src/inference/rollback.ts +0 -7
  319. package/src/jobs/index.ts +0 -31
  320. package/src/jobs/job-entry.ts +0 -107
  321. package/src/jobs/task-client.ts +0 -19
  322. package/src/jobs/types.ts +0 -2
  323. package/src/kv-scheme.ts +0 -257
  324. package/src/kv-store.ts +0 -1099
  325. package/src/lab/README.md +0 -18
  326. package/src/lab/curve/curve-designer.html +0 -303
  327. package/src/lab/curve/curve-sampler.ts +0 -122
  328. package/src/lab/expert-trace/expert-trace.ts +0 -69
  329. package/src/lab/paged-kv/paged-kv-rows.ts +0 -83
  330. package/src/lab/paged-kv/paged-kv.ts +0 -270
  331. package/src/library.ts +0 -40
  332. package/src/lora.ts +0 -408
  333. package/src/md-modules.d.ts +0 -49
  334. package/src/media-fetch.ts +0 -442
  335. package/src/memory/article.ts +0 -558
  336. package/src/memory/chunk-validation.ts +0 -150
  337. package/src/memory/chunk.ts +0 -318
  338. package/src/memory/cluster.ts +0 -351
  339. package/src/memory/coverage.ts +0 -134
  340. package/src/memory/crosslink.ts +0 -0
  341. package/src/memory/db.ts +0 -253
  342. package/src/memory/entity.ts +0 -203
  343. package/src/memory/gate.ts +0 -187
  344. package/src/memory/history.ts +0 -152
  345. package/src/memory/ingest.ts +0 -335
  346. package/src/memory/model.ts +0 -183
  347. package/src/memory/normalize.ts +0 -671
  348. package/src/memory/parse.ts +0 -22
  349. package/src/memory/pipeline.ts +0 -275
  350. package/src/memory/prompts.ts +0 -65
  351. package/src/memory/query.ts +0 -334
  352. package/src/memory/reconcile.ts +0 -734
  353. package/src/memory/redirect.ts +0 -108
  354. package/src/memory/reindex.ts +0 -325
  355. package/src/memory/resolve.ts +0 -307
  356. package/src/memory/rest.ts +0 -245
  357. package/src/memory/route.ts +0 -272
  358. package/src/memory/schedule.ts +0 -165
  359. package/src/memory/stages.ts +0 -777
  360. package/src/memory/synthesize.ts +0 -1638
  361. package/src/memory/tools.ts +0 -749
  362. package/src/memory/vault.ts +0 -1194
  363. package/src/memory/wikify.ts +0 -1064
  364. package/src/mlx/array.ts +0 -388
  365. package/src/mlx/autograd.ts +0 -304
  366. package/src/mlx/checkpoint.ts +0 -149
  367. package/src/mlx/compile.ts +0 -168
  368. package/src/mlx/custom-vjp.ts +0 -188
  369. package/src/mlx/ffi.ts +0 -512
  370. package/src/mlx/materialize.ts +0 -23
  371. package/src/mlx/metal-kernel.ts +0 -159
  372. package/src/mlx/ops.ts +0 -1021
  373. package/src/mlx/quantized-rows.ts +0 -36
  374. package/src/mlx/token-bitmask.ts +0 -52
  375. package/src/mlx/turboquant-kv-decode.ts +0 -82
  376. package/src/mlx/turboquant-kv-inverse.ts +0 -122
  377. package/src/mlx/turboquant-ops.ts +0 -861
  378. package/src/mlx/turboquant-tables.ts +0 -237
  379. package/src/mmap.ts +0 -90
  380. package/src/model/artifact-identity.ts +0 -73
  381. package/src/model/batched-kv.ts +0 -235
  382. package/src/model/batched-mask.ts +0 -279
  383. package/src/model/batched-quant.ts +0 -212
  384. package/src/model/batched-quantized-kv.ts +0 -144
  385. package/src/model/batched-rotating-quant.ts +0 -353
  386. package/src/model/batched-rotating-state.ts +0 -149
  387. package/src/model/batched-rotating.ts +0 -338
  388. package/src/model/batched-row-storage.ts +0 -179
  389. package/src/model/batched-ssm.ts +0 -52
  390. package/src/model/batched-turboquant-kv.ts +0 -93
  391. package/src/model/compiled-decode.ts +0 -712
  392. package/src/model/decoded-kv-donor.ts +0 -12
  393. package/src/model/delayed-quantized-kv.ts +0 -72
  394. package/src/model/delayed-rotating-quantized-kv.ts +0 -93
  395. package/src/model/delayed-turboquant-kv.ts +0 -55
  396. package/src/model/diffusion-gemma.ts +0 -1026
  397. package/src/model/factory.ts +0 -189
  398. package/src/model/fingerprint.ts +0 -33
  399. package/src/model/flash-attention.ts +0 -694
  400. package/src/model/full-prefill-padding.ts +0 -56
  401. package/src/model/full-prefill-row.ts +0 -105
  402. package/src/model/gemma4-base.ts +0 -2351
  403. package/src/model/gemma4.ts +0 -1315
  404. package/src/model/generated/gemma4-12b.ts +0 -429
  405. package/src/model/generated/gemma4-26b.ts +0 -448
  406. package/src/model/generated/gemma4-e4b.ts +0 -717
  407. package/src/model/generated/index.ts +0 -18
  408. package/src/model/glm52-atlas.ts +0 -511
  409. package/src/model/glm52-cache.ts +0 -792
  410. package/src/model/glm52-config.ts +0 -262
  411. package/src/model/glm52-container.ts +0 -305
  412. package/src/model/glm52-coupling.ts +0 -388
  413. package/src/model/glm52-dsa.ts +0 -606
  414. package/src/model/glm52-expert-layout.ts +0 -253
  415. package/src/model/glm52-layout.ts +0 -152
  416. package/src/model/glm52-memory.ts +0 -500
  417. package/src/model/glm52-mla.ts +0 -792
  418. package/src/model/glm52-moe.ts +0 -223
  419. package/src/model/glm52-pilot.ts +0 -537
  420. package/src/model/glm52-reference.ts +0 -445
  421. package/src/model/glm52-residency.ts +0 -557
  422. package/src/model/glm52-resident-weights.ts +0 -135
  423. package/src/model/glm52-streamed-experts.ts +0 -453
  424. package/src/model/glm52-streamed-metal.ts +0 -610
  425. package/src/model/glm52-weights.ts +0 -503
  426. package/src/model/glm52.ts +0 -1132
  427. package/src/model/implementation.ts +0 -69
  428. package/src/model/kv-attention-view.ts +0 -67
  429. package/src/model/minicpm5.ts +0 -376
  430. package/src/model/profile.ts +0 -443
  431. package/src/model/qwen-append.ts +0 -12
  432. package/src/model/qwen-conv.ts +0 -52
  433. package/src/model/qwen3-delta-state.ts +0 -74
  434. package/src/model/qwen3-delta.ts +0 -451
  435. package/src/model/qwen3-moe.ts +0 -404
  436. package/src/model/qwen3-mrope.ts +0 -252
  437. package/src/model/qwen3.ts +0 -277
  438. package/src/model/qwen3_5-checkpoint.ts +0 -164
  439. package/src/model/qwen3_5.ts +0 -819
  440. package/src/model/rotating-kv-donor.ts +0 -35
  441. package/src/model/rotating-kv-layout.ts +0 -262
  442. package/src/model/rotating-row-transaction.ts +0 -35
  443. package/src/model/speculative-rotating-kv.ts +0 -101
  444. package/src/model/ssm-prefill-padding.ts +0 -39
  445. package/src/model/support.ts +0 -102
  446. package/src/model/trellis-balanced-scatter.ts +0 -51
  447. package/src/model/trellis-linear.ts +0 -672
  448. package/src/model/trellis-shared-m.ts +0 -151
  449. package/src/model/trellis-shared-scatter.ts +0 -144
  450. package/src/model/trellis-splitk-prefill.ts +0 -158
  451. package/src/model/trellis-tiled-prefill.ts +0 -136
  452. package/src/model/trellis-vector-expand.ts +0 -62
  453. package/src/model/trellis-wide-prefill.ts +0 -94
  454. package/src/model/turboquant-codec.ts +0 -83
  455. package/src/model/universal/archs.ts +0 -332
  456. package/src/model/universal/dense.ts +0 -612
  457. package/src/model/universal/modules.ts +0 -170
  458. package/src/model/universal/rope.ts +0 -381
  459. package/src/native/expert_io.c +0 -523
  460. package/src/native/frame_extract.swift +0 -140
  461. package/src/native-pack.ts +0 -162
  462. package/src/pi-provider.ts +0 -53
  463. package/src/pi-session.ts +0 -81
  464. package/src/pi-terminal.ts +0 -274
  465. package/src/pi-web.ts +0 -1932
  466. package/src/preflight.ts +0 -158
  467. package/src/prompt-cache.ts +0 -460
  468. package/src/quantize/allocator.ts +0 -627
  469. package/src/quantize/atomic-output.ts +0 -38
  470. package/src/quantize/calibration.ts +0 -181
  471. package/src/quantize/config-writer.ts +0 -145
  472. package/src/quantize/index.ts +0 -84
  473. package/src/quantize/job.ts +0 -162
  474. package/src/quantize/quantizer.ts +0 -666
  475. package/src/quantize/rotate.ts +0 -603
  476. package/src/quantize/safetensors-writer.ts +0 -249
  477. package/src/quantize/sensitivity.ts +0 -216
  478. package/src/quantize/trellis.ts +0 -586
  479. package/src/quantize/weight-transform.ts +0 -292
  480. package/src/registry.ts +0 -602
  481. package/src/runtime-config.ts +0 -81
  482. package/src/safetensors.ts +0 -158
  483. package/src/sampler.ts +0 -1011
  484. package/src/serve/admin-routes.ts +0 -184
  485. package/src/serve/assets/curve-terrain.html +0 -105
  486. package/src/serve/assets/training-inference-map.html +0 -575
  487. package/src/serve/aux-routes.ts +0 -132
  488. package/src/serve/batch-scheduler.ts +0 -8
  489. package/src/serve/checkpoint-identity.ts +0 -64
  490. package/src/serve/generation-gateway.ts +0 -496
  491. package/src/serve/isolate.ts +0 -609
  492. package/src/serve/kv-budget.ts +0 -14
  493. package/src/serve/lab-routes.ts +0 -341
  494. package/src/serve/lane-registry.ts +0 -45
  495. package/src/serve/model-admin-routes.ts +0 -155
  496. package/src/serve/model-binding.ts +0 -43
  497. package/src/serve/model-host.ts +0 -511
  498. package/src/serve/parent-application.ts +0 -56
  499. package/src/serve/prompt-response-trace.ts +0 -147
  500. package/src/serve/response-lease.ts +0 -24
  501. package/src/serve/session-search.ts +0 -326
  502. package/src/serve/static-routes.ts +0 -101
  503. package/src/server.ts +0 -1314
  504. package/src/spec/assistant-rows.ts +0 -92
  505. package/src/spec/assistant-source.ts +0 -126
  506. package/src/spec/cache-identity.ts +0 -22
  507. package/src/spec/deepspec-rows.ts +0 -29
  508. package/src/spec/deepspec-source.ts +0 -145
  509. package/src/spec/dflash-source.ts +0 -149
  510. package/src/spec/drafter.ts +0 -304
  511. package/src/spec/dspark/ab-stats.ts +0 -136
  512. package/src/spec/dspark/calibration.ts +0 -112
  513. package/src/spec/dspark/data-dflash.ts +0 -156
  514. package/src/spec/dspark/data.ts +0 -201
  515. package/src/spec/dspark/deepspec-module.ts +0 -776
  516. package/src/spec/dspark/generate-dflash.ts +0 -245
  517. package/src/spec/dspark/generate.ts +0 -290
  518. package/src/spec/dspark/loader.ts +0 -23
  519. package/src/spec/dspark/loss.ts +0 -213
  520. package/src/spec/dspark/module-dflash.ts +0 -560
  521. package/src/spec/dspark/module.ts +0 -540
  522. package/src/spec/dspark/quantize-drafter.ts +0 -91
  523. package/src/spec/dspark/sample.ts +0 -112
  524. package/src/spec/generate.ts +0 -276
  525. package/src/spec/glm52-mtp-graph.ts +0 -29
  526. package/src/spec/glm52-mtp-rows.ts +0 -132
  527. package/src/spec/glm52-mtp-source.ts +0 -317
  528. package/src/spec/glm52-mtp-state.ts +0 -33
  529. package/src/spec/ngram-source.ts +0 -204
  530. package/src/spec/projected-draft-rows.ts +0 -73
  531. package/src/spec/qwen-mtp-module.ts +0 -171
  532. package/src/spec/qwen-mtp-rows.ts +0 -219
  533. package/src/spec/qwen-mtp-source.ts +0 -383
  534. package/src/spec/qwen-mtp-state.ts +0 -30
  535. package/src/spec/serve-loop.ts +0 -585
  536. package/src/spec/source.ts +0 -215
  537. package/src/spec/two-model-rows.ts +0 -61
  538. package/src/spec/two-model.ts +0 -113
  539. package/src/ssd-cache.ts +0 -372
  540. package/src/ssd-durability.ts +0 -211
  541. package/src/tokenizer.ts +0 -335
  542. package/src/tool-approvals.ts +0 -131
  543. package/src/tool-call.ts +0 -695
  544. package/src/train/dataset.ts +0 -484
  545. package/src/train/diffusion-lora.ts +0 -216
  546. package/src/train/export.ts +0 -32
  547. package/src/train/flash-cce.ts +0 -1234
  548. package/src/train/forward.ts +0 -266
  549. package/src/train/fuse.ts +0 -243
  550. package/src/train/index.ts +0 -46
  551. package/src/train/job.ts +0 -205
  552. package/src/train/lora-params.ts +0 -254
  553. package/src/train/loss.ts +0 -1591
  554. package/src/train/merge.ts +0 -195
  555. package/src/train/optimizer.ts +0 -183
  556. package/src/train/prefix-shared.ts +0 -490
  557. package/src/train/rank.ts +0 -137
  558. package/src/train/segmented.ts +0 -1828
  559. package/src/train/steel-qmm-header.ts +0 -1461
  560. package/src/train/trainer.ts +0 -1221
  561. package/src/train/watch.ts +0 -542
  562. package/src/vision/diffusion-vision.ts +0 -620
  563. package/src/vision/embedder.ts +0 -168
  564. package/src/vision/preprocess.ts +0 -247
  565. package/src/vision/prompt.ts +0 -373
  566. package/src/vision/qwen3vl-preprocess.ts +0 -409
  567. package/src/vision/qwen3vl-prompt.ts +0 -196
  568. package/src/vision/qwen3vl-tower.ts +0 -555
  569. package/src/vision/siglip.ts +0 -599
  570. package/src/vision/video-frames.ts +0 -148
  571. package/src/web/app.html +0 -2143
  572. package/src/web/app.js +0 -5703
  573. package/src/web/skills/memory/SKILL.md +0 -120
  574. package/src/web/skills/web-research/SKILL.md +0 -46
  575. package/src/web/skills.ts +0 -97
  576. package/src/web/src/adapters-panel.ts +0 -288
  577. package/src/web/src/assistant.ts +0 -451
  578. package/src/web/src/chat.ts +0 -1057
  579. package/src/web/src/composer.ts +0 -959
  580. package/src/web/src/dataset.ts +0 -132
  581. package/src/web/src/finetune.ts +0 -267
  582. package/src/web/src/hub.ts +0 -428
  583. package/src/web/src/main.ts +0 -98
  584. package/src/web/src/markdown.ts +0 -0
  585. package/src/web/src/memory-panel.ts +0 -572
  586. package/src/web/src/model-picker.ts +0 -159
  587. package/src/web/src/palette.ts +0 -346
  588. package/src/web/src/protocol.ts +0 -26
  589. package/src/web/src/quantize.ts +0 -167
  590. package/src/web/src/rag.ts +0 -274
  591. package/src/web/src/sessions.ts +0 -469
  592. package/src/web/src/shell.ts +0 -804
  593. package/src/web/src/ui-catalog.ts +0 -78
  594. package/src/web/vendor/README.md +0 -61
  595. package/src/web-assets.ts +0 -47
  596. package/src/web-tools.ts +0 -478
  597. package/src/weights.ts +0 -255
  598. /package/src/{serve → server}/completion-sink.ts +0 -0
  599. /package/src/web/{icon.svg → public/icon.svg} +0 -0
  600. /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
  601. /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`).