You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
apr serve cannot load Qwen3.5 at all — 'Architecture qwen35 … runs through Qwen35Model'; goal A's floor and the P0 decide-lane design both name apr serve #3571
P0 on the dogfood critical path.apr serve cannot load a Qwen3.5 model at all — the architecture the last release shipped, and the path goal A's floor names.
Measured 2026-09-20, published 0.68.2 built from crates.io with --features cuda
$ apr serve run ~/models/Qwen3.5-0.8B-Q4_K_M.gguf --gpu --port 18742
=== APR Serve ===
Detected format: GGUF
GGUF loaded: 320 tensors, 46 metadata entries
Building quantized inference model...
error: Model load failed: Failed to build quantized model: Format error:
Architecture 'qwen35' is the Qwen3.5 hybrid (Gated Delta Net, detected tensor 'blk.0.ssm_a'):
it runs through `Qwen35Model` (re…
The file loads and the architecture is correctly detected; the serve path does not route to Qwen35Model.apr run does — 20/20 cells correct across 0.8B/2B/4B/9B/27B on two GPU hosts, CPU and CUDA. So this is a routing gap in one verb, not a model defect.
Why this is P0 rather than a missing feature
Three things on the critical path assume apr serve works for this model:
Goal A's floor is "≥3 internal consumers on apr serve for 7 consecutive days". Today that floor is unreachable for Qwen3.5 by construction.
The recommended P0 architecture — run the apr engine as a long-lived apr serve unit declared in forjar with its own resource budget, so the model loads once and the lane is an HTTP client. That design is right (a run-per-call lane pays model load on every decision, and arbiter's 5% cgroup would never finish a 9B) and it is not buildable today.
#3555 recorded that every gate we own is single-stream apr run — grep -nE 'batch|serve' scripts/check_model_parity.sh and check_model_ladder.sh both return nothing. The model-capability ladder proves apr run; no rung, no parity record and no dogfood row has ever asked apr serve to load a model. The one verb our own consumers are told to use is the one verb nothing exercises.
Acceptance
apr serve run <qwen3.5 gguf> --gpu starts, reports the real CUDA backend, and answers a /v1/chat/completions request correctly, on both GPU host classes, for every size the ladder covers.
The same on --no-gpu.
A ladder rung or parity row that exercises apr serve, not only apr run — otherwise this regresses silently the next time. That is the durable half of the fix.
Positive control: point the rung at a model the serve path genuinely cannot support and require RED.
Consequences to record now
ARB-APR-001 row 2 should declare an apr serve unit, not just the binary — and it cannot be satisfied until this lands.
Until then the apr decide lane has no correct shape: apr run per call pays the model load every decision (~4.5 min of prefill alone at 30k tokens on gx10 at ~9 ms/token), and apr serve refuses the model.
P0 on the dogfood critical path.
apr servecannot load a Qwen3.5 model at all — the architecture the last release shipped, and the path goal A's floor names.Measured 2026-09-20, published 0.68.2 built from crates.io with
--features cudaThe file loads and the architecture is correctly detected; the serve path does not route to
Qwen35Model.apr rundoes — 20/20 cells correct across 0.8B/2B/4B/9B/27B on two GPU hosts, CPU and CUDA. So this is a routing gap in one verb, not a model defect.Why this is P0 rather than a missing feature
Three things on the critical path assume
apr serveworks for this model:apr servefor 7 consecutive days". Today that floor is unreachable for Qwen3.5 by construction.apr serveunit declared in forjar with its own resource budget, so the model loads once and the lane is an HTTP client. That design is right (arun-per-call lane pays model load on every decision, and arbiter's 5% cgroup would never finish a 9B) and it is not buildable today.apr servesingle-stream.Why nothing caught it
#3555 recorded that every gate we own is single-stream
apr run—grep -nE 'batch|serve' scripts/check_model_parity.shandcheck_model_ladder.shboth return nothing. The model-capability ladder provesapr run; no rung, no parity record and no dogfood row has ever askedapr serveto load a model. The one verb our own consumers are told to use is the one verb nothing exercises.Acceptance
apr serve run <qwen3.5 gguf> --gpustarts, reports the real CUDA backend, and answers a/v1/chat/completionsrequest correctly, on both GPU host classes, for every size the ladder covers.--no-gpu.apr serve, not onlyapr run— otherwise this regresses silently the next time. That is the durable half of the fix.Consequences to record now
apr serveunit, not just the binary — and it cannot be satisfied until this lands.apr runper call pays the model load every decision (~4.5 min of prefill alone at 30k tokens on gx10 at ~9 ms/token), andapr serverefuses the model.apr runandapr serve.Refs #3080, #3555, #3558, #3568