feat(ENG-EXPERT-STREAM-DEVICE): W0f — the dense weights were resident twice, and --device cuda now decodes a 369.97 GiB checkpoint on a 119.631 GiB GB10 (#1299) - #1427
Merged
Conversation
… twice, and `--device cuda` now decodes a 369.97 GiB checkpoint on a 119.631 GiB GB10 (#1299) Replaces #1326. That pull request is correct and reviewed, and its base is gone: it was stacked on `row/ENG-EXPERT-STREAM-DEVICE-W0` at `95883dcae`, and #1377 squash-landed the same W0 work onto `main` as `5f4eb356e`. A squash destroys the merge base, so #1326 now presents product-code conflicts that are two unrelated histories describing one change rather than a disagreement. This branch is that same change rebuilt on `main`, with every one of `main`'s later repairs kept. ## What the defect was With W0's lane on, `Qwen3.8-2.4T-A95B UD-Q1_0` (369.97 GiB) LOADED on `--device cuda` on a 119.631 GiB GB10 and then exhausted the machine inside its first forward: zero decode steps, seven attempts, every one identical (#1299). The measurements name it rather than a reading of the code. A **0.15 GiB** slot arena died exactly where an 18.55 GiB one did, so the arena is not the cost. A 1-token prompt, whose protected set fits with no in-place fallback at all, behaved identically to a 5-token one, so prefill protection is not it. Growth was ANONYMOUS (`RssAnon` 8.1 to 61.4 GB) while file-backed stayed flat, so nothing was pinning the mapping. Host anon plus swap reached ~65 GB against system `used` ~119 GB, and the ~42 GB difference is device memory that unified memory does not charge to RSS. So every non-expert weight was resident twice: once as the host `OwnedTensor`, once as `ResidentWeight`'s device staging copy. On a part where device memory IS host memory, the second copy buys nothing and costs everything. ## The change `ResidentWeight` now takes the same branch W0c gave `KqExpertSlice`, on the same probed predicate: where `Platform::host_memory_is_device_addressable()`, it returns a tensor over `w.bytes.data()` instead of `Alloc` + `Copy` into `w.d_dev`. A DISCRETE device answers false, falls through, and is byte-identical to before, asserted by its own case rather than by inspection. Safety is by alignment, not by surveying kernels. The staging branch is a verbatim byte copy returning the same dtype, shape and dropped marker set, so the only thing a consumer can notice about the substitution is the pointer's alignment. `kDeviceAliasAlignment` is 256 because cuBLASLt's `CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_A_BYTES` defaults to 256 and this tree never sets it, which dominates every explicit pointer gate in the CUDA kernels — at least seven across four files, the strictest asking 32. A plain `std::vector<uint8_t>` gives 16 and no more, so `MakeHostBytesDeviceAliasable` re-homes an OWNED misaligned buffer once into an aligned block: one memcpy that REPLACES the host-to-device copy it removes. A misaligned BORROW declines and stages instead, because copying a clean file-backed GGUF mapping into anonymous memory would create the residency this change exists to remove. ## The result, and the gate that does not pass It decodes. **32/32 steps, peak RSS 97.75 GiB, decode-phase `exhausted` delta 0** (G0-LIVE PASS). G0-CORRECT FAILS: the CUDA ids diverge from the CPU arm at step 7 on a near-tie, where the CPU arm's own runner-up is exactly the token CUDA emitted, 1.4% behind, and one step later the margin is 0.1%. G0-SPEED is therefore VOID by this row's own stop condition and **no rate is claimed anywhere**. ## Can the alias move a logit? Measured on the target silicon, and no The probe compares what a consumer can actually see. `rc` job `7c7a05e9-be87-48f4-94ae-1bbe0340f063` on `dgx:gpu0` — `NVIDIA GB10 sm_121`, driver 580.173.02, cuBLASLt 130101, the predicate re-derived in the job's own output as `pageableMemoryAccess=1 integrated=1` — ran six checkpoint shapes crossed with both cuBLASLt formulations the dense path issues, 12 measurements, `PROBE_EXIT=0`, `PROBE_FAILURES=0`. A repeated heuristic call is identical 12/12; the tree's unset preference equals the documented 256 default 12/12; weakening the promise to 16 moves nothing 12/12; and `cublasLtMatmul` output is bit-exact between a `cudaMalloc` operand and a 256-aligned host block 12/12, `differing=0`. At least five distinct algorithm configurations appear across the twelve and they differ from the earlier `thor:gpu0` leg's, so the heuristic was re-resolved rather than replayed and the instrument discriminates. The structural reason needs no lease: `cublasLtMatmulAlgoGetHeuristic` takes no operand pointers, so alignment reaches it only through a preference this tree never sets. **So the alias does not cause the step-7 divergence.** Excluding one cause is not identifying another. What DOES cause it is unmeasured, and it is carried under `## Owed` with its next traceable step named: a two-arm dump of the step-7 forward that names the first differing tensor. ## What `main` already had, and what this rebuild kept Every repair #1377 and #1378 landed survives, unmodified: - `GgufExpertTowersReachSlotLane`, the fifth lane term, in `gguf_device_fit.{h,cpp}` and read by the loader. This branch does not touch those files. - `PeekRoute` promoted into `include/vllm/model_executor/model_loader/gguf_keep_quant.h`. Untouched. - `HostMemoryIsDeviceAddressableFromAttrs` extracted into `src/vllm/platforms/platform.cpp` and gated over all four attribute pairs. Untouched. - The `HostAddressable` RAII guard `main` introduced in `test_expert_stream_device_slot.cpp`. The one conflicting case now uses it, including for its discrete arm, instead of writing the flag directly. - `docs/USAGE.md`'s limit list keeps `main`'s model-family bullet and its keep-quant/keep-f16 residency bullet (#1378). It grows from four limits to five rather than back to three. ## Records `docs/STATUS.md`, `docs/BENCHMARKS.md` and `docs/FEATURES.md` take one scoped row edit each; every other key is byte-for-byte unchanged. `.agents/benchmark-record.md` is a pure append (198 insertions, 0 deletions). `.agents/issue-index.md` appends two rows and edits none. Two record edits ride here that are not part of W0f and are consequences of it, named so a reviewer does not have to work out why they are in the diff. Adding 198 lines to `qwen3_5_weights.h` moved `struct Fp8Weight` from line 342 to line 540, which `scripts/check-agent-record.py` reported as a stale anchor regression (33 against a baseline of 32); the three citations of it are repointed, in `.agents/quantization-matrix.md` (both the text and the `#L` fragment, which is the one the checker reads) and in two specs. And appending a measurement to `.agents/benchmark-record.md` obliges `docs/FEATURES.md` under `scripts/check-doc-checkpoint.py`, so the routed-expert-streaming row now says the staging device decodes and that its token gate fails. That is #1387's shape, caught before the commit was published rather than after. Issue: #1299 Row issue: #1124 Tripwire filed and covered in flow: #1320 Spec: `.agents/specs/expert-stream-device-slots.md` #1124, #1299 and #1320 all stay OPEN: the row is not finished, the correctness gate does not pass, and #1320's loader-policy half belongs to `QUANT-GGUF-KEEPQ-LOADER`. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…MAIN #1414 landed the W0e measurement while this branch was gating, so main and this branch each appended a record of a run on a DIFFERENT tree: main's at `95883dcae` (the CUDA arm loads and generates nothing) and this branch's at `9c783a8be` (the same harness with W0f, 32/32 steps). Both are kept, in two clearly separated sections, because an append-only record does not get to choose which measurement happened. Where they disagree the standing figure is main's: 11.05 s/token at 4000 slots on a live cache is the CPU number, and this branch's CPU column is a same-lease control rather than a second attempt at it. Five conflicts, all resolved by taking main's version and re-applying the scoped edit rather than by accepting a three-way merge: - `.agents/benchmark-record.md`: pure append of both sections, main's first, 0 deletions. This branch's heading is retitled W0e/W0f to W0f so the two runs are not read as two records of one. - `.agents/specs/expert-stream-device-slots.md`: main's three-gate table, its `## Evidence` section and its `## Owed` rows all survive. The gate table now states what each gate read at `95883dcae` and where W0f moved it. Main's CUDA Evidence subsection is retitled to name the tree it was measured on and is kept verbatim; the W0f re-run is a second subsection beside it. Main's `CLOSED by W0e` row for the CPU denominator is taken as-is; its open row for the first-forward exhaustion is closed by W0f with the correction named. - `docs/STATUS.md`, `docs/BENCHMARKS.md`: one row each, every other key byte-for-byte equal. Main's 11.05 s/token, the 4000-slot count and the 8000-slot 3.6-4.1x figure are carried into the merged rows. - `docs/USAGE.md`: the limit list goes from four to six rather than back to two. Main's model-family bullet, its keep-quant OR keep-f16 bullet, its 4000-slot figure and its page-cache attribution of the 8000-slot slowdown are all kept. No superseded wording is reintroduced: the towers keep keep-quant OR keep-f16, the recipes set 4000 slots, and more slots costs the page cache the borrowed mapping is served out of rather than failing to fit an arena. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…MAIN, and drop the duplicate #1299 index row The merge itself is clean. What it exposed is the union-merge duplicate `AGENTS.md` warns about: #1414 appended a `#1299` row to `.agents/issue-index.md` on main and this branch appended its own, and because that file carries `merge=union` both survived without a conflict. `scripts/check-agent-record.py` is what catches it, and it did: "issue #1299 listed twice. Under `merge=union` a duplicate is what two branches appending the same issue look like". Main's row is kept BYTE-FOR-BYTE and this branch's is dropped, which is the only resolution the append-only rule allows: an index row may never be edited, so the row that is already on `main` cannot be rewritten to mention W0f, and the row that is not on `main` yet is the one free to go. Nothing is lost that the record needs. Main's row already links #1299 to `ENG-EXPERT-STREAM-DEVICE` and to the spec, which is the traceability the index exists for, and the W0f fix is carried by the spec's `## Now`, `## Evidence` and `## Owed`, by `.agents/benchmark-record.md`, by the three public pages, and by the pull request body. The `#1320` row this branch appends is new, is not duplicated, and stays. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…te, and the header named a cause the spec forbids naming (#1299) Five findings from the fresh review of #1427. The product code survived eleven of twelve mutations and is unchanged here apart from one comment. `kDeviceAliasAlignment` was 256 and nothing pinned it. Every assertion about it in the tree is written `% vllm::kDeviceAliasAlignment == 0`, which is a tautology in the constant: the review lowered it to 16 and the whole suite reported SUCCESS at exit 0. That is the failure mode the header's own safety argument cannot survive, because the argument is that cuBLASLt is PROMISED 256 (`CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_A_BYTES` defaults to 256 and this tree never overrides it; `grep -rn MIN_ALIGNMENT src/vt/` returns nothing, while `CUBLASLT_MATMUL_PREF_MAX_WORKSPACE_BYTES` in the same file is the positive control). Someone lowers the constant to skip the re-home memcpy, the promise is gone, and every gate stays green. A case in `test_resident_weight_host_addressable.cpp` now pins the literal. Reproduced red-first: at 256 the file is 13 cases / 72 assertions / SUCCESS / rc 0; with the constant at 16 it is 13 cases, 1 failed, Status FAILURE, rc 1, compile rc 0 both times. The reviewer's mutation to 24 still reds with its original `std::bad_alloc` and SIGABRT signal intact beside the new failure, so the pin masks nothing. The existing `%` assertions stay; they check the buffers, which is a different property. The header's rationale block asserted two things that are false at this head. It said the row's CUDA-versus-CPU token divergence IS the two arms' GEMM arithmetic, which the spec explicitly forbids asserting -- excluding one cause is not identifying another, and that hypothesis is not measured. And it said the GB10 leg is owed, when the spec and `.agents/benchmark-record.md` both record it as RAN (`rc` job `7c7a05e9-be87-48f4-94ae-1bbe0340f063`, NVIDIA GB10 sm_121, 12/12 identical algorithm selection, 12/12 bit-exact, `PROBE_FAILURES=0`). The block now says what the probe established -- the alias is EXCLUDED as the cause, on the target silicon -- and says plainly that the cause is not identified. The disowned 1.97x ratio is deleted rather than restated. It was correctly labelled VOID and not claimed, and no rate reaches any public document, but digits survive a copy-paste and a disclaimer does not, and this repository has already watched a disowned number become a quoted one. Both medians remain in the table, so anyone entitled to the quotient can divide; what is gone is the pre-computed string. `docs/FEATURES.md` gets back "not throughput", which stops a reader treating the lane as a speed feature and which survives at `docs/USAGE.md`. Three record surfaces move with it. `.agents/quantization-matrix.md` and two specs cited `Fp8Weight` at `qwen3_5_weights.h:540`, and the rewritten rationale block adds 23 net lines above it; `scripts/check-agent-record.py` caught exactly that one anchor going stale, 33 against a baseline of 32. The anchor is repaired, never the baseline: the struct moved 540 -> 563, and `sed -n '540,553p'` before and `sed -n '563,576p'` after hash identically (`9f809a38...`), so the shift maps the cited range byte for byte instead of being re-derived by eye. ANCHOR-ROT is back to 38. Three public projections carried the header's error outward, so the correction does not stop at the header. `docs/BENCHMARKS.md` and `docs/STATUS.md` both read "G0-CORRECT FAIL on a near-tie ... not the alias", stating the unmeasured hypothesis as the finding; both now say the cause is NOT identified, in fewer characters than before. `docs/USAGE.md` said it hardest -- "the divergence is a measured near-tie rather than a disagreement about the model" and "the two arms run genuinely different GEMM kernels" -- which is a user-facing document asserting a cause nobody measured. What IS measured there is the margin, and that is what it now says. NOT REACHED, AND NAMED HERE AS `## Nothing lands dead` REQUIRES. No CI gate reaches the alias branch through a production entry point. `test_expert_stream_wiring` enters `Qwen3_5Model::Forward` and the reachability mutation reds it, but it runs on the CPU device, where `ResidentWeight` returns at the `is_cpu()` early return about ninety lines above the alias branch. In CI the branch is reached only through `detail::StageWeightForTest`, a test-only seam. The branch is selected by `needs_weight_staging() && host_memory_is_device_addressable()`, and no CPU tier can register a platform answering both -- one machine this project can reach does. The device evidence is real and stronger (the W0e run entered the branch 43,501 times through `Qwen3_5Model::Forward` on `dgx:gpu0`); it is simply not repeatable in CI. `ENG-EXPERT-STREAM-DEVICE` owns the wiring and #1299 tracks it until either a GPU CI lane on a probed-capable part or a fake-platform production entry point lands. It is listed under `## Owed` in `.agents/specs/expert-stream-device-slots.md`. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…MAIN GitHub reported this pull request CONFLICTING while `git merge-tree` read clean locally, which is the forge ignoring the `merge=union` driver on the append-only `.agents/issue-index.md`. Materialising the merge here is what clears it. The merge is clean, and the two keyed records were verified by key rather than taken on the driver's word. `.agents/issue-index.md` is the exact union: 452 rows, every one of this branch's 450 present, every one of main's 451 present, no extra row and no duplicate. Main's #1396 and #1411 rows arrive; this branch's #1320 row stays. `include/vllm/model_executor/models/qwen3_5_weights.h` and `src/vllm/model_executor/models/qwen3_5_dense_weights.cpp` were both edited on both sides, so each of main's added lines was checked to be present in the merged file: all are. The one line the merge drops relative to main is this branch's own W0f change at `9c30dfe7d`, not a #1396 repair. `scripts/check-agent-record.py` was re-run AFTER the merge rather than before, because a shared summary counter that is byte-identical on both sides merges without a conflict while both row changes apply, and that has already bitten this row. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…MAIN `origin/main` moved twice under this branch during the repair, so this is the second merge: #1436 and #1428 landed while the gate was running, and GitHub read the pull request CONFLICTING against the newer head. The merge is clean, and six files were edited on both sides, so each was checked by key rather than taken on the driver's word. `docs/BENCHMARKS.md`, `docs/FEATURES.md`, `docs/STATUS.md`, `docs/USAGE.md`, `.agents/specs/qwen38-27b-quant-arms.md` and `tests/CMakeLists.txt` each carry every line main added, verified line by line, and this branch's own five edits in those files all survive. `.agents/issue-index.md` is the exact union: 454 rows, every one of this branch's 452 and every one of main's 453 present, no extra row and no duplicate. `struct Fp8Weight` is still at `qwen3_5_weights.h:563`, so the anchor repaired in the previous commit is still correct. Conflict markers were checked with `git grep` under a positive control, because four record checkers return 0 on a file that contains them (#1417). FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
localai-bot
pushed a commit
that referenced
this pull request
Aug 20, 2026
`origin/main` advanced again (#1427). Merged so the pull request stays `MERGEABLE` and the scheduled workflow runs against a computable merge ref. The keyed record is verified against this base: 454 rows on `origin/main`, 458 merged, zero duplicated keys, zero lost keys, every `origin/main` row byte-for-byte equal, and the four branch-only keys (#926, #1290, #1416, #1431) all present. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [claude-code]
localai-bot
added a commit
that referenced
this pull request
Aug 20, 2026
…#1211) The capability landed across #912, #1119, #1132, #1377, #1414 and #1427, and nothing a user reads said how to reach it. AGENTS.md binds the checkpoint pin to docs/USAGE.md, and revision 567d3e6ac26c5474b18311e619c04350fb9a5556 lived only in the agent record: USAGE.md named this checkpoint three times and pinned it zero times, so nobody outside .agents/ could reproduce a single number the project publishes about it. This lands the recipe as a fifth per-model section beside Muse Glimmer 30B, Nemotron-3.5-Lightning-30B, MiniMax-H3 and MiniMax-Music3. It LINKS the "Streaming routed experts from disk" section rather than restating it, so the schema, the precedence rule, the #1135 reach limits and the per-device limits each keep one home. No docs/examples/ directory. `examples/` in this tree is runnable C++ CMake targets and `docs/` is one topic per file listed in the README index, so a new markdown genre would have had exactly one member and would have duplicated facts that already have owners. ## The section was drafted on 18 August, and three changes have landed since The draft is reconciled against them rather than merged as written. The decode subsection quoted a warm 667.0 s time to first token and 44.2 s/token. Neither figure names its expert-stream state, and no record in the tree carries either one outside a single commit message and a single index row, so both are deleted. What replaces them is measured: the CPU arm runs at 11.05 s/token at 4000 expert-stream slots, with 8000 slots at 39.98 to 45.40 s/token and streaming off at 66.7 s/token. The streaming-off row carries no ratio against the other two, because it was taken on a different source tree on a different date. The recipe served with expert streaming off, which is not the arm any current figure was measured on. It now turns streaming on at 4000 slots, matching both recipes in the mechanism section. The subsection headed "The expert slot cache is off, and it has not yet earned being on" is gone. Its premise was the VOID steady-decode figure of #912 F1, and W0e replaced that VOID with a live-cache measurement. Its second premise, that the fill copies from a pointer into the mmap and so still takes the page fault it exists to avoid, is retracted as unestablished in the same record. What a reader still needs from it, that the default is off and that 8000 slots is worse than 4000, is already carried by the section this one links. No `--device cuda` speed number appears anywhere. That arm decodes the checkpoint as of W0f, its token gate against the CPU arm fails at token 7 on a measured near-tie, and docs/BENCHMARKS.md therefore carries G0-SPEED as VOID. The claim that `--offload-config` does not reach vllm-cli is deleted. It reaches vllm-cli, the server's generate and chat path, the server's pooling and embedding path, and the C ABI. The transcription-only path is the one that refuses the flag, and the mechanism section already says so. ## The shard count is settled against the artifact Two copy-paste commands named -00001-of-00008.gguf. A GGUF split writes the total into every member's name, so that is a different file name, and an operator gets a file-not-found after a 370 GiB download. The report is #1420. Settled from the mirrored copy, rather than from a document and rather than from the HuggingFace tree API, whose lfs.oid is fabricated for a gated repo: - shard 1's own metadata declares split.count = 10 and split.tensors.count = 1702, and it carries zero tensors; - shard 1's sha256 recomputes to b7770552b2ac24e7334c917bc92e90e218e87cfe29484db65e62e8ef2a60334d, equal to the download manifest, which also gives shard 2 as 2765517f833c736338d3ab34354e1c10eb8d79e62325f998285b435e5cf03dcd; - the ten files sum to exactly 397,256,393,248 bytes, that is 369.97 GiB. Both commands now name -00001-of-00010.gguf. Issue #1420 stays open for the operator, because this pull request repairs one document and that issue also asks whether any other document repeats the file name. The per-token arithmetic is re-derived from the same metadata rather than transcribed. block_count 93, expert_count 512 and expert_used_count 10 give 93 x 10 x 3 = 2790 slices at 2,490,368 bytes, which is 6.95 GB (6.47 GiB) per token, so a ~5 GB/s NVMe puts the floor at 1.39 s/token, about 0.72 tok/s, and not the 1.29 s and 0.77 tok/s a GiB-for-GB substitution produces. Closes #1194. ## The fresh review returned FAIL, and this is the repair The factual core was found sound: every number traced to a record, no unsourced figure, no CUDA speed claim, and no asserted cause for the step-7 divergence. Five findings sat on top of it. None of them moves a verified fact. **The issue was linked in two of the three required places.** AGENTS.md binds #1194 to the index row, the owning row's spec and this body, and only the index row carried it. No checker catches that, because check-agent-record.py is satisfied by the row naming an owning row ID. .agents/specs/expert-streaming.md now carries a section recording what landed, why the pin is settled against the artifact rather than against a document, and which binary produced the figures. A git grep for the issue link now returns the spec and the index, run beside a control that proves the pattern reports nothing for a number that is absent. **The section claimed to repeat nothing and repeated five facts.** "Nothing here repeats them" was false for the 4000-slot decode figure, the 8000-slot figures, the per-token expert bytes, the --device cpu guidance and the VOID speed axis. The copies agree today. The W0e re-measure this row owes would leave a corrected copy beside a stale one that still reads true, which is the shape that put an 8000-slot figure under a 4000-slot heading on the first revision of this change. Every copy the reader does not need is gone, and the opener now names the three facts the recipe repeats on purpose and says why a recipe cannot omit them: which device to use, the expert bytes a token reads, and the two streaming decode figures. The decode figures name their one record, ENG-EXPERT-STREAM-DEVICE W0e in .agents/benchmark-record.md, so a re-measure has one place to look. **The published recipe is not the binary that was measured.** Every figure came from benchmarks/expert_stream_device_w0e.cpp, a purpose-built C ABI client that reports the token ids, a per-step timestamp and the expert-stream counters together. The section publishes a vllm-server command. That difference is now disclosed beside the prompt and environment differences the section already disclosed, and it is a disclosure rather than a caveat: at seconds per token the server's HTTP and SSE framing sits far below the run-to-run spread the section prints. **A stated bound was false.** Rep 1's 11.22 against 11.05 is 1.5385%, so "agrees within 1.5%" is a bound the numbers do not meet. It now reads 1.54% above, recomputed rather than transcribed. **The gate evidence was pinned to a SHA that would never land.** The branch was behind origin/main, which made the trailer and commit-style gates SKIP while reporting nothing about this tree, and the recorded evidence named a commit one behind the head. main is merged, and both trailer gates now EXECUTE. ## Gates From this branch's own worktree, at caffae2, with origin/main at d0eff4f and verified an ancestor of that head. Every rc was captured unpiped. - scripts/agent-preflight.sh: rc 0, zero gates failed and zero gates skipped. commit-trailers and commit-style both report ok rather than SKIP. - check-agent-record.py: rc 0, ENGINE=168 MODEL=377 QUANT=84 KERNEL=52 BACKEND=85 ANCHOR-ROT=38. - check-public-doc-tables.py: rc 0. - check-issue-index-append-only.py: rc 0. - check-doc-checkpoint.py: rc 0. - check-commit-trailers.py --range origin/main..HEAD: rc 0. - check-commit-style.py --range origin/main..HEAD: rc 0. - All four record checkers resolve ROOT from their own __file__ to this worktree, asserted rather than assumed. - git grep for conflict markers over the whole tree: no match, run beside a positive control that proves the pattern matches. The merge of origin/main touched one keyed record. Both incoming commits append to .agents/issue-index.md and neither edits an existing row, so the merge applied four appends and changed nothing else. UNOWNED_HIGH_WATER in scripts/check-agent-record.py is byte identical on both sides and was not double-applied. No build was run and none is needed. No src/, include/, tests/ or CMake file is touched by this branch. ## What this does not settle The #1194 index row was rewritten in place on this branch, which the append-only rule permits only because the row has never been on main. Reviewers should read it as new rather than as an edit. docs/BENCHMARKS.md line 8 and docs/STATUS.md still describe the streaming-ON decode figure as VOID per #912 F1, while BENCHMARKS.md line 9 records 11.05 s/token as replacing that VOID. That contradiction is #1442, it sits in a record this pull request does not own, and it stays with the ENG-EXPERT-STREAM row. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code] --------- Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
This was referenced Aug 20, 2026
localai-bot
added a commit
that referenced
this pull request
Aug 20, 2026
…bove its replacement (#1442) (#1449) Two public pages and one row record all told a reader the streaming-ON decode figure was void, after the measurement that replaced it had landed. ## The public cells `docs/BENCHMARKS.md:8`, the `ENG-EXPERT-STREAM` row, read "Streaming-ON decode **VOID** (#912 F1); re-measure owed" while line 9, the row directly under it, recorded 11.05 s/token at 4000 slots against a live cache with a decode-phase `exhausted` delta of 0, explicitly as replacing that VOID figure. `docs/STATUS.md:129` also carried the VOID. A reader got the answer that depended on which row they read first. The two cells never said the same thing, so the repair is stated per file: * `docs/BENCHMARKS.md:8` named no cause and its replacement was one line down. It keeps its `**VOID** (#912 F1)` and now reads "re-measured LIVE by `ENG-EXPERT-STREAM-DEVICE`" where it said "the next row". A positional pointer breaks the moment a row is inserted above it, and no checker validates one; the table holds 253 rows, measured with the checker's own `_table_rows` parser. * `docs/STATUS.md:129` never said a re-measure was owed, and its replacement is not adjacent: that figure is at `docs/STATUS.md:167`, 38 rows further down the SAME table, which runs 126-190 as one unbroken block. It keeps the cause verbatim, the step clock that had no caller, and gains the same named pointer. Neither cell repeats 11.05 s/token. `docs/BENCHMARKS.md:9` and `docs/STATUS.md:167` already carry it, and one number stated in two keyed rows is what lets the two drift apart. ## The row record said the same thing one level down `.agents/specs/expert-streaming.md`'s `## Owed` still read "Re-measure decode on a LIVE cache ... is void", with its "why it is open" naming an unreachable `dgx.casa`. So a fixed public cell routed a reader to the row record and the row record told them the measurement was still owed and blocked. The entry is struck as CLOSED by `ENG-EXPERT-STREAM-DEVICE` W0e and kept as a line, using the convention the sibling spec already uses, because the void's cause is what shaped the replacement: `EndStep()` had no caller, `protected_this_step` never cleared, and every slice from partway through token 3 came from the mmap, which is why W0e gates `exhausted` on its decode-phase DELTA rather than on a total. `.agents/specs/expert-stream-device-slots.md`'s `## Owed` listed issue 1387 as open while the same flow closed it. Struck, with the measured evidence beside it and with issue 573 named as the surviving half. ## Evidence for the figures The re-measure stopped being owed at `c805ccbb3`, recorded in `.agents/benchmark-record.md` under `ENG-EXPERT-STREAM-DEVICE W0e`: 11.05 is rep 2's median over steps 4 to 32, and rep 1's 11.22 sits 1.54% above it. The 8000-slot arm is not a second figure for the same thing; it measures 39.98 to 45.40 s/token and consumed all 30,625 MiB of swap, which that record reads as page-cache displacement and states as a reading of its columns rather than a proven mechanism. No CUDA number moves: `e67b2a4ba` makes `--device cuda` decode 32/32 steps at peak RSS 97.75 GiB, G0-CORRECT fails on a step-7 near-tie whose cause is not identified, and the row's own stop condition therefore leaves G0-SPEED VOID. ## What the pointer cost the cell The pointer clause grew 31 characters, from `; re-measure owed` at 17 to `; re-measured LIVE by ENG-EXPERT-STREAM-DEVICE` at 48. Two edits paid for it and both belong in this sentence, because the second alone does not cover it: the words "as 4 KiB faults" came out at 16 characters, and dropping bold from three supporting numbers and moving "streaming OFF" out of parentheses freed 13 more. 31 against 29 is the +2 that takes the cell from 215 on `main` to 217 here, inside the 220 budget. No fact was lost. The 4 KiB demand-fault mechanism survives verbatim at `.agents/benchmark-record.md:22198` and `.agents/specs/expert-streaming.md:880`, which is where this page's own legend sends a reader, and the index row discloses the displacement in full. Bold now marks the claim and the verdict. `docs/STATUS.md`'s cell measures 195, and that page's `oversized_cells` ratchet sits at 44 of 44, unmoved by this change. No gate catches this class, by design. The rows are keyed on different IDs, so `check-public-doc-tables.py` sees well-formed rows and `check-agent-record.py` sees individually consistent lifecycle states, and no checker here compares a claim in one keyed row against a claim in another. ## The index row is corrected in place `.agents/issue-index.md` is append-only. This row is corrected rather than superseded by a second row, and the reason is the rule's own reason: `check-issue-index-append-only.py` evaluates one aggregate diff against the merge base, and its docstring says a union merge duplicates an EDITED line, which needs that line to exist on both sides. Verified rather than assumed: the row appears in no ref but this branch, checked across all 513 remote heads, and `git show origin/main:.agents/issue-index.md | grep -c` returns 0 where the same command on `HEAD` returns 1, so the absence comes from an instrument proven to fire. The net diff against the merge base is one added line and no removed line. Appending a second row for the same issue would leave a duplicate key in an append-only log. This is flagged rather than done silently, and it is not a precedent: the argument holds only while no other branch carries the row. ## Gates Run from this worktree's own `scripts/`, exit status captured unpiped, after merging `origin/main` `4cde4762a`: `check-agent-record` 0, re-run after the merge; `check-public-doc-tables` 0, re-run after each edit; `check-now-current` 0; `check-conflict-markers` 0, the gate #1450 had just landed; `check-doc-checkpoint --base origin/main --head HEAD` 0; `check-issue-index-append-only --base origin/main --head HEAD` 0, with a detached scratch commit editing row 168, a row that DOES exist on `main`, as its positive control at 1 and the mutation proven applied by `git diff --stat`; `check-commit-trailers --range origin/main..HEAD` 0; `check-commit-style --range origin/main..HEAD` 0; `git grep -n '^<<<<<<< \|^>>>>>>> '` 1 with a two-line fixture as its positive control at 0. `agent-preflight.sh` reports one red, `test_cpu_x86_llamacpp_floor`, which exits 4 `NO_QUIET_WINDOW` where its case asserts 2, at one-minute load averages of 49.77, 52.96, 58.34 and 211.99 across four observations. That is the load dependence tracked in issue 618. A quiet re-run was attempted and could not be taken: the box was polled for 30 minutes and never fell below load 8, peaking at 126. The independence argument is structural instead: this branch changes five files, all `.agents/` or `docs/` Markdown, so neither the test nor anything it drives differs from `origin/main`. ## Issue 1387 It gets no product change here, and the reason is evidence rather than scope. Its record half already landed: the stale string "CPU keep-quant towers only" is absent from `docs/FEATURES.md` on `origin/main` and present at `5f4eb356e^`, which is the positive control for that grep. `5f4eb356e` (#1377) wrote the row and `e67b2a4ba` (#1427) refined it again, so the page names the staging device and both accepted residencies, keep-quant and keep-f16. Its checker half, whether a per-commit record gate should be satisfiable after the commit is published, is issue 573 and stays open under `ENG-RECORD-CONFLICT-SURFACES`. This branch touches no file under `scripts/`. Closes #1442 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code] --------- Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Replaces #1326. That pull request is correct and reviewed, and its base is gone:
it was stacked on
row/ENG-EXPERT-STREAM-DEVICE-W0at95883dcae, and #1377squash-landed the same W0 work onto
mainas5f4eb356e. A squash destroys themerge base, so #1326 now presents product-code conflicts that are two unrelated
histories describing one change rather than a disagreement. This branch is that
same change rebuilt on
main, with every one ofmain's later repairs kept.What the defect was
With W0's lane on,
Qwen3.8-2.4T-A95B UD-Q1_0(369.97 GiB) LOADED on--device cudaon a 119.631 GiB GB10 and then exhausted the machine inside itsfirst forward: zero decode steps, seven attempts, every one identical (#1299).
The measurements name it rather than a reading of the code. A 0.15 GiB slot
arena died exactly where an 18.55 GiB one did, so the arena is not the cost. A
1-token prompt, whose protected set fits with no in-place fallback at all,
behaved identically to a 5-token one, so prefill protection is not it. Growth was
ANONYMOUS (
RssAnon8.1 to 61.4 GB) while file-backed stayed flat, so nothingwas pinning the mapping. Host anon plus swap reached ~65 GB against system
used~119 GB, and the ~42 GB difference is device memory that unified memory does not
charge to RSS.
So every non-expert weight was resident twice: once as the host
OwnedTensor,once as
ResidentWeight's device staging copy. On a part where device memory IShost memory, the second copy buys nothing and costs everything.
The change
ResidentWeightnow takes the same branch W0c gaveKqExpertSlice, on the sameprobed predicate: where
Platform::host_memory_is_device_addressable(), itreturns a tensor over
w.bytes.data()instead ofAlloc+Copyintow.d_dev. A DISCRETE device answers false, falls through, and is byte-identicalto before, asserted by its own case rather than by inspection.
Safety is by alignment, not by surveying kernels. The staging branch is a
verbatim byte copy returning the same dtype, shape and dropped marker set, so the
only thing a consumer can notice about the substitution is the pointer's
alignment.
kDeviceAliasAlignmentis 256 because cuBLASLt'sCUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_A_BYTESdefaults to 256 and this tree neversets it, which dominates every explicit pointer gate in the CUDA kernels -- at
least seven across four files, the strictest asking 32. A plain
std::vector<uint8_t>gives 16 and no more, soMakeHostBytesDeviceAliasablere-homes an OWNED misaligned buffer once into an aligned block: one memcpy that
REPLACES the host-to-device copy it removes. A misaligned BORROW declines and
stages instead, because copying a clean file-backed GGUF mapping into anonymous
memory would create the residency this change exists to remove.
Three fresh-review findings and one defect found in flow ride with it, each with
its own red-first case:
MoeBlockBf16Cudareleased host mirrors the aliaseddevice pointer table still pointed at, so the release now asks
HostMirrorIsRedundant; the dense release guarded ond_dev || d_dev_f32, andd_dev_f32is an f32 UPCAST that can never stand in for the raw bytes; theno host bytesrefusal fired ABOVE the device-copy memo and turned analways-served case into a throw; an already-aligned direct-upload borrow re-ran
issue #150's
madvise(MADV_DONTNEED)on every forward step; and #1320'si8mm-repack tripwire was missing on both arms of
ResidentWeight.The result, and the gate that does not pass
It decodes. 32/32 steps, peak RSS 97.75 GiB, decode-phase
exhausteddelta 0(G0-LIVE PASS). G0-CORRECT FAILS: the CUDA ids diverge from the CPU arm at step 7
on a near-tie, where the CPU arm's own runner-up is exactly the token CUDA
emitted, 1.4% behind, and one step later the margin is 0.1%. G0-SPEED is
therefore VOID by this row's own stop condition and no rate is claimed
anywhere.
Can the alias move a logit? Measured on the target silicon, and no
The probe compares what a consumer can actually see.
rcjob7c7a05e9-be87-48f4-94ae-1bbe0340f063ondgx:gpu0--NVIDIA GB10 sm_121,driver 580.173.02, cuBLASLt 130101, the predicate re-derived in the job's own
output as
pageableMemoryAccess=1 integrated=1-- ran six checkpoint shapescrossed with both cuBLASLt formulations the dense path issues, 12 measurements,
PROBE_EXIT=0,PROBE_FAILURES=0. A repeated heuristic call is identical 12/12;the tree's unset preference equals the documented 256 default 12/12; weakening
the promise to 16 moves nothing 12/12; and
cublasLtMatmuloutput is bit-exactbetween a
cudaMallocoperand and a 256-aligned host block 12/12,differing=0.At least five distinct algorithm configurations appear across the twelve and they
differ from the earlier
thor:gpu0leg's, so the heuristic was re-resolved ratherthan replayed and the instrument discriminates.
The structural reason needs no lease:
cublasLtMatmulAlgoGetHeuristictakes nooperand pointers, so alignment reaches it only through a preference this tree
never sets.
So the alias does not cause the step-7 divergence. Excluding one cause is not
identifying another. What DOES cause it is unmeasured, and it is carried under
## Owedwith its next traceable step named: a two-arm dump of the step-7forward that names the first differing tensor.
What
mainalready had, and what this rebuild keptEvery repair #1377 and #1378 landed survives, unmodified. None of the files
carrying them is in this diff:
GgufExpertTowersReachSlotLane, the fifth lane term, ingguf_device_fit.{h,cpp}and read by the loader.PeekRoutepromoted intoinclude/vllm/model_executor/model_loader/gguf_keep_quant.h.HostMemoryIsDeviceAddressableFromAttrsextracted intosrc/vllm/platforms/platform.cppand gated over all four attribute pairs.Their gates are green with W0f in the tree, which is the live evidence rather
than an inspection:
test_gguf_device_fit17 cases / 130 assertions,test_gguf_device_fit_reach14 / 66,test_platform14 / 114.Two more of
main's repairs are inside files this branch does touch, and bothare kept: the
HostAddressableRAII guard intest_expert_stream_device_slot.cpp(the one conflicting case now uses it,including for its discrete arm, instead of writing the flag directly), and
docs/USAGE.md's limit list, which grows from four limits to six rather thanback to two, keeping the model-family bullet and the keep-quant OR keep-f16
residency bullet.
#1414 then landed the W0e measurement while this branch was gating. Its facts are
carried, not overwritten: the CPU arm's 11.05 s/token at 4000 slots on a live
cache is the standing figure and the 4000-slot count is what both recipes set,
and the 8000-slot slowdown keeps
main's attribution -- the extra 9.27 GiB ofarena takes the free memory the borrowed 370 GiB mapping is served out of, which
is the page cache rather than an arena that fails to fit.
Records, and one union-merge duplicate
docs/STATUS.md,docs/BENCHMARKS.mdanddocs/FEATURES.mdtake one scoped rowedit each; every other key is byte-for-byte unchanged.
.agents/benchmark-record.mdis a pure append of 208 lines with 0 deletions, andit now carries TWO sections rather than one merged one, because #1414's run and
this one are different trees:
95883dcae(loads, generates nothing) and9c783a8be(32/32 steps). The spec's## Evidencemirrors that split, and eachside says which figures are its own and which must not be mixed.
.agents/issue-index.mdappends one row (#1320). It appended two, and the secondwas the union-merge duplicate
AGENTS.mdwarns about: #1414 appended a#1299row on main and this branch appended its own, and
merge=unionkept both withouta conflict.
scripts/check-agent-record.pycaught it. Main's row is keptbyte-for-byte and this branch's is dropped, which is the only resolution the
append-only rule allows.
Two record edits are consequences of this change rather than part of it, named so
a reviewer does not have to work out why they are in the diff. Adding 198 lines to
qwen3_5_weights.hmovedstruct Fp8Weightfrom line 342 to line 540, whichscripts/check-agent-record.pyreported as a stale-anchor regression (33 againsta baseline of 32); the three citations of it are repointed, in
.agents/quantization-matrix.md(both the text and the#Lfragment, which isthe one the checker reads) and in two specs. And appending a measurement to
.agents/benchmark-record.mdobligesdocs/FEATURES.mdunderscripts/check-doc-checkpoint.py, so the routed-expert-streaming row now says thestaging device decodes and that its token gate fails. That is #1387's shape,
caught before the commit was published rather than after.
The fresh review returned FAIL, and this is the repair
Five findings, four of them in the record rather than in the product code, which
survived eleven of twelve mutations and is unchanged apart from one comment.
The alignment constant had no gate (MEDIUM).
kDeviceAliasAlignmentwas 256and every assertion about it in the tree is written
% vllm::kDeviceAliasAlignment == 0, which is a tautology in the constant. Thereview lowered it to 16 and the whole suite reported
SUCCESSat exit 0 -- thepromise this change's entire safety argument rests on could be deleted with no
gate saying so. That argument is that cuBLASLt is PROMISED 256:
CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_A_BYTESdefaults to 256 and this tree neveroverrides it, with
grep -rn MIN_ALIGNMENT src/vt/empty against a positivecontrol on
CUBLASLT_MATMUL_PREF_MAX_WORKSPACE_BYTESin the same file. A case intest_resident_weight_host_addressable.cppnow pins the literal.RED-FIRST, and re-taken on the pushed head
ac5e1ad8f. Before the case, theconstant at 16 left every one of the eight suites GREEN at exit 0 with identical
counts -- the reviewer's mutation 5 reproduced exactly. With the case, the same
mutation gives compile rc 0,
git diff --stat1 file / 1 insertion / 1 deletion,test cases: 13 | 12 passed | 1 failed,Status: FAILURE!, exit 1. Restoredbyte-for-byte by sha256 (
7f1d10b8...), rebuilt, 13 cases / 72 assertions /SUCCESS!/ exit 0. The reviewer's mutation to 24 still reds with its originalstd::bad_allocand SIGABRT intact beside the new failure -- exit 134, 5 casesfailed while the
assertions:line read 1 failed of 16, which is why theStatus:line is what was read. The pin masks nothing, and the existing%assertions stay because they check the buffers.
The header stated two things that were false (MEDIUM). Its rationale block
said this row's CUDA-versus-CPU token divergence IS the two arms' GEMM
arithmetic, which the spec explicitly forbids asserting, and said the GB10 leg is
owed when the spec and
.agents/benchmark-record.mdboth record it as RAN. Theblock now says what the probe established -- the alias is EXCLUDED as the cause,
on the target silicon -- and says plainly that the cause is not identified.
Three public projections had carried that same error outward, so the correction
does not stop at the header.
docs/BENCHMARKS.mdanddocs/STATUS.mdboth read"G0-CORRECT FAIL on a near-tie ... not the alias"; both now say the cause is NOT
identified, in fewer characters than before.
docs/USAGE.mdsaid it hardest, ina user-facing document: "the divergence is a measured near-tie rather than a
disagreement about the model" and "the two arms run genuinely different GEMM
kernels". What is measured there is the MARGIN, and that is what it now says.
The disowned ratio is deleted rather than restated (LOW). It was correctly
labelled VOID and not claimed, and no rate reaches any public document. But
digits survive a copy-paste and a disclaimer does not, and this repository has
watched a disowned number become a quoted one. Both medians stay in the table, so
anyone entitled to the quotient can divide; what is gone is the pre-computed
string.
docs/FEATURES.mdgets back "not throughput", which stops a readertreating the lane as a speed feature and which survives in
docs/USAGE.md.One anchor went stale inside this pull request. The rewritten rationale block
adds 23 net lines above
struct Fp8Weight, andcheck-agent-record.pycaughtqwen3_5_weights.h:540going stale, 33 against a baseline of 32. The anchor isrepaired, never the baseline: the struct moved 540 -> 563, and
sed -n '540,553p'before andsed -n '563,576p'after hash identically(
9f809a38...), so the shift maps the cited range byte for byte rather thanbeing re-derived by eye. Two prose citations the checker does not scan are
corrected with it. ANCHOR-ROT is back to 38.
NOT REACHED, and named here as
## Nothing lands deadrequiresNo CI gate reaches the alias branch through a production entry point.
test_expert_stream_wiringentersQwen3_5Model::Forwardand the reachabilitymutation reds it, but it runs on the CPU device, where
ResidentWeightreturnsat the
is_cpu()early return about ninety lines above the alias branch. In CIthe branch is reached only through
detail::StageWeightForTest, a test-onlyseam.
This is deliberate rather than an oversight. The branch is selected by
needs_weight_staging() && host_memory_is_device_addressable(), and no CPU tiercan register a platform that answers both -- exactly one machine this project can
reach does. The device evidence is real and is the stronger of the two: the W0e
run entered the branch 43,501 times through
Qwen3_5Model::Forwardondgx:gpu0. It is simply not repeatable in CI, and closing it needs either a GPUCI lane on a probed-capable part or a production entry point a fake staging
platform can drive end to end.
MakeHostBytesDeviceAliasablealias branch ofResidentWeight, on any CI runner.ENG-EXPERT-STREAM-DEVICE.## Owedin.agents/specs/expert-stream-device-slots.md.The disclosure was in the spec and in neither the pull request body nor any
commit body. Because this repository sets
squash_merge_commit_message = PR_BODY, this body IS the landed commit message, so a disclosure absent from itis a disclosure that does not land.
origin/mainmerged, and the two keyed records resolved BY KEYGitHub reported this pull request CONFLICTING while
git merge-treeread cleanlocally, which is the forge ignoring the
merge=uniondriver on the append-only.agents/issue-index.md. Materialising the merge here clears it.origin/mainmoved TWICE during this repair, so there are two merges:63d87805c(#1399) and then7f9c6802e(#1436, #1428), which landed while thegate was running. Both are clean, and both had their keyed records verified by
key rather than taken on the driver's word.
.agents/issue-index.mdis the exact union at each step, ending at 454 rows withevery one of this branch's 452 and every one of main's 453 present, no extra row
and no duplicate; main's #1396 and #1411 rows arrive and this branch's #1320 row
stays. Eight files were co-edited across the two merges --
include/vllm/model_executor/models/qwen3_5_weights.h,src/vllm/model_executor/models/qwen3_5_dense_weights.cpp,.agents/specs/qwen38-27b-quant-arms.md,tests/CMakeLists.txtand the fourpublic pages -- and each line main added was checked line by line to be present
in the merged file: all are, and all five of this branch's edits in those pages
survive. The one line either merge drops relative to main is this branch's own
W0f change at
9c30dfe7d.struct Fp8Weightis still atqwen3_5_weights.h:563, so the repaired anchor is still correct after both.check-agent-record.pywas re-run AFTER each merge, not before, because a sharedsummary counter byte-identical on both sides merges without a conflict while both
row changes apply.
Conflict markers were checked with
git grepunder a positive control, becausefour record checkers return 0 on a file that contains them (#1417).
Gate
Re-taken on the pushed head
f423df992, from a FRESH build directory ratherthan incrementally, because the second merge brought main's source in and an
incremental build masks
-Werror. Clean-configure plus full build,CMAKE_RC=0and
BUILD_RC=0read from the unpiped commands, 0 warnings, andgrep -c 'No space left on device'= 0 on every log with 61 GB free -- statedbecause this box has hit 100% during a run of this row and an ENOSPC presents as
a code verdict rather than as infrastructure. Eight focused suites, each with a
non-zero case count and an explicit
Status: SUCCESS!:test_expert_stream_device_slottest_resident_weight_host_addressabletest_load_direct_uploadtest_expert_stream_wiringtest_gguf_device_fittest_gguf_device_fit_reachtest_platformtest_gguf_keep_quantcheck-agent-record.py,check-public-doc-tables.py,check-issue-index-append-only.pyandcheck-doc-checkpoint.pyall exit 0, runfrom this worktree's own
scripts/copy because a checker resolves its root fromits own path.
A full
cteston the pre-merge head was 561 of 564, with three failures none ofwhich is this change:
test_qwen3_5_decode_graph_seamSEGFAULTs onmainitself(#1403),
test_nemotron_h_paged_forwardthrowsNo valid attention backend for device type 0, andtest_qwen3_5_moe_visionfailed under parallel load with
safetensors: empty fileon a fixed/tmppathwhile the disk was full, then passed 7 of 7 serially.
test_cpu_x86_llamacpp_flooris not registered in this tree, so there is nothing to re-run for it.
Issue: #1299
Row issue: #1124
Tripwire filed and covered in flow: #1320
Spec:
.agents/specs/expert-stream-device-slots.md#1124, #1299 and #1320 all stay OPEN: the row is not finished, the correctness
gate does not pass, and #1320's loader-policy half belongs to
QUANT-GGUF-KEEPQ-LOADER. Do not merge this before a fresh review, and note thatCI cannot give a verdict on this repository right now -- every completed workflow
run is
cancelled(#1285), so treat it as REMOTE_UNVERIFIED and never as green.FOLLOWING_AGENTS_PROTOCOL
Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]