Release notes
HOL Guard v3.59.0a15
PreviewHOL Guard v3.59.0a15, released October 30, 2026, is a preview release with 4 additions, 16 improvements, 14 fixes and 13 other changes across 46 merged pull requests. Highlights: Contain Linux test runs in the runtime's own sandbox; Link PR comments to listing advisories and scan limits.
4 added · 16 improved · 14 fixed · 13 other
Key facts
- Version
- v3.59.0a15
- Channel
- Preview
- Published
- Previous release
- alpha/v3.59.0a8
- Merged pull requests
- 46
Documented changes
47 typed entries
Verified contributors
Credits being verified. Attribution coverage is in progress.
Attribution coverage
attribution in progress; history inventory partial.
Install
Scope
Guard v3.59.0a15 is a preview release published 2026-10-30. Upstream documents: Guard 3.59.0a15 is an opt-in prerelease cut from c72b015. Stable installations remain on the stable channel. 46 commits • 46 merged pull requests • 1 contributor since Guard 3.59.0a14. Its comparison base is alpha/v3.59.0a8. It includes 129 verified contribution deliveries with public evidence links. Attribution for this release is being verified.
Changes
Added
4- containedContain Linux test runs in the runtime's own sandbox (#6549) Evidence for this change
- scannerLink PR comments to listing advisories and scan limits (#6544) Evidence for this change
- policyEnforce exact command rules from Guard Cloud policy documents (#6530) Evidence for this change
- mcpRefuse undecidable relay calls instead of handing sessions to the Python proxy (#6524) Evidence for this change
mcp_relay_runtime_supersededandmcp_relay_store_newer: version skew, which the proxy of the same release still serves. A store at a newer schema used to sharemcp_relay_store_unreadablewith any store the…- The features the relay has not ported yet:
mcp_relay_layers_unavailable,mcp_relay_saved_remote_policy,mcp_relay_saved_policy_unverifiableandmcp_relay_session_server_proxy_tools(which also marks servers…
Improved
16- commandRead a contained command's words in native authority (#6568) Evidence for this change
- runtimeDrop a recorder lever the native runtime stopped reading (#6570) Evidence for this change
- commandRead a manifest script's words in native authority (#6566) Evidence for this change
- commandRead a package test script in native authority (#6556) Evidence for this change
- local-cliRead a package runner's target in native authority (#6552) Evidence for this change
- commandRead a new worktree's checkout in native authority (#6560) Evidence for this change
- daemonRetire the client attach and heartbeat routes nothing calls (#6557) Evidence for this change
- daemonDrop the launch containment receipt nothing writes (#6564) Evidence for this change
- commandLet native authority name a build's one writable directory (#6542) Evidence for this change
- commandRead a project's Vite output in native authority (#6541) Evidence for this change
- commandRead a pytest invocation in native authority (#6539) Evidence for this change
- runtimeRetire the dead Python copies of three native authority tables (#6534) Evidence for this change
- commandDecide a new command capability's operations in native authority (#6532) Evidence for this change
- commandRead a node tool route in native authority (#6522) Evidence for this change
- mcpStop honoring HOL_GUARD_MCP_RELAY=python (#6531) Evidence for this change
- mcpDecide relay calls whose extension layers the publisher could not read (#6528) Evidence for this change
Fixed
14- mcpRetry a relayed call while the daemon republishes its snapshot (#6565) Evidence for this change
- When the lane defers a call for a reason the daemon can clear and the kick is rate-limited, the relay now waits 25 ms and decides the call again.
- The retries stop when the existing 250 ms retry budget is spent.
- A daemon that refuses or can't be reached still ends the retries immediately.
- nativeKeep the direct-lane ACK when another runtime's resident restarts (#6553) Evidence for this change
- Adding or removing a scope still changes the path set and triggers a republish.
- Generation churn inside another runtime's scope no longer withdraws this runtime's ACK, and no longer outranks the acknowledging resident.
- Before any runtime status is observed, every scope is fingerprinted as before.
- commandRead a search root that is not there (#6550) Evidence for this change
- cursorHand a stale bridge's hook to the runtime the resident runs (#6548) Evidence for this change
- New
hook_bridge_successormodule (Unix). OnDirectMiss::NoResident, the Cursor bridge discovers the live resident's runtime digest. If the bridge is itself a durable copy under the home's state directory, the live… - The child runs with
HOL_GUARD_HOOK_HANDED_OFF=1, so a handed-off bridge never hands off again. - If spawning fails, nothing changes: the hook takes the existing daemon path. If the successor starts but does not answer by the client deadline (or exits on a signal, or prints non-UTF-8), the bridge kills it and fails…
- New
- commandRead the launcher's own diagnostics without a second approval (#6515) Evidence for this change
- pretoolRead an encoded empty target list as naming no file (#6545) Evidence for this change
- commandLet a DigitalOcean cluster listing name its own columns (#6538) Evidence for this change
- windowsStop the daemon leaking a ctypes type on every state file open (#6513) Evidence for this change
- guardKeep Oh My Pi read results for plugin manifests in a linked temp worktree (#6540) Evidence for this change
- commandStop a credential word in a search pattern from forcing review (#6533) Evidence for this change
- guardKeep the edit result for a tracked catalog named for secrets in Oh My Pi (#6536) Evidence for this change
- commandRead Guard's own approval wait and artifact explanation quietly (#6519) Evidence for this change
- policyStop telling users to update Guard when Cloud sends an older policy bundle (#6529) Evidence for this change
- codexSay why an approved action stayed blocked when the daemon rejects it (#6520) Evidence for this change
Other changes
13- Guard 3.59.0a15 is an opt-in prerelease cut from
c72b015. Stable installations remain on the stable channel. 46 commits • 46 merged pull requests • 1 contributor since Guard 3.59.0a14. Evidence for this change - daemonAnswer Claude Stop from the call that ends the turn (#6561) Evidence for this change
- nativeShare one store connection across the publisher's 1 Hz recheck (#6555) Evidence for this change
- commandRead a contained run's prefixes in one native call (#6518) Evidence for this change
- gauntletRetry a run where the model misspelled a fixture path and then read the real file (#6558) Evidence for this change
- gauntletGive the sibling Git-read case a real checkout and keep two prompts to their commands (#6551) Evidence for this change
- gauntletPut the fixture's Bun on the session PATH its installer edits (#6546) Evidence for this change
- gauntletRead the plugin manifest oracle from the checkout the agent starts in (#6543) Evidence for this change
- recoveryMake the same-home overlap the recovery test reads deterministic (#6535) Evidence for this change
- scannerPin scanner results on a synthetic evasion corpus (#6537) Evidence for this change
- packagingRefuse build and package metadata nothing still consumes (#6523) Evidence for this change
- Pin the Linux runners to ubuntu-24.04 (#6563) Evidence for this change
- Run Linux CI jobs on ubuntu-24.04 instead of ubuntu-latest (#6559) Evidence for this change
- Merged pull request #6479: perf(runtime): build and queue a paused native review in one store call (#6479)
- Merged pull request #6530: feat(policy): enforce exact command rules from Guard Cloud policy documents (#6530)
- Merged pull request #6504: perf(runtime): check a drained hook's receipt in the resident's drain page (#6504)
- Merged pull request #6512: fix(workspace): end a slow package audit inside its assessment lease (#6512)
- Merged pull request #6461: refactor(daemon): share the reservation file helpers and drop recovery forwarders (#6461)
- Merged pull request #6448: fix(guard): contain work in checkouts with home hooks and function credential helpers (#6448)
- Merged pull request #6529: fix(policy): stop telling users to update Guard when Cloud sends an older policy bundle (#6529)
- Merged pull request #6564: refactor(daemon): drop the launch containment receipt nothing writes
- Merged pull request #6449: perf(runtime): link a waiting Codex hook's wait when the resident pauses its review (#6449)
- Merged pull request #6497: docs(action): link the scanner Action README to the HOL Plugins marketplace (#6497)
- Merged pull request #6439: perf(runtime): queue a native review and read its row back in one store call (#6439)
- Merged pull request #6452: perf(runtime): queue a paused Cursor review in the resident instead of the daemon (#6452)
- Merged pull request #6457: fix(guard): allow plugin manifests in worktrees under the temp directory (#6457)
- Merged pull request #6556: refactor(command): read a package test script in native authority
- Merged pull request #6521: fix(release): adopt the resolved base version for a pull request alpha
- Merged pull request #6570: refactor(runtime): drop a recorder lever the native runtime stopped reading
- Merged pull request #6440: fix(guard): accept a repeated separator in a worktree destination (#6440)
- Merged pull request #6533: fix(command): stop a credential word in a search pattern from forcing review (#6533)
- Merged pull request #6535: test(recovery): make the same-home overlap the recovery test reads deterministic (#6535)
- Merged pull request #6470: feat(runtime): answer only the ratified emergency-safe profile when the daemon fails (#6470)
- Merged pull request #6464: fix(guard): run bun on an installed entrypoint the way node runs it (#6464)
- Merged pull request #6560: refactor(command): read a new worktree's checkout in native authority
- Merged pull request #6447: fix(approvals): give a bulk approve-once the one-shot grant a waiting Codex hook needs (#6447)
- Merged pull request #6472: fix(command): walk an absolute path's parent steps before calling it workspace work (#6472)
- Merged pull request #6515: fix(command): read the launcher's own diagnostics without a second approval (#6515)
- Merged pull request #6513: fix(windows): stop the daemon leaking a ctypes type on every state file open (#6513)
- Merged pull request #6548: fix(cursor): hand a stale bridge's hook to the runtime the resident runs (#6548)
- Merged pull request #6499: chore(runtime): count each reason a Cursor probe or sink goes to the daemon (#6499)
- Merged pull request #6455: docs(guard): stop documenting a native kill switch that no longer exists (#6455)
- Merged pull request #6522: refactor(command): read a node tool route in native authority (#6522)
- Merged pull request #6544: feat(scanner): link PR comments to listing advisories and scan limits (#6544)
- Merged pull request #6549: feat(contained): contain Linux test runs in the runtime's own sandbox (#6549)
- Merged pull request #6563: ci: pin the Linux runners to ubuntu-24.04
- Merged pull request #6559: ci: run Linux CI jobs on ubuntu-24.04 instead of ubuntu-latest
- Merged pull request #6454: chore(guard): retire Python nothing calls (#6454)
- Merged pull request #6443: fix(command): read a Bun script entry as a script run, not a package action (#6443)
- Merged pull request #6543: test(gauntlet): read the plugin manifest oracle from the checkout the agent starts in (#6543)
- Merged pull request #6498: feat(action): link public repositories to their HOL Plugins listing in the PR comment (#6498)
- Merged pull request #6469: fix(command): read a quoted for-loop word that holds spaces as the one field it is (#6469)
- Merged pull request #6551: test(gauntlet): give the sibling Git-read case a real checkout and keep two prompts to their commands (#6551)
- Merged pull request #6476: chore: remove leftover notes from the repository root
- Merged pull request #6539: refactor(command): read a pytest invocation in native authority (#6539)
- Merged pull request #6518: perf(command): read a contained run's prefixes in one native call (#6518)
- Merged pull request #6566: refactor(command): read a manifest script's words in native authority
- Merged pull request #6492: feat(guard): add codebases to background checks from the command line (#6492)
- Merged pull request #6505: fix(command): read a project-relative Vitest or Jest entry as the project's own runner (#6505)
- Merged pull request #6274: fix(approvals): let an approved Claude Code retry through despite its new prompt_id
- Merged pull request #6465: feat(runtime): keep a day of resident lifecycle counts a support request can read (#6465)
- Merged pull request #6494: fix(command): contain a test runner the agent spells from home (#6494)
- Merged pull request #6466: fix(guard): apply approved Guard Cloud exceptions to Cloud policy blocks (#6466)
- Direct commit 2c8c5a3b00f6: test(gauntlet): run the bun entry-point build in the deterministic gate too
- Merged pull request #6489: fix(dashboard): list Muse in App coverage (#6489)
- Merged pull request #6493: test(plugin-kit): keep listing link campaign parameters intact (#6493)
- Merged pull request #6496: perf(approvals): look up a paused review's connector inside its queue call (#6496)
- Merged pull request #6490: fix(review): give a queued Cloud Review decision enough time to apply after a daemon restart (#6490)
- Merged pull request #6480: ci(gates): give the macOS gate shards eight minutes (#6480)
- Merged pull request #6422: fix(command): read a project file beside a stderr redirect as the source it is (#6422)
- Merged pull request #6486: perf(approvals): decide a paused review's hint inside its queue call (#6486)
- Merged pull request #6558: test(gauntlet): retry a run where the model misspelled a fixture path and then read the real file
- Merged pull request #6507: feat(gauntlet): cover Muse in installed acceptance (#6507)
- Merged pull request #6467: fix(guard): read a resident's answer as a verdict only when it names this review (#6467)
- Merged pull request #6442: perf(runtime): link and seed a waiting Codex hook in its review's queue write (#6442)
- Merged pull request #6537: test(scanner): pin scanner results on a synthetic evasion corpus (#6537)
- Merged pull request #6502: refactor(cursor): retire the Python Cursor hook client behind the native bridge (#6502)
- Merged pull request #6471: fix(runtime): start one daemon when a burst of hooks meets a dead one (#6471)
- Merged pull request #6444: perf(runtime): build a waiting Codex hook's live wait in the resident (#6444)
- Merged pull request #6568: refactor(command): read a contained command's words in native authority
- Merged pull request #6478: feat(runtime): ask the resident for the emergency-safe profile when the daemon fails (#6478)
- Merged pull request #6517: fix(gauntlet): pin the sealed native runtime in installed replay (#6517)
- Direct commit e27e1973aaa4: fix: resolve basedpyright type errors and active operation memory leak in recovery modules
- Merged pull request #6456: chore(guard): move the harness capability report out of the runtime package (#6456)
- Merged pull request #6523: test(packaging): refuse build and package metadata nothing still consumes (#6523)
- Direct commit bd77d453cdb4: docs: clarify RSS probe timeout rationale
- Merged pull request #6468: fix(guard): stop reviewing installs when NODE_OPTIONS only sizes the heap (#6468)
- Merged pull request #6482: fix(extensions): load a script's commands from the file Guard saw it run (#6482)
- Merged pull request #6485: fix(doctor): keep the account name out of the native runtime report (#6485)
- Merged pull request #6475: fix(guard): run checks in a new linked worktree when each part passes (#6475)
- Merged pull request #6509: fix(trust): keep the account name out of the install-surface diagnostics (#6509)
- Merged pull request #6430: fix(guard): run builds and commits in temporary-directory worktrees (#6430)
- Merged pull request #6561: perf(daemon): answer Claude Stop from the call that ends the turn
- Merged pull request #6437: feat(runtime): answer a health question even when the resident is full (#6437)
- Merged pull request #6519: fix(command): read Guard's own approval wait and artifact explanation quietly (#6519)
- Merged pull request #6540: fix(guard): keep Oh My Pi read results for plugin manifests in a linked temp worktree (#6540)
- Merged pull request #6545: fix(pretool): read an encoded empty target list as naming no file (#6545)
- Merged pull request #6495: feat(ci): screen the module names a retirement cannot see (#6495)
- Merged pull request #6532: refactor(command): decide a new command capability's operations in native authority (#6532)
- Merged pull request #6473: feat(doctor): report the day's resident lifecycle in doctor (#6473)
- Merged pull request #6477: fix(network): refuse content-encoded responses before any decoder runs (#6477)
- Merged pull request #6553: fix(native): keep the direct-lane ACK when another runtime's resident restarts (#6553)
- Merged pull request #6500: refactor(command): keep one copy of the action-class risk table (#6500)
- Merged pull request #6550: fix(command): read a search root that is not there (#6550)
- Merged pull request #6557: refactor(daemon): retire the client attach and heartbeat routes nothing calls
- Merged pull request #6451: fix(command): read a staged diff's bare pathspecs as the staged read they are (#6451)
- Merged pull request #6516: refactor(command): read the contained sink's inert prefix in native authority (#6516)
- Merged pull request #6506: chore(deps): retire the runtime requirements only the deleted Python needed (#6506)
- Merged pull request #6542: refactor(command): let native authority name a build's one writable directory (#6542)
- Merged pull request #6474: test(gauntlet): run the installed vite entry through Bun as a live case (#6474)
- Merged pull request #6514: feat(release): let an admin publish a pull request as an alpha
- Merged pull request #6546: test(gauntlet): put the fixture's Bun on the session PATH its installer edits (#6546)
- Merged pull request #6528: refactor(mcp): decide relay calls whose extension layers the publisher could not read (#6528)
- Merged pull request #6483: test(runtime): pin how a killed resident, an unwritable scope and a broken socket fail (#6483)
- Merged pull request #6484: fix(supply-chain): audit workspaces with thousands of lockfile packages (#6484)
- Merged pull request #6508: ci(gauntlet): run installed acceptance for Muse (#6508)
- Merged pull request #6463: feat(runtime): warm the resident at session start so the first hook does not pay for it (#6463)
- Merged pull request #6459: chore(guard): retire Python helpers only tests still called (#6459)
- Merged pull request #6531: refactor(mcp): stop honoring HOL_GUARD_MCP_RELAY=python (#6531)
- Merged pull request #6446: fix(command): read a byte-bounded head or tail as an output filter (#6446)
- Merged pull request #6460: fix(guard): report the restart pause that leaves a healthy install enforcing nothing (#6460)
- Merged pull request #6462: fix(guard): treat tracked credential-named documents as project files (#6462)
- Merged pull request #6534: refactor(runtime): retire the dead Python copies of three native authority tables (#6534)
- Merged pull request #6487: feat(runtime): fetch managed content raw and decode it in a contained worker (#6487)
- Merged pull request #6450: test(runtime): cover a dead published endpoint and a resident that never answers (#6450)
- Merged pull request #6438: feat(runtime): fuzz the parsers that read untrusted bytes (#6438)
- Merged pull request #6541: refactor(command): read a project's Vite output in native authority (#6541)
- Merged pull request #3010: feat(recovery): add trusted service recovery (#3010)
- Merged pull request #6458: fix(guard): contain cargo runs that name a worktree manifest (#6458)
- Merged pull request #6441: fix(guard): allow a listing through the dependency link a worktree add chain just made (#6441)
- Merged pull request #6488: feat(runtime): report what the serving resident has done and how it has failed (#6488)
- Merged pull request #6536: fix(guard): keep the edit result for a tracked catalog named for secrets in Oh My Pi (#6536)
- Merged pull request #6565: fix(mcp): retry a relayed call while the daemon republishes its snapshot
- Merged pull request #6538: fix(command): let a DigitalOcean cluster listing name its own columns (#6538)
- Merged pull request #6491: perf(approvals): answer a paused review and keep its connector context in its queue call (#6491)
- Direct commit 4a22f7c4b5dc: test(gate): run the byte-bound runner cases only where the workspace sandbox exists
- Merged pull request #6520: fix(codex): say why an approved action stayed blocked when the daemon rejects it (#6520)
- Merged pull request #6503: fix(local-cli): list a script's options as commands you can allow or block (#6503)
- Merged pull request #6552: refactor(local-cli): read a package runner's target in native authority
- Merged pull request #6524: feat(mcp): refuse undecidable relay calls instead of handing sessions to the Python proxy (#6524)
- Merged pull request #6555: perf(native): share one store connection across the publisher's 1 Hz recheck (#6555)
- Merged pull request #6453: feat(ci): fail the retirement gate when a deletion strands a console script (#6453)
Upgrade and compatibility
None documented.
Compare with the previous release
Predecessor on the same channel: alpha/v3.59.0a8
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.