Anvil Serving 1.0.0 release readiness¶
Date: 2026-08-30
Candidate version: 1.0.0
Starting source revision: a29fcc9c51204395626a3d91f4c19df55a0a26e5
Scope: public product boundary, all six product-family journeys, CLI and machine-readable discovery, Fleet version reporting, documentation, package metadata, and source-package publication
Deployment state: not-deployed; no route, model assignment, promotion,
container, controller, client catalog, media worker, or live fleet state changed
Release disposition: candidate for published_not_deployed; merge, tag,
GitHub Release, trusted publication, and clean published-package verification
remain required
Product boundary decision¶
Anvil Serving remains one umbrella product. Model Serving, the Capability Gateway, Evaluation & Evidence, Anvil Voice, Anvil Media, and Control Plane & Fleet share one package, CLI, topology model, safety/evidence contract, and release line. Voice and Media are first-class branded families inside that umbrella, not separate products.
Spinning Media into a separate product was rejected for this release because its named workflows, durable jobs, qualification, worker lifecycle, opaque artifacts, controller/MCP exposure, topology ownership, and evidence gates already depend on the same public contracts. A separate repository or release line would duplicate those contracts without creating an independent authority boundary.
The Capability Gateway remains only one family. Its direct alias-to-tier selection is unchanged: no prompt classifier, semantic model selection, quality-profile routing, fallback, cloud escalation, or hidden substitution was introduced.
| Product family | Owned user outcome | Primary root commands |
|---|---|---|
| Model Serving | Reproducible artifact, recipe, serve, and reservation lifecycle | init, models, serves |
| Capability Gateway | Authenticated exact-alias protocol boundary | router |
| Evaluation & Evidence | Functional qualification and comparison-safe evidence | eval |
| Anvil Voice | Explicit STT, TTS, realtime, and voice qualification lifecycle | voice |
| Anvil Media | Bounded named image/video workflows, durable jobs, and artifacts | media |
| Control Plane & Fleet | Ownership resolution, typed dispatch, host utilities, and fleet state | fleet, controller, mcp, host, topology, and integration roots |
ADR-0042 records the authority decision. Product families and user journeys is the user-facing contract.
Executable story and compatibility¶
The candidate adds a code-owned product catalog and read-only discovery:
Every visible operational root command is assigned to exactly one family and validated as a complete partition. Command-manifest schema 6 publishes the umbrella catalog, family metadata, and each command's family id. Consumers that accept only schema 5 must update; ordinary existing command invocations remain compatible.
README, package metadata, root help, documentation navigation, getting started, architecture, terminology, CLI reference, agent context, and the dedicated Voice, Media, and control-plane references now use the same story. The Media journey covers capability discovery, exact bundle inventory, workflow validation, dry-run submission, durable job state, and opaque artifacts.
The candidate also repairs global JSON output for fleet version. A skew or
missing-installation gate still exits nonzero, but automation now receives the
complete per-host report and stable fleet_version_gate_failed error instead
of data: null. Human rendering and redaction remain intact.
The closed public tickets record the defects and their acceptance evidence:
.tickets/closed/2026-08-30-product-family-journeys-not-enforced.md;.tickets/closed/2026-08-30-fleet-json-drops-nonzero-report.md;.tickets/closed/2026-08-30-media-cancel-examples-missing-backend-url.md;.tickets/closed/2026-08-30-media-envelope-finding-not-indexed.md;.tickets/closed/2026-08-30-existing-finding-missing-from-index.md;.tickets/closed/2026-08-30-product-journey-json-schema-inconsistent.md;.tickets/closed/2026-08-30-finding-index-test-includes-untracked-drafts.md;.tickets/closed/2026-08-30-json-errors-duplicated-as-warnings.md; and.tickets/closed/2026-08-30-cli-audit-inventory-stale-after-review-test.md.
Candidate review found and corrected one additional documentation defect: the
Media bundle inventory/staging journey and examples initially omitted their
required workflow id. The commands now include <WORKFLOW>, and a regression
requires every catalog journey step to begin with a visible command-tree path.
Three independent review rounds then found incomplete Media cancellation
examples, two missing finding-index entries, an inconsistent shared journey
JSON field type, an index regression that included untracked drafts, and a JSON
error duplicated as a warning. Exact-head CI separately rejected a generated
CLI-reference inventory that had been checked before its new regression file
entered the Git index. Each issue is corrected and covered before the final
exact-head review.
Version and artifact closure¶
The 1.0.0 candidate is synchronized across package metadata, runtime version,
README badge, changelog, Dockerfile examples, public controller/router/voice/
media Compose defaults, and the byte-synchronized packaged scaffold. These
Compose tags identify locally built source images; this release does not publish
a container image or rebuild a live service.
Verification record¶
Tests ran in an isolated worktree with no GPU, model, route, container, client, or fleet mutation. The full suite used the repository's isolated pytest wrapper and ordinary bounded host resources; no parallel model workload was started.
| Surface | Command or method | Result |
|---|---|---|
| Candidate version | source-module version probe | anvil-serving 1.0.0; a separate stale PATH shim still reported the previously installed 0.36.0 and was excluded from candidate evidence |
| Focused product/Fleet regression | command-tree, CLI, Fleet, output, and Compose tests | 531 passed before the final journey correction; the post-correction focused set passed 348 tests; the first adversarial-review correction set passed 146 and skipped 6; the second correction set passed 355; the third correction set passed 339 |
| Full Python regression | python scripts/run_tests.py tests/ -x -q |
third review-corrected code: 4,456 passed and 9 skipped in 186.73 seconds |
| CLI documentation audit | full-scope check/update | final correction inventory covers 836 files with zero violations; generated manifest/reference inventory current |
| Semantic secret hygiene | scanner self-test and current/tracked/untracked scopes | self-test passed; third review-corrected candidate scan covered 2,128 tracked or non-ignored untracked text files with zero findings |
| Pinned signature scan | exact staged-tree archive with pinned Gitleaks digest | final pre-review staged snapshot scanned with zero findings; current-head CI must repeat the gate |
| Full Git history | pinned Gitleaks history scan, reported separately | 21 historical signatures remain: 17 generic-key, 3 private-key, and 1 curl-auth-header; none is present in the current candidate; history rewrite or credential rotation was not authorized |
| Python lint | repository-wide Ruff check | passed |
| Documentation render | strict MkDocs build | passed |
| Markdown links | tracked Markdown link checker | 453 tracked Markdown files passed |
| CLI documentation audit | final full-scope check | 836 files scanned with zero violations; manifest, generated reference, inventory, and navigation current |
| Scaffold synchronization | packaged-scaffold sync check | public examples and packaged copies are byte-identical |
| Patch hygiene | staged diff check | passed |
| Distribution build | isolated python -m build |
built anvil_serving-1.0.0-py3-none-any.whl and anvil_serving-1.0.0.tar.gz |
| Distribution metadata | Twine check | wheel and source distribution passed |
| Isolated wheel install | clean wheel smoke outside the checkout | installed package data and anvil-serving router run --help passed; wheel SHA-256 591991ea48b8c20d4ec72ff27c8692330078e2ba9d31993294435dd46ecc5eb9 |
| Independent adversarial review | GPT-5.5/xhigh reviews of pushed commits 7fea8c8bccce04ebb8702302e5c2f806e78d79c9, 481057c04d0d80a5eac2752e10078c4e54e866cb, and ae39f0f0e52aa92a7b6e327f3e1ebaf1d4ebf151 |
first review found two P2 documentation defects; second found one P2 shared-schema inconsistency and one P3 test-scope defect; third found one P2 JSON error/warning regression; all findings were ticketed and corrected, and exact-head re-review remains the merge gate |
| Current-head CI | exact pushed commit after all review corrections | ae39f0f0e52aa92a7b6e327f3e1ebaf1d4ebf151 passed every test, lint, docs, wheel, and secret job but failed the CLI audit because its new test was absent from the generated inventory; corrected exact-head CI remains required |
The host PATH observation is not package evidence: a pre-existing console shim resolved to an older installation even while the source module resolved this candidate. Artifact acceptance therefore requires the clean temporary wheel environment, and post-publication verification must resolve from the published package rather than that shim.
The historical signature findings are not represented as a clean-history claim. Current files are clean, the established public-artifact audit remains tracked by GitHub issue 290, and destructive history rewriting or live credential rotation is outside this publication authorization.
Adversarial review¶
The exact current head must be reviewed independently against at least these failure classes before merge:
- an umbrella label that hides or weakens a family's authority boundary;
- a journey command that is nonexistent, incomplete, or mutates more than its prose claims;
- a root command missing from, or duplicated across, the family partition;
- routing behavior that infers intent, selects by engine, or introduces fallback while presenting as a story-only change;
- JSON error handling that loses partial diagnostics or reveals private data;
- version/artifact drift, stale generated docs, or release/deployment conflation.
Review comments must be resolved on a new commit and the new head re-reviewed. A review of an earlier revision is not sufficient.
Release disposition¶
The authorized closure is published_not_deployed:
- pass final source, documentation, security, scaffold, and artifact gates;
- push the candidate and obtain independent adversarial review of the exact head;
- require current-head CI and merge only that reviewed revision;
- verify the merge revision on
main; - create the
v1.0.0GitHub Release from that exact merge revision; - let the trusted-publisher workflow build and publish from the tag;
- verify PyPI serves
1.0.0and a clean install resolves that version; and - leave the current live router, controller, serves, clients, media workers, and routes untouched.
Any failed merge, tag, release, workflow, index, or clean-install check leaves publication incomplete. Live deployment remains a separate transaction.