Release notes
HOL Guard v3.57.0
StableHOL Guard v3.57.0, released October 25, 2026, is a stable release with 26 additions, 8 improvements, 33 fixes and 8 other changes across 73 merged pull requests. Highlights: Report launched runtimes that match an advisory as workspace findings; Hold background assessments while the host is busy.
26 added · 8 improved · 33 fixed · 8 other
Published Original GitHub release for v3.57.0
Key facts
- Version
- v3.57.0
- Channel
- Stable
- Published
- Previous release
- v3.56.0
- Merged pull requests
- 73
- Commits
- 76
Documented changes
75 typed entries
Verified contributors
Credits being verified. Attribution coverage is unknown.
Attribution coverage
attribution not yet verified; history inventory partial.
Install
Scope
Guard v3.57.0 is a stable release published 2026-10-25. Upstream documents: Report launched runtimes that match an advisory as workspace findings. Attribution for this release is being verified.
Changes
Added
26- guardReport launched runtimes that match an advisory as workspace findings (#5980) Evidence for this change
- Findings. One finding per advisory and matched executable path (byte-identical runtimes at two paths are two findings), for the
affected,restart_requiredandfix_unverifiedverdicts. Settled or unknown… - Coverage. The run is never reported clean for runtimes it could not check. Missing advisories add
runtime_advisories_unavailable, an unknown verdict, an unreadable harness configuration, a launch past the probe's… - Reassessment. The worker probes each worktree's runtimes at most once every 10 minutes, and at most two worktrees per poll, so a restart does not hash every worktree's executables at once. The runtime identity…
- Findings. One finding per advisory and matched executable path (byte-identical runtimes at two paths are two findings), for the
- workspaceHold background assessments while the host is busy (#5978) Evidence for this change
- plugin-kitLeave marketplace copies out of the plugin with [plugin_kit] exclude_paths (#5979) Evidence for this change
- dashboardShow plugin update prompts in the local Guard dashboard (#5969) Evidence for this change
- The dashboard cannot reach hol.org (CSP), so two new daemon routes do the work:
GET /v1/plugins/updatesruns the same native comparison as the CLI, andPOST /v1/plugins/updates/dismissrecords a dismissal for one… - Both routes need the dashboard session token. The Rust route policy lists them in
TOKEN_REQUIRED_PATHSand allows them only with the right method (GET for the read, POST for the dismissal). - The check runs only when the reader presses "Check for plugin updates". Guard downloads the public release index and compares versions on the device; nothing about the installed plugins is sent.
- The dashboard cannot reach hol.org (CSP), so two new daemon routes do the work:
- runtimeReview Node.js launches of builds with known high or critical advisories (#5957) Evidence for this change
- plugin-releaseAdd the trusted reusable Plugin Release workflow (#5970) Evidence for this change
- The workflow starts with
permissions: {}. The one job asks forcontents: read,id-token: write,attestations: write,artifact-metadata: writeandsecurity-events: write(the last only matters with… - Every composite input is forwarded, and the composite's outputs (score, check result, runtime count, attestation URL, registration status and releases page URL) are exposed to the caller.
- The doc now describes the workflow as shipped and shows a minimal caller.
- The workflow starts with
- plugin-releasePin the Guard wheel and smoke-test the composite (#5965) Evidence for this change
- Match runtime advisories from the signed supply-chain bundle (#5953) Evidence for this change
- Verification and coverage stay native. Python passes the stored bundle response, the recorded sync keyring and the recorded bundle entitlement through unparsed. Rust checks the entitlement with the same rule…
- Only an anchored bundle can clear a runtime. A bundle that verifies only against the key it advertises can still report
affected, but itsnot_affectedmatches are downgraded tounknown… - Unknown stays unknown. Platform-scoped rules match only a confirmed OS/arch; an unconfirmed platform, including a macOS universal binary, reports
platform_unknown. Bundled-component rules report…
- guardReport observed MCP launch runtimes in fleet posture (#5950) Evidence for this change
- Coverage is
observed_only, so the section never claims a complete scope and never reports a runtime as safe. - A minimal report leaves the section out; older receivers that do not know it are unaffected because it is optional in the v1 schema.
- Observing launches hashes executables, so the section is cached for an hour.
- Coverage is
- guardAssess workspaces registered with install --workspace (#5947) Evidence for this change
- Each poll admits the workspace of every active install once. A root that is already admitted is skipped before any snapshot.
- Automatic admission never resumes a paused worktree, even when the same worktree is reached through a newly registered path. Manual admission still resumes, as before.
- A root that cannot be admitted (for example, the snapshot is refused) is remembered for the life of the worker, so it is not walked on every poll. A missing root is retried once it exists.
- dashboardReview and apply dependency fixes from the Workspaces tab (#5935) Evidence for this change
- A Fix column joins the findings table. An npm finding with a published fix version gets Prepare fix. Other findings show "Manual update" and no button, so the tab never offers an edit the daemon cannot make.
- Prepare fix opens a review below the table, without a modal. It shows each package.json Guard would change, the section and the range before and after, and the diff. Each manifest gets its own **Apply to **…
- After apply, the notice names the lockfile to update with the package manager. The row shows Waiting for re-check until a complete assessment settles the proposal as Fixed or Still found ("Update the…
- guardScan workspace snapshots for secrets in background assessments (#5930) Evidence for this change
- The native workspace snapshot scans the same bounded file set it already hashes, with the existing
guard-scannerrepository secret rules. It follows no symlinks and never leaves the workspace root. - Credential stores, key and certificate files, non-text files and oversize files are skipped. They are counted under
coverage.secrets.skippedand are not reported as findings. - Matched text is dropped at the native boundary. The native scan emits the final finding: a worktree-scoped id, the rule id, the root-relative path, every line where it appears (up to 16) with an
occurrencescount…
- The native workspace snapshot scans the same bounded file set it already hashes, with the existing
- runtimeReport the runtimes configured servers would launch, without running them (#5929) Evidence for this change
- A new native
runtime-identity-probecommand (featureruntime-identity-probe-v1) describes each candidate path without executing it. It resolves symlinks and hashes the file with a bounded read. Missing files… - The runtime family and version are inferred from the file name and the install layout only: nvm, Homebrew Cellar, fnm, asdf, volta and pyenv. Because nothing is executed or signature-checked, assurance is at most…
- Launch resolution is native too: the probe takes launch specs (the configured command, the server's own
PATH, the launch directory, and the environment values a search path may reference) under a new…
- A new native
- guardPrepare, apply and verify reviewed dependency fixes for workspace findings (#5926) Evidence for this change
- pluginsShow update prompts for installed plugins with a newer checked release (#5928) Evidence for this change
- Guard downloads the public listing index and the public release index. Before the native check it narrows the listing index to plugins found on this machine, using the same
repositoriesfilter as install counts. - The native runtime (
guard-plugin-telemetry, newupdatescommand behind theplugin-updates-v1resident feature) compares installed versions with recorded releases locally. Nothing about installed plugins is sent. - A prompt is marked urgent when the newer release fixes a high or critical scanner finding, or when the installed release had one.
- Guard downloads the public listing index and the public release index. Before the native check it narrows the listing index to plugins found on this machine, using the same
- guardSend workspace assessment summaries with receipt sync (#5919) Evidence for this change
- telemetryAdd opt-in weekly plugin install counts (#5909) Evidence for this change
- runtimeAssess runtime identities against vendor advisory ranges (#5916) Evidence for this change
- dashboardShow background workspace assessments in the supply-chain hub (#5921) Evidence for this change
- Each tracked worktree shows one status: fresh, stale, queued, running, partial, failed, paused or pending.
- A partial check lists its coverage gaps, and detectors that are not part of the check yet are named, so a partial result never reads as all clear.
- Dependency findings show the package, installed version, fixed version, decision, severity and advisory IDs.
- guardAssess the active worktree in the background (#5901) Evidence for this change
- plugin-releaseAttest each plugin release with the scanner and the Plugin Kit (#5913) Evidence for this change
- plugin-kitCheck and package one plugin source for every agent runtime (#5889) Evidence for this change
- check reports what a marketplace reviewer or runtime loader would reject (name not kebab-case, missing description or license, skills without frontmatter, MCP servers with neither command nor url, a literal value…
- package writes a ready-to-load copy for
claude-code,codex,gemini-cli,cursor,vscode,opencode,mcp-registryandagent-skills, plushol.provenance.json(source digest and per-file SHA-256, no… - links prints the install commands that already work for the repository and the steps left to list it everywhere.
- commandAdmit the daemon summaries that resolve no compose project (#5860) Evidence for this change
- diagnosticsRecord active-set and candidate counts for scale runs (#5894) Evidence for this change
guard-commandkeeps counters innative_command_program_work_stats.rs. They record the active extension count of the last compiled controls, plus, per thread, the candidates the last declarative pass considered and…- With
HOL_GUARD_NATIVE_DIAGNOSTICset, the resident writes those counts after each request asnative_resident_notelines in its existing phase log. As with existing notes, a line is written only when its value… - With the variable unset nothing is written. Receipts, decision IDs and the wire format are unchanged.
- Add a false-positive issue form (#5962) Evidence for this change
- Add ApexCompress command safety extension (#2994) Evidence for this change
Improved
8- hookAnswer
hol-guard hookthrough the daemon review path (#5963) Evidence for this change - commandMake pretool a base layer of guard-command (#5960) Evidence for this change
- runtimeDrop request-classifier tables nothing reads (#5946) Evidence for this change
- runtimeShare artifact payload and Python whitespace helpers (
23da1c3) Evidence for this change - runtimeRemove the unused Python literal-cd shell parser (#5945) Evidence for this change
- hookAsk the resident for queued review hints (#5942) Evidence for this change
- hookDeclare fail-closed hook envelopes in one Rust-checked contract (#5922) Evidence for this change
- runtimeRemove the unused Python skill-path resolver (
fcbbde7) Evidence for this change
Fixed
33- guardLet slow workspace assessments finish instead of retrying forever (#5985) Evidence for this change
- The runner now renews the lease after each stage: after the first snapshot, after the audit and after the runtime check. A slow workspace keeps its run and records its result.
- If renewal fails because the run was canceled, expired or taken over, the runner stops before the next stage.
- An expired lease is retried once. The retry is recognised because the expiry creates it in the same transaction, so a later run (for example after a paused worktree resumes) keeps its own retry. If the retry also…
- guardKeep workspaces with unsupported lockfiles out of complete coverage (#5984) Evidence for this change
- The snapshot digest does not change, because the lockfile is already one of the snapshot's entries. The assessment context version moves to v2 instead, so every admitted worktree is reassessed once after the upgrade.…
- Fix verification still works in a repository that mixes ecosystems. This reason does not leave any file unread, so a
pubspec.lockbesidepackage.jsoncannot hide an npm finding. It is the onesnapshot_*reason… - The secret scan is unaffected. This reason does not leave any file unread.
- pluginWait up to 60 seconds for the HOL plugin indexes (#5982) Evidence for this change
- workspaceReport unchecked dependencies when no advisory data is cached (#5977) Evidence for this change
- commandHonour a Git extension Allow over a review the command order alone raises (#5967) Evidence for this change
- plugin-releaseSend a User-Agent so release registration reaches HOL (#5973) Evidence for this change
- Plugin release and Guarded Repository registration now send
User-Agent: hol-guard-attestation-registration. - When registration fails, the runner now prints the HTTP status code next to the error class. It still prints no body and no token.
- Plugin release and Guarded Repository registration now send
- dashboardLabel the audit priority badge as high priority, not critical (#5964) Evidence for this change
- supply-chainSay where an auditable project folder must live (#5961) Evidence for this change
- dashboardCount blocked package installs from receipts, not inactive apps (#5959) Evidence for this change
- commandRead
git submodule statusas the printing command it is (#5955) Evidence for this change - commandLet a parent step return to the root a proven descent left (#5956) Evidence for this change
- commandKeep a recursive search or listing of a missing path quiet (#5954) Evidence for this change
- commandRead a process substitution as the path it opens (#5952) Evidence for this change
- commandKeep a help request silent when it names a subcommand's own verb (#5958) Evidence for this change
- commandKeep a checkout's own signing and pager settings out of the way (#5917) Evidence for this change
- commandProve the branch
git worktree addnames after its destination (#5949) Evidence for this change - commandRead a bare refresh as the reach it has, and let a fetch lead a chain (#5933) Evidence for this change
- commandRead a branch switch as the checkout it is (#5932) Evidence for this change
- catalogNote a publication built for another engine once, not as two errors every refresh (#5941) Evidence for this change
- commandRead a backgrounded launch followed by more jobs as a review, not a block (#5938) Evidence for this change
- dashboardClose Supply Chain dialogs on Escape and report real intel freshness (#5943) Evidence for this change
- commandKeep a proven fast-forward silent when a read follows it (#5936) Evidence for this change
- scannerReport oversized packaged Mac executables as uninspected (
8725d33) Evidence for this change - commandKeep a reader's proof when it follows a verified directory change (#5914) Evidence for this change
- guardKeep packages Cloud could not answer out of background findings (#5927) Evidence for this change
- A package whose only reasons are Cloud lookup failures is left out of the findings. A
blockdecision is always kept. - Supply-chain coverage for that run is reported as
incomplete, withsupply_chain_incompletein the reasons, so the result reads as partial and never as clean.
- A package whose only reasons are Cloud lookup failures is left out of the findings. A
- daemonKeep the verdict's reason when a hook render misses its deadline (#5918) Evidence for this change
- supply-chainFind the package managers a launcher PATH hides and explain a failed audit sync (#5906) Evidence for this change
- commandRead the command list a redirected control-flow construct runs (#5912) Evidence for this change
- guardVerify supply-chain bundles whose text is not ASCII (#5905) Evidence for this change
- releaseList every change in large release notes (#5904) Evidence for this change
- mcpbPack the release bundle without the MCPB CLI (#5903) Evidence for this change
publish-mcpb.ymlandmcpb-validation.ymlpackdistributions/mcpbwithscripts/ci/pack_mcpb.py. The release still uploadshol-guard- .mcpband its checksum.- The script checks the manifest, reads
[project].versionand[project].dependencies, refuses symlinks and paths that leave the bundle, and writes the zip through an exclusive temporary file. .github/tools/mcpb-cliis removed, including the Forge backport, the Trivy skip for that lockfile, and the node-forge ignore entry that belonged to that tool.
- commandRead a closed double-bracket test as the test it asks (#5855) Evidence for this change
- commandRead a grouped command that stands in a pipeline (#5862) Evidence for this change
Other changes
8- ciWiden the benign gate to 24 shards (#5939) Evidence for this change
- hookAnswer a review's retry binding and exact-action token in one resident ask (#5920) Evidence for this change
- gauntletAdd known-vulnerable Node.js launch cases (#5968) Evidence for this change
- guardShow that restoring protection leaves a known workspace risk open (#5948) Evidence for this change
- plugin-releaseRun plugin releases with Guard 3.57.0a5 (#5983) Evidence for this change
- plugin-releasePin Guard 3.57.0a5 so the Kit honors exclude_paths (#5981) Evidence for this change
- plugin-releaseRun the trusted workflow on the Guard 3.57.0a4 composite (#5976) Evidence for this change
- plugin-releasePin Guard 3.57.0a4 so registration names its client (#5975) Evidence for this change
Upgrade and compatibility
None documented.
Compare with the previous release
Predecessor on the same channel: v3.56.0
Verified contributors
Credits derive from public pull-request authorship, verified commit authorship, or verified co-authorship — never from thanks text or release metadata. Each distinct contributor is listed once; the evidence ledger paginates every published credit record.
Evidence ledger0 credits
No credits are published for this release yet.