Release 2.1.202 (2026-08-23)¶
Bug fixes¶
- skip the warmup when its manifests are absent (#2881) (#2887) The cached-image warmup IS the install-stage command list, run unconditionally. For cpp that is 'conan lock create . && conan install . && cmake ...', so a repo with no conanfile.txt failed at the first link, aborted the && chain, failed the image build, and raised RuntimeError: Cache build failed - leaving vrg-container-run unable to run any command at all, including echo (#2871).
This is the bootstrap case, and it is not cpp-specific: every language's warmup assumes manifests that a fresh repo does not have yet. #2859 is what generalised it - before that, detect_language read the filesystem, so an unbootstrapped repo resolved to '' and fell back to prod-base, accidentally dodging the warmup. Now the language is asserted from vergil.toml, so any fresh repo of any language hits it. cpp reached it first only because it is the newest language in use.
_WARMUP_REQUIRES declares per-language prerequisites as groups: a group is satisfied when any of its names is present, and every group must be satisfied. The group form is needed for cpp, which accepts either conanfile spelling; a flat list would mis-handle conanfile.py. _warmup_command takes repo_root (both call sites already had it) and returns '' when a group is unsatisfied. The provisioning banner reports the skip and names what is missing, so an unwarmed image is never silently indistinguishable from a warmed one. The image builds unwarmed but usable, and vrg-validate then produces its own legible install-stage error.
Also adds the missing cpp and typescript entries to _CACHE_FILES, which is not merely adjacent. The cache hash is cache-files + base-digest + salt; the setup string is not in it. Without a cpp entry the key was vergil.toml alone, so an image built unwarmed during bootstrap would keep being reused after conanfile.txt appeared, and a later dependency change would silently reuse stale warmed deps. With the entry, bootstrapping changes the key and forces a rebuild that warms properly - which is what makes the skip self-healing.
Verified against logical-minds-foundry/mq-protocol-gateway, the blocked repo: missing_warmup_files reports both groups, the warmup resolves to '', and the cache file set is vergil.toml only until the manifests land.
Testing¶
- run the suite under pytest-xdist (-n auto) (#2886) Add pytest-xdist to the dev group and set addopts=['-n','auto'] in pyproject so every pytest run — vrg-validate and PR-CI — fans out across all cores. pytest-cov aggregates per-worker coverage, so --cov-fail-under=100 is preserved. Regenerated uv.lock (adds pytest-xdist, execnet; both MIT). Scoped to this repo's pyproject, not the shared languages.py test command, so no other repo changes. Override with -n0 for a serial/debug run.
CI Evidence: All gates passed — full audit bundle available. Download →