mlx-bun 0.0.11 → 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.
Files changed (81) hide show
  1. package/README.md +43 -13
  2. package/THIRD_PARTY_LICENSES.md +9 -0
  3. package/docs/design/colibri-glm52-port.md +1479 -0
  4. package/docs/design/pre-colibri-stabilization.md +329 -0
  5. package/docs/investigations/colibri-oracle-pin.md +1284 -0
  6. package/docs/investigations/indexshare-performance-spike.md +357 -0
  7. package/docs/planning/release-notes-v0.0.12.md +80 -0
  8. package/docs/reference/cli.md +28 -2
  9. package/docs/reference/distribution.md +25 -1
  10. package/docs/reference/embedding.md +5 -2
  11. package/docs/reference/features-matrix.md +4 -2
  12. package/docs/reference/library-api.md +41 -13
  13. package/docs/reference/models.md +49 -2
  14. package/docs/reference/server-api.md +90 -9
  15. package/docs/reference/server-config.md +21 -14
  16. package/docs/reference/training.md +10 -1
  17. package/package.json +1 -1
  18. package/src/anthropic.ts +54 -44
  19. package/src/chat-template.ts +155 -10
  20. package/src/cli.ts +127 -8
  21. package/src/config.ts +71 -26
  22. package/src/diffusion/diffusion-generate.ts +14 -8
  23. package/src/download.ts +103 -12
  24. package/src/eval/ifeval.ts +63 -120
  25. package/src/eval/runner.ts +14 -5
  26. package/src/eval/tasks/ifeval.ts +167 -31
  27. package/src/expert-io.ts +391 -0
  28. package/src/expert-residency.ts +1134 -0
  29. package/src/expert-usage.ts +415 -0
  30. package/src/generate.ts +114 -17
  31. package/src/hf-push.ts +1 -1
  32. package/src/index.ts +14 -2
  33. package/src/jobs/runner.ts +37 -18
  34. package/src/kv-store.ts +147 -8
  35. package/src/lora.ts +77 -14
  36. package/src/media-fetch.ts +198 -56
  37. package/src/mlx/array.ts +43 -0
  38. package/src/mlx/autograd.ts +51 -14
  39. package/src/mlx/checkpoint.ts +46 -13
  40. package/src/mlx/custom-vjp.ts +83 -35
  41. package/src/model/factory.ts +96 -5
  42. package/src/model/gemma4-base.ts +32 -0
  43. package/src/model/glm52-atlas.ts +511 -0
  44. package/src/model/glm52-cache.ts +706 -0
  45. package/src/model/glm52-config.ts +262 -0
  46. package/src/model/glm52-container.ts +305 -0
  47. package/src/model/glm52-coupling.ts +388 -0
  48. package/src/model/glm52-dsa.ts +602 -0
  49. package/src/model/glm52-expert-layout.ts +253 -0
  50. package/src/model/glm52-layout.ts +152 -0
  51. package/src/model/glm52-memory.ts +473 -0
  52. package/src/model/glm52-mla.ts +786 -0
  53. package/src/model/glm52-moe.ts +223 -0
  54. package/src/model/glm52-pilot.ts +537 -0
  55. package/src/model/glm52-reference.ts +445 -0
  56. package/src/model/glm52-residency.ts +557 -0
  57. package/src/model/glm52-resident-weights.ts +135 -0
  58. package/src/model/glm52-streamed-experts.ts +453 -0
  59. package/src/model/glm52-streamed-metal.ts +610 -0
  60. package/src/model/glm52-weights.ts +503 -0
  61. package/src/model/glm52.ts +1153 -0
  62. package/src/model/support.ts +8 -1
  63. package/src/native/expert_io.c +523 -0
  64. package/src/native-pack.ts +6 -4
  65. package/src/responses.ts +62 -49
  66. package/src/serve/batch-scheduler.ts +95 -16
  67. package/src/serve/generation-gateway.ts +41 -16
  68. package/src/server.ts +362 -81
  69. package/src/spec/glm52-mtp-source.ts +392 -0
  70. package/src/spec/serve-loop.ts +99 -18
  71. package/src/spec/source.ts +31 -6
  72. package/src/ssd-cache.ts +6 -2
  73. package/src/tool-call.ts +30 -2
  74. package/src/train/job.ts +0 -10
  75. package/src/train/lora-params.ts +17 -6
  76. package/src/train/trainer.ts +59 -26
  77. package/src/web/app.html +13 -2
  78. package/src/web/app.js +30 -3
  79. package/src/web/src/status.ts +51 -3
  80. package/src/web-tools.ts +54 -2
  81. package/src/weights.ts +82 -19
@@ -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.