Release notes
HOL Guard v3.58.0
StableHOL Guard v3.58.0, released October 27, 2026, is a stable release with 48 additions, 104 improvements, 86 fixes and 25 other changes across 231 merged pull requests. Highlights: Report running processes on the build they started from; Add the opt-in Oids remote server contribution.
48 added · 104 improved · 86 fixed · 25 other
Published Original GitHub release for v3.58.0
Key facts
- Version
- v3.58.0
- Channel
- Stable
- Published
- Previous release
- v3.57.0
- Merged pull requests
- 231
- Commits
- 265
Documented changes
263 typed entries
Verified contributors
Credits being verified. Attribution coverage is unknown.
Attribution coverage
attribution not yet verified; history inventory partial.
Install
Scope
Guard v3.58.0 is a stable release published 2026-10-27. Upstream documents: Report running processes on the build they started from. Its comparison base is v3.57.0. Attribution for this release is being verified.
Changes
Added
48- runtimeReport running processes on the build they started from (#6234) Evidence for this change
- It lists processes this user can see whose executable is one of the probed files, each named by boot, PID and start identity.
- A process is bound to the file on disk only when the file provably has not changed since it started: the process started a whole second after the file's last modification or status change, and on Linux…
- Otherwise the process keeps the build an earlier probe bound it to, passed back as
known_instances, or gets an unidentified artifact with no version andunknownassurance, which never clears an advisory. Stored…
- mcpAdd the opt-in Oids remote server contribution (
09ba7a7) Evidence for this change - mcp-serversAdd the borer MCP contribution (
41f6c0e) Evidence for this change - runtimeSign and verify command envelopes in the native runtime (#6116) Evidence for this change
- runtimeAuthenticate adapter state in the native runtime (#6121) Evidence for this change
- extensionsAdd the OpenComms command extension (
0c210ac) Evidence for this change - runtimeResolve package risk actions inside the native runtime (
927edc8) Evidence for this change - storeResolve an exact cloud review inside the native runtime (
7c6137d) Evidence for this change - guardLet the native runtime verify a supply-chain bundle (
2ab4140) Evidence for this change - runtimeCompose the live Codex allow artifact in the resident (#6103) Evidence for this change
- dashboardShow finding evidence apart from install policy (#6182) Evidence for this change
- extensionsAdd the ShieldEnv command extension (#6177) Evidence for this change
- Add the ShieldEnv command extension for local secret scans, with an external trust binding, the compact public descriptor, and a portable fixture.
- Includes the command source from #6162.
- workspaceFlag editor tasks and dev container commands that run on their own (#6143) Evidence for this change
- pluginSay how to get HOL Guard in the README install block and explain a missing native runtime (#6091) Evidence for this change
- README install block (
hol-guard plugin links --block)**
- README install block (
- pluginMake plugin install and uninstall easier to read and recover from (#6094) Evidence for this change
- Install and uninstall**
- pluginStop risky plugin installs, pin both runtimes and run only absolute programs (#6093) Evidence for this change
- The gate**
- A listing whose gate is
blockstops before any runtime starts, with exit 4. This also applies without--apply, so a script that only plans sees the refusal. - A listing whose gate is
confirmasks "Install anyway?" at the terminal. With--yesit stops with exit 4 unless--accept-riskis also given.--yesalone never accepts a risk.
- pluginGate installs on HOL's scan result and pin them to the scanned commit (#6092) Evidence for this change
- Spec versions**
hol.plugin-install-spec.v1stays strict: an unknown key is refused.v2ignores fields it does not know, so HOL can add fields without breaking older Guards. Ignored fields never reach a command line.
- guardCheck GitHub Actions workflows in workspace assessments (#6082) Evidence for this change
- Only
.ymland.yamlfiles directly in the root.github/workflowsdirectory are read, matching the files GitHub runs. Nested directories, composite actions under.github/actionsand workflow directories below… - The rules live in a new
guard-commandmodule,ci_workflow_risk, so the runtime owns them: ci.workflow.untrusted-checkout(execution, high, likely): a privileged trigger (pull_request_target,workflow_run, including inside anon:list) together with a pull request head reference on a checkoutref:…
- Only
- extensionsAdd GiviLoop command controls (
4c682be) Evidence for this change - pluginLet plugin install read specs from a test portal (#6087) Evidence for this change
- It accepts https anywhere, or plain http only on
localhost,127.0.0.1,::1orhost.docker.internal. - The native Kit checks the value (
endpointcommand) and returns its normalized origin: lowercase host, default port dropped. It refuses credentials (even empty ones), a query, a fragment, a backslash, a bad port or a… - An overridden endpoint never follows a redirect. A 3xx answer stops and asks for the final install-spec URL.
- It accepts https anywhere, or plain http only on
- guardApprove a paused package install in the terminal that ran it (#6095) Evidence for this change
- Approve on the spot. When both are terminals and no AI harness marker is present, Guard asks right there:
yallows once,aalways allows this exact install,n(or Enter) keeps it blocked. The answer resolves… - Clear next steps when no one can answer. For non-interactive human output, the "Guard guidance" panel (which tells an agent to wait and not retry) is replaced by "Approve this install": the exact `hol-guard…
- Approve on the spot. When both are terminals and no AI harness marker is present, Guard asks right there:
- runtimeVerify Guard Cloud command capabilities in the runtime (#6079) Evidence for this change
- mcp-serversAdd the Arch MCP contribution (
6827a43) Evidence for this change - extensionsAdd the agent-gauntlet command extension (
6f36e93) Evidence for this change - extensionsAdd the Mori command extension (
a5cd796) Evidence for this change - guardCount why the bounded bridges hand a hook to the daemon (#6076) Evidence for this change
bounded_direct_answerreturnsResultinstead ofOption: disabled switch, unsupported event, unbuildable request, or the resident's own miss.route_hookcarries the miss into both daemon posts, including the one after a daemon restart, as theX-Guard-Direct-Missheader.DIRECT_MISS_HEADERnow lives next toDirectMiss, and the Grok bridge imports it instead of keeping its own copy.
- policyDerive a cached bundle's decision identities in the resident (#6067) Evidence for this change
- mcpAdd the keepAwake MCP server (
61352fb) Evidence for this change - extensionsAdd Astrix command and MCP contributions (
4c5fb48) Evidence for this change - guardCount why the Grok bridge hands a hook to the daemon (#6071) Evidence for this change
- guardCheck agent plugin hooks and MCP servers in workspace assessments (#6027) Evidence for this change
- A plugin's hooks are its manifest's inline
hooks, the files that field names andhooks/hooks.jsonat the plugin root. Its MCP servers are the manifest's inlinemcpServers, the files that field names and… - Hook commands run the shared
hook_config_riskrules and servers the sharedmcp_config_riskrules, so a plugin finding uses the same rule ids as the project hook and MCP checks (hook.config.remote-code… - The runtime advertises the scan as
workspace-snapshot-plugins-v1. Each finding carries the rule id, category, severity, confidence, the rule's fixed title, reason and false-positive hint, the root-relative path of…
- A plugin's hooks are its manifest's inline
- runtimeSign workflow capabilities in the native resident (#6052) Evidence for this change
- nativeRead a packaged hook file's identity in the resident (#5873) Evidence for this change
- guardAssemble the local CLI inventory in the resident (#6039) Evidence for this change
- extensionsAdd drip command safety extension (
b030e35) Evidence for this change - guardReconcile temporary MCP grants in the resident (#6025) Evidence for this change
- pluginPrint a draft .well-known plugin card (#6033) Evidence for this change
- plugin-kitPrint a listing owner's HOL stats with hol-guard plugin stats (#6031) Evidence for this change
- guardWrite policy decisions in the resident (#6023) Evidence for this change
- pluginCheck and convert plugins against the Agent Plugins spec (#6021) Evidence for this change
- plugin-releaseAttest a CycloneDX SBOM and annotate changes since the previous release (#6024) Evidence for this change
- guardCheck project agent hooks in background workspace assessments (#6014) Evidence for this change
- The files checked are the ones agents load from the worktree root:
.claude/settings.jsonandsettings.local.json,.codex/hooks.jsonandconfig.toml,.cursor/hooks.json,.gemini/settings.json… - Hooks are read from a
hooksobject keyed by event. Only Devin'shooks.v1.jsonand the Copilot files may instead be keyed by event at the top level, so other top-level lists in a settings file (notify… - The rules live in
guard_command::hook_config_risk, on top of the sharedguard_command::launch_screenthe MCP check uses, so remote code, environment exfiltration and privileged launches are named the same way as in…
- The files checked are the ones agents load from the worktree root:
- pluginInstall and uninstall HOL listings with each runtime's CLI (#6013) Evidence for this change
- Guard downloads the listing's install spec from
https://hol.org/api/guard/plugins/install-spec(identifiers only, 64 KiB cap).--spec-filereads a local spec instead, for offline use and tests. The spec must name… - The native Plugin Kit checks every identifier in the spec and turns it into argument vectors for a fixed set of programs:
claude,codexandnpx. Anything else in the spec is printed under "Install by hand" and… - The default is a plan: Guard prints the commands and changes nothing.
--applyruns them without a shell, askingInstall for ? [y/N]for each runtime.--yesskips the prompts for CI.--runtimelimits…
- Guard downloads the listing's install spec from
- runtimeDerive and publish the policy verifier key natively (#6011) Evidence for this change
- guardCheck configured MCP servers in workspace assessments (#5993) Evidence for this change
- Python reuses Guard's harness adapters to find configured MCP servers and sends every one with the worktree roots (as named and with links followed). The runtime keeps only servers whose configuration file sits under a…
- Only each server's launch command, arguments and URL go to the runtime over stdin. Environment, headers and other settings stay behind. The new
mcp-config-assess --stdinruntime command reads no files and starts… - The rules live in
guard_command::mcp_config_risk, on top of a sharedguard_command::launch_screenthat later hook checks reuse. A launch reaches a POSIX shell script (sh,bash,zsh,dash,ksh,fishand…
- workspaceCheck agent skills in background workspace assessments (#5990) Evidence for this change
- The native workspace snapshot takes a
skillsflag. With it, the runtime runs the sharedskill_content_riskrules over the bytes it already hashed for eachSKILL.mdunder.claude/skills,.agents/skills… - Each finding carries the rule id, category, severity, confidence, the rule's fixed title, reason and false-positive hint, and the skill's root-relative path. The rule's technical detail can quote skill text, so the…
- A skill the scan could not read in full leaves the detector
incomplete: one over the hook-time skill size bound, one that is not UTF-8, one the snapshot itself skipped, any snapshot limit that may have hidden a…
- The native workspace snapshot takes a
- pluginLet the release summary carry one HOL Blue line (#5988) Evidence for this change
- HOL's registration response may include
offerUrl. The runner keeps it only when it is ahttps://hol.org/guard/plugins/promote?…link with plain query characters. Anything else is dropped, so HOL cannot inject… - The line's text is written by Guard, not by HOL: "HOL Blue adds full owner insights and the checkmark to this listing", followed by the link and a note on how to hide it.
- HOL sends the link at most once per repository in 28 days, and never on a retry of an already recorded release.
- HOL's registration response may include
- Add HOL Guard sponsorship manifest (
4aa4eb8) Evidence for this change
Improved
104- daemonRecord the Claude review notice in the queue write (#6240) Evidence for this change
- guardParse a contained Node or TypeScript launch in the resident (#6241) Evidence for this change
- hookPrint the redacted hook document from the native runtime (#6236) Evidence for this change
- guardMove three test-only native helpers into test support (#6232) Evidence for this change
- guardMove a test-only approval write and network enum into tests (#6239) Evidence for this change
- guardMove test-only contribution and policy helpers out of the runtime (#6209) Evidence for this change
- guardDrop the Python receipt-event and bulk-resolve helpers (#6235) Evidence for this change
- guardRemove Python helpers only tests reached (#6229) Evidence for this change
- guardDrop unused Python helpers left behind by the native port (#6225) Evidence for this change
- guardMove test-only store, identity and path helpers into test support (#6227) Evidence for this change
- approvalsDerive package workspace approval scopes in the native runtime (#6128) Evidence for this change
- runtimeVerify trust attestations in the native runtime (#6135) Evidence for this change
- guardMove test-only hook adapter wrappers out of the runtime (#6208) Evidence for this change
- guardProject workspace package findings in the native runtime (#6222) Evidence for this change
- guardMove test-only local CLI, Grok and Copilot wrappers into test support (#6187) Evidence for this change
- guardRender the bounded bridge's daemon answer in the native runtime (#6206) Evidence for this change
- guardMove test-only resident probes into test support and drop dead helpers (#6184) Evidence for this change
- guardRetire dead Python left behind by earlier moves (
fbd3989) Evidence for this change - guardDrop unused AIBOM summary wrappers and the MDM JSON loader (#6204) Evidence for this change
- guardDrop the unused live hook approval copy builder (#6202) Evidence for this change
- guardDrop the Python path-tree fingerprint (#6203) Evidence for this change
- guardRetire dead harness-usage recording and test-only wrappers (#6195) Evidence for this change
- guardMove the test-only approval protocol decoders into test support (#6196) Evidence for this change
- guardDrop the legacy Grok managed-block writer and two dead helpers (#6198) Evidence for this change
- guardDrop the unused Codex browser-wait predicates (#6200) Evidence for this change
- guardDrop dead Codex resume-metadata extraction (#6197) Evidence for this change
- guardMove test-only shims into test support (#6192) Evidence for this change
- guardDrop helpers only the CLI shared module still imported (#6199) Evidence for this change
- guardMove six test-only helpers out of the runtime (#6194) Evidence for this change
- guardMove the sensitive-read client into tests (
c99586b) Evidence for this change - guardMove test-only v1 policy bundle wrappers into test support (#6188) Evidence for this change
- guardMove test-only Codex inspection and snapshot clients into tests (
987c21b) Evidence for this change - guardMove contribution payload loaders into test support (
435b0bd) Evidence for this change - guardMove the test-only network policy model into test support (
1eb22bf) Evidence for this change - guardDrop dead helpers and move test-only ones out of src (#6193) Evidence for this change
- guardRetire the unused hook metrics recorder path and local tool grant lookup (
e0f6793) Evidence for this change - guardMove the test-only policy store wrappers into test support (#6179) Evidence for this change
- cliMove the test-only Claude approval-gate fallback out of the shipped CLI (#6173) Evidence for this change
- networkMove test-only capability negotiation shapes out of the shipped contract (#6172) Evidence for this change
- guardMove the Python command-id resolver into tests (#6158) Evidence for this change
- guardMove test-only setup helpers out of the runtime (#6157) Evidence for this change
- guardKeep only the exact-command validator in the Cloud Review contract adapter (#6168) Evidence for this change
- guardMove the single-receipt sync payload and risk report verifier into tests (
abe38f8) Evidence for this change - guardMove four test-only native wrappers into tests (
417147a) Evidence for this change - guardMove the request snapshot driver and sync status into tests (#6160) Evidence for this change
- codexMove the dead-daemon fast path out of the shipped package (#6169) Evidence for this change
- guardMove unwired network and gVisor reference modules into tests (#6164) Evidence for this change
- guardMove the extension pack validator into tests (#6167) Evidence for this change
- guardMove test-only managed controls contracts into tests (#6166) Evidence for this change
- guardMove unwired Linux enforcement reference modules into tests (#6165) Evidence for this change
- guardMove the test-only authoritative decision decoders into tests (#6163) Evidence for this change
- guardMove the shell-helper client into tests (#6151) Evidence for this change
- guardMove the Python Codex containment route into tests (#6153) Evidence for this change
- guardRetire helpers nothing calls (#6159) Evidence for this change
- guardRetire the unused Python resident admission wrapper (#6146) Evidence for this change
- guardMove browser MCP normalize projection to tests (#6154) Evidence for this change
- guardMove the launch-evidence client into the test helpers (#6147) Evidence for this change
- guardRemove probe and status helpers nothing calls (#6155) Evidence for this change
- guardRetire hook compose query kinds no caller sends (#6139) Evidence for this change
- guardRetire the Python MCP Skills check and env wrapper shim (#6129) Evidence for this change
- guardRemove unreferenced guard helpers (#6150) Evidence for this change
- guardRetire the unused isolation status payload builders (#6148) Evidence for this change
- guardMove the GitHub CLI classifier client into the tests (#6144) Evidence for this change
- guardRetire the unused Python local CLI grant client (#6136) Evidence for this change
- guardRetire three test-only review and package-script helpers (#6142) Evidence for this change
- guardRetire the unused Python hook-route client (#6134) Evidence for this change
- guardRetire three Python helpers only tests still called (#6141) Evidence for this change
- guardRetire the Python Cursor shell normalizer and state helpers (#6133) Evidence for this change
- guardRetire the Python prepared and executed Bash reply checks (#6140) Evidence for this change
- guardRetire the Python Claude bridge's dead response helpers (#6132) Evidence for this change
- guardRetire the unused Python hook payload normalizer (#6138) Evidence for this change
- guardRetire three Python modules that only tests still imported (#6126) Evidence for this change
- guardRetire the unused Python hook enrichment queue (#6127) Evidence for this change
- reviewAsk the resident for a daemon-queued connector setup hint (#6113) Evidence for this change
- guardRetire the Python Composio discovery and workflow parsers (#6123) Evidence for this change
- guardShare one projection across the workspace rule detectors (#6131) Evidence for this change
- guardRetire the unused outcome receipt builder and command-policy validator (#6122) Evidence for this change
- guardRetire the Python command risk-effects table (#6130) Evidence for this change
- hookSettle a Claude approval answer in one resident transaction (#6115) Evidence for this change
- guardRetire the Python shell-structure, interpreter-option and embedded-script shims (#6124) Evidence for this change
- runtimeDrop the unused Python containment request contract (#6108) Evidence for this change
- guardRemove native shims only tests called (#6120) Evidence for this change
- guardRemove Python helpers nothing calls (
f034f0a) Evidence for this change - guardRetire the unused Python command shadow builder (#6117) Evidence for this change
- cursorDrop the Python hook's unused native daemon-reply handoff (#6111) Evidence for this change
- hookDelete the CLI pipeline's leftover native edge review (#6109) Evidence for this change
- runtimeDrop the unused Python package-script evidence builder (#6107) Evidence for this change
- runtimeProvision the policy verifier key through the native runtime (#6046) Evidence for this change
- mcpKeep observed relay sessions native under ask (#6078) Evidence for this change
- storeRead the local CLI inventory from the resident (#6063) Evidence for this change
- mcpRoute Hermes stdio servers through the native relay (#6064) Evidence for this change
- policyHash a signed v2 bundle's policy payload in the runtime (#6065) Evidence for this change
- runtimeDecide consumer artifact outcomes in the resident (#6054) Evidence for this change
- hooksLet the resident decide custom extension rules on the daemon path (#6056) Evidence for this change
- runtimeMove the observed-MCP provider and skill reads into the native store (#6036) Evidence for this change
- runtimeRender stopped MCP package-lane answers in the resident (#6051) Evidence for this change
- runtimeResolve Guard risk actions and synced policy natively (#6049) Evidence for this change
- runtimeRetire the Python GitHub capability table in favor of the resident's contract (#6044) Evidence for this change
- guardWrite the local CLI command catalog in the resident (#6034) Evidence for this change
- policyDecide the pending integrity generation in the native runtime (#6030) Evidence for this change
- runtimeResolve risk-class actions in the resident instead of Python (#6017) Evidence for this change
- runtimeDrop the unused extension-control snapshot slot (#5998) Evidence for this change
- hookDelete the rest of the CLI hook pipeline and the helpers only it called (#5991) Evidence for this change
- hookDelete the CLI hook pipeline, its route and Claude renderer (#5987) Evidence for this change
Fixed
86- commandRead a repository's own hooks directory as the developer's (#6233) Evidence for this change
- guardVerify the signed network protection bundle in the native runtime (#6171) Evidence for this change
- connectAsk for a new device code when Guard Cloud's approval answer is lost (#6226) Evidence for this change
- plugin-kitPoint upgrade messages at hol-guard update instead of pip (#6231) Evidence for this change
- a listing whose install spec uses a newer schema than this Guard reads (exit 5);
hol-guard plugin statswhen HOL answers in a shape this Guard does not know;hol-guard telemetry pluginswhen the native runtime is too old or the plugin index is too large.
- dashboardStop waiting on a stalled intel sync and show how long it has run (#6224) Evidence for this change
- supply-chainList every version a lockfile installs in the workspace inventory (#6223) Evidence for this change
DepMap::earlierexposes the versions a key held before its current one.installs_every_versionis now public so the inventory can apply the same lockfile list the manifest diff uses.- For those lockfiles, each earlier version is merged into the inventory as its own transitive row. The current version keeps its direct flag and range, and
merge_inventory_itemalready gives a differing version its…
- cloudDowngrade a catalog sync only when no page reached Cloud (#6205) Evidence for this change
- supply-chainAudit every version a lockfile resolves a package to (#6220) Evidence for this change
DepMapremembers each distinct value a key held, andinto_sorted_versionsreturns every one with the current value last. Collecting the result into a map still givesinto_sorted, so callers that want one version…- The complete lockfile parser now emits one entry per resolved version for the lockfiles whose package managers install or build every copy side by side: pnpm, yarn and bun text locks, and
Cargo.lock… - The transitive audit skipped every entry whose name matched a requested package. It now skips only the copy whose version the request names or the lockfile resolves the requested package to, using the same per-lockfile…
- guardKeep a package finding's identity when its rule data changes (#6217) Evidence for this change
- guardList every resolved version of a package in the workspace inventory (#6216) Evidence for this change
- dashboardShow Guard's advice when workspace findings cannot reach the daemon (#6219) Evidence for this change
- guardKeep workspace findings and model refusals out of enforcement records (#6213) Evidence for this change
- dashboardKeep the last check time visible on workspace findings (#6211) Evidence for this change
- The status note (out of date, failed reason, paused) and the check time now show together.
- When the newest run failed, is queued or is still running, the findings on screen come from the last finished assessment. The row now reads "Showing results from the check 2h ago." using that assessment's finish time…
- When no check has finished yet and the first run failed or is still in progress, the row says "No check has finished yet." The last scan time moves on failed runs too, so it is not used there.
- releaseKeep published wheels on core metadata PyPI can read (#6201) Evidence for this change
- plugin-kitKeep a Claude Code plugin installed by its declared command (#6176) Evidence for this change
- guardDecide the low registry trust review floor in the native runtime (#6112) Evidence for this change
- cloudDowngrade a sync whose catalog view was evicted instead of failing it (
6677f9d) Evidence for this change - readRead a project's own documents out of its hidden directories (#6104) Evidence for this change
- guardStop holding a pack because another compiler wrote its security root (#6145) Evidence for this change
- workspaceKeep earlier findings listed while their detector has not rechecked (#6156) Evidence for this change
- The finding stays listed with
carried_from_run_id, the run that last observed it, and keeps that origin while the gap lasts. - A detector that completes again, or has nothing left to read, settles its own earlier findings: one it no longer reports is gone.
- A finding the run found again is listed once, as observed.
- The finding stays listed with
- guardReject unnamed options on fail-secure leading subcommands (
4101032) Evidence for this change - guardLet an install take back a policy root admitted under another engine (#6114) Evidence for this change
- shimsReport cloud coverage as a new login shell sees PATH (#6080) Evidence for this change
export PATH= :$PATHandfish_add_path --prependput the shim directory first, so the manager is reported protected.- An append stays behind the real binary. That includes
export PATH="$PATH: ",[ -d ] && export PATH="$PATH: ", andfish_add_path -ga. - A later
export PATH=/usr/bin:/bindrops the shim directory.
- adaptersFind user-installed CLIs when Guard runs with the desktop launch PATH (#6099) Evidence for this change
- Homebrew,
/usr/local/bin,~/.local/bin,~/bin - bun, npm-global, Volta, asdf, Cargo, pnpm
~/. /bin
- Homebrew,
- guardLet a quarantined pack still accept the operator's next prompt (#6110) Evidence for this change
- guardDrop workspace findings whose severity, confidence or verdict is not text (#6118) Evidence for this change
workspace_mcp_config_findings.py,workspace_hook_config_findings.py,workspace_skill_findings.py:severityandconfidence.workspace_secret_findings.py:severity.workspace_ci_workflow_findings.py:rule_id.
- syncTreat an unreachable Guard Cloud during token refresh as a retryable outage (#6105) Evidence for this change
- guardLet the runtime decide which posture governs a harness (
e4344b6) Evidence for this change - runtimeKeep the published runtime's resident when an older install asks it to stop (#6100) Evidence for this change
- A
shutdownwhose intent is notstopis refused withnative_resident_in_use(not retryable) only when the publisher's latest snapshot (policy-snapshot-publisher-v3.json, MAC and key id verified with the store's… - Every doubt stops the resident as before: no policy store; a missing, unreadable, non-private, malformed or unauthenticated publisher snapshot; a lease directory lock busy past 100 ms; an unreadable lease record. A…
- Explicit stops (
stop_managed) send{"intent":"stop"}and are always honoured. The handoff path sends{"intent":"handoff"}. A bare{}from an older client counts as a handoff. Every released resident parses the…
- A
- commandRead the removal of a worktree that is already gone as a removal that takes nothing away (#6101) Evidence for this change
- runtimeKeep resident auth workers free while requests evaluate (#6097) Evidence for this change
- guardRead a harness's target_file as the file an approval is about (#6096) Evidence for this change
- hooksName the guard home in the recovery command an authority block offers (#6053) Evidence for this change
- pretoolRead a request for a subagent's output as collecting a result (#6088) Evidence for this change
- extensionsLet two clients prepare the same catalog at once (#6089) Evidence for this change
- guardKeep saved package approvals valid across feed refreshes and PATH changes (#6090) Evidence for this change
- PATH drift. The package-manager executable component bound a digest of the whole
PATH. Agent harnesses that prepend a per-session shim directory changed it on every launch, so reuse failed with… - Feed refreshes. The policy component bound
bundle_version,policy_version,feed_snapshot_hashand the full reason text. The hourly Guard Cloud refresh changed those without changing the verdict, so reuse…
- PATH drift. The package-manager executable component bound a digest of the whole
- commandRead the Guard approval command's own help without a review (#6074) Evidence for this change
- guardReconcile hook launchers that run another install's Python or an older runtime (#6083) Evidence for this change
- mcpLet the relay decide OpenCode package calls its native prompt approves (#6084) Evidence for this change
- commandResolve a relative symlink source the way the kernel does (#6077) Evidence for this change
- extensionsAccept the compare response GitHub actually returns (#6085) Evidence for this change
- hooksTell the daemon why the resident missed a hook (#6081) Evidence for this change
- commandRead the launcher's own help, posture and delimited inspection without a review (#6072) Evidence for this change
- hookRead the daemon's answer to a
hol-guard hookcall in the native runtime (#6075) Evidence for this change- It reshaped the answer into a bridge harness's wire format with
_daemon_response_to_native. - It chose the exit status of every other harness with
_consistent_native_responseand_policy_action_from_daemon.
- It reshaped the answer into a bridge harness's wire format with
- hooksRepin harness hooks to the current native runtime (#6070) Evidence for this change
repair_failing_managed_harness_hooksnow reinstalls an active managed harness whoseconfig_pathnames a runtime digest other than the running frozen build's.- The repair counts as failed when the config still names the old digest afterwards.
- Source installs never write durable runtime paths and are skipped.
- mcpLaunch Desktop MCP proxies through the native relay (#6061) Evidence for this change
- hooksRender the Claude Code prompt notice in the native edge (#6073) Evidence for this change
edge.rsbrands the rendered harness response for a reviewed Claude CodeUserPromptSubmitwhen the envelope is notrecording_only. The receipt does not bind the harness response, so receipts are unchanged.- The daemon worker returns the edge's harness response as is. The Python overlay and its secret-class mapping are removed from
hook_worker_native.py. - The direct lane's
prompt_answerno longer applies the notice again, because the edge it reads already carries it.
- mcpDecide Composio tool calls in the native relay (#6062) Evidence for this change
- releasePublish MCPB checksums that verify next to the download (#6069) Evidence for this change
- releasePublish stable releases to the MCP Registry and MCPB (#6060) Evidence for this change
- ciClassify the raw artifact fields helper in the runtime scope (#6066) Evidence for this change
- releasePublish a main alpha when plugin-scanner is over the PyPI limit (#6057) Evidence for this change
- Skip the plugin-scanner PyPI upload on a main alpha when that project is already at the 10 GiB limit.
- Still publish hol-guard and create the alpha prerelease. The scanner upload stays required when the project has room.
- catalogGive Sigstore's trust refresh CA roots in the packaged runtime (#6058) Evidence for this change
- runtimeKeep the recovery command when a block has no repair page (#6045) Evidence for this change
- authorityFinish an interrupted control-authority commit on the next read (#6042) Evidence for this change
- commandDecide the protected harness configuration paths natively (#5876) Evidence for this change
- nativeAttribute a package request to the harness that actually ran it (#5874) Evidence for this change
- nativeRead a tool response's text in the resident (#5877) Evidence for this change
- commandFollow a project lookup up to the workspace root (
df70ec6) Evidence for this change - scannerAccept structured Kimi interface metadata (#6047) Evidence for this change
- Validate only Kimi's five documented string display fields, allowing additional structured interface metadata such as
tryPrompts,mcpOverridesandskillOverrides. - Preserve findings for non-object interfaces and invalid documented display values.
- Fixes #6032. Regression cases:
test_kimi_interface_accepts_additional_metadataand the CLI scan ofkimi-plugin-goodwith all three reported fields. All five acceptance cases fail before the fix.
- Validate only Kimi's five documented string display fields, allowing additional structured interface metadata such as
- commandRead a package manager's quiet and workspace options as part of its verb (
80d7efd) Evidence for this change - commandResolve a package manager past Guard's own shim before judging containment (
0c89b8d) Evidence for this change - guardShow HOL as the publisher name (#6043) Evidence for this change
- Name the publisher HOL in the Claude plugin, MCP bundle, Windows installer, and approval center.
- Use that same publisher display name in the extension catalogs and fixtures.
- Publish the drip command descriptor for the source already on main, so native verification can accept it.
- commandRead a bounded jq filter over a piped read as a read (#6018) Evidence for this change
- extensionsPublish the drip command descriptor (
07bb24d) Evidence for this change - commandLet an agent read Guard's own records without an approval (#6016) Evidence for this change
- dashboardStop asking a connected device to connect Guard Cloud when intel has not synced (#6041) Evidence for this change
- Local only: unchanged. It still prompts to connect Guard Cloud.
- Paired (waiting or active): "Guard Cloud is connected, but no signed advisory bundle has synced to this device yet. Use Sync on this page to fetch it."
- supply-chainOffer a retry when Guard Cloud cannot be reached during sync (#6040) Evidence for this change
- refused or reset connections
- DNS lookup failures
- timeouts
- cliExplain native runtime installation requirements (#5940) Evidence for this change
- Explain missing native runtimes in CLI configuration errors and the Desktop bootstrap fast path. Preserve the CLI error/exit 1 and Desktop's first error line, empty stdout and exit 2; avoid missing-runtime guidance…
- Recommend
hol-guard updatebefore a matching-wheel fallback in the same Python environment. Document the 3.56.0 wheel matrix, Intel Mac repair prerequisites, Linux ARM64 limitation and Windows ARM64 x64-Python…
- runtimeKeep enforcing when an abandoned prepare sits above the authority head (#6022) Evidence for this change
- dashboardKeep the standalone Sync approval about syncing and close it when the sync succeeds (#6028) Evidence for this change
createSupplyChainSyncApprovalGate()without auto-retry now uses the headline "Approve supply-chain intel sync" and shows only the "Sync intel" step. The chained sync-then-audit gate keeps its audit headline and both…isStandaloneSyncRecoveryGate()tells the modal which case it is in, so the dialog label and kicker match.runRecoverySynccloses the modal after a standalone sync succeeds.
- runtimeAsk the classifier for the contained peel instead of peeling it twice (#6002) Evidence for this change
- dashboardExplain extension policy save failures instead of printing daemon codes (#6019) Evidence for this change
- extensionsStop a failed policy save from blocking every later save (#6015) Evidence for this change
- nativeRead logged launches, rooted find -exec and looped inline programs as review (#6007) Evidence for this change
- Logged background launch.
node server.js > /tmp/x.log 2>&1 & ...carried the redirect reason, not the background reason, so the launch had no segments and its script read as a file nobody opened. A launch whose… find -execunder a quoted home root.find "$HOME/Downloads/x" -type f -exec basename {} \;was refused for containing$. A$is now accepted only when it opens a double-quoted parameter followed by/, so…- Inline program in a loop.
for f in ...; do [ -f "$f" ] && node -e '...' "$f"; doneread thenode -elaunch as an interpreter running an unread file. Each launch in a list or loop is now read on its own (split…
- Logged background launch.
- commandRead a package directory flag the same way for every verb (#6003) Evidence for this change
- connectKeep polling for device approval when one request goes unanswered (#6005) Evidence for this change
- A poll that times out, or fails with a refused or reset connection (directly or wrapped in
URLError), doubles the polling interval up to 60 seconds and polls again. - Once the device code deadline passes, it stops with a message that says Guard Cloud did not answer and how to request a new code.
- Other
URLErrorcauses, such as certificate failures, and managed-network policy blocks (ManagedNetworkError) still fail immediately.
- A poll that times out, or fails with a refused or reset connection (directly or wrapped in
- releaseShip a Linux ARM64 native wheel on the GitHub release (#6009) Evidence for this change
- Build: a
manylinux_2_17_aarch64wheel around the staticaarch64-unknown-linux-muslruntime, compiled on theubuntu-24.04-armrunner by the existing single-wheel workflow. The full-task Gauntlet runtime… - Release only: the platform joins
GITHUB_ONLY_PLATFORM_TAGS, so PyPI staging leaves it out. The pure wheel'snative-wheels.jsonlists its digest along with every other platform wheel. - Update path:
hol-guard updateon a pure-wheel Linux ARM64 install downloads that wheel from thevrelease and checks it against the embedded digest manifest, the same check Windows ARM64 gets. Doctor…
- Build: a
- packageBlock bundle-flagged Copilot and exec-flow packages before review (#6004) Evidence for this change
- Copilot sends its command in
toolArgs. The daemon's package check only readtool_input.command, so it never evaluated the command.
- Copilot sends its command in
- updatePoint native Windows ARM64 Python at x64 Python (#6006) Evidence for this change
hol-guard updateon awin-arm64interpreter (sysconfig.get_platform()) that fails while building cryptography or rfc3161-client now stops with statusblockedand reason…- The message gives the reinstall command for the active installer (
pipx install --force --python " " hol-guard, theuv tool installequivalent, or that interpreter's pip) and the check that the… - Guard lists installed x64 interpreters from
py -0p, skipping-arm64and-32tags, and asks each one for its own platform before labeling it x64. If none is found, the message points at the 64-bit python.org…
- commandWalk a project's own skills tree without review (#5994) Evidence for this change
- claudeStore a tool-call permission notice with its credentials masked (#6001) Evidence for this change
hook_authority_state_op/flows.rs:claude_record_noticemaskscommandandraw_command_textontool_callnotices withredacted_command_tokens::redact_textbefore signing. The notice and pending rows are one…- The direct hook lane (
hook_direct_review_notice.rs) and the daemon's fallback writer (_record_claude_permission_notice) both store through this op, so there is one masking point and no Python change. - Other artifact types are stored as sent. A
tool_action_requestcommand feeds the saved policy's exact-match context (hook_decision_native_permission_persist.rs), and masking it would change that hash.
- commandRefuse a contained run that hands the shell a directory search path (#5996) Evidence for this change
- storeMask credentials in queued tool-call commands (#6000) Evidence for this change
ApprovalRequest::decodemasks credentials in atool_callrow'slaunch_targetandraw_command_textwithguard_command::redacted_command_tokens::redact_text, the redaction the generic queue builder already…- Both queue writers decode through this function: the resident hook writer (
add_native_review_approval_request) and the generaladd_approval_requestpath that the daemon uses. One change covers both. native_bash_requestandtool_action_requestrows are left alone, because their scope and exact-match checks re-parse the stored command.
- guardSay when a workspace has no dependency files to check (#5989) Evidence for this change
normalizeAssessmentexposesdependencyFilesFound, false whendetectors.supply_chainisno_inputs.- The empty findings copy for such a workspace becomes "No dependency files were found, so there were no dependencies to check.", followed by the secret result when the secret detector ran.
- Workspaces with dependency files keep the existing copy.
- guardReport dependency files below audit discovery as unchecked (#5986) Evidence for this change
- The Rust snapshot walk flags any manifest or lockfile deeper than the audit's discovery depth and marks the snapshot partial with the
undiscovered_dependency_inputreason. The discovery depth is now shared from… - The dashboard coverage panel explains the new reason in plain language.
- Fix verification treats the new reason like the existing unsupported-lockfile reason: the snapshot is still readable, so verification does not fail on it.
- The Rust snapshot walk flags any manifest or lockfile deeper than the audit's discovery depth and marks the snapshot partial with the
Other changes
25- mcpReuse the catalog fingerprint while the catalog is unchanged (#6242) Evidence for this change
- daemonStop re-encoding every hook payload for the scheduler (#6137) Evidence for this change
- guardAdd a guide for installing plugins from HOL (#6228) Evidence for this change
- guardName the local CLI grant step the pre-tool floor actually asks (#6170) Evidence for this change
- guardList the Linux ARM64 wheel and the Intel Mac cryptography build (#6218) Evidence for this change
- gauntletAsk only for a required extension's permissions (#6267) Evidence for this change
- guardRead the failed carry run through the test support helper (#6238) Evidence for this change
- guardKeep a known-vulnerable runtime approval across feed updates (#6230) Evidence for this change
- guardPin that hook and plugin findings keep their id when they move (#6214) Evidence for this change
- guardPopulate the benign gate from the approval queue's own rows (
807e0fb) Evidence for this change - gauntletReplay each installed-acceptance case through its own hook event (
2a0c8a8) Evidence for this change
Upgrade and compatibility
None documented.
Compare with the previous release
Predecessor on the same channel: v3.57.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.