mlx-bun 0.0.10 → 0.0.12
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 +107 -32
- package/THIRD_PARTY_LICENSES.md +10 -0
- package/docs/archive/mlx-bun-lab-report.html +275 -0
- package/docs/archive/wwdc-mlx-bun.html +848 -0
- package/docs/design/audio-input-plan.md +356 -0
- package/docs/design/batching-perf-path.md +58 -35
- package/docs/design/batching-v2-plan.md +23 -9
- package/docs/design/bucketing-stage.md +2 -1
- package/docs/design/colibri-glm52-port.md +1479 -0
- package/docs/design/compat-cli-surface-design.md +4 -3
- package/docs/design/decode-speed-program.md +172 -0
- package/docs/design/docs-reorg-plan.md +1 -1
- package/docs/design/dspark-serving-program.md +371 -0
- package/docs/design/dspark-speculative-decoding.md +167 -5
- package/docs/design/faithful-l1-consolidation.md +310 -0
- package/docs/design/generic-model-support.md +8 -5
- package/docs/design/grammar-spec-batching-integration.md +301 -0
- package/docs/design/minicpm5-decode-megakernel.md +16 -11
- package/docs/design/mlx-lm-tool-parity-plan.md +11 -1
- package/docs/design/omlx-adoption-map.md +14 -6
- package/docs/design/orpo-training.md +34 -30
- package/docs/design/paged-kv-cache.md +214 -0
- package/docs/design/parallel-slots.md +82 -49
- package/docs/design/parity-tier-dag.md +43 -33
- package/docs/design/pre-colibri-stabilization.md +329 -0
- package/docs/design/repo-cleanup-plan.md +189 -0
- package/docs/design/runtime-isolation.md +19 -3
- package/docs/design/segmented-backward-training.md +3 -2
- package/docs/design/ssd-kv-cold-tier.md +130 -0
- package/docs/design/structured-output.md +484 -0
- package/docs/design/the-dreaming-master-plan.md +2 -3
- package/docs/design/turboquant-kv.md +235 -0
- package/docs/design/unified-engine-frontier-plan.md +774 -0
- package/docs/design/web-chat-beat-matrix.md +315 -0
- package/docs/design/web-chat-redesign.md +1112 -0
- package/docs/investigations/colibri-oracle-pin.md +1284 -0
- package/docs/investigations/dspark-handoff.md +182 -16
- package/docs/investigations/indexshare-performance-spike.md +357 -0
- package/docs/investigations/lab-build-journal.md +2 -2
- package/docs/investigations/openwiki-evaluation.md +249 -0
- package/docs/planning/IDEAS.md +14 -0
- package/docs/planning/PRODUCT_ROADMAP.md +2 -3
- package/docs/planning/chat-ui-vision-memory-first.md +199 -0
- package/docs/planning/chat-ui-vision.md +50 -0
- package/docs/planning/memory-docs-and-dag-plan.md +15 -6
- package/docs/planning/release-notes-v0.0.11.md +239 -0
- package/docs/planning/release-notes-v0.0.12.md +80 -0
- package/docs/reference/cli.md +63 -18
- package/docs/reference/distribution.md +37 -6
- package/docs/reference/embedding.md +40 -16
- package/docs/reference/features-matrix.md +99 -0
- package/docs/reference/library-api.md +69 -20
- package/docs/reference/memory.md +26 -6
- package/docs/reference/models.md +60 -3
- package/docs/reference/orpo-quickstart.md +3 -4
- package/docs/reference/server-api.md +717 -24
- package/docs/reference/server-config.md +265 -129
- package/docs/reference/training.md +24 -16
- package/package.json +5 -3
- package/src/anthropic.ts +67 -44
- package/src/audio/conformer.ts +647 -0
- package/src/audio/decode.ts +133 -0
- package/src/audio/features.ts +202 -0
- package/src/audio/transcode.ts +67 -0
- package/src/chat-template.ts +155 -10
- package/src/cli.ts +483 -113
- package/src/config.ts +116 -24
- package/src/diffusion/diffusion-generate.ts +14 -8
- package/src/download.ts +143 -12
- package/src/eval/README.md +7 -6
- package/src/eval/ifeval.ts +63 -120
- package/src/eval/kl.ts +59 -3
- package/src/eval/quality-db.ts +2 -2
- package/src/eval/runner.ts +17 -8
- package/src/eval/tasks/ifeval.ts +167 -31
- package/src/expert-io.ts +391 -0
- package/src/expert-offload.ts +15 -2
- package/src/expert-residency.ts +1134 -0
- package/src/expert-usage.ts +415 -0
- package/src/flags.ts +13 -0
- package/src/generate.ts +438 -35
- package/src/grammar.ts +585 -0
- package/src/hf-push.ts +1 -1
- package/src/hub-rest.ts +242 -0
- package/src/index.ts +14 -2
- package/src/jobs/runner.ts +37 -18
- package/src/kv-store.ts +586 -93
- package/src/lora.ts +85 -14
- package/src/md-modules.d.ts +42 -0
- package/src/media-fetch.ts +426 -0
- package/src/memory/rest.ts +245 -0
- package/src/memory/vault.ts +74 -0
- package/src/mlx/array.ts +149 -19
- package/src/mlx/autograd.ts +53 -16
- package/src/mlx/checkpoint.ts +46 -13
- package/src/mlx/custom-vjp.ts +83 -35
- package/src/mlx/ffi.ts +27 -3
- package/src/mlx/metal-kernel.ts +7 -4
- package/src/mlx/ops.ts +153 -23
- package/src/mlx/turboquant-ops.ts +831 -0
- package/src/mlx/turboquant-tables.ts +237 -0
- package/src/model/batched-mask.ts +62 -1
- package/src/model/batched-quant.ts +206 -0
- package/src/model/batched-rotating-quant.ts +346 -0
- package/src/model/batched-rotating.ts +46 -1
- package/src/model/compiled-decode.ts +4 -15
- package/src/model/factory.ts +103 -6
- package/src/model/gemma4-base.ts +395 -39
- package/src/model/gemma4.ts +122 -33
- package/src/model/generated/gemma4-12b.ts +9 -13
- package/src/model/generated/gemma4-26b.ts +10 -5
- package/src/model/generated/gemma4-e4b.ts +14 -9
- package/src/model/glm52-atlas.ts +511 -0
- package/src/model/glm52-cache.ts +706 -0
- package/src/model/glm52-config.ts +262 -0
- package/src/model/glm52-container.ts +305 -0
- package/src/model/glm52-coupling.ts +388 -0
- package/src/model/glm52-dsa.ts +602 -0
- package/src/model/glm52-expert-layout.ts +253 -0
- package/src/model/glm52-layout.ts +152 -0
- package/src/model/glm52-memory.ts +473 -0
- package/src/model/glm52-mla.ts +786 -0
- package/src/model/glm52-moe.ts +223 -0
- package/src/model/glm52-pilot.ts +537 -0
- package/src/model/glm52-reference.ts +445 -0
- package/src/model/glm52-residency.ts +557 -0
- package/src/model/glm52-resident-weights.ts +135 -0
- package/src/model/glm52-streamed-experts.ts +453 -0
- package/src/model/glm52-streamed-metal.ts +610 -0
- package/src/model/glm52-weights.ts +503 -0
- package/src/model/glm52.ts +1153 -0
- package/src/model/minicpm5.ts +58 -102
- package/src/model/paged-kv.ts +253 -0
- package/src/model/qwen3-delta.ts +76 -15
- package/src/model/qwen3-moe.ts +404 -0
- package/src/model/qwen3.ts +9 -8
- package/src/model/qwen3_5.ts +88 -23
- package/src/model/support.ts +19 -1
- package/src/model/universal/dense.ts +40 -5
- package/src/model/universal/rope.ts +36 -21
- package/src/native/expert_io.c +523 -0
- package/src/native-pack.ts +6 -4
- package/src/pi-web.ts +1299 -82
- package/src/preflight.ts +27 -8
- package/src/prompt-cache.ts +293 -33
- package/src/quantize/quantizer.ts +16 -1
- package/src/registry.ts +57 -2
- package/src/responses.ts +62 -49
- package/src/serve/batch-scheduler.ts +1050 -78
- package/src/serve/generation-gateway.ts +252 -24
- package/src/serve/isolate.ts +417 -0
- package/src/serve/lane-registry.ts +44 -0
- package/src/serve/session-search.ts +326 -0
- package/src/server.ts +1701 -175
- package/src/spec/assistant-source.ts +150 -0
- package/src/spec/deepspec-source.ts +143 -0
- package/src/spec/dflash-source.ts +124 -0
- package/src/spec/dspark/ab-stats.ts +136 -0
- package/src/spec/dspark/calibration.ts +112 -0
- package/src/spec/dspark/deepspec-module.ts +801 -0
- package/src/spec/dspark/generate-dflash.ts +72 -20
- package/src/spec/dspark/loader.ts +23 -0
- package/src/spec/dspark/module-dflash.ts +278 -36
- package/src/spec/dspark/quantize-drafter.ts +91 -0
- package/src/spec/generate.ts +59 -25
- package/src/spec/glm52-mtp-source.ts +392 -0
- package/src/spec/ngram-source.ts +132 -0
- package/src/spec/serve-loop.ts +617 -0
- package/src/spec/source.ts +118 -0
- package/src/spec/two-model.ts +171 -0
- package/src/ssd-cache.ts +111 -35
- package/src/tokenizer.ts +288 -2
- package/src/tool-approvals.ts +131 -0
- package/src/tool-call.ts +438 -22
- package/src/train/flash-cce.ts +2 -2
- package/src/train/job.ts +0 -12
- package/src/train/lora-params.ts +17 -6
- package/src/train/trainer.ts +60 -30
- package/src/vision/prompt.ts +217 -48
- package/src/web/app.html +1197 -1791
- package/src/web/app.js +5694 -0
- package/src/web/icon.svg +13 -0
- package/src/web/manifest.webmanifest +24 -0
- package/src/web/src/adapters-panel.ts +288 -0
- package/src/web/src/api.ts +57 -0
- package/src/web/src/assistant.ts +485 -0
- package/src/web/src/chat.ts +1050 -0
- package/src/web/src/composer.ts +959 -0
- package/src/web/src/dataset.ts +132 -0
- package/src/web/src/finetune.ts +267 -0
- package/src/web/src/hub.ts +428 -0
- package/src/web/src/main.ts +98 -0
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +572 -0
- package/src/web/src/model-picker.ts +159 -0
- package/src/web/src/palette.ts +346 -0
- package/src/web/src/protocol.ts +62 -0
- package/src/web/src/quantize.ts +167 -0
- package/src/web/src/rag.ts +274 -0
- package/src/web/src/sessions.ts +469 -0
- package/src/web/src/shell.ts +804 -0
- package/src/web/src/status.ts +300 -0
- package/src/web/src/ui-catalog.ts +92 -0
- package/src/web/sw.js +71 -0
- package/src/web/vendor/README.md +61 -0
- package/src/web/vendor/hljs-LICENSE +29 -0
- package/src/web/vendor/hljs-theme.css +59 -0
- package/src/web/vendor/hljs.js +26 -0
- package/src/web-tools.ts +54 -2
- package/src/weights.ts +82 -19
- package/src/model/fused-decode-kernel.ts +0 -312
- package/src/model/fused-geglu-kernel.ts +0 -198
- package/src/model/fused-mlp-kernel.ts +0 -169
- package/src/model/fused-swiglu-kernel.ts +0 -240
- package/src/model/steel-linear-kernel.ts +0 -96
- package/src/status-page.html +0 -497
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
# Pre-Colibri stabilization program
|
|
2
|
+
|
|
3
|
+
**Status:** ACTIVE — opened 2026-07-29. This program interrupts Phase 21
|
|
4
|
+
before G4. The landed Colibri G1–G3 foundation stays intact; no new Colibri
|
|
5
|
+
feature work starts until the exit gate below closes.
|
|
6
|
+
|
|
7
|
+
## 1. Why this is a program, not a bug pile
|
|
8
|
+
|
|
9
|
+
The intake contains 25 potential issues with different evidence and different
|
|
10
|
+
failure modes. Some are statically obvious safety or correctness defects. Two
|
|
11
|
+
are performance hypotheses whose magnitude has not been measured. Three are
|
|
12
|
+
deployment hardening ideas that add little while the server is strictly
|
|
13
|
+
loopback-only.
|
|
14
|
+
|
|
15
|
+
Treating all 25 as equivalent would create a large, unreviewable patch and
|
|
16
|
+
would encourage performance claims without numbers. This program instead:
|
|
17
|
+
|
|
18
|
+
1. gives every item a stable ID (source line numbers are only discovery
|
|
19
|
+
anchors);
|
|
20
|
+
2. records whether the item is reported, reproduced, disproved, fixed, or
|
|
21
|
+
deliberately deferred;
|
|
22
|
+
3. requires a failing regression or baseline measurement before changing
|
|
23
|
+
code;
|
|
24
|
+
4. lands one coherent invariant per commit/PR, except where cancellation must
|
|
25
|
+
be fixed end-to-end across several protocol adapters;
|
|
26
|
+
5. runs a wave gate before moving to the next risk class; and
|
|
27
|
+
6. resumes Colibri from its exact checkpoint only after the closeout gate.
|
|
28
|
+
|
|
29
|
+
## 2. Colibri pause and resume point
|
|
30
|
+
|
|
31
|
+
Phase 21 is paused after the G1–G3 foundation landed on `main` at
|
|
32
|
+
`2cd6e35`. G0 and G2 are closed. G1 and G3 still require the quiet-machine
|
|
33
|
+
kernel/power matrix and the stock-MLX-versus-custom-Metal path decision. G4
|
|
34
|
+
(serial native MTP) has not started.
|
|
35
|
+
|
|
36
|
+
After this program closes, resume in this order:
|
|
37
|
+
|
|
38
|
+
1. run the remaining G1/G3 quiet-machine kernel and passive-worker power
|
|
39
|
+
measurements;
|
|
40
|
+
2. record the selected correct path per shape and close G1/G3;
|
|
41
|
+
3. start G4 serial native MTP; and
|
|
42
|
+
4. continue the existing G5–G8 contract unchanged.
|
|
43
|
+
|
|
44
|
+
No stabilization result changes the Colibri performance target or licenses an
|
|
45
|
+
unmeasured performance claim.
|
|
46
|
+
|
|
47
|
+
## 3. State and priority vocabulary
|
|
48
|
+
|
|
49
|
+
Each ledger row has one state:
|
|
50
|
+
|
|
51
|
+
- **reported** — credible intake, but no dedicated regression has failed yet;
|
|
52
|
+
- **reproduced** — a deterministic test, stress case, or benchmark captures
|
|
53
|
+
the old behavior;
|
|
54
|
+
- **disproved** — the claimed failure does not occur; preserve the evidence
|
|
55
|
+
that disproved it;
|
|
56
|
+
- **fixed** — the reproducer is green, the focused suite is green, and the
|
|
57
|
+
relevant wave gate is green;
|
|
58
|
+
- **deferred** — the risk is outside the supported threat/deployment model and
|
|
59
|
+
has a named trigger for reopening.
|
|
60
|
+
|
|
61
|
+
Priority means:
|
|
62
|
+
|
|
63
|
+
- **P0:** security boundary, native lifetime, cancellation/runaway work, or a
|
|
64
|
+
global resource lease that can wedge the product;
|
|
65
|
+
- **P1:** user-visible silent corruption, broken advertised behavior, or
|
|
66
|
+
durable output loss;
|
|
67
|
+
- **P2:** bounded leaks, cold-path ownership, test/typecheck coverage, and
|
|
68
|
+
misleading dead code;
|
|
69
|
+
- **P3:** performance hypothesis; measure first, optimize only if material;
|
|
70
|
+
- **D:** conditional deployment hardening, not active product work.
|
|
71
|
+
|
|
72
|
+
## 4. Intake ledger
|
|
73
|
+
|
|
74
|
+
Active rows begin in **reported**; the three deployment rows begin in
|
|
75
|
+
**deferred**. The “proof to close” column is the minimum evidence needed to
|
|
76
|
+
change that state.
|
|
77
|
+
|
|
78
|
+
| ID | Pri | State | Discovery anchor | Failure or invariant | Proof to close |
|
|
79
|
+
|---|---:|---|---|---|---|
|
|
80
|
+
| PERF-01 | P3 | fixed | `src/server.ts`, `StreamDecoder.push` | `push()` decoded the full accumulated ID list on every token, giving an O(n²) code shape across streaming surfaces. | Deterministic tokenizer-only scaling benchmark at several output lengths; optimize only if the curve and wall time are material, then preserve exact emitted bytes/chunk boundaries. |
|
|
81
|
+
| PERF-02 | P3 | fixed | `src/generate.ts`, `readExtras` | Serial `logprobs`/`top_logprobs` readback placed `astype` work behind the already-dispatched next step and serialized decoding. Direct integer reads plus host bf16/f16 expansion remove the barrier. | Quiet-machine paired generation benchmark with logprobs off/on and a timeline or per-token latency signal; patch must recover overlap without changing logprob values. |
|
|
82
|
+
| CANCEL-01 | P0 | fixed | `src/anthropic.ts`, `src/responses.ts` SSE translators | Canceling the outer Anthropic or Responses stream does not cancel its upstream OpenAI stream. | A synthetic slow upstream records `cancel()` exactly once when the translated reader is canceled; normal completion and upstream error behavior remain exact. |
|
|
83
|
+
| CANCEL-02 | P0 | fixed | `src/server.ts`, non-streaming chat/completions | Client abort is not threaded into non-streaming gateway generation, so abandoned work can retain the serial lane. | End-to-end abort test proves generation stops, the lane/row is released, and a following request begins promptly for chat and text completions; protocol shims inherit the same signal. |
|
|
84
|
+
| JOB-01 | P0 | fixed | `src/jobs/runner.ts`, `spawnNow` | The GPU lease is assigned before `Bun.spawn`; a synchronous throw can leave `isGpuBusy()` true forever. | Inject a throwing spawn, assert failed job state, null lease, and successful queue drain/next job. |
|
|
85
|
+
| LIFE-01 | P0 | fixed | `src/expert-io.ts`, `wait`/`close` | `wait()` polls again after an await without re-checking closure while `close()` may free the native pool. | Native stress test races pending waits with close repeatedly under the existing helper; no post-close FFI call, crash, stale read, or leaked waiter. Define whether close waits, cancels, or makes wait reject. |
|
|
86
|
+
| ADAPTER-01 | P1 | fixed | `src/lora.ts`, adapter shape validation | The validator assumes mlx-lm tensor orientation and rejects real PEFT LoRA A/B tensors despite accepting PEFT names. | Tiny tracked PEFT-layout adapter mounts and produces the expected delta; mlx-lm-layout fixtures remain exact; invalid and wrong-base shapes get distinct, truthful errors. |
|
|
87
|
+
| TRAIN-01 | P1 | fixed | `src/train/lora-params.ts`, adapter config writes | Two un-awaited `Bun.write` calls can let successful training exit before mount metadata is durable. | Inject delayed writes and prove save completion waits for both JSON files; immediately reopen/mount the returned adapter directory. |
|
|
88
|
+
| EVAL-01 | P1 | fixed | `src/eval/ifeval.ts` and `src/eval/tasks/ifeval.ts` | Two scorer implementations have different coverage and unknown-instruction/strict-loose semantics while both present results as IFEval. | Choose one canonical scorer and metric schema; run one frozen response corpus through every public entrypoint and prove identical labeled results. If a legacy subset remains, rename it so results cannot be compared accidentally. |
|
|
89
|
+
| METRIC-01 | P1 | fixed | `src/train/trainer.ts`, `countResponseTokens` | Batched SFT throughput counts padded sequence length, inflating tokens/s for B>1. | Unequal-length batch fixture reports only supervised, non-padding response tokens and matches a manual count. |
|
|
90
|
+
| TRAIN-02 | P1 | fixed | `src/train/trainer.ts`, optimizer construction | `loraPlusRatio` is accepted for SFT/DPO but only creates per-leaf LR scales in ORPO. | Either wire the same A/B LR-scale contract into all three methods with optimizer-state tests, or reject the option outside supported methods at parse/CLI/API boundaries and document that scope. |
|
|
91
|
+
| STORE-01 | P1 | fixed | `src/responses.ts`, `ResponseStore.#evictExpired` | LRU touches change map insertion order but not `createdAt`; early-break expiry can leave expired entries after a fresh entry. | Fake-clock test creates, touches, advances, and proves every expired ID is gone regardless of LRU order while byte accounting stays exact. |
|
|
92
|
+
| GRAMMAR-01 | P1 | fixed | `src/server.ts`, guided degrade prompt | Graceful grammar degradation can inject a system message whose `content` is null, causing the fallback request itself to fail. | A request for every degrading `guided_*` form reaches generation with a valid string/content shape and carries an explicit Warning header. |
|
|
93
|
+
| GRAMMAR-02 | P1 | fixed | `src/generate.ts`, grammar jump gate | Jump-forward excludes `logprobs` but not `topLogprobs`, so forced tokens can emit empty logprob records. | `topLogprobs > 0` test cannot enter a jump path that lacks complete rows; emitted token/logprob counts and values stay aligned. |
|
|
94
|
+
| LEAK-01 | P2 | fixed | `src/diffusion/diffusion-generate.ts`, stable/confident stop | A precomputed soft-embedding tensor can be abandoned on early stop. | Forced early-stop fixture returns native/MLX live-handle counts to baseline over repeated runs. |
|
|
95
|
+
| LEAK-02 | P2 | fixed | `src/weights.ts`, `Weights.open` failure | Loader failure can leak the current array-map handle plus maps retained from earlier shards. | Fail loading shard N and assert every array/meta map from shards 1..N is freed exactly once. |
|
|
96
|
+
| LEAK-03 | P2 | fixed | `src/mlx/{autograd,checkpoint,custom-vjp}.ts` constructors | Failure out-parameter slots are initialized with live handles that may not be freed when native constructor calls fail. | Failure-injection tests for all three constructors prove slots, closures, and callbacks return to baseline with no double free. |
|
|
97
|
+
| HYG-01 | P2 | fixed | `src/train/job.ts`, empty Gemma block | A config read and stale comment claim load-bearing environment setup, but the branch is empty. | Remove the read/block/comment; job parsing and training setup tests stay green. |
|
|
98
|
+
| HYG-02 | P2 | fixed | `tsconfig.json` exclusions | Shipped web sources and tests that run in the gate are excluded from the zero-error typecheck contract. | Remove the exclusions or replace them with an explicit checked project reference; repository and web typechecks are green with no hidden files. |
|
|
99
|
+
| HYG-03 | P2 | fixed | `scripts/test.sh` test glob | `scripts/bench-serving-load.test.ts` is model-free but outside the gate. | Gate enumerates and runs it exactly once; a sentinel/failing-case check proves it cannot silently fall out again. |
|
|
100
|
+
| SEC-01 | P0 | fixed | `src/web-tools.ts`, `web_fetch` | Model-selected URLs bypass the existing public-destination policy, follow redirects automatically, and buffer the full body. This permits SSRF into loopback/private services and unbounded response buffering. | Reuse one shared fetch-policy implementation: reject private literals and DNS resolutions, revalidate every redirect, combine caller abort with timeout, and stream to a byte cap. Tests cover loopback, private DNS, public-to-private redirect, redirect limit, chunked over-cap, and normal public text. |
|
|
101
|
+
| SEC-02 | P1 | fixed | `src/download.ts`, `blobId` | An unvalidated blob ID reaches `join()` and symlink creation, unlike the adjacent validated digest. It requires a hostile HF-compatible endpoint. | Reject any non-lowercase-40-hex SHA-1 blob ID before path construction; traversal and malformed-ID tests fail closed. |
|
|
102
|
+
| DEPLOY-01 | D | deferred | `src/server.ts`, WebSocket upgrade | No WebSocket Origin enforcement. | Deferred while bind is loopback-only. Reopen before any supported non-loopback bind, tunnel, reverse proxy, or browser origin; then add an allowlist and cross-origin rejection tests. |
|
|
103
|
+
| DEPLOY-02 | D | deferred | `src/server.ts`, `/api/*` mutation routes | Browser-accessible state-changing routes have no CSRF/origin policy. | Same deployment trigger as DEPLOY-01; define trusted origins/auth before exposing the control plane. |
|
|
104
|
+
| DEPLOY-03 | D | deferred | `src/server.ts`, CORS headers | Wildcard CORS would be unsafe in a remotely reachable deployment. | Same deployment trigger as DEPLOY-01; replace wildcard policy as part of one remote-exposure threat-model change, not as isolated lines today. |
|
|
105
|
+
|
|
106
|
+
### Evidence log
|
|
107
|
+
|
|
108
|
+
- **Frozen baseline:** `2cd6e35`, Bun `1.3.14`, loopback-only supported
|
|
109
|
+
deployment. The initial gate isolated an e4b chirp trajectory mismatch and
|
|
110
|
+
a mixed-KV teacher-forced logit mismatch; both are resolved below rather
|
|
111
|
+
than carried as hidden exceptions.
|
|
112
|
+
- **Wave 1:** 134 focused tests passed across web fetch/media policy,
|
|
113
|
+
expert-I/O, jobs, generation gateway, protocol translators, and the live
|
|
114
|
+
server. Coverage includes private DNS and redirects, chunked response caps,
|
|
115
|
+
250 wait/close races, synchronous spawn failure plus queue drain, translated
|
|
116
|
+
stream cancellation exactly once, request abort, and immediate serial-lane
|
|
117
|
+
reuse.
|
|
118
|
+
- **Wave 2:** 91 focused tests passed across adapters/training, IFEval,
|
|
119
|
+
ResponseStore, grammar, download, and the live server. Evidence includes a
|
|
120
|
+
real PEFT-layout numeric delta, delayed config writes plus immediate remount,
|
|
121
|
+
unequal padded rows, shared LoRA+ leaf scales for SFT/DPO/ORPO, frozen-corpus
|
|
122
|
+
scorer equivalence, fake-clock reordered LRU expiry, every guided degrade
|
|
123
|
+
form, the `topLogprobs` jump gate, and malformed SHA-1 IDs.
|
|
124
|
+
- **Wave 3 focused gate:** 197 tests passed. Fifty diffusion early-stop loops
|
|
125
|
+
dispose 300/300 targeted wrappers with flat active memory; 200 shard-N
|
|
126
|
+
loader failures free every current/prior map exactly once; all three native
|
|
127
|
+
transform constructors return slots, closures, and callbacks to zero under
|
|
128
|
+
repeated failure injection. The root typecheck now includes DOM/web sources
|
|
129
|
+
and the formerly excluded web tests. `scripts/test.sh` enumerates
|
|
130
|
+
`scripts/bench-serving-load.test.ts` exactly once and rejects gate drift.
|
|
131
|
+
- `bunx tsc --noEmit`, `bun scripts/check-hygiene.ts`, `bash -n
|
|
132
|
+
scripts/test.sh`, and `git diff --check` are green after Wave 3. The full
|
|
133
|
+
post-Wave-3 repository gate and both performance measurements remain open.
|
|
134
|
+
- **Post-wave audit:** public-address fetches now dial the DNS-checked IP while
|
|
135
|
+
preserving the logical Host/SNI, closing the validation/connect rebinding
|
|
136
|
+
window. The gateway owns grammar disposal even for already-aborted and
|
|
137
|
+
queued-aborted requests. A live server test covers both chat and text
|
|
138
|
+
completion cancellation and every guided degrade form; it caught and fixed
|
|
139
|
+
the non-ASCII `Warning` header value that helper-only coverage missed.
|
|
140
|
+
Standard PEFT `use_rslora` now mounts and saves at exactly
|
|
141
|
+
`alpha / sqrt(rank)`. Custom-VJP also frees the first callback if allocation
|
|
142
|
+
of the second callback throws.
|
|
143
|
+
- **PERF-01:** `scripts/bench-stream-decoder.ts` measured the original
|
|
144
|
+
full-history decoder against the bounded exact-suffix implementation with
|
|
145
|
+
five paired repetitions. MiniCPM5 medians were 142.62 → 27.40 ms at 512
|
|
146
|
+
tokens (5.20×), 576.01 → 56.45 ms at 1,024 (10.20×), and 2,284.57 →
|
|
147
|
+
115.16 ms at 2,048 (19.84×; before IQR 2,258.83–2,297.20 ms, after
|
|
148
|
+
113.62–116.06 ms). Every per-push chunk and final byte stream matched at
|
|
149
|
+
64–2,048 tokens; the e4b 1,024-token check was 88.62 → 10.25 ms. Raw,
|
|
150
|
+
gitignored artifacts are under `reports/perf-01-stream-decoder-*.json`.
|
|
151
|
+
- **PERF-02:** `scripts/bench-logprobs-readback.ts` confirmed the reported
|
|
152
|
+
barrier on a clean M1 Max 32 GB with Bun 1.3.14 and
|
|
153
|
+
Qwen2.5-0.5B-Instruct-4bit (256 tokens, two warmups, five measured rounds).
|
|
154
|
+
At clean base `00e597e`, off/logprobs/top-5 medians were
|
|
155
|
+
802.75/1,185.89/1,354.21 ms: logprobs cost 1.477× and top-5 cost 1.687×.
|
|
156
|
+
Clean fix commit `b1cb7cb` measured 803.94/802.77/856.24 ms:
|
|
157
|
+
0.999× and 1.065× the off arm. The off control moved only 0.15%; selected
|
|
158
|
+
logprob throughput rose 220.52→329.18 tok/s and top-5 rose
|
|
159
|
+
192.69→307.63 tok/s. All 40 parity checks passed; all 1,280 selected values
|
|
160
|
+
and all 1,280 emitted top-k entries were bit-exact with zero maximum delta.
|
|
161
|
+
Raw gitignored artifacts:
|
|
162
|
+
`scripts/reports/perf02-logprobs-readback-2026-07-30T04-40-09-139Z.json`
|
|
163
|
+
(before) and
|
|
164
|
+
`reports/perf02-logprobs-readback-2026-07-30T04-50-06-626Z.json` (after).
|
|
165
|
+
The focused affected-path gate is 100/100 green, with typecheck, hygiene,
|
|
166
|
+
and diff checks green.
|
|
167
|
+
- **Oracle-drift closeout:** the e4b frontend differs from the oracle mel by
|
|
168
|
+
at most `4.768e-7`, inside the existing `1e-5` T0 contract. With the oracle
|
|
169
|
+
mel, the tower output is byte-exact at the actual bf16/divide language-model
|
|
170
|
+
splice boundary. The allowed frontend residual changes only a handful of
|
|
171
|
+
bf16 values and crosses a later greedy near-tie (`contains`/`features`) with
|
|
172
|
+
the same factual chirp description, so the fixture now gates exact splice
|
|
173
|
+
IDs/counts and the decoded fact. The mixed-KV mismatch was stale untracked
|
|
174
|
+
`.bin` data: regenerating with MLX `0.31.2`, mlx-lm `0.31.3`, OptiQ `0.2.15`,
|
|
175
|
+
and model revision `5b1101065d2094c8f12aa87fee80e0afa5b292b7` makes all
|
|
176
|
+
four logit steps bit-exact. Its tracked manifest now records that provenance
|
|
177
|
+
and each blob's SHA-256, which the parity test verifies before comparison.
|
|
178
|
+
- **Repository closeout gate:** `bash scripts/test.sh` completed both shards:
|
|
179
|
+
shard 1 passed 760 with 42 skips across 107 files; shard 2 passed 1,097 with
|
|
180
|
+
29 skips across 108 files. Total: 1,857 pass, 71 intentional skip, zero
|
|
181
|
+
failures. Typecheck, hygiene, and diff checks are green. The formal exit is
|
|
182
|
+
closed and Phase 21 is unpaused at its G1/G3 quiet-machine measurements.
|
|
183
|
+
|
|
184
|
+
## 5. Execution waves
|
|
185
|
+
|
|
186
|
+
### Wave 0 — freeze the baseline and open the ledger
|
|
187
|
+
|
|
188
|
+
- Record the current commit, Bun version, test/typecheck commands, and supported
|
|
189
|
+
deployment assumption (loopback only).
|
|
190
|
+
- Treat reproduction as a rolling gate in risk order: establish the P0 cases
|
|
191
|
+
first and fix them without waiting for every later-wave reproducer.
|
|
192
|
+
- For each active row, add the smallest deterministic failing test or, for
|
|
193
|
+
PERF-01/PERF-02, an honest baseline benchmark.
|
|
194
|
+
- Change a row to **reproduced** or **disproved** before editing its production
|
|
195
|
+
path. A statically obvious one-line ownership bug still needs failure-path
|
|
196
|
+
coverage.
|
|
197
|
+
- Keep fixtures model-free where possible. Any model/quiet-machine step is
|
|
198
|
+
labeled USER-RUN and may not be silently replaced by a loaded-machine number.
|
|
199
|
+
|
|
200
|
+
### Wave 1 — stop unsafe and runaway work
|
|
201
|
+
|
|
202
|
+
Land independent changes in this order:
|
|
203
|
+
|
|
204
|
+
1. **SEC-01** — shared SSRF/redirect/body-cap policy;
|
|
205
|
+
2. **LIFE-01** — native wait/close lifetime contract;
|
|
206
|
+
3. **CANCEL-01 + CANCEL-02** — one end-to-end cancellation vertical slice
|
|
207
|
+
across OpenAI, Anthropic, and Responses surfaces; and
|
|
208
|
+
4. **JOB-01** — exception-safe GPU lease ownership and queue drain.
|
|
209
|
+
|
|
210
|
+
Wave gate: focused suites plus cancellation-after-abort follow-up requests,
|
|
211
|
+
native wait/close churn, and full model-free tests. No P0 row may be deferred
|
|
212
|
+
without a new product-scope decision in `PLAN.md`.
|
|
213
|
+
|
|
214
|
+
### Wave 2 — restore advertised correctness and durable output
|
|
215
|
+
|
|
216
|
+
Use small review units:
|
|
217
|
+
|
|
218
|
+
1. **ADAPTER-01 + TRAIN-01** — adapters can be produced durably and mounted in
|
|
219
|
+
both supported layouts;
|
|
220
|
+
2. **TRAIN-02 + METRIC-01** — training knobs and throughput accounting mean
|
|
221
|
+
what the API says;
|
|
222
|
+
3. **EVAL-01** — one canonical, clearly labeled IFEval result;
|
|
223
|
+
4. **STORE-01** — TTL and LRU are separate correct invariants; and
|
|
224
|
+
5. **GRAMMAR-01 + GRAMMAR-02 + SEC-02** — protocol/data validation edges.
|
|
225
|
+
|
|
226
|
+
Wave gate: all focused fixtures, one save-then-immediate-mount adapter flow,
|
|
227
|
+
frozen-corpus scorer equivalence, and the full model-free suite.
|
|
228
|
+
|
|
229
|
+
### Wave 3 — close resource and gate debt
|
|
230
|
+
|
|
231
|
+
1. Fix **LEAK-01**, **LEAK-02**, and **LEAK-03** with failure/early-exit handle
|
|
232
|
+
accounting.
|
|
233
|
+
2. Remove **HYG-01**.
|
|
234
|
+
3. Close **HYG-02** and **HYG-03** last so the enlarged type/test gate judges
|
|
235
|
+
all earlier work.
|
|
236
|
+
|
|
237
|
+
Wave gate: repeated failure-path loops stay flat, `bunx tsc --noEmit` covers
|
|
238
|
+
the newly admitted sources, hygiene is green, and `scripts/test.sh` executes
|
|
239
|
+
every model-free test including the serving-load test.
|
|
240
|
+
|
|
241
|
+
### Wave 4 — measure before optimizing
|
|
242
|
+
|
|
243
|
+
Run **PERF-01** and **PERF-02** only after correctness and cancellation have
|
|
244
|
+
stabilized the baseline.
|
|
245
|
+
|
|
246
|
+
- Preserve raw benchmark artifacts outside curated results.
|
|
247
|
+
- Record tokenizer/output lengths, model/config where applicable, warmup,
|
|
248
|
+
repetitions, median and spread, and machine load.
|
|
249
|
+
- Optimize only when the measured cost is material to an affected surface.
|
|
250
|
+
- Require paired before/after results plus exact output parity. If the effect
|
|
251
|
+
is immaterial, mark the row **disproved** or **deferred with evidence**; do
|
|
252
|
+
not land speculative complexity.
|
|
253
|
+
- Curate a number into `benchmarks/RESULTS.md` only when it passed the
|
|
254
|
+
repository’s quiet-machine preflight.
|
|
255
|
+
|
|
256
|
+
### Wave 5 — deployment decision and closeout
|
|
257
|
+
|
|
258
|
+
- Keep **DEPLOY-01..03** deferred together while loopback-only is an enforced
|
|
259
|
+
product invariant.
|
|
260
|
+
- Before adding a non-loopback flag, tunnel quickstart, or reverse-proxy
|
|
261
|
+
support, reopen all three as one threat-model/API project. “Ten easy lines”
|
|
262
|
+
are not sufficient without deciding trusted origins and authentication.
|
|
263
|
+
- Run the final exit gate, update this ledger’s states/evidence, update
|
|
264
|
+
`STATUS.md`, and explicitly unpause Phase 21.
|
|
265
|
+
|
|
266
|
+
## 6. Per-item working loop
|
|
267
|
+
|
|
268
|
+
Every active item uses the same loop:
|
|
269
|
+
|
|
270
|
+
1. **Revalidate:** trace the current call/data path and replace stale line
|
|
271
|
+
numbers with symbol-level anchors.
|
|
272
|
+
2. **Reproduce:** check in the minimal red regression, failure injection,
|
|
273
|
+
stress case, or baseline benchmark.
|
|
274
|
+
3. **State the invariant:** describe ownership, cancellation, metric, or
|
|
275
|
+
protocol behavior in one sentence before choosing a fix.
|
|
276
|
+
4. **Patch narrowly:** one invariant per branch/commit. The cancellation
|
|
277
|
+
vertical slice and closely coupled adapter save/mount work are deliberate
|
|
278
|
+
exceptions.
|
|
279
|
+
5. **Adversarial pass:** test abort during await, constructor throw, redirect,
|
|
280
|
+
partial write, reordered LRU, unequal padding, and repeated teardown as
|
|
281
|
+
appropriate—not just the happy path.
|
|
282
|
+
6. **Run gates:** focused test, affected subsystem suite, then the current wave
|
|
283
|
+
gate.
|
|
284
|
+
7. **Document with the behavior:** any served field, warning, default, flag, or
|
|
285
|
+
support claim updates README/reference docs in the same change.
|
|
286
|
+
8. **Close honestly:** record **fixed**, **disproved**, or **deferred**, with
|
|
287
|
+
the exact test/benchmark artifact. Do not close on “code looks right.”
|
|
288
|
+
|
|
289
|
+
Recommended branch/PR naming is `fix/<ledger-id>-<slug>`. Keep at most two
|
|
290
|
+
independent changes in flight and avoid concurrent edits to `server.ts` or
|
|
291
|
+
`generate.ts`. Merge in wave order; rebase and rerun the focused reproducer
|
|
292
|
+
after any overlapping merge.
|
|
293
|
+
|
|
294
|
+
## 7. Gate matrix
|
|
295
|
+
|
|
296
|
+
| Area | Required focused evidence |
|
|
297
|
+
|---|---|
|
|
298
|
+
| Protocol cancellation | `tests/{server,anthropic,responses}.test.ts`; slow synthetic source; cancel/abort followed by immediate lane reuse |
|
|
299
|
+
| Jobs | `tests/jobs.test.ts`; injected synchronous spawn failure and queue drain |
|
|
300
|
+
| Native expert I/O | `tests/expert-io-native.test.ts`; repeated wait/close race and post-close-call detection |
|
|
301
|
+
| Web fetch/download security | `tests/{web-tools,download}.test.ts`; private DNS/redirect, body cap, traversal/malformed IDs |
|
|
302
|
+
| Adapters/training | `tests/{lora,train-*,ifeval}.test.ts`; delayed writes, PEFT + mlx-lm layouts, unequal padding, optimizer LR scales, frozen scorer corpus |
|
|
303
|
+
| Grammar/Responses store | `tests/{grammar,grammar-jump,responses,server}.test.ts`; degrade forms, top-logprob alignment, fake-clock reordered LRU |
|
|
304
|
+
| MLX/resource ownership | focused diffusion/weights/autograd/checkpoint/custom-VJP failure loops with handle/allocation baselines |
|
|
305
|
+
| Repository gate | `bun scripts/check-hygiene.ts`, `bunx tsc --noEmit`, `bash scripts/test.sh`; prove `scripts/bench-serving-load.test.ts` is included |
|
|
306
|
+
| Performance | deterministic raw artifact, paired A/B, exact output parity, quiet-machine preflight before any curated claim |
|
|
307
|
+
|
|
308
|
+
## 8. Exit gate
|
|
309
|
+
|
|
310
|
+
Colibri may resume only when:
|
|
311
|
+
|
|
312
|
+
- every P0 and P1 row is **fixed** or **disproved** with checked-in evidence;
|
|
313
|
+
- every P2 row is fixed, disproved, or explicitly parked with a bounded impact
|
|
314
|
+
and owner;
|
|
315
|
+
- PERF-01 and PERF-02 have measured baselines and are either fixed with paired
|
|
316
|
+
wins or closed without an optimization claim;
|
|
317
|
+
- cancellation is proven end-to-end on streaming and non-streaming protocol
|
|
318
|
+
surfaces, including prompt lane reuse after abort;
|
|
319
|
+
- native lifetime and constructor/load failure stress tests stay flat;
|
|
320
|
+
- SSRF redirect/DNS/body-cap and blob-ID tests are green;
|
|
321
|
+
- typecheck and the complete model-free gate are green with the former
|
|
322
|
+
exclusions removed and the serving-load test included;
|
|
323
|
+
- documentation matches any changed public behavior; and
|
|
324
|
+
- `STATUS.md` names the exact Phase 21 resume action: finish the G1/G3 quiet
|
|
325
|
+
matrix/path choice, then begin G4.
|
|
326
|
+
|
|
327
|
+
The deferred deployment trio does not block this exit while the product
|
|
328
|
+
remains loopback-only. Any decision to support remote exposure invalidates
|
|
329
|
+
that deferral and reopens all three together.
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# Repo cleanup plan
|
|
2
|
+
|
|
3
|
+
Status: PLANNED (2026-07-02, written post-v0.0.10). The audit behind it:
|
|
4
|
+
`.git` was 179 MB, driven by 497 machine-specific golden `.bin` blobs
|
|
5
|
+
(~290 MB working tree, every regen compounding history); root has ~30
|
|
6
|
+
entries of mixed tracked/untracked provenance; `repro/` was undocumented.
|
|
7
|
+
Already done in v0.0.10: `.bin` goldens untracked + gitignored +
|
|
8
|
+
`goldens/README.md` policy; CLAUDE.md root-layout map. This plan is the
|
|
9
|
+
rest, phased so each step is safe, reversible (except C1, which is the
|
|
10
|
+
point), and independently shippable.
|
|
11
|
+
|
|
12
|
+
Principle: the hygiene discipline IS the product edge — every phase ends
|
|
13
|
+
with a guardrail so the mess can't re-form, not just a one-time sweep.
|
|
14
|
+
|
|
15
|
+
## What can actually be lost? Nothing. (Read this before re-litigating.)
|
|
16
|
+
|
|
17
|
+
Every binary this plan untracks or purges survives in MULTIPLE independent
|
|
18
|
+
places, so "we might lose the goldens/fixtures" is not a reason to stall:
|
|
19
|
+
|
|
20
|
+
1. **Both dev laptops' working trees** — `git rm --cached` and `.gitignore`
|
|
21
|
+
never touch disk; the files sit exactly where they were.
|
|
22
|
+
2. **Git history** — until Phase C runs, every previously-committed byte is
|
|
23
|
+
still in `.git` and recoverable with `git show <rev>:<path>`.
|
|
24
|
+
3. **The Phase-C mirror backup** — `scripts/history-rewrite.sh` refuses to
|
|
25
|
+
rewrite before writing `~/mlx-bun-history-backup-<date>.tar` (a full
|
|
26
|
+
pre-rewrite mirror, kept forever). Even after the purge, every historical
|
|
27
|
+
blob is one `tar -x` away.
|
|
28
|
+
4. **Regen scripts** — goldens regenerate from `scripts/regen-*` + the
|
|
29
|
+
oracle venv; the universal-rope fixtures from their gen script.
|
|
30
|
+
5. **Pinned-hash fetch** — the two LoRA adapter fixtures are sha256-pinned
|
|
31
|
+
in `scripts/fetch-test-fixtures.sh`, sourced from the `test-fixtures-v1`
|
|
32
|
+
GitHub release (one command to create — see the script header) or
|
|
33
|
+
either laptop.
|
|
34
|
+
|
|
35
|
+
And no test can break: every suite that reads a binary fixture gates on
|
|
36
|
+
FILE PRESENCE and skips cleanly when it's absent (goldens via
|
|
37
|
+
tests/goldens.ts, LoRA via `haveAdapters`, universal-rope via its own
|
|
38
|
+
check). Untracked ≠ deleted ≠ unrunnable.
|
|
39
|
+
|
|
40
|
+
## Phase A — root consolidation (30 min, zero risk) — DONE 2026-07-02
|
|
41
|
+
|
|
42
|
+
- `[x]` **A1. `lab/`**: `git mv repro lab/repro && git mv spikes lab/spikes`.
|
|
43
|
+
One home for "code that proves a point but isn't the product": upstream
|
|
44
|
+
bug reproductions and feasibility probes. Update the CLAUDE.md layout map
|
|
45
|
+
+ the two docs that reference `repro/` (grep first: `grep -rn "repro/"
|
|
46
|
+
docs/ *.md`).
|
|
47
|
+
- Also updated every path reference (CLAUDE.md, PLAN.md, PLAN-archive.md,
|
|
48
|
+
docs/investigations/lab-build-journal.md, docs/design/docs-reorg-plan.md,
|
|
49
|
+
and the `repro/`-pointing comments in src/mlx/{ffi,array,autograd,ops}.ts
|
|
50
|
+
+ tests/{ffi-jit,train-autograd}.test.ts + the repro's own ISSUE.md).
|
|
51
|
+
- `[x]` **A2. root strays** (all untracked; no git surgery): delete
|
|
52
|
+
`train.log`; move `benchmarks-e4b-flag-matrix-2026-06-15.json` into
|
|
53
|
+
`reports/`; confirm `.DS_Store` is gitignored globally.
|
|
54
|
+
- `train.log` deleted; benchmark json moved to `reports/`; `.DS_Store`
|
|
55
|
+
already globally gitignored (`.gitignore`).
|
|
56
|
+
- `[x]` **A3. `archive/` → `docs/archive/`**: the two frozen HTML reports
|
|
57
|
+
are docs, not a root concern. `git mv`, update CLAUDE.md map.
|
|
58
|
+
- Exit: root = code (`src tests scripts`), product surfaces (`docs website
|
|
59
|
+
packaging bin extensions`), fixtures (`goldens fixtures lab`), meta
|
|
60
|
+
(README/PLAN/STATUS/CLAUDE + configs), and gitignored working dirs. Every
|
|
61
|
+
tracked root entry appears in the CLAUDE.md layout map.
|
|
62
|
+
|
|
63
|
+
## Phase B — tracked-content policy + guardrail (1 h) — DONE 2026-07-02 (B2 closed same day)
|
|
64
|
+
|
|
65
|
+
- `[x]` **B1. Binary-in-git gate**: `scripts/check-hygiene.ts` — FAILS on
|
|
66
|
+
any tracked file that is (a) >1 MB, or (b) matches `*.bin|*.safetensors|
|
|
67
|
+
*.dylib|*.gguf|*.metallib` — outside an explicit, size-capped, justified
|
|
68
|
+
allowlist. Wired into `scripts/test.sh` (runs before tests) AND CI
|
|
69
|
+
(`.github/workflows/ci.yml` `hygiene` job, gates typecheck). Supports
|
|
70
|
+
`--staged` for pre-commit use. This is the "can't re-form" guarantee.
|
|
71
|
+
- `[x]` **B2. fixtures/ audit**: 13 MB, 2 tracked `.safetensors`.
|
|
72
|
+
Decision per file:
|
|
73
|
+
- `fixtures/adapters/{upper,french}/adapters.safetensors` (6.6 MB each):
|
|
74
|
+
KEEP tracked, on the gate's explicit allowlist (cap 7 MB). They are
|
|
75
|
+
stable one-time-trained LoRA adapter INPUTS (trained 2026-06-10, never
|
|
76
|
+
churned) for the opt-in `MLX_BUN_TEST_LORA` hot-swap test, which also
|
|
77
|
+
requires the e4b base. The tracked `adapter_config.json` + `data-*/`
|
|
78
|
+
jsonl fully describe how to reproduce them; a bit-exact regen script
|
|
79
|
+
(trainer-of-record: optiq `lora train` vs mlx-lm — the saved config is
|
|
80
|
+
ambiguous) is a Josh task to confirm + smoke. NOT untracked now because
|
|
81
|
+
an untested untrack would break the lora hot-swap parity test, and these
|
|
82
|
+
do not churn (the goldens-bloat problem was *churning* artifacts). This
|
|
83
|
+
is a deliberate allowlist exception, not the default `fixtures/ ≤ 2 MB`
|
|
84
|
+
policy.
|
|
85
|
+
- **CLOSED later the same day**: untracked + gitignored after pinning the
|
|
86
|
+
bytes by sha256 in `scripts/fetch-test-fixtures.sh` (fetch from the
|
|
87
|
+
`test-fixtures-v1` release / either laptop / pre-rewrite history; the
|
|
88
|
+
gated LoRA test skips cleanly when absent — verified). The regen-
|
|
89
|
+
ambiguity concern was real but orthogonal: preservation is by pinned
|
|
90
|
+
original bytes, not by retraining. Allowlist entry removed; gate green
|
|
91
|
+
with ZERO multi-MB binaries tracked.
|
|
92
|
+
- `[x]` **B3. tests/ binary audit**: 27 tracked `.bin` under
|
|
93
|
+
`tests/fixtures/universal-rope/` (4–8 KB each, ~108 KB total). All are
|
|
94
|
+
model-free CI-load-bearing bit-exact oracle fixtures (used by
|
|
95
|
+
`tests/universal-rope.test.ts`, which skips cleanly if absent),
|
|
96
|
+
regenerated by `scripts/gen-universal-rope-fixtures.py`. STAY, on the
|
|
97
|
+
allowlist (cap 16 KB each). Also allowlisted: `tests/fixtures/qwen-delta-golden.json`
|
|
98
|
+
(1.08 MB text JSON golden, model-free, regen script exists).
|
|
99
|
+
- Exit: `git ls-files | grep -E '\.(bin|safetensors|dylib)$'` returns only
|
|
100
|
+
allowlisted entries; the gate enforces it forever.
|
|
101
|
+
|
|
102
|
+
## Phase C — history rewrite (the 179 MB) — DONE 2026-07-02 (Josh go)
|
|
103
|
+
|
|
104
|
+
Executed 2026-07-02 on Josh's explicit go. Result: `.git` **182 MB →
|
|
105
|
+
20 MB**. Notes on what actually ran (vs the sketch below):
|
|
106
|
+
|
|
107
|
+
- C1: dry-run `--analyze` confirmed goldens `.bin` = the entire bloat.
|
|
108
|
+
Actual invocation, narrower than sketched (no size threshold needed):
|
|
109
|
+
`git filter-repo --invert-paths --path-glob 'goldens/*.bin'
|
|
110
|
+
--path-glob 'goldens/*/*.bin'` — both globs needed because git
|
|
111
|
+
pathspec `**` doesn't span the flat + one-deep layout; covers all 497
|
|
112
|
+
historical blobs. Verified pre-push: 343 commits in/out, HEAD tree
|
|
113
|
+
bit-identical to original, zero `.bin` left anywhere in goldens
|
|
114
|
+
history, tags remapped.
|
|
115
|
+
- C2: force-pushed main + branches + tags. Mirror backup at
|
|
116
|
+
`~/mlx-bun-mirror-backup-2026-07-02.tar.gz` (143 MB) — delete once
|
|
117
|
+
both boxes verified. M1 Max done: fetch --force + reset --hard,
|
|
118
|
+
surviving branches remapped, stale agent-session worktrees/branches
|
|
119
|
+
deleted (Josh: only main matters), stray `refs/codex`/`refs/original`
|
|
120
|
+
pruned, reflog expired, gc'd to 20 MB. **M4 Pro remaining (Josh)**:
|
|
121
|
+
`git fetch origin --tags --force --prune && git reset --hard
|
|
122
|
+
origin/main` (or fresh clone).
|
|
123
|
+
- C3: `v0.0.10` resolves; release assets untouched (they live outside
|
|
124
|
+
git history); hygiene gate green; regen path proven live —
|
|
125
|
+
`bun scripts/regen-fused-sdpa-goldens.ts` rewrote
|
|
126
|
+
`goldens/apple-m1-max/fused-sdpa.{json,bin}`. The full suite could not
|
|
127
|
+
be run from the executing session (tooling restriction); run it once
|
|
128
|
+
per box as the final check.
|
|
129
|
+
|
|
130
|
+
**Now ONE COMMAND**: `scripts/history-rewrite.sh` (dry-run by default,
|
|
131
|
+
`MLX_BUN_REWRITE_GO=1` to execute) — it enforces every precondition below,
|
|
132
|
+
writes the permanent mirror backup first, purges goldens `.bin` + the
|
|
133
|
+
adapter safetensors from history, force-pushes, and prints the re-clone
|
|
134
|
+
steps for the other laptop.
|
|
135
|
+
|
|
136
|
+
One-time, destructive-by-design, ~15 min total. Preconditions: BOTH
|
|
137
|
+
laptops fully pushed (verify `git log origin/main..HEAD` empty on each);
|
|
138
|
+
no open PRs; a fresh `git clone --mirror` tarball kept as belt-and-
|
|
139
|
+
suspenders until both machines are re-cloned.
|
|
140
|
+
|
|
141
|
+
- `[x]` **C1. rewrite**: `git filter-repo --strip-blobs-bigger-than 200K
|
|
142
|
+
--path-glob 'goldens/**/*.bin' --invert-paths` (exact invocation to be
|
|
143
|
+
dry-run first with `--analyze`; target: drop all historical goldens
|
|
144
|
+
`.bin` while keeping every text file's history intact).
|
|
145
|
+
- `[x]` **C2. force-push** `main` (+ tags), re-clone on BOTH laptops
|
|
146
|
+
(M1 Max + M4 Pro), re-link local-only assets (nothing tracked is lost —
|
|
147
|
+
the blobs being dropped are regenerable and already untracked at HEAD).
|
|
148
|
+
- `[x]` **C3. verify**: `du -sh .git` (expect ~15–25 MB), `bash
|
|
149
|
+
scripts/test.sh` green, one `scripts/regen-*` smoke to prove the regen
|
|
150
|
+
path, tag `v0.0.10` still resolves + release assets untouched (GitHub
|
|
151
|
+
releases store assets outside git history).
|
|
152
|
+
- NOT doing LFS: 290 MB of churning machine-specific artifacts is exactly
|
|
153
|
+
what LFS quotas punish, and the regen scripts make the artifacts
|
|
154
|
+
reproducible — a fixture server is overkill for a two-laptop project.
|
|
155
|
+
- Exit: fresh clone < 30 MB ✓ (20 MB); M1 Max on rewritten history ✓;
|
|
156
|
+
M4 Pro pending its one-line reset (see notes above).
|
|
157
|
+
|
|
158
|
+
## Phase D — docs debt (follow-the-map, 1–2 h, independent) — gate DONE 2026-07-02
|
|
159
|
+
|
|
160
|
+
- `[~]` **D1.** PLAN.md is 139 KB — move closed phases older than Phase 17
|
|
161
|
+
into PLAN-archive.md (the established pattern; keep PLAN.md scannable).
|
|
162
|
+
- **Finding (2026-07-02):** no candidates currently. Every phase <17 in
|
|
163
|
+
PLAN.md (6, 7, 12, 13, 14, 15, 16) is marked `[~]` or `[ ]` — none are
|
|
164
|
+
`[x]`/CLOSED, and the established archive pattern archives only
|
|
165
|
+
`[x]`-marked phases. Phases 6 and 16 have *all* their checkboxes
|
|
166
|
+
checked but carry a deliberate `[~]`; reclassifying them to closed +
|
|
167
|
+
archiving is a Josh state-call (they may have ongoing narrative
|
|
168
|
+
threads). The closed `oMLX` phase (2026-07-02) and Phase 19 are
|
|
169
|
+
*newer* than 17, so they stay in PLAN.md as recent history per the
|
|
170
|
+
criterion. Revisit D1 when a <17 phase is confirmed closed.
|
|
171
|
+
- `[x]` **D2.** `docs/investigations/curve-runs/` + two untracked HTML
|
|
172
|
+
strays in docs/investigations: gitignore or move under `reports/`.
|
|
173
|
+
- Already satisfied: `docs/investigations/curve-runs/` is gitignored
|
|
174
|
+
(`.gitignore`), and the four HTML strays (`curve-terrain.html`,
|
|
175
|
+
`hlg-ab.html`, `hlg-report.html`, `hlg-explorer.html`) are gitignored
|
|
176
|
+
via `docs/investigations/*.html`. No action needed.
|
|
177
|
+
- `[x]` **D3.** The CLAUDE.md doc-map lists are hand-maintained; add a
|
|
178
|
+
`scripts/check-hygiene.ts` assertion that every `docs/**/*.md` appears in
|
|
179
|
+
the map (same guardrail spirit as B1).
|
|
180
|
+
- Implemented in `check-hygiene.ts` (`docs-map` check). First run caught
|
|
181
|
+
10 drifted docs (3 design, 1 investigation, 6 planning) — all added to
|
|
182
|
+
the CLAUDE.md map. Gate now green; CI enforces it on every push/PR.
|
|
183
|
+
|
|
184
|
+
## Ordering & ownership
|
|
185
|
+
|
|
186
|
+
A and D anytime (safe, agent-executable solo) — DONE 2026-07-02. B gate
|
|
187
|
+
DONE 2026-07-02 (B2 adapter-untrack deferred to Josh — see B2 finding).
|
|
188
|
+
C executed 2026-07-02 on Josh's explicit go — only remaining tail is the
|
|
189
|
+
M4 Pro reset + deleting the backup tarball once both boxes are green.
|
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
# Runtime isolation — the AI may crash, the UI never may
|
|
2
2
|
|
|
3
|
-
Status: **
|
|
3
|
+
Status: **P1 LANDED 2026-07-05** (opt-in `--isolate`; default flip after
|
|
4
|
+
bake). Phase 1 (yields) fully landed same day (the gateway onToken hop
|
|
5
|
+
existed; prefill chunk yields added). **ARCHITECTURE DECISION (2026-07-05,
|
|
6
|
+
deviates from the IPC sketch below):** the engine child is the ENTIRE
|
|
7
|
+
existing server on a unix domain socket; the parent is a thin reverse
|
|
8
|
+
proxy (src/serve/isolate.ts). Rationale: the gateway-as-IPC-client cut
|
|
9
|
+
would serialize grammar controllers (WASM), vision embeddings (GPU
|
|
10
|
+
arrays), sampler closures, and prompt-cache hooks over a message protocol
|
|
11
|
+
— weeks of re-plumbing; HTTP-over-UDS reuses the whole serving stack
|
|
12
|
+
verbatim, streams SSE for free, and cancellation is abort propagation.
|
|
13
|
+
The inter-process API is the existing /v1 surface — no second protocol.
|
|
14
|
+
**Measured (M1 Max, cpm5, paired)**: proxied 197.2 vs direct 197.9 tok/s
|
|
15
|
+
(−0.4%, noise), TTFT +2 ms, SSE per-token granularity preserved (96 reads
|
|
16
|
+
/ 96 tokens), parent answers in 0.6 ms mid-decode (criterion: <50 ms),
|
|
17
|
+
child kill → 502 + respawn (gated model-free + E2E:
|
|
18
|
+
tests/isolate-proxy.test.ts, tests/isolate-e2e.test.ts). Not proxied yet:
|
|
19
|
+
/ws/chat (501 + pointer). P2 = child-per-model pool (multi-model switch by
|
|
20
|
+
spawn-overlap); P3 = GPU-lease unification. The original design follows.
|
|
4
21
|
Owner: serving layer / runtime
|
|
5
|
-
Default today: inference runs
|
|
6
|
-
thread. This doc proposes moving it to a **subprocess**.
|
|
22
|
+
Default today: inference runs in-process unless `--isolate` is passed.
|
|
7
23
|
|
|
8
24
|
## Goal
|
|
9
25
|
|
|
@@ -249,8 +249,9 @@ returns the split indices + which donor K/V to save, computed from the above.
|
|
|
249
249
|
- The chunk data needs ≥4096 (median 4092; 0% ≤2048; 98% ≤8192). Success = e4b
|
|
250
250
|
trains at 8192 ≤ ~10 GB AND the chunk eval (`scripts/chunk-eval.ts`) shows a
|
|
251
251
|
quality delta on e4b like MiniCPM5's.
|
|
252
|
-
- Training
|
|
253
|
-
|
|
252
|
+
- Training needs no env-flag sanitization (the no-vjp fused CustomKernels that
|
|
253
|
+
once required `MLX_BUN_PERF_KERNEL=0 MLX_BUN_FUSED_GELU=0` were deleted
|
|
254
|
+
2026-07-05; see docs/design/unified-engine-frontier-plan.md §6).
|
|
254
255
|
- MLX `Date.now()`/random caveats don't apply here; standard determinism via seed.
|
|
255
256
|
|
|
256
257
|
## 7. Key files
|