Release notes
HOL Guard v3.60.0a19
PreviewHOL Guard v3.60.0a19, released November 6, 2026, is a preview release with 12 additions, 1 improvement, 14 fixes and 5 other changes across 31 merged pull requests. Highlights: Retain the legacy pack baseline in the resident; Record catalog migration events and abandon a failed bootstrap in the resident.
12 added · 1 improved · 14 fixed · 5 other
Key facts
- Version
- v3.60.0a19
- Channel
- Preview
- Published
- Previous release
- alpha/v3.60.0a18
- Merged pull requests
- 31
Documented changes
32 typed entries
Verified contributors
Credits being verified. Attribution coverage is in progress.
Attribution coverage
attribution in progress; history inventory partial.
Install
Scope
Guard v3.60.0a19 is a preview release published 2026-11-06. Upstream documents: Guard 3.60.0a19 is an opt-in prerelease cut from d1f709f. Stable installations remain on the stable channel. 31 commits • 31 merged pull requests • 2 contributors since Guard 3.60.0a18. Its comparison base is alpha/v3.60.0a18. Attribution for this release is being verified.
Changes
Added
12- extensionsRetain the legacy pack baseline in the resident (#7312) Evidence for this change
- extensionsRecord catalog migration events and abandon a failed bootstrap in the resident (#7311) Evidence for this change
record_migration: when a protected read reports a catalog migration whose event the store does not hold yet, Python now only works out the writer provenance and hands it to the resident. The resident re-reads the…abandon_bootstrap: a failed enrollment's revision-0 snapshot is removed by the resident instead of a direct Python delete. Only a revision-0 snapshot can be removed.
- extensionsReset the extension-control authority in the resident (#7310) Evidence for this change
- New
resetop on the extension-control authority request, carrying the reason and whether the catalog manifests go with the lost key. - In one immediate transaction the resident archives the snapshot, every transition and every proof into
extension_control_authority_recovery_archive, records theextension_control_authority_resetevent with the same… - Python keeps the key recovery and secret storage, then bootstraps the fresh authority as before. The reset op needs the commit feature.
- New
- extensionsClear the remote policy authority in the resident (#7307) Evidence for this change
- extensionsQueue recovery's change event in the resident and refuse unreserved pack commits (#7305) Evidence for this change
- extensionsWrite earned authority anchors in the resident (#7303) Evidence for this change
anchored: a prepared row exists at that revision, seals that snapshot, and carries no authority of its own. The vault still pins the committed head below it and the row authenticates as that head's prepare.committed: the committed snapshot head is that revision and digest, and the vault already names it.- Anything else, including
prepared, is refused as tampered with the vault untouched.
- extensionsResume a commit retry's own prepared row in the resident (#7301) Evidence for this change
- commit_pending / mark_committed / finish: the proof is inserted as consumed, or a reserved proof is stamped once (
coalesce), in the transaction that commits the row. - abandon: the reserved proof is released with the row.
- current: when the retry's view already shows the row committed, the proof is stamped and the change event queued; no anchor is written.
- commit_pending / mark_committed / finish: the proof is inserted as consumed, or a reserved proof is stamped once (
- extensionsMigrate a catalog that activates a command pack in the resident (#7300) Evidence for this change
migratetakes thepack_reservethe commit path already sends. It reserves the staged activation in the transaction that writes the prepared row and returnspack_boundonce the row is anchored. A reservation the…resumewith amigration_recordrecords the migration event in the transaction that commits the row. It queues no change event, which matches every other migration.- Python runs the same resume loop a commit uses, so the lifecycle floor moves before the resident installs the activation. The Python insert, reserve, finish, snapshot update and event write for this path are gone.
- extensionsReserve staged pack activations in the resident (#7299) Evidence for this change
- extensionsInstall pack-bound control commits in the resident (#7298) Evidence for this change
- storeWrite local extension grants and continuity natively (#7309) Evidence for this change
- New native methods are
apply_custom_extension_continuityandupsert_local_cli_grant. They live inguard_store_continuity_write.rs. - Every refusal keeps its Python message, so callers and the HTTP API return the same errors as before.
- The capability refusals (
invalid_capabilities,capabilities_require_cli_surface,capabilities_require_allowed_grant) are raised asLocalCliCapabilityErroragain on the Python side.
- New native methods are
- extension-controlBootstrap, commit, resume, migrate and manifest writes in the resident (#7295) Evidence for this change
bootstraptakes the bootstrap plan and inserts the revision-zero snapshot in one immediate transaction, then seals the committed anchor into the credential vault and reads it back.commit_preparetakes the commit plan, reserves the proof and writes the prepared transition in the same transaction, so no other writer can claim the revision in between.resumewith the reserved proof finishes the…migratecommits a catalog rebinding: the prepared row, the anchored anchor, the snapshot move, the migration event (and the regression row for a downgrade), then the committed anchor. The migration event is built…
Improved
1- authorityRetire the Python pack activation journal writers (#7304) Evidence for this change
Fixed
14- commandRead inline shell scripts behind glob and POSIX-mode options (#7329) Evidence for this change
- commandRun an allowed Git read when the configuration probe cannot answer (#7319) Evidence for this change
- daemonCancel the policy publisher's native helpers on shutdown (#7290) Evidence for this change
run_isolated_hook_processfalls back to it when the caller passes no stop event, so a helper in flight is killed.- New helpers from that thread are refused without starting a process.
runtime_answerreturnsNonebefore it hashes the runtime binary.
- daemonRetry a busy resident client lease during lifecycle requests (#7323) Evidence for this change
- approvalsRelease a waiting Codex call when its silent review is approved (#7322) Evidence for this change
- commandKeep a manager option's value out of the reporting strip (#7320) Evidence for this change
- commandAsk instead of blocking when the extension check runs out of time (#7317) Evidence for this change
- commandRead bash -o pipefail and --norc in front of an inline script (#7318) Evidence for this change
- supply-chainKeep a saved package approval across quiet and verbose spellings (#7315) Evidence for this change
- hook-coreKeep field boundaries when scanning a structured edit (#7314) Evidence for this change
- commandLet a Git Allow settle Git's own plumbing names (#7316) Evidence for this change
- policyBlock a ruled command however the shell spells it (#7302) Evidence for this change
- extra or leading spaces
- a trailing
;or& CI=1 npm publishorenv CI=1 npm publish
- commandLet a fully allowed extension cover the spellings no rule models (#7297) Evidence for this change
- commandRead a heredoc commit message as the value it is (#7284) Evidence for this change
Other changes
5- Guard 3.60.0a19 is an opt-in prerelease cut from
d1f709f. Stable installations remain on the stable channel. 31 commits • 31 merged pull requests • 2 contributors since Guard 3.60.0a18. Evidence for this change - approvalsHand a remote review decision to the waiting hook sooner (#7330) Evidence for this change
- gateGive the command-substitution commit case an id of its own (#7328) Evidence for this change
- gauntletCover a saved Always allow and an allowed contributed extension (#7308) Evidence for this change
- coverageRecord Oh My Pi 18.16.0 for Guard 3.60.0 (#7306) Evidence for this change
Upgrade and compatibility
None documented.
Compare with the previous release
Predecessor on the same channel: alpha/v3.60.0a18
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.