v0.2.1
Patch release on the v0.2.x line. Dominantly defensive: a comprehensive
end-to-end QA suite for the jarvy registry sync feature shipped in
v0.2.0, plus the two real bugs that suite caught in the supply-chain
verification path. Also closes Windows test-isolation tech debt that had
been silently red on every tag-push CI run going back to v0.2.0-rc.1.
Soaked as v0.2.1-rc.1 → -rc.8 over 2026-06-24 → 2026-06-25; soak
record in #39.
The two registry-sync bug fixes are the user-impacting items. Operators
running jarvy registry sync against a cosign-signed manifest in v0.2.0
were getting fail-CLOSED behavior that looked correct on the surface
(verification rejected) but happened for the wrong reason (the sig/pem
staging paths never matched what cosign verify-blob looked for), so
the actual signature was never checked. The second fix closes a window
where a malformed manifest body could be promoted to the canonical
manifest.json path before validation rejected it — a subsequent
jarvy registry status would then dump the invalid bytes verbatim.
Both shipped silently in v0.2.0 because the original PR only had
in-process tests of run_sync_with_config; the new e2e suite drives
the real binary against a programmable mock registry + cosign shim and
is what surfaced them.
Known limitation — bootstrap-mode gates carry forward
Same status as v0.2.0: #30
is still open, so the Path 2/3/4 (upgrade / skip-version / rollback) CI
gate still runs in bootstrap mode. No regression vs v0.2.0; the gap
closes when tarballs ship.
Added
- Comprehensive registry-pull QA suite (~1900 LOC across 4 new test
files). End-to-end lifecycle (configure → sync → status → clear),
cosign signature path with a FakeCosign shim, resilience (oversized
manifest, truncated body, HTTP 500, parallel-fetch stress, recovery
after prior failed sync, duplicate names, invalid UTF-8, unparseable
TOML), and tracing-event regression guards that pin
registry.sync.{started,completed,sha_mismatch,signature_disabled,failed}
by name + level + field shape against the documented OTEL taxonomy.
Replaces the prior in-process-only coverage that missed the
staging-path bug.
Fixed
- Registry
cosign verify-blobactually verifies now. Prior to this
release,verify_sigstore_signature_with_identitylooked for
manifest.json.unverified.{sig,pem}as siblings of the staged
manifest, but the orchestrator wrote them at
manifest.json.{sig,pem}.unverified. Cosign returned
SignatureFilesMissingon every invocation, whichsignature_outcome_is_acceptable
correctly rejected — so the failure mode was fail-CLOSED ("sync
refused") rather than silent-bypass, but no signature was ever
actually checked. Staging now uses the path shape cosign's extension
derivation expects. - Malformed manifest bodies no longer poison the cache. Previously,
sync.rswrotemanifest.json.unverifiedto disk and then promoted
to the canonicalmanifest.jsonBEFORE parsing the bytes. A non-UTF-8
or syntactically invalid manifest would error out of sync but leave
the canonical file populated with the bad bytes, which
jarvy registry statusthen printed verbatim. Manifest is now parsed
in-memory before any disk write; promotion happens only after a
successful parse. - Windows test-isolation tech debt cleared across the suite. Eight
previously-silent Windows-only test failures (paths::tests,
network::propagate::tests,update::installer::tests, plus 12
ai_hooks_integration+ 2mcp_register_integrationtests) had
been red on every tag-push CI run since v0.2.0-rc.1 because (a) test
helpers hard-coded/tmppaths that aren't absolute on Windows,
(b)Path::starts_withis component-aware but string-prefix checks
withformat!("{prefix}/")weren't, (c)dirs::home_dir()on
Windows is Win32-API-backed and ignores HOME/USERPROFILE env vars
(so test sandboxes had no effect), and (d)cosigndiscovery only
knew about.exe, not.cmd/.bat. All fixed; the Test workflow
now runs Windows-green on every tag push. v0.2.0 stable shipped with
these failures as inherited sev-2. - Test-mode bypass for
jarvy audit.audit::run_one_scannernow
honorsJARVY_FAST_TEST=1(the documented test-mode contract for
"skip external command execution") and returns synthetic "not
available" results. The test for this code path went from 683s to
1.7s locally.
Changed
- Registry CLI + cache events now route through
telemetry_gate::emit.
Closes the opt-in contract for theregistry.*event family — v0.2.0
leakedregistry.cli.sync_failed,registry.cache.swap_failed, and
theregistry.cache.index_*events to OTLP even when the user had
settelemetry.enabled = false. Matches the contract already
documented for thepackage.*event family. - CI Test workflow on
cargo-nextest. Switched fromcargo test
tocargo nextest run --all-features --no-fail-fast. Process-level
parallelism per test; the Windows lane went from ~14 min to ~3-4 min
warm-cache. Also dropped--show-output(Windows terminal I/O sink)
and--verbosefromcargo check. - CI actions on Node 24. Bumped
actions/checkoutv4→v7,
actions/upload-artifactv4→v7.0.1,actions/deploy-pagesv4→v5,
softprops/action-gh-releasev2.2.1→v3.0.0,
KSXGitHub/github-actions-deploy-aurv2.7.2→v4.1.3. Clears the
Node 20 deprecation warnings the runner had been forcing through.
Tooling
- Cursor + JetBrains Toolbox Linux install support (#35).
Both were macOS+Windows only in v0.2.0; Linux now lands via tarball
fallback paths. - 9 networking tools (#36):
cloudflared,headscale,nebula,netbird,openvpn,
tailscale,twingate,wireguard-tools,zerotier. Covers VPN +
overlay-mesh stacks for both home-lab and corp deployments.
Full Changelog: v0.2.1-rc.8...v0.2.1
Installation
Quick Install (Unix)
curl -fsSL https://raw.githubusercontent.com/bearbinary/jarvy/main/dist/scripts/install.sh | bashQuick Install (Windows PowerShell)
irm https://raw.githubusercontent.com/bearbinary/jarvy/main/dist/scripts/install.ps1 | iexHomebrew
brew install bearbinary/tap/jarvyCargo
cargo install jarvyEarly-Release Channel
Pre-release tags (-rc.N, -beta.N) are routed through the beta channel.
Opt in: JARVY_CHANNEL=beta on the install script, or jarvy update --channel beta.
See docs/release-testing.md.
See installation docs for more options.
Security
Verify Signatures
All release artifacts are signed with Sigstore keyless OIDC. Verify any artifact:
ARTIFACT=jarvy-linux-x86_64.tar.gz
BASE=https://github.com/bearbinary/jarvy/releases/download/v0.2.1
curl -LO $BASE/$ARTIFACT
curl -LO $BASE/$ARTIFACT.sig
curl -LO $BASE/$ARTIFACT.pem
cosign verify-blob \
--signature $ARTIFACT.sig \
--certificate $ARTIFACT.pem \
--certificate-identity-regexp '^https://github\.com/bearbinary/Jarvy/\.github/workflows/release\.yml@refs/tags/v[0-9.]+(-[A-Za-z0-9.]+)?$' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
$ARTIFACTTag Signature
This release was cut from a signed git tag. Verify with:
git -c gpg.ssh.allowedSignersFile=.github/allowed_signers tag --verify v0.2.1SBOM
Software Bill of Materials in SPDX 2.3 (sbom.spdx.json) and CycloneDX 1.4 (sbom.cdx.json).
Checksums
SHA256 checksums for all artifacts are in SHA256SUMS.txt.