mlx-bun 0.0.13 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -578
- package/bin/mlx-bun.mjs +1 -1
- package/docs/README.md +91 -0
- package/docs/{design → archive}/hlg-sampling.md +3 -3
- package/docs/{design → archive/investigations}/audio-input-plan.md +4 -4
- package/docs/{design → archive/investigations}/colibri-glm52-port.md +1 -1
- package/docs/{design → archive/investigations}/diffusion-gemma-port.md +3 -3
- package/docs/{design → archive/investigations}/faithful-l1-consolidation.md +4 -4
- package/docs/{investigations → archive/investigations}/hlg-sampling-investigation.md +1 -1
- package/docs/{design → archive/investigations}/minicpm5-decode-megakernel.md +11 -11
- package/docs/{design → archive/investigations}/optimization_plan.md +1 -1
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +92 -0
- package/docs/{design → archive/investigations}/pre-colibri-stabilization.md +5 -5
- package/docs/{design → archive/investigations}/the-dreaming-handoff.md +2 -2
- package/docs/{planning → archive/planning}/chat-ui-vision.md +1 -1
- package/docs/{planning → archive/planning}/chunk-task-roadmap.md +1 -1
- package/docs/{planning → archive/planning}/curve-sampler-research-plan.md +4 -4
- package/docs/{planning → archive/planning}/memory-docs-and-dag-plan.md +1 -1
- package/docs/{planning → archive/planning}/release-notes-v0.0.9.md +1 -1
- package/docs/archive/planning/release-notes-v0.2.0.md +49 -0
- package/docs/{planning → archive/planning}/website-readme-pass-plan.md +1 -1
- package/docs/design/batching.md +569 -0
- package/docs/design/decode-speed-program.md +3178 -169
- package/docs/design/dreaming-nightly-pipeline.md +675 -282
- package/docs/design/generic-model-support.md +579 -334
- package/docs/design/kv-cache.md +680 -0
- package/docs/design/orpo-training.md +673 -1239
- package/docs/design/speculative-decoding.md +1627 -0
- package/docs/design/turboquant.md +2102 -0
- package/docs/design/unified-engine-frontier-plan.md +1831 -727
- package/docs/design/web-chat-redesign.md +666 -1083
- package/docs/planning/PRODUCT_ROADMAP.md +34 -1
- package/docs/planning/release-notes-v0.3.0.md +35 -0
- package/docs/planning/video-series.md +421 -0
- package/docs/reference/benchmarks.md +1162 -0
- package/docs/reference/cli.md +395 -149
- package/docs/reference/distribution.md +321 -181
- package/docs/reference/environment.md +348 -0
- package/docs/reference/glossary.md +39 -0
- package/docs/reference/library-api.md +580 -142
- package/docs/reference/memory.md +227 -64
- package/docs/reference/models.md +137 -6
- package/docs/reference/server-api.md +938 -422
- package/docs/reference/server-config.md +652 -320
- package/docs/reference/training.md +393 -254
- package/docs/reference/troubleshooting.md +166 -0
- package/package.json +10 -5
- package/src/admission-plan.ts +18 -0
- package/src/anthropic.ts +92 -3
- package/src/audio/decode.ts +2 -2
- package/src/audio/features.ts +2 -2
- package/src/backends/mlx/autoregressive.ts +108 -0
- package/src/backends/mlx/batch-group.ts +1646 -0
- package/src/backends/mlx/diffusion.ts +39 -0
- package/src/backends/mlx/draft-target.ts +47 -0
- package/src/backends/mlx/evaluation.ts +105 -0
- package/src/backends/mlx/fill-append.ts +45 -0
- package/src/backends/mlx/gateway-binding.ts +71 -0
- package/src/backends/mlx/graph.ts +38 -0
- package/src/backends/mlx/memory-client.ts +189 -0
- package/src/backends/mlx/memory-guard.ts +40 -0
- package/src/backends/mlx/methods.ts +90 -0
- package/src/backends/mlx/model-prompt.ts +164 -0
- package/src/backends/mlx/model-serving.ts +79 -0
- package/src/backends/mlx/prefill.ts +33 -0
- package/src/backends/mlx/request-policy.ts +20 -0
- package/src/backends/mlx/rollback.ts +51 -0
- package/src/backends/mlx/serial-executor.ts +273 -0
- package/src/backends/mlx/speculative.ts +114 -0
- package/src/backends/mlx/state-views.ts +26 -0
- package/src/backends/mlx/text-engine.ts +73 -0
- package/src/cli.ts +189 -61
- package/src/client.ts +66 -0
- package/src/config.ts +21 -4
- package/src/contracts/completion.ts +16 -0
- package/src/contracts/execution.ts +49 -0
- package/src/contracts/generation.ts +103 -0
- package/src/contracts/host.ts +7 -0
- package/src/contracts/jobs.ts +66 -0
- package/src/contracts/pi-provider.ts +30 -0
- package/src/contracts/pi.ts +259 -0
- package/src/contracts/resources.ts +18 -0
- package/src/contracts/scheduling.ts +27 -0
- package/src/contracts/tsconfig.json +14 -0
- package/src/diffusion/diffusion-generate.ts +218 -153
- package/src/embed.ts +1 -1
- package/src/engine/admission.ts +59 -0
- package/src/engine/cancellation.ts +38 -0
- package/src/engine/engine.ts +56 -0
- package/src/engine/execution-coordinator.ts +70 -0
- package/src/engine/execution-plan.ts +51 -0
- package/src/engine/resources.ts +42 -0
- package/src/engine/scheduler.ts +67 -0
- package/src/engine/session.ts +247 -0
- package/src/eval/README.md +44 -1
- package/src/eval/kl.ts +263 -23
- package/src/eval/reference-logits.ts +207 -0
- package/src/eval/runner.ts +10 -79
- package/src/eval/tasks/bfcl.ts +2 -1
- package/src/eval/tasks/gsm8k.ts +2 -1
- package/src/eval/tasks/hashhop.ts +2 -1
- package/src/eval/tasks/humaneval.ts +5 -4
- package/src/eval/tasks/ifeval.ts +2 -1
- package/src/eval/tasks/mmlu.ts +2 -1
- package/src/expert-io.ts +3 -1
- package/src/expert-offload.ts +3 -1
- package/src/fill/echo-index.ts +188 -0
- package/src/fill/fill-session.ts +452 -0
- package/src/fill/proposal.ts +68 -0
- package/src/fill/schema-rows.ts +506 -0
- package/src/fill/tool-boundary.ts +103 -0
- package/src/fit.ts +24 -43
- package/src/generate.ts +740 -337
- package/src/grammar.ts +14 -8
- package/src/harness-pi.ts +15 -34
- package/src/hub-rest.ts +4 -4
- package/src/index.ts +27 -0
- package/src/inference/denoising.ts +17 -0
- package/src/inference/graph.ts +33 -0
- package/src/inference/prefill.ts +39 -0
- package/src/inference/rollback.ts +7 -0
- package/src/jobs/db.ts +4 -0
- package/src/jobs/index.ts +2 -0
- package/src/jobs/job-entry.ts +15 -14
- package/src/jobs/runner.ts +98 -13
- package/src/jobs/task-client.ts +19 -0
- package/src/jobs/types.ts +2 -58
- package/src/kv-scheme.ts +199 -0
- package/src/kv-store.ts +459 -234
- package/src/lab/README.md +18 -0
- package/src/{assets → lab/curve}/curve-designer.html +2 -2
- package/src/{curve-sampler.ts → lab/curve/curve-sampler.ts} +2 -2
- package/src/{expert-trace.ts → lab/expert-trace/expert-trace.ts} +7 -5
- package/src/{model → lab/paged-kv}/paged-kv.ts +9 -6
- package/src/library.ts +40 -0
- package/src/lora.ts +18 -0
- package/src/media-fetch.ts +20 -4
- package/src/memory/article.ts +1 -1
- package/src/memory/chunk.ts +1 -1
- package/src/memory/model.ts +32 -170
- package/src/memory/prompts.ts +1 -1
- package/src/memory/rest.ts +1 -1
- package/src/memory/schedule.ts +1 -1
- package/src/memory/stages.ts +4 -1
- package/src/memory/vault.ts +3 -4
- package/src/mlx/array.ts +9 -10
- package/src/mlx/compile.ts +12 -2
- package/src/mlx/ffi.ts +66 -22
- package/src/mlx/materialize.ts +23 -0
- package/src/mlx/metal-kernel.ts +10 -11
- package/src/mlx/ops.ts +64 -19
- package/src/mlx/quantized-rows.ts +36 -0
- package/src/mlx/token-bitmask.ts +52 -0
- package/src/mlx/turboquant-kv-decode.ts +82 -0
- package/src/mlx/turboquant-kv-inverse.ts +122 -0
- package/src/mlx/turboquant-ops.ts +33 -3
- package/src/mlx/turboquant-tables.ts +2 -2
- package/src/model/batched-mask.ts +9 -3
- package/src/model/batched-quant.ts +2 -2
- package/src/model/batched-rotating-quant.ts +45 -99
- package/src/model/batched-rotating-state.ts +73 -0
- package/src/model/batched-rotating.ts +57 -106
- package/src/model/batched-row-storage.ts +127 -0
- package/src/model/compiled-decode.ts +4 -3
- package/src/model/diffusion-gemma.ts +8 -8
- package/src/model/factory.ts +87 -49
- package/src/model/fingerprint.ts +1 -1
- package/src/model/flash-attention.ts +3 -3
- package/src/model/gemma4-base.ts +187 -17
- package/src/model/gemma4.ts +6 -6
- package/src/model/generated/gemma4-12b.ts +52 -148
- package/src/model/generated/gemma4-26b.ts +34 -94
- package/src/model/generated/gemma4-e4b.ts +28 -76
- package/src/model/glm52-cache.ts +19 -9
- package/src/model/glm52-dsa.ts +13 -9
- package/src/model/glm52-memory.ts +28 -1
- package/src/model/implementation.ts +69 -0
- package/src/model/minicpm5.ts +7 -8
- package/src/model/profile.ts +443 -0
- package/src/model/qwen-append.ts +12 -0
- package/src/model/qwen-conv.ts +52 -0
- package/src/model/qwen3-delta.ts +98 -2
- package/src/model/qwen3-mrope.ts +252 -0
- package/src/model/qwen3_5-checkpoint.ts +164 -0
- package/src/model/qwen3_5.ts +336 -60
- package/src/model/support.ts +1 -1
- package/src/model/trellis-balanced-scatter.ts +51 -0
- package/src/model/trellis-linear.ts +672 -0
- package/src/model/trellis-shared-m.ts +151 -0
- package/src/model/trellis-shared-scatter.ts +144 -0
- package/src/model/trellis-splitk-prefill.ts +158 -0
- package/src/model/trellis-tiled-prefill.ts +136 -0
- package/src/model/trellis-vector-expand.ts +62 -0
- package/src/model/trellis-wide-prefill.ts +94 -0
- package/src/model/universal/dense.ts +1 -1
- package/src/model/universal/modules.ts +8 -1
- package/src/native/frame_extract.swift +140 -0
- package/src/native-pack.ts +15 -7
- package/src/pi-provider.ts +6 -64
- package/src/pi-web.ts +14 -320
- package/src/prompt-cache.ts +97 -54
- package/src/quantize/allocator.ts +1 -1
- package/src/quantize/atomic-output.ts +38 -0
- package/src/quantize/calibration.ts +2 -1
- package/src/quantize/config-writer.ts +16 -3
- package/src/quantize/index.ts +28 -1
- package/src/quantize/job.ts +11 -0
- package/src/quantize/quantizer.ts +265 -100
- package/src/quantize/rotate.ts +603 -0
- package/src/quantize/safetensors-writer.ts +79 -1
- package/src/quantize/sensitivity.ts +41 -59
- package/src/quantize/trellis.ts +586 -0
- package/src/quantize/weight-transform.ts +292 -0
- package/src/responses.ts +130 -3
- package/src/runtime-config.ts +81 -0
- package/src/sampler.ts +276 -4
- package/src/serve/admin-routes.ts +184 -0
- package/src/serve/aux-routes.ts +132 -0
- package/src/serve/batch-scheduler.ts +8 -1558
- package/src/serve/chat-request.ts +391 -0
- package/src/serve/chat-stage.ts +195 -0
- package/src/serve/checkpoint-identity.ts +64 -0
- package/src/serve/completion-executor.ts +354 -0
- package/src/serve/completion-sink.ts +157 -0
- package/src/serve/discovery-routes.ts +204 -0
- package/src/serve/generation-gateway.ts +211 -243
- package/src/serve/http.ts +159 -0
- package/src/serve/inference-request.ts +79 -0
- package/src/serve/isolate.ts +297 -105
- package/src/serve/kv-budget.ts +14 -0
- package/src/serve/lab-routes.ts +341 -0
- package/src/serve/lane-registry.ts +2 -1
- package/src/serve/model-admin-routes.ts +155 -0
- package/src/serve/model-binding.ts +43 -0
- package/src/serve/model-host.ts +512 -0
- package/src/serve/openai-wire.ts +103 -0
- package/src/serve/parent-application.ts +56 -0
- package/src/serve/pipeline.ts +33 -0
- package/src/serve/preparation.ts +33 -0
- package/src/serve/prompt-response-trace.ts +147 -0
- package/src/serve/request-plan.ts +162 -0
- package/src/serve/request-prep.ts +346 -0
- package/src/serve/response-lease.ts +24 -0
- package/src/serve/responses-client.ts +69 -0
- package/src/serve/session-completion-engine.ts +110 -0
- package/src/serve/session-search.ts +1 -1
- package/src/serve/static-routes.ts +101 -0
- package/src/serve/text-completion-stage.ts +104 -0
- package/src/serve/token-streams.ts +519 -0
- package/src/server.ts +523 -3551
- package/src/spec/assistant-source.ts +10 -44
- package/src/spec/deepspec-source.ts +6 -6
- package/src/spec/dflash-source.ts +9 -8
- package/src/spec/dspark/ab-stats.ts +3 -3
- package/src/spec/dspark/calibration.ts +2 -2
- package/src/spec/dspark/deepspec-module.ts +2 -2
- package/src/spec/dspark/generate-dflash.ts +2 -2
- package/src/spec/dspark/generate.ts +2 -2
- package/src/spec/dspark/loader.ts +1 -1
- package/src/spec/dspark/module-dflash.ts +5 -4
- package/src/spec/dspark/module.ts +3 -3
- package/src/spec/dspark/quantize-drafter.ts +1 -1
- package/src/spec/generate.ts +1 -1
- package/src/spec/glm52-mtp-source.ts +9 -1
- package/src/spec/ngram-source.ts +1 -1
- package/src/spec/prefix-state.ts +45 -0
- package/src/spec/qwen-mtp-source.ts +528 -0
- package/src/spec/serve-loop.ts +179 -213
- package/src/spec/source.ts +42 -10
- package/src/spec/two-model.ts +1 -1
- package/src/ssd-cache.ts +95 -24
- package/src/ssd-durability.ts +207 -0
- package/src/tool-call.ts +51 -14
- package/src/train/flash-cce.ts +14 -13
- package/src/train/forward.ts +38 -1
- package/src/train/loss.ts +3 -2
- package/src/train/prefix-shared.ts +5 -1
- package/src/train/segmented.ts +9 -6
- package/src/train/trainer.ts +9 -8
- package/src/vision/preprocess.ts +1 -1
- package/src/vision/prompt.ts +48 -2
- package/src/vision/qwen3vl-preprocess.ts +409 -0
- package/src/vision/qwen3vl-prompt.ts +196 -0
- package/src/vision/qwen3vl-tower.ts +555 -0
- package/src/vision/video-frames.ts +148 -0
- package/src/web/app.html +1 -1
- package/src/web/app.js +15 -6
- package/src/web/src/adapters-panel.ts +3 -3
- package/src/web/src/assistant.ts +2 -36
- package/src/web/src/chat.ts +16 -9
- package/src/web/src/composer.ts +4 -4
- package/src/web/src/hub.ts +1 -1
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +1 -1
- package/src/web/src/model-picker.ts +1 -1
- package/src/web/src/palette.ts +1 -1
- package/src/web/src/protocol.ts +3 -39
- package/src/web/src/sessions.ts +1 -1
- package/src/web/src/ui-catalog.ts +4 -18
- package/src/web-assets.ts +47 -0
- package/src/weights.ts +134 -33
- package/docs/archive/mlx-bun-lab-report.html +0 -275
- package/docs/archive/wwdc-mlx-bun.html +0 -848
- package/docs/design/adapters-end-to-end.md +0 -205
- package/docs/design/batching-perf-path.md +0 -255
- package/docs/design/batching-v2-plan.md +0 -529
- package/docs/design/bucketing-stage.md +0 -197
- package/docs/design/compat-cli-surface-design.md +0 -230
- package/docs/design/docs-reorg-plan.md +0 -165
- package/docs/design/dspark-serving-program.md +0 -371
- package/docs/design/dspark-speculative-decoding.md +0 -268
- package/docs/design/grammar-spec-batching-integration.md +0 -301
- package/docs/design/memory-inference-path.md +0 -422
- package/docs/design/memory-synthesis.md +0 -287
- package/docs/design/memory-system.md +0 -237
- package/docs/design/mlx-lm-tool-parity-plan.md +0 -545
- package/docs/design/omlx-adoption-map.md +0 -98
- package/docs/design/orpo-dynamic-lambda.md +0 -220
- package/docs/design/orpo-future-enhancements.md +0 -340
- package/docs/design/paged-kv-cache.md +0 -214
- package/docs/design/parallel-slots.md +0 -567
- package/docs/design/parity-tier-dag.md +0 -161
- package/docs/design/repo-cleanup-plan.md +0 -189
- package/docs/design/runtime-isolation.md +0 -263
- package/docs/design/segmented-backward-training.md +0 -543
- package/docs/design/spec-decode-larger-targets.md +0 -229
- package/docs/design/ssd-kv-cold-tier.md +0 -288
- package/docs/design/structured-output.md +0 -484
- package/docs/design/tauri-desktop-app.md +0 -127
- package/docs/design/the-dreaming-master-plan.md +0 -445
- package/docs/design/turboquant-kv.md +0 -235
- package/docs/design/w4a16-compute-precision-spike.md +0 -232
- package/docs/design/web-chat-beat-matrix.md +0 -315
- package/docs/design/write-pipeline-entity.md +0 -468
- package/docs/investigations/curve-runs/bisector-route.json +0 -98
- package/docs/investigations/curve-runs/bisector-trace.json +0 -1393
- package/docs/investigations/curve-runs/curve-terrain.json +0 -1179
- package/docs/investigations/curve-runs/curve-terrain.svg +0 -42
- package/docs/investigations/hlg-ab.html +0 -34
- package/docs/investigations/hlg-explorer.html +0 -238
- package/docs/investigations/hlg-figs/cliff.svg +0 -1
- package/docs/investigations/hlg-figs/cross.svg +0 -1
- package/docs/investigations/hlg-figs/edges.svg +0 -1
- package/docs/investigations/hlg-figs/k20-grids.svg +0 -1
- package/docs/investigations/hlg-figs/k20-peaks.svg +0 -1
- package/docs/investigations/hlg-figs/lw-curve.svg +0 -1
- package/docs/investigations/hlg-figs/terrain.svg +0 -1
- package/docs/investigations/hlg-report.html +0 -262
- package/docs/investigations/hlg-runs/hlg-ab.json +0 -149
- package/docs/investigations/hlg-runs/hlg-blind-prompts.md +0 -87
- package/docs/investigations/hlg-runs/hlg-blind.json +0 -107
- package/docs/investigations/hlg-runs/hlg-cliff.json +0 -197
- package/docs/investigations/hlg-runs/hlg-cross.json +0 -505
- package/docs/investigations/hlg-runs/hlg-edge.json +0 -388
- package/docs/investigations/hlg-runs/hlg-eval1.json +0 -25
- package/docs/investigations/hlg-runs/hlg-frontier.json +0 -86
- package/docs/investigations/hlg-runs/hlg-grid.json +0 -242
- package/docs/investigations/hlg-runs/hlg-grid2.json +0 -343
- package/docs/investigations/hlg-runs/hlg-lw-coarse.json +0 -110
- package/docs/investigations/hlg-runs/hlg-map.json +0 -383
- package/docs/investigations/hlg-runs/run0-original.log +0 -159
- package/docs/investigations/hlg-runs/runA-recommended.log +0 -131
- package/docs/investigations/hlg-runs/runAA-cliff-cpm5.log +0 -26
- package/docs/investigations/hlg-runs/runAB-grid2-e4b.log +0 -18
- package/docs/investigations/hlg-runs/runAC-peak-e4b-partial.log +0 -25
- package/docs/investigations/hlg-runs/runAD-ab-samples.log +0 -8
- package/docs/investigations/hlg-runs/runAE-edge-e4b.log +0 -51
- package/docs/investigations/hlg-runs/runAF-logit-calibration.log +0 -10
- package/docs/investigations/hlg-runs/runAG-eval-config2.log +0 -16
- package/docs/investigations/hlg-runs/runB-gain-variants.log +0 -192
- package/docs/investigations/hlg-runs/runC-pivots.log +0 -162
- package/docs/investigations/hlg-runs/runD-oetf.log +0 -132
- package/docs/investigations/hlg-runs/runE-eotf.log +0 -162
- package/docs/investigations/hlg-runs/runF-shaper-working.log +0 -86
- package/docs/investigations/hlg-runs/runG-shaper-sweep.log +0 -101
- package/docs/investigations/hlg-runs/runH-wsweep.log +0 -176
- package/docs/investigations/hlg-runs/runI-asweep.log +0 -176
- package/docs/investigations/hlg-runs/runJ-knobmap.log +0 -49
- package/docs/investigations/hlg-runs/runK-frontier.log +0 -19
- package/docs/investigations/hlg-runs/runL-widemap.log +0 -65
- package/docs/investigations/hlg-runs/runM-frontier-emb.log +0 -15
- package/docs/investigations/hlg-runs/runN-verify.log +0 -116
- package/docs/investigations/hlg-runs/runO-frontier-seed5000.log +0 -15
- package/docs/investigations/hlg-runs/runP-grid-AxSm.log +0 -15
- package/docs/investigations/hlg-runs/runQ-grid-tgW.log +0 -15
- package/docs/investigations/hlg-runs/runR-blind-transcript.log +0 -79
- package/docs/investigations/hlg-runs/runS-cross-coherence.log +0 -33
- package/docs/investigations/hlg-runs/runT-cross-cpm5.log +0 -33
- package/docs/investigations/hlg-runs/runU-cross-12b.log +0 -33
- package/docs/investigations/hlg-runs/runV-lw-e4b.log +0 -22
- package/docs/investigations/hlg-runs/runW-lw-12b.log +0 -22
- package/docs/investigations/hlg-runs/runX-lw-cpm5.log +0 -22
- package/docs/investigations/hlg-runs/runY-cliff-e4b.log +0 -26
- package/docs/investigations/hlg-runs/runZ-cliff-12b.log +0 -26
- package/docs/planning/IDEAS.md +0 -69
- package/docs/reference/embedding.md +0 -197
- package/docs/reference/features-matrix.md +0 -100
- package/docs/reference/orpo-quickstart.md +0 -135
- package/src/flags.ts +0 -13
- /package/docs/{investigations → archive/investigations}/chunk-finetune-experiment.md +0 -0
- /package/docs/{investigations → archive/investigations}/colibri-oracle-pin.md +0 -0
- /package/docs/{investigations → archive/investigations}/curve-bisector-routing.md +0 -0
- /package/docs/{investigations → archive/investigations}/decode-roofline-lookagain.md +0 -0
- /package/docs/{investigations → archive/investigations}/dspark-handoff.md +0 -0
- /package/docs/{investigations → archive/investigations}/expert-offload-single-user-moe.md +0 -0
- /package/docs/{investigations → archive/investigations}/indexshare-performance-spike.md +0 -0
- /package/docs/{investigations → archive/investigations}/kernel-perf-review-2026-07.md +0 -0
- /package/docs/{investigations → archive/investigations}/lab-build-journal.md +0 -0
- /package/docs/{investigations → archive/investigations}/openwiki-evaluation.md +0 -0
- /package/docs/{investigations → archive/investigations}/orpo-base-uf-experiment-and-directions.md +0 -0
- /package/docs/{investigations → archive/investigations}/orpo-flash-cce-pin-leak.md +0 -0
- /package/docs/{investigations → archive/investigations}/orpo-uf-testing-handoff.md +0 -0
- /package/docs/{investigations → archive/investigations}/pi-builtin-investigation.md +0 -0
- /package/docs/{investigations → archive/investigations}/segmented-backward-handoff.md +0 -0
- /package/docs/{investigations → archive/investigations}/starter-model-port-handoff.md +0 -0
- /package/docs/{investigations → archive/investigations}/steel-flash-cce-handoff.md +0 -0
- /package/docs/{investigations → archive/investigations}/trainer-validation-experiment.md +0 -0
- /package/docs/{planning → archive/planning}/chat-ui-vision-memory-first.md +0 -0
- /package/docs/{planning → archive/planning}/journal.md +0 -0
- /package/docs/{planning → archive/planning}/pi-integration-review.md +0 -0
- /package/docs/{planning → archive/planning}/release-notes-v0.0.10.md +0 -0
- /package/docs/{planning → archive/planning}/release-notes-v0.0.11.md +0 -0
- /package/docs/{planning → archive/planning}/release-notes-v0.0.12.md +0 -0
- /package/docs/{planning → archive/planning}/release-notes-v0.0.13.md +0 -0
- /package/docs/{planning → archive/planning}/web-ui-pass-plan.md +0 -0
- /package/{docs/investigations → src/serve/assets}/curve-terrain.html +0 -0
- /package/{docs/dag → src/serve/assets}/training-inference-map.html +0 -0
|
@@ -1,301 +0,0 @@
|
|
|
1
|
-
# Grammar × spec decode × batching — integration plan + feature-matrix benchmark
|
|
2
|
-
|
|
3
|
-
Status: **ALL PHASES EXECUTED** (A/B/C/E 2026-07-03; D completed
|
|
4
|
-
2026-07-04: KV-budget admission + vectorized homogeneous sampling +
|
|
5
|
-
extend-join, each oracle/A-B gated — see the execution log). Remaining
|
|
6
|
-
follow-ups live in "Later / parked" with their triggers.
|
|
7
|
-
Execution log at the bottom of this doc. Successor plan tying together
|
|
8
|
-
three workstreams so they compose deliberately instead of colliding:
|
|
9
|
-
|
|
10
|
-
- **Structured output** — SHIPPED on main (serial + batched lanes;
|
|
11
|
-
docs/design/structured-output.md). Open debt: B2 model-gated batch
|
|
12
|
-
tests + bench, F4 compiler cache, F5 regex, F6 escaping, F7 structural
|
|
13
|
-
tags, U1/U2 engine upgrades.
|
|
14
|
-
- **Batching perf path** — P5 done; P0–P4 open
|
|
15
|
-
(docs/design/batching-perf-path.md).
|
|
16
|
-
- **Speculative decoding** — research proven (assistant drafter bit-exact
|
|
17
|
-
vs optiq, 12B γ=1 ≈ 1.09× win, docs/design/spec-decode-larger-targets.md;
|
|
18
|
-
DSpark architecture verified, docs/investigations/dspark-handoff.md) but
|
|
19
|
-
**not served**: no `--draft-model`. Build plan already written:
|
|
20
|
-
docs/design/mlx-lm-tool-parity-plan.md §7 (the `DraftSource` interface,
|
|
21
|
-
two-model L1 source, serve loop, admission, prompt-cache composition).
|
|
22
|
-
|
|
23
|
-
This doc does NOT restate those plans — it sequences them, defines the
|
|
24
|
-
composition rules where they meet, and specifies the benchmark that
|
|
25
|
-
measures every combination. The per-feature designs stay canonical in
|
|
26
|
-
their own docs.
|
|
27
|
-
|
|
28
|
-
## The composition matrix (v1 target state)
|
|
29
|
-
|
|
30
|
-
`GenerationGateway.willBatch` is the single routing point; every rule
|
|
31
|
-
below is one predicate there. "Serial" routing is a v1 rule, not a
|
|
32
|
-
limitation to hide — upstream mlx-lm routes spec serial too
|
|
33
|
-
(`is_batchable = draft_model is None`, server.py:371).
|
|
34
|
-
|
|
35
|
-
| Request shape | Lane | Mechanism | Status |
|
|
36
|
-
| --- | --- | --- | --- |
|
|
37
|
-
| plain | batch (or serial) | shipped engine | DONE |
|
|
38
|
-
| grammar only | batch (or serial) | B1 per-row matchers / serial mask loop | DONE (B2 gates open) |
|
|
39
|
-
| spec only | **serial** | `hasDraft` routes serial (upstream parity) | Phase B |
|
|
40
|
-
| grammar + spec | **serial** | constrained verify walk (novel — §Phase C) | Phase C |
|
|
41
|
-
| batch + spec | serial per request | `hasDraft` wins over batch | Phase B (routing) |
|
|
42
|
-
| batch + grammar + spec | serial per request | `hasDraft` wins | falls out of B+C |
|
|
43
|
-
|
|
44
|
-
Non-goals (explicitly out of scope, revisit only on measured demand):
|
|
45
|
-
per-row spec inside the batch scheduler (variable accept-lengths break
|
|
46
|
-
uniform-B; a research project, not a feature gap), DSpark as a served
|
|
47
|
-
source before its 27B retrain/data-scale lands, grammar on the
|
|
48
|
-
`/v1/responses` shim beyond what chat inheritance already gives.
|
|
49
|
-
|
|
50
|
-
## Phases
|
|
51
|
-
|
|
52
|
-
Ordering rationale: A is small and closes the trust gap on what already
|
|
53
|
-
shipped. B is the flagship parity feature and lays the `DraftSource`
|
|
54
|
-
seam C needs. C is the novel composition. D runs parallel to B/C
|
|
55
|
-
(scheduler files vs serial-loop files — near-zero overlap). E needs all
|
|
56
|
-
of them and produces the numbers.
|
|
57
|
-
|
|
58
|
-
### Phase A — structured-output debt (B2 + F4) [S, 2–3 days]
|
|
59
|
-
|
|
60
|
-
1. **B2 model-gated scheduler tests** (spec'd in structured-output.md):
|
|
61
|
-
mixed batch mask isolation; **all-grammar B=4 with four different
|
|
62
|
-
schemas** (THE bug-class gate — row↔matcher misalignment after
|
|
63
|
-
eviction/join); early termination + churn + joiner; max_tokens
|
|
64
|
-
mid-JSON truncation under batch; prefill-terminated row never merges.
|
|
65
|
-
2. **F4 compiler cache**: one `GrammarCompiler` per `TokenizerInfo`
|
|
66
|
-
(both vocab-structural; `ownsCompiler=false` path already exists).
|
|
67
|
-
Measure compile time cold vs cached on a real JSON schema — this is
|
|
68
|
-
the agentic-replay win and a benchmark row in Phase E.
|
|
69
|
-
3. Opportunistic: F6 choice escaping (tiny), F3 explicit padded-vocab
|
|
70
|
-
comment. F5/F7 stay parked for the structural-tag pass (see Later).
|
|
71
|
-
|
|
72
|
-
Exit: gated suites green on cpm5 + e4b; compile-cache A/B number
|
|
73
|
-
recorded.
|
|
74
|
-
|
|
75
|
-
### Phase B — `serve --draft-model` (two-model, serial lane) [M, ~1 wk]
|
|
76
|
-
|
|
77
|
-
Execute mlx-lm-tool-parity-plan.md §7 as written (it is already the
|
|
78
|
-
hand-to-an-implementer plan). Integration deltas this plan adds:
|
|
79
|
-
|
|
80
|
-
- **`RequestShape.hasDraft`** beside `hasGrammar`; `willBatch` returns
|
|
81
|
-
false for it. Lane-debug line includes it. (The B0-grammar routing
|
|
82
|
-
pattern, reused verbatim.)
|
|
83
|
-
- **The serve verify loop lands grammar-aware from day one**: the loop
|
|
84
|
-
emits bursts of ≤ n+1 tokens; the stop-sequence/detokenizer audit in
|
|
85
|
-
§7 ("risky parts") must treat the grammar mask hook as a first-class
|
|
86
|
-
participant even while it's unused in this phase — i.e. the per-round
|
|
87
|
-
walk is structured as `for pos in verifyWindow: sample(logits[pos],
|
|
88
|
-
maskHook?)` so Phase C is a hook implementation, not a loop rewrite.
|
|
89
|
-
- **Kill switch** `MLX_BUN_SPEC=0` (degrade: ignore the flag, log once),
|
|
90
|
-
house style.
|
|
91
|
-
|
|
92
|
-
Oracle: L1 spec-vs-spec token equality with `mlx_lm.server
|
|
93
|
-
--draft-model` from the oracle venv (§7.8). Acceptance telemetry
|
|
94
|
-
(`drafted/accepted/targetCalls`) in stats — Phase E consumes it.
|
|
95
|
-
|
|
96
|
-
Exit: greedy token-for-token vs mlx-lm spec on a fixed pair; rotating
|
|
97
|
-
wrap falls back non-spec (no 500); `--batch 4` + `--draft-model` routes
|
|
98
|
-
spec requests serial and batches the rest; admission accounts for draft
|
|
99
|
-
weights + KV.
|
|
100
|
-
|
|
101
|
-
### Phase C — grammar × spec: the constrained verify walk [M, ~1 wk]
|
|
102
|
-
|
|
103
|
-
Novel territory — **no oracle serves grammar+spec** (mlx-lm has no
|
|
104
|
-
grammar; oMLX has no spec). No-oracle (Lab-class) gating per the
|
|
105
|
-
parity-tier contract: equivalence + validity gates, not bit-parity to an
|
|
106
|
-
ancestor.
|
|
107
|
-
|
|
108
|
-
Design (v1 = verify-side masking, drafter free-running):
|
|
109
|
-
|
|
110
|
-
1. **Drafter is unconstrained.** Drafts are proposals; correctness never
|
|
111
|
-
depends on them (a grammar-invalid draft is simply rejected at
|
|
112
|
-
verify). No matcher state touches the draft path.
|
|
113
|
-
2. **The verify walk applies the mask sequentially.** One batched target
|
|
114
|
-
forward over `[pending, ...drafts]` (n+1 positions) as in Phase B;
|
|
115
|
-
then the host-side accept walk goes position by position:
|
|
116
|
-
`mask_i = matcher.bitmask` → apply to `logits[i]` → sample → if
|
|
117
|
-
sampled == draft_i: `matcher.accept(draft_i)`, continue; else emit
|
|
118
|
-
the masked correction token, `matcher.accept(correction)`, stop.
|
|
119
|
-
The matcher only ever advances on **emitted** tokens — no rollback
|
|
120
|
-
needed in v1. Sequential bitmask fills cost 0.004–0.19 ms each
|
|
121
|
-
(measured, structured-output.md); at γ≤3 that's ≤0.8 ms/round against
|
|
122
|
-
a 12B target step of ~40 ms — noise.
|
|
123
|
-
3. **Grammar termination mid-burst** truncates the accepted prefix at
|
|
124
|
-
the terminating token (same all-`-inf` guarantee as serial/batched:
|
|
125
|
-
nothing is sampled past termination), finish_reason "stop".
|
|
126
|
-
4. **The measured fork** ([[flag-and-try-both-on-forks]]): on
|
|
127
|
-
grammar-tight spans (e.g. `guided_choice`, closing braces) a
|
|
128
|
-
free-running drafter's acceptance may crater — every draft off-grammar
|
|
129
|
-
is a wasted round. If Phase E shows that, the alternative is built
|
|
130
|
-
behind `MLX_BUN_SPEC_GRAMMAR_DRAFT=1`: mask the drafter's logits too
|
|
131
|
-
(matcher advances per draft, `rollBack(n − kAccept)` on rejection —
|
|
132
|
-
the WASM API exposes rollBack; this is its use case). Build the flag
|
|
133
|
-
only if the default's acceptance number demands it; don't pre-build.
|
|
134
|
-
|
|
135
|
-
Gates (no external oracle):
|
|
136
|
-
- **Equivalence**: greedy grammar+spec long-prefix-equal to greedy
|
|
137
|
-
grammar-only serial on fixed prompts (exact-match acceptance means
|
|
138
|
-
spec must reproduce the non-spec masked-greedy stream, modulo the
|
|
139
|
-
documented batched-verify-head knife-edges — same caveat class as L1
|
|
140
|
-
spec-vs-spec).
|
|
141
|
-
- **Validity**: every grammar+spec output parses / conforms to its
|
|
142
|
-
schema (100%, no exceptions), matcher never rejects an emitted token.
|
|
143
|
-
- **Composition regression fence**: grammar-only and spec-only suites
|
|
144
|
-
byte-unchanged.
|
|
145
|
-
|
|
146
|
-
### Phase D — batching P0 (+ admission slice of P3) [M, ~1 wk, parallel with B/C]
|
|
147
|
-
|
|
148
|
-
From batching-perf-path.md, the subset that the benchmark needs and that
|
|
149
|
-
doesn't collide with B/C's serial-loop work:
|
|
150
|
-
|
|
151
|
-
1. **P0**: `scripts/bench-serving-load.ts` (N concurrent vs live server,
|
|
152
|
-
aggregate tok/s + TTFT p50/p95 at the SSE first-token event) —
|
|
153
|
-
Phase E builds on this harness; `extend` join (kill the O(B·S)
|
|
154
|
-
re-merge); vectorized homogeneous-sampler fast path.
|
|
155
|
-
- `extend` + grammar rows: the B1 read-before-build step must hold
|
|
156
|
-
across an extend-join — add one B2-style churn test with a joiner
|
|
157
|
-
landing while a grammar row is live.
|
|
158
|
-
2. **P3 admission slice only**: `projectKvBytes` + `--kv-budget`
|
|
159
|
-
queueing (the OOM backstop the combined benchmark needs before it
|
|
160
|
-
pushes B=4 × long prompts on 24 GB). Prompt-cache-under-batching,
|
|
161
|
-
adapters, and the default flip stay in batching-perf-path P3.
|
|
162
|
-
|
|
163
|
-
P1 (quantized KV at B>1) is NOT in this plan's critical path — it's the
|
|
164
|
-
next wave after the matrix benchmark exists, and the benchmark is exactly
|
|
165
|
-
what will size its payoff. (P2 — perf kernel at B>1 — is OBSOLETE: the
|
|
166
|
-
kernel was deleted 2026-07-05, docs/design/unified-engine-frontier-plan.md §6.)
|
|
167
|
-
|
|
168
|
-
### Phase E — the feature-matrix benchmark [S–M, 3–4 days]
|
|
169
|
-
|
|
170
|
-
One harness answering "what does each feature — and each legal
|
|
171
|
-
combination — cost or buy, per model?" Extends P0's
|
|
172
|
-
`bench-serving-load.ts`; preflight-gated like benchmark.sh (dirty-machine
|
|
173
|
-
numbers are garbage; quotable rows need the clean-machine protocol).
|
|
174
|
-
|
|
175
|
-
**Cells** (skip-if-unavailable, like the model-gated suites):
|
|
176
|
-
|
|
177
|
-
- Lanes/features: `serial`, `batch4`, `serial+grammar`, `batch4+grammar`,
|
|
178
|
-
`serial+spec`, `serial+grammar+spec` — the six legal shapes from the
|
|
179
|
-
matrix. (batch+spec cells route serial by design; the harness records
|
|
180
|
-
them as routing checks, not perf rows.)
|
|
181
|
-
- Models: cpm5 + e4b (fast movers, both lanes), 12B (+ its assistant
|
|
182
|
-
drafter — the measured spec win), Qwen3.5 (batch + thinking-model
|
|
183
|
-
grammar canary; grammar cells expected to expose F7 until structural
|
|
184
|
-
tags land — record, don't hide).
|
|
185
|
-
- Workloads: short-chat (128 tok), JSON-extraction (a real schema,
|
|
186
|
-
grammar cells), long-form (512 tok). 4 concurrent for batch cells,
|
|
187
|
-
1 for serial cells; N=3 median.
|
|
188
|
-
|
|
189
|
-
**Metrics per cell**: aggregate + per-stream decode tok/s · TTFT
|
|
190
|
-
p50/p95 (SSE first token, wall-clock) · spec acceptance
|
|
191
|
-
(drafted/accepted/targetCalls) · grammar overhead vs the same cell
|
|
192
|
-
without grammar (%) · schema-conformance rate (**must be 100% in every
|
|
193
|
-
grammar cell — a conformance failure fails the run, it's a correctness
|
|
194
|
-
gate wearing a benchmark costume**) · peak RSS.
|
|
195
|
-
|
|
196
|
-
**Denominator discipline** (spec-decode-larger-targets.md): every
|
|
197
|
-
feature cell is compared to the SAME model+lane baseline cell from the
|
|
198
|
-
SAME run. No cross-model or cross-run speedup claims.
|
|
199
|
-
|
|
200
|
-
**Output**: eval-DB rows tagged `feature-matrix[<host>]` + a dated
|
|
201
|
-
markdown artifact (gitignored, like benchmark.sh's); promoted rows land
|
|
202
|
-
in benchmarks/RESULTS.md under a new "composition" table. Josh-gated
|
|
203
|
-
clean-machine run for anything quotable.
|
|
204
|
-
|
|
205
|
-
Exit: the matrix runs end-to-end on this machine; a first
|
|
206
|
-
(loaded-machine, unquotable) sweep sanity-checks every cell; the
|
|
207
|
-
clean-machine run is queued in STATUS Josh-gated.
|
|
208
|
-
|
|
209
|
-
## Later / parked (pointers, so they aren't lost)
|
|
210
|
-
|
|
211
|
-
- **F7 + F5 structural-tag pass** (thinking-model grammar + real regex)
|
|
212
|
-
— try the installed WASM package's `fromStructuralTag`/`RegexFormat`
|
|
213
|
-
first; U1 rebuild only if its Dec-2025 core predates the semantics
|
|
214
|
-
(structured-output.md addendum). Qwen3.5's grammar cells in Phase E
|
|
215
|
-
are the forcing function.
|
|
216
|
-
- **U2 native XGrammar-2 via TVM-FFI** — trigger conditions unchanged
|
|
217
|
-
(B≫8, spec+grammar draft-tree masking via `traverse_draft_tree`, or
|
|
218
|
-
compile time visible despite F4). Phase C's v1 walk deliberately
|
|
219
|
-
avoids needing it.
|
|
220
|
-
- **Batching P1** (quant-KV at B>1) — next wave, sized by the matrix.
|
|
221
|
-
(P2, perf kernel at B>1, is obsolete — kernel deleted 2026-07-05.)
|
|
222
|
-
- **P4 device-side step chaining** — orthogonal serial-decode work; the
|
|
223
|
-
matrix's serial baselines will show its headroom.
|
|
224
|
-
- **Assistant/DSpark sources behind `--draft-model`** —
|
|
225
|
-
mlx-lm-tool-parity-plan §7.9; DSpark stays research until 27B
|
|
226
|
-
retrain + data scale (dspark-handoff.md).
|
|
227
|
-
- **Spec inside the batch lane** — research question, not scheduled.
|
|
228
|
-
|
|
229
|
-
## Execution log (2026-07-03)
|
|
230
|
-
|
|
231
|
-
- **Phase A** ✅ — B2 gates in `tests/batch-grammar.test.ts` (all five
|
|
232
|
-
scenarios + a sixth found later, below); F4 compiler cache went through a
|
|
233
|
-
bring-up fix (single-flight rebuild — concurrent compiles after a
|
|
234
|
-
tokenizer switch double-disposed the previous compiler); F6, F3 landed.
|
|
235
|
-
- **Phase B** ✅ — `serve --draft-model`/`--num-draft-tokens`;
|
|
236
|
-
`src/spec/{source,two-model,serve-loop}.ts`. **L1 gate: 48/48
|
|
237
|
-
token-for-token vs mlx-lm spec** (Llama 3B+1B greedy, 65% acceptance,
|
|
238
|
-
`scripts/oracle-spec-two-model.py`). Deviations as designed (ring-wrap
|
|
239
|
-
degrades pre-pollution via an offset+n+1 gate — upstream's post-hoc check
|
|
240
|
-
would already have polluted the ring; prompt cache bypassed v1).
|
|
241
|
-
- **Phase C** ✅ — the constrained verify walk in `samplePos`; gates green
|
|
242
|
-
(100% validity; 12/12 token-identical to grammar-only serial; choice
|
|
243
|
-
terminates mid-spec). Drafter-masking flag NOT built (acceptance 6/15 on
|
|
244
|
-
a tight schema — usable; revisit only if Phase E's clean run says so).
|
|
245
|
-
- **Phase E** ✅ (harness) — `scripts/bench-feature-matrix.ts` (the planned
|
|
246
|
-
bench-serving-load extension became its own script: that file already
|
|
247
|
-
exists as a client-only stack-vs-stack tool and stays one). Six cells
|
|
248
|
-
green end-to-end on Llama 3B+1B; `usage.speculation` telemetry on all
|
|
249
|
-
four API usage blocks. Clean-machine run for RESULTS.md is Josh-gated.
|
|
250
|
-
- **The conformance gate paid for the whole phase in one smoke run** —
|
|
251
|
-
three real bugs: (1) snake_case wire fields never reached the grammar
|
|
252
|
-
resolver (structured output was DEAD over HTTP since it landed);
|
|
253
|
-
(2) `#flushPipeline` didn't advance matchers → stale masks on mid-decode
|
|
254
|
-
joins (regression test added); (3) **UniversalDenseModel batched RoPE
|
|
255
|
-
uses the scalar cache.offset** → uneven-row batches decode joiners at
|
|
256
|
-
wrong positions — latent for ALL Tier-0 archs since v0.0.9. **Fixed
|
|
257
|
-
same day**: `UniversalRope.applyDynamic` (+ `ops.ropeScaledDynamic`)
|
|
258
|
-
routes the wrapper's per-row `ropeOffsetArr`; gated **token-exact vs
|
|
259
|
-
mlx-lm B=2 on Llama-3.2-3B** — static uneven rows AND the dynamic
|
|
260
|
-
join/leave protocol (tests/batched-decode-parity.test.ts "Llama 3B
|
|
261
|
-
Tier-0"). Plain full-attention universal archs now batch; maskArray
|
|
262
|
-
(gemma2-family, pad-blind causal mask in forwardLayers) and
|
|
263
|
-
sliding-window universal archs remain serial (unvalidated cells).
|
|
264
|
-
Lesson, per [[per-model-quant-specialization]]: the gateway's
|
|
265
|
-
capability gate admitted a model family no batched-parity suite ever
|
|
266
|
-
validated.
|
|
267
|
-
|
|
268
|
-
### Phase D completion (2026-07-04)
|
|
269
|
-
|
|
270
|
-
- **KV-budget admission** — `--kv-budget <GB>`: aggregate projected-KV gate
|
|
271
|
-
in the scheduler (queue-don't-OOM, oversized-alone rejects,
|
|
272
|
-
`/stats.batch.{pending_rows,kv_bytes,kv_budget_bytes}`;
|
|
273
|
-
tests/batch-kv-budget.test.ts).
|
|
274
|
-
- **Vectorized homogeneous sampling** — all-plain-greedy batches sample via
|
|
275
|
-
ONE log-softmax+argmax over [B,V]; gateway flags `plainGreedy`; BIT-equal
|
|
276
|
-
A/B vs the per-row path (`MLX_BUN_BATCH_VEC_SAMPLE=0` kill switch;
|
|
277
|
-
tests/batch-vec-sample.test.ts).
|
|
278
|
-
- **Extend-join** — `extendKVRows` (mlx-lm `BatchKVCache.extend` semantics:
|
|
279
|
-
one pad + one B-axis concat, running rows untouched, pads grow) replaces
|
|
280
|
-
the O(B·S) re-merge for full-attention layers in `#mergeJoiner`
|
|
281
|
-
(`MLX_BUN_BATCH_EXTEND=0` = re-merge). **Own oracle** (extend's pad
|
|
282
|
-
layout ≠ re-merge's): scripts/gen-batched-extend-golden.py →
|
|
283
|
-
token-for-token on CPM AND Llama-3B (tests/batched-decode-parity.test.ts
|
|
284
|
-
"EXTEND-JOIN ORACLE"); full scheduler suite incl. the grammar-churn join
|
|
285
|
-
test green through the extend path AND the kill-switch path.
|
|
286
|
-
Rotating-layer extend (Gemma joins re-merge their sliding layers, extend
|
|
287
|
-
their full layers) is a follow-up.
|
|
288
|
-
|
|
289
|
-
## Risks
|
|
290
|
-
|
|
291
|
-
- **Grammar+spec has no oracle** — mitigated by the three-gate stack
|
|
292
|
-
(equivalence to grammar-only greedy, 100% validity, regression fence)
|
|
293
|
-
and by keeping the drafter out of the grammar state in v1.
|
|
294
|
-
- **Multi-token bursts through stop-sequence/detokenizer state** — the
|
|
295
|
-
known §7 risky part, now load-bearing for two phases; land the burst
|
|
296
|
-
audit with Phase B tests, not after.
|
|
297
|
-
- **Memory at 12B+drafter / B=4 on 24 GB** — Phase D's admission slice
|
|
298
|
-
is the backstop; benchmark cells must go through it, not around it.
|
|
299
|
-
- **Scope creep via the matrix** — the benchmark measures what exists;
|
|
300
|
-
it must not become a reason to build P1/P2/drafter-masking
|
|
301
|
-
speculatively. Each parked item has its trigger written above.
|