Anvil Serving 0.35.0 release readiness¶
Date: 2026-08-22
Candidate version: 0.35.0
Scope: source package and documentation release
Deployment state: not-deployed; no route, model assignment, promotion, or
fleet state changed
This release candidate turns the Qwen3.8 RTX 5090 qualification workflow into reusable product surfaces. It adds deterministic recipe feasibility screening, stronger context and long-agent gates, and a routed evaluation command that checks router identity and capacity before testing real OpenClaw and Hermes clients. It also makes the product's routing contract explicitly independent of llama.cpp, vLLM, SGLang, TensorRT-LLM, Unsloth-derived serving stacks, or any other OpenAI-compatible engine.
Model-evaluation boundary¶
The complete model measurements and immutable artifact identities are in the
Qwen3.8 27B RTX 5090 finding.
The observed result is a FAST-TIER challenger, not a promotion:
- Q4_0 plus the matching MTP3 head accepted 253,822 actual prompt tokens while preserving an 8,192-token output reserve and passed exact cross-link retrieval.
- It passed tools 20/20, one tool call after 110,875 actual prompt tokens, deterministic images 18/18, and three neutral 101-request endurance sessions.
- MTP improved short decode from 69.1 to 104.1 tok/s and reduced short end-to-end latency from 0.91 to 0.74 seconds, with slower TTFT and prefill.
- Q6_K with the same MTP head was mathematically disqualified because its optimistic VRAM margin remained negative at the required context and reserve.
- Real
llm.secondaryOpenClaw and Hermes identity and tool-continuation smokes passed without accepted fallback. The routed 250K gate failed because the router advertised a stale 131,072-token SGLang/NVFP4 profile instead of the active 262,144-token llama.cpp Q4_0/MTP3 candidate.
The release does not treat those short routed passes as authorization to update
the router fingerprint, client defaults, or a promoted assignment. A future
operator transaction must deploy truthful metadata, reconcile client catalogs,
and rerun eval routed at the 250K minimum before promotion can be considered.
Session validation record¶
The following checks were run from the release worktree. Counts describe the candidate tree at the recorded point; the final release gates are rerun after the version and narrative edits.
| Surface | Command or method | Result |
|---|---|---|
| Upstream reconciliation | fast-forward from origin/main, then editable reinstall |
source advanced to 0.34.3; a stale 0.34.2 console entry point caused two version assertions until pip install -e ".[dev]" refreshed the environment |
| Upstream client-catalog regression | pytest on client catalog, CLI, and MCP tests |
301 passed after the editable refresh |
| Routed evaluation unit evolution | focused tests/test_routed_eval.py runs |
8 passed, then 10 passed, then 11 passed after real catalog-reconciler integration |
| Focused benchmark/docs integration | benchmark, routed-eval, command-tree, audit, and docs tests | 126 passed and 6 skipped at one checkpoint; 113 passed and 6 skipped after command/reference regeneration |
| Python lint | focused and repository-wide Ruff checks | passed |
| Full Python regression | python -m pytest tests/ -q |
first shell invocation reached its 122-second wrapper timeout with no test failure; bounded rerun completed with 4,126 passed and 9 skipped in 163.08 seconds; the final staged candidate repeated 4,126 passed and 9 skipped in 163.96 seconds |
| Python 3.11 compatibility | GitHub matrix plus isolated CPython 3.11.16 rerun | the first PR head failed five feasibility tests on Ubuntu and Windows 3.11 while both 3.13 lanes passed: integer interval bounds called int.is_integer(), which is unavailable on 3.11; normalization now calls float(value).is_integer(), a direct regression passes 10/10, and the complete local 3.11 suite passes 4,127 with 9 skipped in 166.01 seconds |
| Documentation render | strict MkDocs build | passed |
| CLI documentation audit | audit_cli_references.py --check |
early docs-scope pass covered 118 files; final full-scope pass covered 725 files with zero violations and current inventory/generated/nav state; the preceding combined invocation was nonzero only because the audit command was initially called without required --check |
| Markdown links | check_markdown_links.py --root . |
382 tracked Markdown files passed after the new finding was staged; the expected pre-stage run could not resolve untracked targets |
| Secret hygiene | semantic scanner plus pinned Gitleaks | self-test passed; staged tracked snapshot had zero semantic and zero signature findings; full Git history had zero signature findings; seven ignored working-directory hits were confined to generated site/ and pytest-cache copies |
| Patch hygiene | git diff --cached --check |
passed after replacing Markdown hard-break whitespace; Git emitted line-ending conversion warnings only |
| Distribution build | python -m build |
built anvil_serving-0.35.0-py3-none-any.whl and anvil_serving-0.35.0.tar.gz from an isolated build environment |
| Distribution metadata | python -m twine check dist/* |
wheel and sdist passed |
| Isolated wheel install | python scripts/wheel_smoke.py --json |
passed outside the checkout; package data loaded and anvil-serving router run --help succeeded |
The timeout and stale editable install are retained because they explain non-passing command exits without misclassifying them as product regressions. Neither was hidden by changing the benchmark or test expectations.
Independent correctness design¶
The new gates do not ask the candidate model to grade itself. Context probes use deterministic exact identifiers and relationships. Long-tool acceptance requires independently parsed usage of at least 100,000 prompt tokens and a schema-valid tool selection. Routed acceptance verifies router metadata, client-observed provider/model identity, fallback state, and tool protocol rather than grading only the visible answer. The feasibility skill reports uncertain memory, speed, and quality terms as intervals or unfilled variables.
Retained blockers and follow-up¶
- The managed llama.cpp recipe health check targets the image-default internal port rather than the recipe port; the durable product gap is recorded in the repository ticket dated 2026-08-21.
- The required controller transport to the independent SWE-bench worker was unavailable, so difficult coding and time-to-success comparisons against the heavy tiers remain incomplete.
- Non-consecutive token-position warnings observed during llama.cpp endurance need explanation or elimination.
- The candidate supports images through its F16 projector but does not support native video.
- Package release does not rebuild a serving image or prove live fleet version parity. Those are deployment-readiness gates for a separately authorized deployment.
Release disposition¶
The intended closure state is published-not-deployed. PR checks, the merged
commit, the v0.35.0 GitHub Release, trusted-publisher workflow, and an isolated
install from PyPI are authoritative publication records. If any current-head
CI, package, security, or publication gate fails, the release remains blocked
and no tag is cut.