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.
- package/README.md +1453 -88
- package/THIRD_PARTY_NOTICES.md +882 -0
- package/bin/mlx-bun.convert.mjs +4 -0
- package/bin/mlx-bun.fuse.mjs +4 -0
- package/bin/mlx-bun.generate.mjs +4 -0
- package/bin/mlx-bun.lora.mjs +4 -0
- package/bin/mlx-bun.mjs +13 -21
- package/bin/mlx-bun.server.mjs +4 -0
- package/bin/mlx-bun.upload.mjs +4 -0
- package/dist/web/app.js +9584 -0
- package/package.json +50 -53
- package/src/cli/ane-install.ts +76 -0
- package/src/cli/args.ts +179 -0
- package/src/cli/engine-entry.ts +68 -0
- package/src/cli/inference.ts +214 -0
- package/src/cli/job-entry.ts +97 -0
- package/src/cli/library-host.ts +117 -0
- package/src/cli/main.ts +57 -0
- package/src/cli/memory-engine.ts +163 -0
- package/src/cli/memory.ts +36 -0
- package/src/cli/mlx-lm-aliases.ts +309 -0
- package/src/cli/model-choice.ts +33 -0
- package/src/cli/model-selection.ts +84 -0
- package/src/cli/module-host.ts +11 -0
- package/src/cli/module-verbs.ts +50 -0
- package/src/cli/numerical-policy.ts +12 -0
- package/src/cli/perplexity.ts +89 -0
- package/src/cli/serve-host.ts +423 -0
- package/src/cli/serve-isolated.ts +217 -0
- package/src/cli/serve-options.ts +106 -0
- package/src/cli/serve-state.ts +205 -0
- package/src/cli/serve.ts +500 -0
- package/src/cli/served-model-host.ts +102 -0
- package/src/cli/server-entry.ts +148 -0
- package/src/cli/serving-unit.ts +177 -0
- package/src/{tui.ts → cli/terminal.ts} +13 -8
- package/src/cli/worker-adapters.ts +34 -0
- package/src/cli/worker-entry.ts +272 -0
- package/src/cli/worker-unit.ts +179 -0
- package/src/engine/adapter-operation.ts +26 -0
- package/src/engine/cache-services.ts +114 -0
- package/src/engine/completion.ts +39 -0
- package/src/engine/generation-gateway.ts +358 -0
- package/src/engine/index.ts +59 -0
- package/src/engine/kv-budget.ts +120 -0
- package/src/engine/media-preparation.ts +232 -0
- package/src/engine/model-binding.ts +24 -0
- package/src/engine/model-host.ts +513 -0
- package/src/engine/model-serving.ts +89 -0
- package/src/{serve → engine}/preparation.ts +10 -8
- package/src/{serve → engine}/session-completion-engine.ts +6 -6
- package/src/engine/telemetry.ts +109 -0
- package/src/hub/downloads.ts +116 -0
- package/src/jobs/db.ts +16 -7
- package/src/jobs/events.ts +29 -0
- package/src/jobs/executable.ts +5 -0
- package/src/jobs/host.ts +51 -0
- package/src/jobs/in-process.ts +55 -0
- package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
- package/src/jobs/runner.ts +150 -231
- package/src/jobs/service.ts +75 -0
- package/src/jobs/sse.ts +59 -23
- package/src/jobs/worker-memory.ts +46 -0
- package/src/jobs/worker-process.ts +163 -0
- package/src/jobs/worker-supervisor.ts +258 -0
- package/src/modules.ts +58 -0
- package/src/publishing/catalog-hub.ts +18 -0
- package/src/publishing/credentials.ts +31 -0
- package/src/publishing/upload.ts +37 -0
- package/src/residency/leased-adapters.ts +21 -0
- package/src/residency/local-records.ts +16 -0
- package/src/residency/model-residency.ts +405 -0
- package/src/residency/record-index.ts +28 -0
- package/src/residency/resident-estimate.ts +50 -0
- package/src/{anthropic.ts → server/anthropic.ts} +3 -81
- package/src/server/cache-routes.ts +36 -0
- package/src/{serve → server}/chat-request.ts +12 -10
- package/src/{serve → server}/chat-stage.ts +27 -22
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +42 -42
- package/src/server/decision-body.ts +55 -0
- package/src/server/decision-routes.ts +134 -0
- package/src/server/decision-wire.ts +228 -0
- package/src/{serve → server}/discovery-routes.ts +42 -83
- package/src/server/generated-token-history.ts +57 -0
- package/src/{serve → server}/http.ts +25 -13
- package/src/{serve → server}/inference-request.ts +5 -5
- package/src/server/job-routes.ts +20 -0
- package/src/server/media-prompt.ts +63 -0
- package/src/server/memory-completion-client.ts +46 -0
- package/src/server/model-routes.ts +192 -0
- package/src/{serve → server}/openai-wire.ts +3 -2
- package/src/{serve → server}/pipeline.ts +1 -1
- package/src/server/prompt-builder.ts +13 -0
- package/src/server/prompt-contracts.ts +17 -0
- package/src/server/proxy-routes.ts +187 -0
- package/src/server/publishing-routes.ts +41 -0
- package/src/{serve → server}/request-plan.ts +8 -8
- package/src/{serve → server}/request-prep.ts +82 -68
- package/src/{serve → server}/responses-client.ts +30 -13
- package/src/{responses.ts → server/responses.ts} +12 -93
- package/src/server/routes.ts +205 -0
- package/src/server/start.ts +72 -0
- package/src/server/status-routes.ts +108 -0
- package/src/{serve → server}/text-completion-stage.ts +25 -4
- package/src/server/text-prompt.ts +12 -0
- package/src/{serve → server}/token-streams.ts +36 -38
- package/src/server/worker-routes.ts +311 -0
- package/src/storage/paths.ts +61 -0
- package/src/web/assets.ts +37 -0
- package/src/web/{src → browser}/api.ts +5 -23
- package/src/web/browser/chat-host.ts +17 -0
- package/src/web/browser/installed-panels.ts +6 -0
- package/src/web/browser/main.ts +55 -0
- package/src/web/browser/markdown.ts +279 -0
- package/src/web/browser/memory-panel.ts +9 -0
- package/src/web/browser/palette.ts +64 -0
- package/src/web/browser/protocol.ts +13 -0
- package/src/web/browser/shell.ts +467 -0
- package/src/web/{src → browser}/status.ts +32 -36
- package/src/web/build.ts +51 -0
- package/src/web/public/app.html +1054 -0
- package/src/web/{sw.js → public/sw.js} +4 -3
- package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
- package/src/web/{vendor → public/vendor}/hljs.js +2 -2
- package/THIRD_PARTY_LICENSES.md +0 -51
- package/docs/README.md +0 -94
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
- package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
- package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
- package/docs/archive/investigations/curve-bisector-routing.md +0 -123
- package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
- package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
- package/docs/archive/investigations/dspark-handoff.md +0 -224
- package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
- package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
- package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
- package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
- package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
- package/docs/archive/investigations/lab-build-journal.md +0 -157
- package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
- package/docs/archive/investigations/openjarvis-fit.md +0 -198
- package/docs/archive/investigations/openwiki-evaluation.md +0 -249
- package/docs/archive/investigations/optimization_plan.md +0 -346
- package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
- package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
- package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
- package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
- package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
- package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
- package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
- package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
- package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
- package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
- package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
- package/docs/archive/planning/chat-ui-vision.md +0 -50
- package/docs/archive/planning/chunk-task-roadmap.md +0 -77
- package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
- package/docs/archive/planning/journal.md +0 -316
- package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
- package/docs/archive/planning/pi-integration-review.md +0 -178
- package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
- package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
- package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
- package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
- package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
- package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
- package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
- package/docs/archive/planning/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -1841
- package/docs/design/decode-speed-program.md +0 -2349
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -705
- package/docs/design/kv-cache.md +0 -824
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -1990
- package/docs/design/turboquant.md +0 -2212
- package/docs/design/unified-engine-frontier-plan.md +0 -1880
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -594
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/release-notes-v0.4.0.md +0 -45
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3613
- package/docs/reference/cli.md +0 -585
- package/docs/reference/distribution.md +0 -355
- package/docs/reference/environment.md +0 -398
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -674
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -334
- package/docs/reference/server-api.md +0 -1775
- package/docs/reference/server-config.md +0 -846
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/conformer.ts +0 -647
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/transcode.ts +0 -67
- package/src/backends/mlx/assistant-target.ts +0 -46
- package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
- package/src/backends/mlx/autoregressive.ts +0 -108
- package/src/backends/mlx/batch-group.ts +0 -1790
- package/src/backends/mlx/cache-attachment.ts +0 -67
- package/src/backends/mlx/cache-layout.ts +0 -31
- package/src/backends/mlx/checkpoint-state.ts +0 -53
- package/src/backends/mlx/continuation-persistence.ts +0 -106
- package/src/backends/mlx/continuation-request.ts +0 -43
- package/src/backends/mlx/continuation.ts +0 -77
- package/src/backends/mlx/diffusion.ts +0 -39
- package/src/backends/mlx/draft-target.ts +0 -32
- package/src/backends/mlx/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -45
- package/src/backends/mlx/full-kv-row-append.ts +0 -32
- package/src/backends/mlx/full-kv-row-donor.ts +0 -54
- package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
- package/src/backends/mlx/gateway-binding.ts +0 -130
- package/src/backends/mlx/graph.ts +0 -38
- package/src/backends/mlx/kv-codec.ts +0 -9
- package/src/backends/mlx/kv-maintenance.ts +0 -133
- package/src/backends/mlx/kv-tensor-rows.ts +0 -212
- package/src/backends/mlx/memory-client.ts +0 -189
- package/src/backends/mlx/methods.ts +0 -90
- package/src/backends/mlx/model-prompt.ts +0 -164
- package/src/backends/mlx/model-serving.ts +0 -79
- package/src/backends/mlx/prefill-cohort.ts +0 -89
- package/src/backends/mlx/prefill-rows.ts +0 -200
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -41
- package/src/backends/mlx/rollback.ts +0 -89
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -242
- package/src/backends/mlx/speculative-group.ts +0 -359
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -114
- package/src/backends/mlx/state-rows.ts +0 -104
- package/src/backends/mlx/state-views.ts +0 -46
- package/src/backends/mlx/target-layout-capability.ts +0 -35
- package/src/backends/mlx/text-engine.ts +0 -73
- package/src/backends/mlx/transitioning-kv-rows.ts +0 -165
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3168
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -60
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -259
- package/src/contracts/prefix-cache.ts +0 -23
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -45
- package/src/contracts/tsconfig.json +0 -14
- package/src/dataset/generators.ts +0 -1087
- package/src/dataset/index.ts +0 -12
- package/src/dataset/job.ts +0 -81
- package/src/dataset/llm.ts +0 -71
- package/src/dataset/registry.ts +0 -528
- package/src/diffusion/diffusion-generate.ts +0 -507
- package/src/download.ts +0 -505
- package/src/embed.ts +0 -77
- package/src/engine/admission.ts +0 -59
- package/src/engine/cancellation.ts +0 -38
- package/src/engine/engine.ts +0 -56
- package/src/engine/execution-coordinator.ts +0 -70
- package/src/engine/execution-plan.ts +0 -53
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -72
- package/src/engine/session.ts +0 -247
- package/src/eval/README.md +0 -130
- package/src/eval/ifeval.ts +0 -81
- package/src/eval/kl-prompts.ts +0 -29
- package/src/eval/kl.ts +0 -590
- package/src/eval/perplexity.ts +0 -164
- package/src/eval/quality-db.ts +0 -92
- package/src/eval/reference-logits.ts +0 -207
- package/src/eval/runner.ts +0 -124
- package/src/eval/score.ts +0 -49
- package/src/eval/tasks/bfcl.ts +0 -535
- package/src/eval/tasks/gsm8k.ts +0 -98
- package/src/eval/tasks/hashhop.ts +0 -139
- package/src/eval/tasks/humaneval.ts +0 -275
- package/src/eval/tasks/ifeval.ts +0 -525
- package/src/eval/tasks/mmlu.ts +0 -157
- package/src/eval/ultrafeedback.ts +0 -60
- package/src/evaldb.ts +0 -199
- package/src/expert-io.ts +0 -393
- package/src/expert-offload-build.ts +0 -77
- package/src/expert-offload.ts +0 -76
- package/src/expert-residency.ts +0 -1134
- package/src/expert-usage.ts +0 -415
- package/src/fill/echo-index.ts +0 -188
- package/src/fill/fill-session.ts +0 -452
- package/src/fill/proposal.ts +0 -68
- package/src/fill/schema-rows.ts +0 -506
- package/src/fill/tool-boundary.ts +0 -103
- package/src/fit.ts +0 -249
- package/src/generate.ts +0 -1346
- package/src/grammar.ts +0 -591
- package/src/harness-pi.ts +0 -184
- package/src/hf-push.ts +0 -628
- package/src/hub-rest.ts +0 -242
- package/src/index.ts +0 -63
- package/src/inference/denoising.ts +0 -17
- package/src/inference/draft-acceptance.ts +0 -41
- package/src/inference/draft-output.ts +0 -49
- package/src/inference/graph.ts +0 -33
- package/src/inference/prefill.ts +0 -39
- package/src/inference/rollback.ts +0 -7
- package/src/jobs/index.ts +0 -31
- package/src/jobs/job-entry.ts +0 -107
- package/src/jobs/task-client.ts +0 -19
- package/src/jobs/types.ts +0 -2
- package/src/kv-scheme.ts +0 -257
- package/src/kv-store.ts +0 -1099
- package/src/lab/README.md +0 -18
- package/src/lab/curve/curve-designer.html +0 -303
- package/src/lab/curve/curve-sampler.ts +0 -122
- package/src/lab/expert-trace/expert-trace.ts +0 -69
- package/src/lab/paged-kv/paged-kv-rows.ts +0 -83
- package/src/lab/paged-kv/paged-kv.ts +0 -270
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -49
- package/src/media-fetch.ts +0 -442
- package/src/memory/article.ts +0 -558
- package/src/memory/chunk-validation.ts +0 -150
- package/src/memory/chunk.ts +0 -318
- package/src/memory/cluster.ts +0 -351
- package/src/memory/coverage.ts +0 -134
- package/src/memory/crosslink.ts +0 -0
- package/src/memory/db.ts +0 -253
- package/src/memory/entity.ts +0 -203
- package/src/memory/gate.ts +0 -187
- package/src/memory/history.ts +0 -152
- package/src/memory/ingest.ts +0 -335
- package/src/memory/model.ts +0 -183
- package/src/memory/normalize.ts +0 -671
- package/src/memory/parse.ts +0 -22
- package/src/memory/pipeline.ts +0 -275
- package/src/memory/prompts.ts +0 -65
- package/src/memory/query.ts +0 -334
- package/src/memory/reconcile.ts +0 -734
- package/src/memory/redirect.ts +0 -108
- package/src/memory/reindex.ts +0 -325
- package/src/memory/resolve.ts +0 -307
- package/src/memory/rest.ts +0 -245
- package/src/memory/route.ts +0 -272
- package/src/memory/schedule.ts +0 -165
- package/src/memory/stages.ts +0 -777
- package/src/memory/synthesize.ts +0 -1638
- package/src/memory/tools.ts +0 -749
- package/src/memory/vault.ts +0 -1194
- package/src/memory/wikify.ts +0 -1064
- package/src/mlx/array.ts +0 -388
- package/src/mlx/autograd.ts +0 -304
- package/src/mlx/checkpoint.ts +0 -149
- package/src/mlx/compile.ts +0 -168
- package/src/mlx/custom-vjp.ts +0 -188
- package/src/mlx/ffi.ts +0 -512
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/ops.ts +0 -1021
- package/src/mlx/quantized-rows.ts +0 -36
- package/src/mlx/token-bitmask.ts +0 -52
- package/src/mlx/turboquant-kv-decode.ts +0 -82
- package/src/mlx/turboquant-kv-inverse.ts +0 -122
- package/src/mlx/turboquant-ops.ts +0 -861
- package/src/mlx/turboquant-tables.ts +0 -237
- package/src/mmap.ts +0 -90
- package/src/model/artifact-identity.ts +0 -73
- package/src/model/batched-kv.ts +0 -235
- package/src/model/batched-mask.ts +0 -279
- package/src/model/batched-quant.ts +0 -212
- package/src/model/batched-quantized-kv.ts +0 -144
- package/src/model/batched-rotating-quant.ts +0 -353
- package/src/model/batched-rotating-state.ts +0 -149
- package/src/model/batched-rotating.ts +0 -338
- package/src/model/batched-row-storage.ts +0 -179
- package/src/model/batched-ssm.ts +0 -52
- package/src/model/batched-turboquant-kv.ts +0 -93
- package/src/model/compiled-decode.ts +0 -712
- package/src/model/decoded-kv-donor.ts +0 -12
- package/src/model/delayed-quantized-kv.ts +0 -72
- package/src/model/delayed-rotating-quantized-kv.ts +0 -93
- package/src/model/delayed-turboquant-kv.ts +0 -55
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -189
- package/src/model/fingerprint.ts +0 -33
- package/src/model/flash-attention.ts +0 -694
- package/src/model/full-prefill-padding.ts +0 -56
- package/src/model/full-prefill-row.ts +0 -105
- package/src/model/gemma4-base.ts +0 -2351
- package/src/model/gemma4.ts +0 -1315
- package/src/model/generated/gemma4-12b.ts +0 -429
- package/src/model/generated/gemma4-26b.ts +0 -448
- package/src/model/generated/gemma4-e4b.ts +0 -717
- package/src/model/generated/index.ts +0 -18
- package/src/model/glm52-atlas.ts +0 -511
- package/src/model/glm52-cache.ts +0 -792
- package/src/model/glm52-config.ts +0 -262
- package/src/model/glm52-container.ts +0 -305
- package/src/model/glm52-coupling.ts +0 -388
- package/src/model/glm52-dsa.ts +0 -606
- package/src/model/glm52-expert-layout.ts +0 -253
- package/src/model/glm52-layout.ts +0 -152
- package/src/model/glm52-memory.ts +0 -500
- package/src/model/glm52-mla.ts +0 -792
- package/src/model/glm52-moe.ts +0 -223
- package/src/model/glm52-pilot.ts +0 -537
- package/src/model/glm52-reference.ts +0 -445
- package/src/model/glm52-residency.ts +0 -557
- package/src/model/glm52-resident-weights.ts +0 -135
- package/src/model/glm52-streamed-experts.ts +0 -453
- package/src/model/glm52-streamed-metal.ts +0 -610
- package/src/model/glm52-weights.ts +0 -503
- package/src/model/glm52.ts +0 -1132
- package/src/model/implementation.ts +0 -69
- package/src/model/kv-attention-view.ts +0 -67
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -443
- package/src/model/qwen-append.ts +0 -12
- package/src/model/qwen-conv.ts +0 -52
- package/src/model/qwen3-delta-state.ts +0 -74
- package/src/model/qwen3-delta.ts +0 -451
- package/src/model/qwen3-moe.ts +0 -404
- package/src/model/qwen3-mrope.ts +0 -252
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -819
- package/src/model/rotating-kv-donor.ts +0 -35
- package/src/model/rotating-kv-layout.ts +0 -262
- package/src/model/rotating-row-transaction.ts +0 -35
- package/src/model/speculative-rotating-kv.ts +0 -101
- package/src/model/ssm-prefill-padding.ts +0 -39
- package/src/model/support.ts +0 -102
- package/src/model/trellis-balanced-scatter.ts +0 -51
- package/src/model/trellis-linear.ts +0 -672
- package/src/model/trellis-shared-m.ts +0 -151
- package/src/model/trellis-shared-scatter.ts +0 -144
- package/src/model/trellis-splitk-prefill.ts +0 -158
- package/src/model/trellis-tiled-prefill.ts +0 -136
- package/src/model/trellis-vector-expand.ts +0 -62
- package/src/model/trellis-wide-prefill.ts +0 -94
- package/src/model/turboquant-codec.ts +0 -83
- package/src/model/universal/archs.ts +0 -332
- package/src/model/universal/dense.ts +0 -612
- package/src/model/universal/modules.ts +0 -170
- package/src/model/universal/rope.ts +0 -381
- package/src/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native-pack.ts +0 -162
- package/src/pi-provider.ts +0 -53
- package/src/pi-session.ts +0 -81
- package/src/pi-terminal.ts +0 -274
- package/src/pi-web.ts +0 -1932
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -460
- package/src/quantize/allocator.ts +0 -627
- package/src/quantize/atomic-output.ts +0 -38
- package/src/quantize/calibration.ts +0 -181
- package/src/quantize/config-writer.ts +0 -145
- package/src/quantize/index.ts +0 -84
- package/src/quantize/job.ts +0 -162
- package/src/quantize/quantizer.ts +0 -666
- package/src/quantize/rotate.ts +0 -603
- package/src/quantize/safetensors-writer.ts +0 -249
- package/src/quantize/sensitivity.ts +0 -216
- package/src/quantize/trellis.ts +0 -586
- package/src/quantize/weight-transform.ts +0 -292
- package/src/registry.ts +0 -602
- package/src/runtime-config.ts +0 -81
- package/src/safetensors.ts +0 -158
- package/src/sampler.ts +0 -1011
- package/src/serve/admin-routes.ts +0 -184
- package/src/serve/assets/curve-terrain.html +0 -105
- package/src/serve/assets/training-inference-map.html +0 -575
- package/src/serve/aux-routes.ts +0 -132
- package/src/serve/batch-scheduler.ts +0 -8
- package/src/serve/checkpoint-identity.ts +0 -64
- package/src/serve/generation-gateway.ts +0 -496
- package/src/serve/isolate.ts +0 -609
- package/src/serve/kv-budget.ts +0 -14
- package/src/serve/lab-routes.ts +0 -341
- package/src/serve/lane-registry.ts +0 -45
- package/src/serve/model-admin-routes.ts +0 -155
- package/src/serve/model-binding.ts +0 -43
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -147
- package/src/serve/response-lease.ts +0 -24
- package/src/serve/session-search.ts +0 -326
- package/src/serve/static-routes.ts +0 -101
- package/src/server.ts +0 -1314
- package/src/spec/assistant-rows.ts +0 -92
- package/src/spec/assistant-source.ts +0 -126
- package/src/spec/cache-identity.ts +0 -22
- package/src/spec/deepspec-rows.ts +0 -29
- package/src/spec/deepspec-source.ts +0 -145
- package/src/spec/dflash-source.ts +0 -149
- package/src/spec/drafter.ts +0 -304
- package/src/spec/dspark/ab-stats.ts +0 -136
- package/src/spec/dspark/calibration.ts +0 -112
- package/src/spec/dspark/data-dflash.ts +0 -156
- package/src/spec/dspark/data.ts +0 -201
- package/src/spec/dspark/deepspec-module.ts +0 -776
- package/src/spec/dspark/generate-dflash.ts +0 -245
- package/src/spec/dspark/generate.ts +0 -290
- package/src/spec/dspark/loader.ts +0 -23
- package/src/spec/dspark/loss.ts +0 -213
- package/src/spec/dspark/module-dflash.ts +0 -560
- package/src/spec/dspark/module.ts +0 -540
- package/src/spec/dspark/quantize-drafter.ts +0 -91
- package/src/spec/dspark/sample.ts +0 -112
- package/src/spec/generate.ts +0 -276
- package/src/spec/glm52-mtp-graph.ts +0 -29
- package/src/spec/glm52-mtp-rows.ts +0 -132
- package/src/spec/glm52-mtp-source.ts +0 -317
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -204
- package/src/spec/projected-draft-rows.ts +0 -73
- package/src/spec/qwen-mtp-module.ts +0 -171
- package/src/spec/qwen-mtp-rows.ts +0 -219
- package/src/spec/qwen-mtp-source.ts +0 -383
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -585
- package/src/spec/source.ts +0 -215
- package/src/spec/two-model-rows.ts +0 -61
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -372
- package/src/ssd-durability.ts +0 -211
- package/src/tokenizer.ts +0 -335
- package/src/tool-approvals.ts +0 -131
- package/src/tool-call.ts +0 -695
- package/src/train/dataset.ts +0 -484
- package/src/train/diffusion-lora.ts +0 -216
- package/src/train/export.ts +0 -32
- package/src/train/flash-cce.ts +0 -1234
- package/src/train/forward.ts +0 -266
- package/src/train/fuse.ts +0 -243
- package/src/train/index.ts +0 -46
- package/src/train/job.ts +0 -205
- package/src/train/lora-params.ts +0 -254
- package/src/train/loss.ts +0 -1591
- package/src/train/merge.ts +0 -195
- package/src/train/optimizer.ts +0 -183
- package/src/train/prefix-shared.ts +0 -490
- package/src/train/rank.ts +0 -137
- package/src/train/segmented.ts +0 -1828
- package/src/train/steel-qmm-header.ts +0 -1461
- package/src/train/trainer.ts +0 -1221
- package/src/train/watch.ts +0 -542
- package/src/vision/diffusion-vision.ts +0 -620
- package/src/vision/embedder.ts +0 -168
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -373
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -196
- package/src/vision/qwen3vl-tower.ts +0 -555
- package/src/vision/siglip.ts +0 -599
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2143
- package/src/web/app.js +0 -5703
- package/src/web/skills/memory/SKILL.md +0 -120
- package/src/web/skills/web-research/SKILL.md +0 -46
- package/src/web/skills.ts +0 -97
- package/src/web/src/adapters-panel.ts +0 -288
- package/src/web/src/assistant.ts +0 -451
- package/src/web/src/chat.ts +0 -1057
- package/src/web/src/composer.ts +0 -959
- package/src/web/src/dataset.ts +0 -132
- package/src/web/src/finetune.ts +0 -267
- package/src/web/src/hub.ts +0 -428
- package/src/web/src/main.ts +0 -98
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +0 -572
- package/src/web/src/model-picker.ts +0 -159
- package/src/web/src/palette.ts +0 -346
- package/src/web/src/protocol.ts +0 -26
- package/src/web/src/quantize.ts +0 -167
- package/src/web/src/rag.ts +0 -274
- package/src/web/src/sessions.ts +0 -469
- package/src/web/src/shell.ts +0 -804
- package/src/web/src/ui-catalog.ts +0 -78
- package/src/web/vendor/README.md +0 -61
- package/src/web-assets.ts +0 -47
- package/src/web-tools.ts +0 -478
- package/src/weights.ts +0 -255
- /package/src/{serve → server}/completion-sink.ts +0 -0
- /package/src/web/{icon.svg → public/icon.svg} +0 -0
- /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
- /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`).
|