Decision context
This revision applies the following product decisions as hard constraints:
- Python/UV is not retained as a Vox platform packaging/runtime lane.
vox installis removed from package-management semantics (Phase B).- Vox uses a hybrid package command model:
- Top-level common dependency verbs (
add/remove/update/lock/sync). - Advanced and governance operations under
vox pm ....
- Top-level common dependency verbs (
updateandupgradecannot remain semantic synonyms.
Why this document was rewritten
The prior draft captured useful benchmarking, but it underweighted three repo-critical areas:
- Package storage and repository lifecycle details (
.vox_modules, local DB usage, CAS boundaries). - Existing namespace policy conflict already documented in CLI design rules (
updatevsupgrade). - Current state of Python retirement (some surfaces already retired, others still active in code/docs).
This rewrite corrects those gaps and converts findings into implementation-grade requirements.
Method and evidence quality
- Repo audit focused on active code paths and command contracts:
- crates/vox-cli/src/lib.rs
- crates/vox-cli/src/commands/lock.rs
- crates/vox-cli/src/commands/update.rs
- crates/vox-cli/src/commands/add.rs
- crates/vox-cli/src/commands/remove.rs
- crates/vox-cli/src/build_service.rs
- crates/vox-cli/src/commands/run.rs
- crates/vox-pm/src/lib.rs
- contracts/cli/command-registry.yaml
- External benchmark pass: 24 web searches (Cargo, registries, lockfile systems, supply-chain controls).
- Source weighting:
- Tier A: canonical specs and official docs.
- Tier B: project-maintainer docs.
- Tier C: ecosystem analyses.
Current-state architecture map
Command surface and namespace
- Phase B:
vox installis not a CLI subcommand; it does not appear in crates/vox-cli/src/lib.rs or contracts/cli/command-registry.yaml (usevox add/vox lock/vox sync/vox pm— see pm-migration-2026.md). - Historical (pre‑2026 wave):
Installhad been a hidden migration-error variant; that shim is removed. add/remove/update/lock/sync/pmare first-class in crates/vox-cli/src/commands/mod.rs.- CLI design rules already call out the anti-pattern of near-synonyms (
updatevsupgrade) in docs/src/reference/cli.md.
PM core capabilities already present
vox-pm already provides foundational pieces:
- Manifest parsing (
Vox.toml) in crates/vox-pm/src/manifest.rs. - Lockfile model (
vox.lock) in crates/vox-pm/src/lockfile.rs. - Registry client in crates/vox-pm/src/registry.rs.
- Workspace model in crates/vox-pm/src/workspace.rs.
- Artifact cache in crates/vox-pm/src/artifact_cache.rs.
Gap: the user-visible lifecycle is not coherently exposed through stable top-level commands.
Package storage and repository blind spots
- Current
updatepath uses.vox_modules/local_store.dbthroughvox_db::VoxDbin crates/vox-cli/src/commands/update.rs. - Vendor trees:
vox pm vendor(or copy.vox_modules/dlmanually) aftervox sync; the old unwiredcommands/vendor.rshelper was removed as duplicate. - The relationship between:
- manifest (
Vox.toml), - lock (
vox.lock), - local materialization (
.vox_modules), - and cache/CAS (
artifact_cache) is not enforced as one canonical contract yet.
- manifest (
Cargo invocation architecture
- Cargo orchestration service exists in crates/vox-cli/src/build_service.rs.
- Direct cargo spawning still exists in crates/vox-cli/src/commands/run.rs.
- This split undermines consistent policy enforcement (target-dir, telemetry, retries, lock handling).
Python/UV retirement status (hard-cut baseline)
vox mens train-uvis already retired by runtime bail in crates/vox-cli/src/commands/mens/populi/dispatch.rs and markedretiredin registry.- But UV/Python code remains in active crate surfaces (for example crates/vox-container/src/env.rs).
- Docs still describe active Python integration (for example
how-to-pytorch,api/vox-pypages listed by doc inventory).
Conclusion: retirement is policy-correct but code/docs are not fully converged.
Critique of prior draft
What the prior draft got right
- Correctly identified Cargo as the stable substrate.
- Correctly identified
vox installas a stub and namespace confusion source. - Correctly identified Docker reproducibility and provenance as strategic requirements.
What it missed or under-specified
- Did not reflect user intent to hard-retire Python/UV.
- Did not specify a concrete hybrid command taxonomy with migration-level detail.
- Did not map
.vox_modulesand local store behavior into the PM lifecycle model. - Did not handle
updatevsupgradewith explicit namespace ownership and policy. - Treated UV patterns as adoption candidates instead of retirement impacts.
Corrected stance
- Python/UV is a removal target, not a retained compatibility strategy.
vox installis retired; top-leveladd/remove/update/lock/syncbecome the common package lane.upgradeis reserved for Vox toolchain/self-update semantics only.
Namespace unification requirements (hard constraints)
Canonical meaning per verb
add: add project dependency declaration toVox.toml.remove: remove project dependency declaration fromVox.toml.update: update resolved package graph and lock entries for the project.lock: create or refreshvox.lockwithout necessarily materializing.sync: materialize dependencies to local storage from lock/manifest policy.upgrade: upgrade Vox binary/toolchain/source distribution, never project dependencies.
Advanced pm scope
Use vox pm ... only for advanced, operator, or governance actions:
- registry/search/publish/yank,
- vendor/offline packs,
- provenance verify,
- policy checks,
- cache maintenance and diagnostics.
install retirement rule
vox installis removed as a package verb.- Any transitional alias must fail with explicit migration guidance to the new verbs.
Cargo-first PM lifecycle to implement
Required lifecycle stages
- Read and validate
Vox.toml. - Resolve version graph.
- Write deterministic
vox.lock. - Fetch artifacts with digest checks into canonical cache/store.
- Materialize local working set (for build/runtime).
- Build/ship from lock-bound inputs.
Policy modes required
--locked: forbid lock mutation.--offline: forbid network.--frozen: locked + offline.
These modes must be consistently enforced in local workflows, CI lanes, and Docker build paths.
Python hard-retirement impact matrix
Code targets (remove or gate-to-error)
- UV/Python environment code in crates/vox-container/src/env.rs.
- Python-oriented container generation in
vox-containerpython Dockerfile paths. - Any remaining command flags or branches that imply Python package setup.
Command contracts and registry
- Ensure command registry reflects no active Python package-management lane.
- Keep historical retired rows only where needed for migration diagnostics.
Documentation targets
- Remove or rewrite Python integration pages so they no longer describe supported paths.
- Keep historical context only in ADR/changelog sections where explicitly marked as superseded.
Docker packaging findings and applied requirements
- Current Docker surfaces package the Vox runtime, but are not yet lockfile-contract strict.
- Applied requirement: every packaging lane that installs Vox dependencies must be lock-aware and reproducible.
- Required checks:
- lock present or explicitly generated by policy,
- digest verification at fetch,
- deterministic materialization path.
External patterns to apply (post-filtered for hard-cut strategy)
Cargo patterns
- Resolver + lockfile precedence behavior.
- Source replacement, vendoring, and offline operation.
- Sparse registry metadata model and cache discipline.
Supply-chain patterns
- Checksum-first install guarantees.
- Provenance attestations on release artifacts.
- Policy verification at CI/release gates.
Patterns explicitly not adopted
- UV/Python universal lock or environment-resolution features are not strategic under hard-cut retirement.
Risks and unresolved design questions
High risk
- Breaking script/tooling users who still invoke
vox install. - Incomplete retirement where command registry, docs, and code diverge.
- Operator confusion if
upgradeis documented as touchingVox.toml/vox.lock(mitigated: namespace split + CI guard onupgrade.rs; binary replacement SSOT isbinary-release-contract.md/ bootstrap, not the PM lock).
Toolchain upgrade distribution (packaging wave closure)
- Namespace / safety:
vox upgradeis toolchain-only and must not touchVox.toml/vox.lock(enforced in CI). The command currently emits operator guidance (channel placeholder, rebuild / PATH hints). - Binary SSOT for replacing
vox: documented artifact layout and triples live inbinary release contract; first-party install path isvox-bootstrap(falls back tocargo install --locked --path crates/vox-cliwhen no asset matches). - Toolchain self-update (shipped):
vox upgradeis check-only by default;--applyusesself_update+checksums.txt(same contract as bootstrap) intoCARGO_HOME/bin, with--provider github|gitlab|http, semver gates, and--allow-breaking/--allow-prerelease. Further hardening (e.g. TUF) remains optional.
Research-backed acceptance criteria
A successful PM redesign must satisfy all of:
- No active package flow depends on Python/UV.
- No active command uses
installas dependency-management verb. updateandupgradeare semantically disjoint and test-enforced.- Top-level dependency verbs and advanced
pmverbs are both documented and contract-tested. - Lockfile policy modes are implemented and enforced across local, CI, and container lanes.
Implementation closure (tracked in-tree)
As of the 2026 packaging execution wave: hybrid top-level + vox pm grammar is shipped; vox install is removed from the CLI and registry (scripts must migrate — see reference/pm-migration-2026.md); update vs upgrade split includes CI validators; Lockfile TOML round-trips path/git/registry sources; vox pm mirror supports --file and --from-registry for the local PM index; integration tests cover path graph, registry stub, frozen sync, pm-provenance, and optional workflow_dispatch fixture workflow — see vox-packaging-full-implementation-plan-2026.md.
Bibliography (core)
- Cargo resolver: Dependency Resolution
- Cargo source replacement: Source Replacement
- Cargo vendoring: cargo vendor
- Cargo sparse registry: RFC 2789
- Go transparent checksum model: sumdb design
- SLSA provenance schema: SLSA provenance
- Sigstore attest verification: Cosign in-toto attestations
- in-toto framework: Getting started