docs/FEATURES.md drifted from the tree in the places no checker covers. scripts/check-supported-models.py gates the arch table between the supported-arch-table markers, and it is green — every drift below is in prose, in a row the checker does not read, or in a different document. Verified at 616ba9fe.
1. Architecture counts say 30, the registry has 35
check-supported-models.py prints "exactly the 35 architectures registered via REGISTER_VLLM_MODEL", and grep -c REGISTER_VLLM_MODEL over src/ agrees (36 hits, one being the macro definition). The prose disagrees in four places:
docs/FEATURES.md:28 — "30 registered, 25+ gated"
docs/FEATURES.md:81 — "Today that is 30 registered architectures"
docs/FEATURES.md:155 — "25 of the 30 registered text-generation architectures"
README.md:296 — "all 30 registered architectures"
The gated count needs a real recount, not arithmetic. A first pass off the table: 35 registered − 4 non-text-generation (3× Parakeet + LlamaModel) = 31 text-generation, of which KimiK3ForConditionalGeneration (scaffold), CohereForCausalLM (scaffold), Gemma4UnifiedForConditionalGeneration (no separate oracle gate) and Olmo3ForCausalLM (oracle-blocked) are ungated ⇒ ~27/31. DeepseekV4ForCausalLM and LagunaForCausalLM gate through their CLIs while the registered engine forward is a stub/VT_CHECK, so whoever takes this should decide how those count and say so in the row.
2. Multimodal over HTTP is marked ☐ / "architecturally blocked", but W1–W3 landed and are wired
docs/FEATURES.md:170 marks "Multimodal over the OpenAI server" ☐, :174 calls serving it "the named open gap", and :285 says "Architecturally blocked — Vision tower lives outside the registered engine forward."
That is not what the tree does. ROAD-V1-MM W1–W3 landed (0a8dd58b → 2581a7d4 → 308c312a) and the production server attaches the seam at src/vllm/entrypoints/openai/server_main.cpp:826:
chat.set_multimodal_chat_fn(oai::MakeQwen3VLImageChatFn(
*mm_image_proc, tokenizer, chat_prompt_fn, std::move(codec)));
docs/STATUS.md:131 already carries the honest state; FEATURES does not project it. The blocker is no longer architectural — it is two named residuals, both stated in the comment at server_main.cpp:780:
- the model runner has no mm-forward path consuming
Request.mm_features;
- no container-format image codec is vendored, so encoded PNG/JPEG are refused.
The row should read ◐ with those two residuals named, and :285 should stop saying "architecturally blocked". The separate C-ABI row (:258, multimodal input embedder-unreachable) is accurate and should stay.
3. Smaller reconciliations
Scope
docs/FEATURES.md + the one README.md:296 count. No src/, include/ or tests/ change; no capability moves, so no BENCHMARKS entry is owed. Per the public-documents rule this is a projection repair, and docs/STATUS.md is already correct.
Why this matters beyond tidiness
Item 2 understates a landed capability and item 1 undercounts the registry by five architectures — both in the direction of making the project look less complete than it is, on the page a reader uses to judge it.
docs/FEATURES.mddrifted from the tree in the places no checker covers.scripts/check-supported-models.pygates the arch table between thesupported-arch-tablemarkers, and it is green — every drift below is in prose, in a row the checker does not read, or in a different document. Verified at616ba9fe.1. Architecture counts say 30, the registry has 35
check-supported-models.pyprints "exactly the 35 architectures registered viaREGISTER_VLLM_MODEL", andgrep -c REGISTER_VLLM_MODELoversrc/agrees (36 hits, one being the macro definition). The prose disagrees in four places:docs/FEATURES.md:28— "30 registered, 25+ gated"docs/FEATURES.md:81— "Today that is 30 registered architectures"docs/FEATURES.md:155— "25 of the 30 registered text-generation architectures"README.md:296— "all 30 registered architectures"The gated count needs a real recount, not arithmetic. A first pass off the table: 35 registered − 4 non-text-generation (3× Parakeet +
LlamaModel) = 31 text-generation, of whichKimiK3ForConditionalGeneration(scaffold),CohereForCausalLM(scaffold),Gemma4UnifiedForConditionalGeneration(no separate oracle gate) andOlmo3ForCausalLM(oracle-blocked) are ungated ⇒ ~27/31.DeepseekV4ForCausalLMandLagunaForCausalLMgate through their CLIs while the registered engine forward is a stub/VT_CHECK, so whoever takes this should decide how those count and say so in the row.2. Multimodal over HTTP is marked ☐ / "architecturally blocked", but W1–W3 landed and are wired
docs/FEATURES.md:170marks "Multimodal over the OpenAI server" ☐,:174calls serving it "the named open gap", and:285says "Architecturally blocked — Vision tower lives outside the registered engine forward."That is not what the tree does.
ROAD-V1-MMW1–W3 landed (0a8dd58b→2581a7d4→308c312a) and the production server attaches the seam atsrc/vllm/entrypoints/openai/server_main.cpp:826:docs/STATUS.md:131already carries the honest state; FEATURES does not project it. The blocker is no longer architectural — it is two named residuals, both stated in the comment atserver_main.cpp:780:Request.mm_features;The row should read ◐ with those two residuals named, and
:285should stop saying "architecturally blocked". The separate C-ABI row (:258, multimodal inputembedder-unreachable) is accurate and should stay.3. Smaller reconciliations
include/vllm.h:145isVLLM_ABI_VERSION 17. FEATURES quotes v15 (:254) and v16 (:290). v17 (vllm_server_main,c1716fd0) is absent from the C-ABI capability table.:224reads "25 native kernels plus 8 GDN", which parses as 33.src/vt/vulkan/references 25 uniqueOpIds in total, and the 8 GDN-family ops are inside that 25 (include/vt/ops.hdeclares 112OpIds). Either the sentence double-counts or "25 native kernels" means the 29 shader files — needs one honest number.:209cites only ROCm (AMD GPU) backend #41; the ROCm 6.x build fix (ce134e1d, rocm_matmul_hipblaslt.hip:384:13: error: no matching function for call to 'hipblasGemmEx' #201/ROCm: -O0 RmsNorm triggers a CLR HostcallListener teardown deadlock #132) is not reflected.docs/FEATURES.md:313is a| Gemma4 MoE ROCm fused helpers | … |row stranded after the closing prose, belonging to no table. It renders as literal text.Scope
docs/FEATURES.md+ the oneREADME.md:296count. Nosrc/,include/ortests/change; no capability moves, so noBENCHMARKSentry is owed. Per the public-documents rule this is a projection repair, anddocs/STATUS.mdis already correct.Why this matters beyond tidiness
Item 2 understates a landed capability and item 1 undercounts the registry by five architectures — both in the direction of making the project look less complete than it is, on the page a reader uses to judge it.