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,173 +0,0 @@
1
- # Trainer validation experiment
2
-
3
- **Status:** in progress (started 2026-06-20). **Goal:** prove the from-scratch
4
- SFT/DPO/ORPO trainer actually works before trusting any downstream result — general
5
- capability (Goal 1) or task-specific (Goal 2).
6
-
7
- ## Why this exists — the smoking gun
8
-
9
- The margin/accuracy is recorded in `metrics.json` (`valTrajectory[].margin`,
10
- `bestMargin`), not the stdout log. The prior `cpm5-uf` ORPO run (λ=0.1) shows:
11
-
12
- | step | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 |
13
- |---|---|---|---|---|---|---|---|---|
14
- | accuracy | .507 | .514 | .534 | .541 | .534 | .520 | .547 | .547 |
15
- | margin | .132 | .124 | .110 | .120 | .136 | .128 | .118 | .123 |
16
-
17
- **Preference accuracy is ~0.52 (near the 0.50 coin-flip) and the margin is flat.**
18
- ORPO's defining job is to push accuracy up and widen the margin. This is *not* a clean
19
- "it works" signal. Caveats: 800 steps ≈ 0.05 epoch (undertrained), provenance
20
- (from-base vs warm-start) unconfirmed. But it's enough to make validation mandatory:
21
- **we cannot currently claim our ORPO learns the preference at all.**
22
-
23
- ## Method-decomposition (the validation key)
24
-
25
- `ORPO_loss = NLL(chosen) + λ·L_OR`. NLL is exactly the SFT objective; L_OR is the
26
- reference-free odds-ratio preference term. So we validate the building blocks, and ORPO
27
- is covered by its parts plus a small ORPO-specific surface (the OR term + λ).
28
-
29
- mlx-lm has **no DPO/ORPO** — so the oracle strategy is:
30
- - **SFT/NLL** → numeric parity vs **mlx-lm tuner** (oracle env exists).
31
- - **DPO + OR loss** → **numeric unit test vs the paper's equations** on a fixed tiny
32
- input (hand-computed expected loss + grad). No external dep. Optional stronger
33
- cross-check: **TRL** `DPOTrainer`/`ORPOTrainer` loss (PyTorch; multi-GB env →
34
- approve-first, not default).
35
-
36
- Every positive control is designed so "weak data / weak lever" is **not** an available
37
- excuse — success must be unambiguous.
38
-
39
- ## PILLAR 1 — Prove the trainer (gate for everything)
40
-
41
- - **1a · SFT positive control** *(infra GREEN, behavioral check WEAK)*. Train
42
- `fixtures/adapters/data-upper` from scratch on MiniCPM5; assert generations are
43
- actually uppercased (oracle: the repo's pre-trained `upper` adapter). Existing
44
- `train-e2e.test.ts` only checks loss↓ — add the behavioral assert. *(seconds)*
45
- - **1b · DPO positive control** *(MISSING)*. Trivial preference (chosen uppercase,
46
- rejected lowercase). Assert **margin increases** and **preference accuracy → ~1.0**.
47
- - **1c · ORPO positive control + the real question.** (i) Same trivial preference →
48
- accuracy → ~1.0. (ii) **From-BASE ORPO on UF**, multiple epochs, watch margin widen
49
- and accuracy climb well above chance — directly resolves the near-chance finding
50
- (undertraining vs warm-start vs bug).
51
- - **1d · Loss-formula parity.** SFT NLL vs mlx-lm; DPO/ORPO loss + grad vs hand-computed
52
- paper equations (unit test). The training-side analogue of the inference logit-parity
53
- oracle — currently MISSING.
54
- - **1e · vs the paper.** Internal proxy first: preference accuracy robustly > chance on
55
- UF. Then (approve-first, LLM-judge) AlpacaEval/MT-Bench **direction** vs base (not
56
- absolute — paper used 7B). optiq suite (incl. IFEval) is an already-local downstream.
57
-
58
- > **Gate:** until 1a–1c are green, Pillars 2 & 3 sit on an unverified trainer.
59
-
60
- ## PILLAR 2 — Measure general-capability impact (optiq suite)
61
-
62
- All 6 datasets are present locally (`~/.cache/mlx-bun/eval-data/`: mmlu, gsm8k, ifeval,
63
- bfcl, humaneval, hashhop); harness = `scripts/eval.ts capability`.
64
- - **2a · Eval parity:** run on base CPM5, reproduce optiq's **30.28** within tolerance
65
- (validates the *measurement* before trusting deltas; confirm the README's open BFCL
66
- "no-calls" / MMLU "at-chance" flags aren't broken on our side).
67
- - **2b · Delta:** trained checkpoint vs base, on the 6-task mean.
68
- - **2c · Targeting:** mean is floored by **BFCL 0.0 / GSM8K 2.7 / HashHop 4.0**; UF hits
69
- the already-strong IFEval, so expect small mean movement. Highest-leverage Goal-1 lever
70
- is **BFCL** (0.0 is format-trainable; 0→30 = +5 on the mean).
71
-
72
- ## PILLAR 3 — Task-specific (separate; gated on Pillar 1)
73
-
74
- Chunk segmenter via `scripts/chunk-eval.ts` (boundary/label accuracy), using the
75
- hard-negative ORPO data (remove-a-cut / add-a-cut, balanced to kill the length
76
- shortcut). Measured by chunk accuracy, not val loss / capability. Credibility depends on
77
- Pillar 1.
78
-
79
- ## Sequencing & gates
80
-
81
- 1. Pillar 1 positive controls (1a→1b→1c-trivial) — fast, "does the machinery work."
82
- 2. Pillar 1 real replication (1c from-base UF) + 1d loss-formula parity.
83
- 3. Pillar 2a eval-parity (reproduce 30.28) → 2b deltas.
84
- 4. Pillar 3 — once the trainer is trusted.
85
-
86
- ## Execution log
87
-
88
- ### 2026-06-20 — Pillar 1 quick validations: PASS
89
-
90
- **Machinery + gradient correctness — GREEN.** `MLX_BUN_TEST_TRAIN=1 bun test
91
- train-autograd train-e2e train-orpo-e2e` → 8 pass / 0 fail, real training on
92
- MiniCPM5 (11.3s). `train-autograd` confirms the backward matches autograd.
93
-
94
- **ORPO positive control (prefer-uppercase, 12 train / 4 val, 120 iters, lr 1e-3) — PASS.**
95
- Held-out preference accuracy **1.000 by step 10**, margin **5.5 → 4.0** (noisy at lr=1e-3
96
- but accuracy solid). Logged: `runs/orpo-pc.{json,csv}`.
97
-
98
- **DPO positive control (same data) — PASS, cleaner.** Accuracy **1.000 from step 10**,
99
- margin **monotonic 6.46 → 9.67**. Logged: `runs/dpo-pc.{json,csv}`.
100
-
101
- **Conclusion: the preference machinery is validated.** On a learnable preference both
102
- DPO and ORPO drive accuracy to 1.0 and the margin wide open (vs UF's flat ~0.12). A
103
- broken trainer could not. ⇒ **The UF near-chance result is the DATA, not a bug** — UF
104
- pairs are genuinely subtle for a 1B (both responses plausible); "prefer uppercase" is
105
- trivially separable. The smoking gun is explained: implementation sound, lever weak.
106
-
107
- **Gotcha found (recorded so we don't repeat it):** `AdapterManager.mount` (the *serving*
108
- hot-swap path) does **not** reflect into `branchLogpMean` (the *training* forward) — an
109
- external base-vs-adapter `orpoMetrics` measurement via mount returns bit-identical
110
- numbers (measured: 0.500/0.1463 both). Measure training-side metrics via the
111
- `trainLora` emit / loraState path (`scripts/experiments/pref-control.ts`), not mount.
112
-
113
- **Logging for plotting:** `runs/<stem>.{json,csv}` — per-step train `{loss, accuracy,
114
- margin}` + per-eval val `{loss, accuracy, margin}`. CSV columns: `phase,step,loss,
115
- accuracy,margin`. Tools: `scripts/experiments/pref-control.ts` (train+log),
116
- `scripts/experiments/measure-pref.ts` (standalone adapter eval — superseded by the
117
- emit path for training metrics; see gotcha).
118
-
119
- ### 2026-06-20 — Pillar 2a: capability-harness parity. Two bugs found + fixed.
120
-
121
- **The first-measure step caught two harness bugs** (exactly its purpose — never trust a
122
- delta until the harness reproduces the published baseline):
123
-
124
- 1. **Thinking mode.** The eval rendered the chat template's *default* (thinking-on for
125
- MiniCPM5); optiq's numbers are **non-thinking** (HF card: IFEval 64.7 is non-thinking).
126
- Symptom: IFEval **36.7%** vs 64.7. **Fix:** `src/eval/runner.ts` `generateText` now
127
- renders `enableThinking: false` by default (env `MLX_BUN_EVAL_THINK=1` to re-enable).
128
- → IFEval **73.3%** (n=30), optiq ballpark.
129
- 2. **HumanEval oracle-python path.** `src/eval/tasks/humaneval.ts` hardcoded
130
- `/Users/joshrossi/Code/mlx-lm/.venv/bin/python` — wrong on this machine (it's
131
- `mlx-lm-example`), so every code-exec spawned a missing interpreter → **0%**. **Fix:**
132
- env-overridable `MLX_BUN_ORACLE_PYTHON` (committed default = reference box; never
133
- re-commit the path). → HumanEval **53.3%** (n=15), optiq 57.9.
134
-
135
- **Post-fix parity (base CPM5, non-thinking, n=20 — all ballpark):**
136
-
137
- | | MMLU | GSM8K | IFEval | BFCL | HumanEval | HashHop |
138
- |---|---|---|---|---|---|---|
139
- | ours | 55.0 | 10.0 | 75.0 | 0.0 | ~53 | 0.0 |
140
- | optiq | 52.4 | 2.7 | 64.7 | 0.0 | 57.9 | 4.0 |
141
-
142
- ⇒ **harness reproduces optiq.** Small-n inflation on GSM8K/IFEval will settle toward
143
- optiq on the full set. **Exp-1 baseline harness VALIDATED.**
144
-
145
- ### Ready-to-fire sequence (everything staged; only GPU time remains)
146
-
147
- All measurement tools validated. `scripts/eval.ts` now takes `--adapter <dir>` (mounts the
148
- trained LoRA → x2). `ORC=/Users/joshrossi/Code/mlx-lm-example/.venv/bin/python` below.
149
-
150
- 1. **x1** (running): `MLX_BUN_ORACLE_PYTHON=$ORC bun scripts/eval.ts capability --candidate MiniCPM5`
151
- 2. **Train** (user): from-base ORPO/UF → `./adapters/cpm5-uf-frombase` (command in chat).
152
- 3. **x2 (Exp 1 after):** `MLX_BUN_ORACLE_PYTHON=$ORC bun scripts/eval.ts capability --candidate MiniCPM5 --adapter ./adapters/cpm5-uf-frombase` → compare to x1.
153
- 4. **Exp 2 gen (GPU):** `bun scripts/experiments/prefbench.ts gen mtbench ./adapters/cpm5-uf-frombase mtbench-uf` (and `gen alpaca … alpaca-uf 200` for a subset).
154
- 5. **Exp 2 judge (codex, anytime):** `bun scripts/experiments/prefbench.ts judge mtbench-uf` → TRAINED win-rate vs BASE.
155
-
156
- ### Next
157
- - **Full baseline:** see step 1 (running). **(long → user-launched)**
158
- - **Train (the "do"):** from-base ORPO on UF (`pref-control.ts`, command in chat). **(long → user-launched)**
159
- - **Re-measure → x2**, compare to x1. Exp 1 done.
160
- - **Exp 2 judge — VALIDATED (keyless).** No OpenAI key needed: the judge shells out to
161
- `codex exec -m gpt-5.4-mini` (codex's own auth), forcing structured `{"winner":...}` via
162
- `--output-schema` and reading the clean verdict from `-o`. `scripts/experiments/llm-judge.ts`
163
- — `judgeOnce` + `judgePair` (judges BOTH orders to cancel small-judge position bias).
164
- Positive control: **3/3 obvious good-vs-bad pairs, good won both orders, zero flips.**
165
- 1bx vs 1bx1; consistency (same judge both sides), not absolute comparability to the paper's GPT-4.
166
- - **Exp 2 harness — STAGED.** Prompts downloaded: `~/.cache/mlx-bun/eval-data/{mt_bench.jsonl
167
- (80), alpaca_eval.json (805)}`. Two-phase runner `scripts/experiments/prefbench.ts`:
168
- `gen <mtbench|alpaca> <adapterDir> <stem> [limit]` (GPU — base then trained, non-thinking)
169
- → `runs/<stem>.responses.jsonl`; `judge <stem> [limit]` (codex) → TRAINED win-rate vs BASE,
170
- judging trained-vs-base **directly** (head-to-head, not vs a fixed reference). Only the `gen`
171
- phase needs GPU; everything else is validated. Fire after the from-base training produces
172
- `./adapters/cpm5-uf-frombase`.
173
- - **1c real / 1d parity** — still open (lower priority now the positive controls + harness parity are green).
@@ -1,199 +0,0 @@
1
- # Chat UI Vision: The Model That Knows You
2
-
3
- **Stance: memory/personalization-first.** Every other axis in this
4
- doc — speed, tools, LoRA routing, privacy — is real, but it is in
5
- service of one idea: mlx-bun is the only local chat surface where the
6
- model visibly, auditably gets better at being *yours* over time. If we
7
- build a fast, private, tool-capable chat app that doesn't make that
8
- tangible on screen, we've built LM Studio with worse artifacts. That is
9
- not the plan.
10
-
11
- ## The feeling
12
-
13
- Open the app. It's not a hero screen with generic suggestion chips —
14
- it's a hero screen that already knows something. Not in a creepy way:
15
- in the way a good assistant who's worked with you for months starts a
16
- Monday with "want me to pick up the Lisbon itinerary thing from
17
- Thursday?" instead of "How can I help you today?" It should feel like
18
- walking into a room where someone has been quietly paying attention,
19
- not opening a fresh terminal.
20
-
21
- The tell, mechanically: a chat with mlx-bun after a month of use is a
22
- *different product* from day one — not because we shipped a new model,
23
- but because the sidebar, the hero, and the answers themselves carry
24
- accumulated context the user can see, correct, and trust. Cloud
25
- chatbots fake a version of this behind a black box on someone else's
26
- server. Local competitors (LM Studio, Ollama, macMLX) don't attempt
27
- it — stateless between chats by design. Open WebUI and AnythingLLM
28
- attempt it as prompt-stuffing into a flat fact list. Odysseus gets
29
- closest (memory + skills) but on vLLM/llama.cpp infra with no adapter
30
- concept at all. **Nobody combines memory-as-training-artifact with
31
- weight-level LoRA routing and native MLX speed. That combination is the
32
- whole pitch, and today it's invisible in our own UI** — the vault, the
33
- memory tools, and the adapter runtime already exist server-side; none
34
- of it shows on screen.
35
-
36
- ## The five things that make this unmistakable
37
-
38
- **1. Memory is a visible citizen of the chat, not a silent tool call.**
39
- Today `memory_search`/`memory_read` fire invisibly inside a generic
40
- tool-call card indistinguishable from a bash command. The redesign
41
- gives memory its own visual language: when the model consults the
42
- vault mid-answer, a small soft-colored chip appears inline — not a
43
- context dump, not an approval gate (it's read-only, never needs
44
- permission), just a quiet citation: **"grounded in: Photography,
45
- Lisbon-2026"**. Click it, it expands to the exact section read. This
46
- is the single highest-leverage UI change in the whole plan: it turns
47
- an architectural property ("the model is grounded in your vault") into
48
- a *felt* one, every single turn, for free, using tool-call
49
- infrastructure that already exists.
50
-
51
- **2. A real Memory surface — not a settings toggle, a workspace.** New
52
- 8th tab (or better: reachable via one click from the sidebar, since
53
- memory is chat-adjacent, not admin-adjacent): a vault browser. Articles
54
- + categories on the left, a reading pane on the right, a wikilink graph
55
- view (the backend already resolves `memory_links` — nobody has drawn
56
- it). Critically: a **git-history scrubber** on every article, because
57
- self-healing-through-correction (the wiki updates itself when you
58
- contradict a prior claim) is our best differentiator-in-the-flesh and
59
- today it happens with zero visible seam. Correct the model about your
60
- camera body in a chat on Tuesday; open the Photography article on
61
- Wednesday and see the diff, dated, with the source conversation linked.
62
- This is the "watch it happen" answer to ChatGPT/Claude's opaque
63
- "Manage Memories" list — we don't just show *what* is remembered, we
64
- show *how it changed and why*, because the whole pipeline runs on the
65
- user's own disk.
66
-
67
- **3. LoRA adapters are a routing story, not a filename dropdown.** The
68
- current `<select>` lists raw ids (`minicpm5-chunk-final · r16`). The
69
- redesign gives every adapter a name, a one-line specialty, and a
70
- *kind*: **memory adapters** (trained nightly from the vault — these are
71
- the "gets to know you" adapters) versus **task adapters** (coding,
72
- writing-voice, whatever a user trains deliberately). The composer shows
73
- a small persistent chip: **"grounded in your Writing adapter"** with a
74
- one-click swap, and — since the backend already supports it — a
75
- **stacking** affordance (memory adapter + task adapter together,
76
- visibly, not just via a hidden `a+b` string). This is where LoRA
77
- routing and memory literally become the same feature in the UI: a
78
- memory-LoRA *is* accumulated personalization made concrete in weights,
79
- and that's a claim no competitor's "persona" or "preset" system
80
- (LM Studio Presets, Msty Personas, Ollama Modelfiles) can make, because
81
- none of them adapt weights per user.
82
-
83
- **4. Speed is shown, not hidden, because it's the substrate memory runs
84
- on.** A live perf strip near the composer — tok/s, TTFT, prompt-cache
85
- hit (already computed server-side, never surfaced), a plain-English
86
- serving-lane badge ("batched ×3" / "spec-decode active"). This isn't a
87
- generic benchmarking flex: it's what makes "the model reads your whole
88
- vault before answering, every time, and it's still instant" credible
89
- instead of hopeful. Fast local retrieval is worthless if it feels slow.
90
-
91
- **5. Tool-call and approval UI as a trust surface for an agent with
92
- real disk access.** The approval gate is fully built (per-call
93
- allow/deny, diff preview) but dead in web chat today — the browser
94
- tool allowlist excludes bash/edit/write entirely. Ship a "Power" mode
95
- that widens the toolset with the approval cards already built, styled
96
- as inline code-review hunks (LM Studio's argument-editable pattern,
97
- Jan's non-blocking inline cards). This matters to the memory thesis
98
- specifically: a vault the model can *write* to, not just read, is the
99
- next step after this redesign, and users need to already trust
100
- approval before we get there.
101
-
102
- ## Making it tangible in the surface
103
-
104
- **Layout.** Keep the two-pane shape (sidebar + thread) — it's not
105
- broken, and Msty/Claude/ChatGPT converge on it. Change what the sidebar
106
- *contains*: above the flat session list, a compact **Memory status
107
- strip** — vault article count, "last synthesis: 6h ago, 3 articles
108
- updated," a dot that goes amber if synthesis is overdue. This is
109
- `vaultStatus()` (already returns exactly this data) surfaced for the
110
- first time. One click opens the Memory workspace as a slide-over, not a
111
- full tab switch — memory should feel adjacent to chat, not a separate
112
- destination.
113
-
114
- **Composer.** Left of Send: the adapter chip (kind-colored — memory
115
- adapters warm, task adapters cool), click to open a compact router
116
- panel (available/loaded/selected, RAM cost per loaded adapter, stack
117
- toggle). Right of the textarea: the perf strip. Above the composer:
118
- typing `#` surfaces both attached-file context AND vault articles in
119
- one unified picker, because "attach a file" and "recall something I
120
- told you" are the same retrieval gesture from the user's point of view.
121
- Don't teach two mental models for "give the model context."
122
-
123
- **Messages.** Each assistant bubble gets, for the first time, a real
124
- action row (copy — currently missing outside code blocks, regenerate,
125
- edit-and-branch with the ChatGPT/Claude convention of a lightweight
126
- `< 1/2 >` sibling toggle rather than a full tree). The memory-citation
127
- chip attaches only when memory tools actually fired that turn — never
128
- fabricated, because false positives here destroy the trust the feature
129
- depends on.
130
-
131
- **Model & adapter switching.** The nav model label goes from a static
132
- span to a real switcher (currently zero affordance, a stark gap for a
133
- product built on per-model specialization). The adapter panel sits next
134
- to it, not buried in a settings modal.
135
-
136
- **Tool-call display.** Three visual tiers, not one generic card: (a)
137
- read-only tools (file read, web fetch) render minimally, collapsed,
138
- auto-allowed; (b) memory tools render as the soft citation chip from
139
- differentiator #1 — deliberately *not* styled like a tool call; (c)
140
- mutating tools (bash/edit/write, once Power mode exists) render as the
141
- inline approve/deny code-review-hunk card with visible diff. Same
142
- underlying `tool_call` event stream, three renderers — conflating "read
143
- your camera preferences" with "wants to delete a file" in one visual
144
- language is exactly what makes today's UI feel generic.
145
-
146
- **Onboarding.** The <1-minute install-to-chat promise gets a second
147
- clause: install-to-chat-*that-remembers*-under-two-minutes. First-run
148
- hero adds one honest, skippable memory-consent step ("Let mlx-bun keep
149
- a personal notes vault on your Mac? Read, edit, or delete it anytime —
150
- it's just Markdown files") in the same breath as the first message, not
151
- buried in a CLI-only `mlx-bun memory init`. Consent has to happen
152
- *before* the flywheel can start proving itself.
153
-
154
- ## What we deliberately don't build
155
-
156
- - **No enterprise/multi-user layer** — no RBAC, no Open-WebUI-style
157
- Channels, no admin console. mlx-bun is single-user by identity.
158
- - **No general-purpose agent-flow builder** (AnythingLLM's Agent Flows,
159
- Msty's Turnstiles). Automation, if any, is scoped narrowly to what
160
- the synthesis pipeline needs, not a drag-and-drop canvas.
161
- - **No cloud tier, no hosted anything** — no Ollama-style `:cloud`
162
- hybrid. "Escalate to a bigger model" means local spec-decode against
163
- a larger local target, never a paid API.
164
- - **No email/calendar/documents workspace clone** (Odysseus's scope
165
- creep). Personal-context connectors, if they ever happen, are
166
- read-only memory *feeders*, not a productivity suite to maintain.
167
- - **No full conversation-tree graph view.** The lightweight
168
- sibling-toggle branch UI (ChatGPT/Claude's convention) is the right
169
- amount of investment; neither incumbent ships a real tree either.
170
- - **No page-level PDF citation rendering as v1.** Filename + snippet
171
- citation gets most of the trust benefit for a fraction of the
172
- engineering; save PDF-aware rendering for later.
173
- - **No speech-to-speech voice mode as a v1 commitment** — a bolt-on
174
- STT→LLM→TTS pipeline reads as worse than what users now expect;
175
- scope as future work, not parity-by-next-release.
176
- - **No unsandboxed shell tool shipped quietly.** If Power mode widens
177
- the toolset to bash/edit/write, the approval-gate trust surface
178
- ships *with* it, not after — Odysseus's unsandboxed bash tool and
179
- its 48-hour-patched CVEs are the cautionary tale.
180
- - **No competing on raw model-catalog breadth** (Ollama's library,
181
- LM Studio's HF browser). MLX-only by identity; a focused, well-labeled
182
- local model/adapter list beats a sprawling catalog we'd have to
183
- maintain against a moving target.
184
-
185
- ## Why this ordering, not another
186
-
187
- Speed, tool UX, and multi-adapter composition are all worth building —
188
- the research surfaces excellent, copyable patterns for each (Jan's
189
- inline approval cards, LM Studio's hardware-fit indicator, Msty's
190
- split-pane compare). But every one of those patterns is *matchable* by
191
- a well-resourced competitor within a release cycle. The memory flywheel
192
- is not: it requires a vault architecture, a synthesis pipeline, an
193
- adapter-namespaced KV runtime, and a product culture willing to treat
194
- "gets better at being yours" as the headline rather than a checkbox —
195
- all of which mlx-bun already has built and simply hasn't surfaced. The
196
- redesign's job is not to invent new backend capability. It's to stop
197
- hiding the one capability nothing else in this market has, and frame
198
- every other improvement (speed HUD, tool cards, adapter switching) as
199
- infrastructure *for* that capability, not a parallel feature track.
@@ -1,50 +0,0 @@
1
- # The mlx-bun chat surface: a vision
2
-
3
- *Draft vision, product/design lead pass — 2026-07-06. Bold stance: reimagine the chat surface from scratch. Companion to the market research and current-state audit that produced it; see `docs/archive/planning/web-ui-pass-plan.md` for the tactical bug list and `docs/design/adapters-end-to-end.md` / `docs/design/memory-system.md` for the backend contracts this vision assumes.*
4
-
5
- ## The feeling
6
-
7
- Open mlx-bun and it should feel like sitting down with someone who already knows you — not a search box you interrogate, not a terminal you configure, not a dashboard you administer. Every other local-AI chat UI (Open WebUI, LM Studio, Jan, Ollama's app) is, underneath the polish, the **same product**: a stateless request/response window in front of a model file. They compete on how many knobs they expose. We are not building a better knob panel. We are building the only chat surface where "it remembers what I told it three weeks ago, and it's faster than the thing it's replacing" is literally, verifiably true — and where the UI's job is to make that trust legible turn by turn, not assert it in marketing copy.
8
-
9
- `src/web/app.html` has already solved the hard infrastructure problem (streaming, tool-calls, sessions, steering) and completely missed the product problem: memory is invisible, LoRA routing is a bare `<select>`, and the first thing a new user sees is marketing copy about privacy with zero proof of personalization on screen. The redesign's job is not "add more tabs." It's: collapse the surface to what a person actually touches every day (chat), and make the three things nobody else can build — memory that becomes weights, routed adapters, an engine fast enough to show its work — into things you can *see happen*.
10
-
11
- ## Five things that make this unmistakably not-Open-WebUI
12
-
13
- **1. Memory has a face, and it's a citation, not a settings toggle.**
14
- Every competitor's "memory" (ChatGPT, AnythingLLM, Odysseus) is a flat fact-list re-injected into a system prompt — legible after the fact, invisible during the conversation. We already run `memory_search`/`memory_read` silently on every turn (`src/memory/tools.ts`, wired into `webChatToolAllowlist`) and render them with the same generic wrench icon as `bash`. Instead: when a memory tool fires, render a distinct, quieter card — a small "📖 Photography" chip inline with the response — that expands on click to show the exact vault section that grounded that sentence. No context dump, no "as an AI with access to your notes" narration, just a footnote that proves the flywheel is real. This costs almost nothing: the event stream already distinguishes memory calls; we just have to stop rendering them like `bash`.
15
-
16
- **2. Adapters are personas you route to, not files you pick.**
17
- Nobody else has hot-swappable LoRA adapters with adapter-namespaced KV — not LM Studio, not Ollama, not Msty (whose "Persona Studio" is prompt-only). We already have `/v1/adapters`, three-tier state, and per-request injection; the UI throws it away on a `<select>` full of raw filenames. Instead: a **persona rail** above the composer, one pill per named persona (adapter + system prompt + tool allowlist + memory scope bundled, a richer Ollama Modelfile), each with a one-line specialty, a resident/cold dot, and RAM cost on hover. Switching shows a "new context segment" micro-transition (genuine, not cosmetic — that's what adapter-namespaced KV means), and a Msty-style split-compare fires one prompt at two personas side by side to *prove* the adapter earns its keep.
18
-
19
- **3. Speed is a HUD, not a footnote.**
20
- Today tok/s is a dim gray number after the message finishes. Every other local tool either hides serving mechanics (Open WebUI) or shows only tok/s (Ollama `ps`, LM Studio). We control the whole stack down to spec-decode and batch slots. A persistent strip near the composer: live tok/s *during* the stream, TTFT, a context-fullness ring, and a lane badge — "draft+verify (dspark)" vs "batched ×3" vs "serial" — since mlx-lm's own architecture treats these as mutually exclusive lanes and users should see which one they're in. An internal engineering decision becomes a felt, screenshot-able proof point.
21
-
22
- **4. Tool-calls are a code-review hunk, not a permission dialog.**
23
- We already have per-call approve/deny in `pi-web.ts` with a diff-style card; Jan and LM Studio validate the pattern (inline, non-blocking, argument-editable), nobody's pushed it further. Ours should feel like reviewing a PR: syntax-highlighted args, a blast-radius line ("will write 40 lines to `src/foo.ts`"), three-state approval (once / always-this-session / deny) persisted to disk so it survives restarts (Claude Desktop and Cowork visibly get this wrong), and read-only tools pre-approved by default so fatigue only hits tools that deserve scrutiny.
24
-
25
- **5. The whole thing installs to a felt "it knows me" moment in under a minute.**
26
- Every competitor's onboarding ends at "chat works." Ours ends at "chat works, and it already asked, gently, whether it can start learning from you." First run: pick a hardware-fit-scored starter model, land in chat, and the hero screen's first chip isn't "what is mlx-bun?" — it's a dismissible memory-consent card ("Let mlx-bun remember what matters across chats? Nightly, local, git-tracked, editable any time.") where a philosophy statement used to be. Say yes and the vault seeds; say no and it never mentions it again — the one screen where "local-to-you" becomes an action instead of a claim.
27
-
28
- ## Making the differentiators tangible, in one line each
29
-
30
- **Privacy** = a one-click "Temporary chat" pill, honestly stronger than ChatGPT/Claude's (theirs retains 30 days server-side; ours touches no third party, ever) — stated once in a tooltip, otherwise proven by the UI's total silence about accounts or "sync." **Memory** = the citation chips plus a **Memory panel** (slide-over, not a 6th tab): vault search, per-article git-diff so a user can *watch* an article self-correct, and a nightly synthesis changelog — the mechanism shown, not asserted. **LoRA routing** = the persona rail plus a routing table in settings (which surface defaults to which persona) with the three-tier lifecycle (available/loaded/selected) shown honestly, RAM cost visible before it's spent. **Speed** = the always-on HUD plus a Benchmark strip in Status (live prefill/decode tok/s, TTFT, peak RSS, spec-decode acceptance rate, cold-start — macMLX's pattern, extended with what only dspark can show). **Local tools** = the code-review-hunk approval cards plus a curated first-run toolset (file read, web fetch, our own `memory_search`) so day one isn't a JSON config exercise.
31
-
32
- ## Concrete screens
33
-
34
- **Layout.** Kill the 7-tab flat nav. One primary surface (Chat), with Quantize / Fine-tune / Build Dataset / Curves / Routes / Status collapsed behind a single **Developer** toggle (LM Studio's User/Power-User/Developer pattern, flattened to two states). A new user's day-one mental model: sidebar, thread, composer, persona rail, speed HUD — not seven tabs including a fine-tuning dashboard before they've sent one message.
35
-
36
- **Sidebar.** Full-text session search (not just title — unlike Claude's well-known gap), and a real mobile treatment: a slide-over drawer behind a hamburger, not today's "delete the sidebar at 760px with no replacement."
37
-
38
- **Thread.** Actions that don't exist today: copy on any assistant message, edit-and-resend that forks non-destructively with an inline `< 1/2 >` branch switcher (a linear toggle, not a tree — both cloud incumbents prove that's the right ceiling), regenerate, and "regenerate with a different persona." Streaming gets fixed architecturally: block-level memoization (only the live tail re-parses) instead of today's `innerHTML = mdToHtml(fullText)` on every token — O(n²) over a response, and the thing most likely to make a spec-decode-accelerated model *feel* slow because the frontend can't keep up with its own backend. Code fences get real syntax highlighting; math gets KaTeX — both zero today.
39
-
40
- **Composer.** Autosize textarea, file/image attach (existing), a persona pill, live steering (existing — keep it), and the sampling popover expanded from three sliders to the full server-supported set (min_p, XTC, penalties, logit_bias) behind an "Advanced" disclosure — closing a plain parity gap against the mlx-lm oracle.
41
-
42
- **Memory & model switching.** A slide-over Memory panel (vault search, git-diff per article, synthesis changelog) plus a vault-status chip in the composer, and a real model switcher — today's `#nav-model` is a read-only label with no click handler, an odd miss given the pitch is fast tier-switching between e4b/12B/26B.
43
-
44
- **Tool-call display.** Inline, non-blocking approval cards (Jan's pattern) with argument diffs, blast-radius text, three-tier persistence, and pre-approved read-only defaults.
45
-
46
- ## What we deliberately do not build
47
-
48
- No Channels or multi-user/Slack-style shared spaces (Open WebUI's most enterprise-flavored feature) — mlx-bun is single-user by identity. No RBAC, org admin, or plugin marketplace — there is no "org" to administer. No general-purpose no-code agent-flow canvas (AnythingLLM's Agent Flows, Msty's Turnstiles) — if one ever justifies itself, scope it to the memory/synthesis pipeline, not general automation. No speech-to-speech voice mode as a v1 commitment — it would visibly disappoint next to Advanced Voice Mode if half-built; an honest stretch goal, not table stakes. No paid cloud escalation tier (Ollama Cloud) — any "bigger model" story stays local (dspark spec-decode against a larger local target). No email/calendar/document-suite bloat (Odysseus), even reframed as "memory feeders," until the core loop is airtight. And no sandbox-theater for a shell tool we can't actually sandbox — if we ship tool execution, we say plainly it runs on your machine with your permissions.
49
-
50
- The through-line: every screen either makes local-to-you *provable* or it doesn't ship. Speed you can see. Memory you can read and correct. Adapters you can name, compare, and trust. Everything else is Open WebUI's problem to solve, not ours.
@@ -1,77 +0,0 @@
1
- # Chunk-task quality roadmap (2026-06-17)
2
-
3
- Where the MiniCPM5 chunking adapter stands and what raises real segmentation
4
- quality. Companion to the chunk-eval metric vs. accuracy finding (score = well-formedness, not gold accuracy) and
5
- [`docs/archive/investigations/chunk-finetune-experiment.md`](../investigations/chunk-finetune-experiment.md).
6
-
7
- ## Where we are
8
-
9
- - Adapter **solved the output contract**: 0/25 invalid JSON (base model: 22/25
10
- invalid — unusable). That's the entire 95.10 well-formedness score.
11
- - Adapter is **mediocre at the actual task**: vs-gold boundary ~35.6, label ~52.0,
12
- all 25 cases in disagreement (`reports/chunk-eval-cpm-2026-06-17.html`).
13
- - Dominant failures: `under_split` 17/25, TAIL GAP / `missed_content` 9,
14
- hallucinated anchors 4 — explained by the training-data bias below.
15
-
16
- ## Step 1 (the lever): fix the training data
17
-
18
- The data (`chunk-data-le4000`) is **86% single-chunk** (626/730 examples = 1 chunk,
19
- mean 1.16, max 4). The model learned a strong "one short chunk" prior → it
20
- under-splits and truncates coverage. A 1B model on this diet isn't at its capacity
21
- ceiling, it's mimicking its data.
22
-
23
- - Rebuild the dataset so the **chunk-count distribution matches real operational
24
- segmentation**, not a single-topic majority.
25
- - Teach **full-transcript coverage** (spans that reach the end — kill the tail gaps).
26
- - This is the #1 lever. Do it before touching capacity or iters.
27
-
28
- ## Eval methodology: do NOT judge against codex's gold
29
-
30
- **Codex over-segments — it splits articles ~2× what we actually do in operations.**
31
- So the current gold is inflated: judging the adapter as `under_split` is partly an
32
- artifact of a gold that over-splits. The under-split signal is real but smaller than
33
- the verdict count suggests.
34
-
35
- - Recalibrate the gold to **operational granularity** (use real-ops segmentations as
36
- the reference, or down-weight codex's extra splits) before trusting `bs`/`ls`.
37
- - Until the gold matches ops, the report **understates** the adapter.
38
- - Going forward, optimize against operational gold, not codex, and not the saturated
39
- well-formedness score.
40
-
41
- ## rank / scale: tune for a single narrow task
42
-
43
- We are telling CPM to do exactly **one** thing: take a sequence of messages and find
44
- the topic seams. That narrowness should drive the LoRA capacity knobs deliberately —
45
- revisit the inherited rank 16 / scale 1 rather than carrying old defaults. Folds into
46
- the "configurable training params with mlx-lm defaults" task (rank / scale / num_layers
47
- / LR / dropout selectable at run start). The question to answer empirically: how little
48
- rank does this one transformation need, and what scale/LR pairs with it.
49
-
50
- ## Streaming / windowed segmentation mode
51
-
52
- Whole-transcript-at-once is one framing; it likely isn't the operational one. Explore:
53
-
54
- - A **sliding message window** — segment incrementally as messages arrive, over a
55
- bounded window, rather than ingesting the entire conversation.
56
- - "Lots of different ways to segment these conversations" — try multiple task
57
- formulations (whole-transcript vs windowed vs streaming/online) and measure which
58
- matches operations and trains best on a small model.
59
- - Implications for training data shape (windowed targets) and for serving (a streaming
60
- endpoint / incremental decode).
61
-
62
- ## Evaluate other base models
63
-
64
- CPM5-1B is tiny and was a memory-driven pick. Run a **bake-off**: score other base
65
- models on the chunk task (same gold, same harness) to find the best base for the
66
- chunking adapter. Capacity is the second lever after data — and the e4b +
67
- segmented-backward work exists precisely to train bigger models at long context. See
68
- [[e4b-lora-training-seqlen-ceiling]], [[segmented-backward-landed]].
69
-
70
- ## Ordered plan
71
-
72
- 1. **Fix the training data** (multi-chunk + full coverage, operational granularity).
73
- 2. **Recalibrate the eval gold** off codex toward operational segmentation.
74
- 3. **Tune rank/scale** for the single narrow task (with configurable params).
75
- 4. **Prototype streaming/windowed** segmentation; pick the framing that fits ops.
76
- 5. **Model bake-off**; move up in capacity (e4b via segmented backward) if data alone
77
- plateaus.