OXYGENHUB

Release 0.4.5: keyless agents f05b84d1ad2d

Agents sign with fresh keys the hub certifies under their owner's grant
(author.signer = keyless), policies grant certified subjects, and the
hub's acceptance dates certified updates. See CHANGELOG.

Refs oxygenhub#241
Author
Andy McCall @andymccall <[email protected]>
via
agent Claude Code <[email protected]> · delegate for changes, until 2026-11-13 19:00Z · key ea5f78160088
When
· 2026-10-17 19:39 UTC
Signature
✔ signed by Claude Code
Hash
f05b84d1ad2d93d2027bc1e09fe393984c6a32e9b2d4016a11b6858f873b8b3c
Depends on
750251b21a96 8d80356371c5 8fd78eb52ad2 efad40f9ac8e ff0af1ee299d
Depended on by
68dcf21fe055
In bookmarks
carried-not-removed doctor-trust identical-sides keyless-tags main merge-remote-bookmark paths-for-resolutions-and-amend push-notes show-stat subrepo-pin-state
In tags
v0.10.0 v0.11.0 v0.4.5 v0.4.6 v0.5.0 v0.5.1 v0.6.0 v0.7.0 v0.8.0 v0.9.0
Edits
8 atoms, 0 tree operations, 3 files

Browse the tree at this change

modified CHANGELOG.md +12 −0
1 1
# Changelog
2 2
3 +
## 0.4.5 (2026-10-17)
4 +
5 +
- **Agents sign with no key of their own (oxygenhub#241).** With `author.signer = keyless`, oxy signs with a fresh key the hub certifies for ten minutes whenever it must sign, kept in memory only. The agent proves itself with a grant token its owner made with `oh agent grant NAME` and `oxy auth grant` keeps. The owner's own key signs the grant, which travels inside every certificate issued under it, so the agent's commits count in the owner's name without trusting the hub for authorship. The owner revokes the grant on the hub, and there is no key left to rotate or leak. `keyless.hub` names the hub (default: the default remote's).
6 +
7 +
- **Certificates for short-lived keys (spec §14.7).** A hub's key certifies a fresh key for a subject such as `repo:OWNER/NAME:bookmark:B` or `agent:NAME@ACCOUNT`, with a scope and a window of at most an hour. Pushes and fetches carry the certificates of the keys that signed what they bring. `oxy receipt verify` reads receipts that OxygenFlow runners sign with such keys.
8 +
9 +
- **Policies grant subjects an issuer certifies.** `oxy policy grant-subject SUBJECT --issuer IDENTITY --scope SCOPES` lets keys certified for a subject sign changes and move bookmarks. A push is checked at the receiver's clock. A fetch is checked at the time the issuer says it accepted the update, a countersigned `accepted` attestation the hub serves with the bookmark, so an expired key cannot backdate one.
10 +
11 +
- **A push seals for the author it signs for.** A delegate or a certified key set as `author.signer` now seals the author's unsigned changes at push, so it no longer has to sign each change at commit (`core.sign = change`).
12 +
13 +
- **gc keeps short-lived keys' certificates** for every change and attestation it keeps, not only receipts', so a fresh clone can still check a certified bookmark after a gc.
14 +
3 15
## 0.4.4 (2026-10-17)
4 16
5 17
- **A fresh clone takes tags made before a key rotation (#114).** A tag's signature was checked against the current trust policy with no regard for rotation, so every tag signed by a key since rotated away from was refused, and a fresh `oxy clone` of a repository with such a tag failed (this repository's own v0.1.0). A tag signed by a predecessor of a key the policy names is accepted when it is dated before that key's successor was made; a superseded key makes no new ones, and revoked keys never count.
…
194 unchanged lines
modified Cargo.lock +4 −4
…
1469 unchanged lines
1470 1470
1471 1471
[[package]]
1472 1472
name = "oxy"
1473 -
version = "0.4.4"
1473 +
version = "0.4.5"
1474 1474
dependencies = [
1475 1475
 "anyhow",
1476 1476
 "clap",
…
11 unchanged lines
1488 1488
1489 1489
[[package]]
1490 1490
name = "oxy-core"
1491 -
version = "0.4.4"
1491 +
version = "0.4.5"
1492 1492
dependencies = [
1493 1493
 "blake3",
1494 1494
 "ed25519-dalek",
…
18 unchanged lines
1513 1513
1514 1514
[[package]]
1515 1515
name = "oxy-server"
1516 -
version = "0.4.4"
1516 +
version = "0.4.5"
1517 1517
dependencies = [
1518 1518
 "axum",
1519 1519
 "axum-server",
…
6 unchanged lines
1526 1526
1527 1527
[[package]]
1528 1528
name = "oxy-strata"
1529 -
version = "0.4.4"
1529 +
version = "0.4.5"
1530 1530
dependencies = [
1531 1531
 "async-trait",
1532 1532
 "bytes",
…
1419 unchanged lines
modified Cargo.toml +1 −1
…
2 unchanged lines
3 3
resolver = "2"
4 4
5 5
[workspace.package]
6 -
version = "0.4.4"
6 +
version = "0.4.5"
7 7
edition = "2021"
8 8
license = "MIT OR Apache-2.0"
9 9
…
37 unchanged lines