OXYGENHUB

Log P4c (signed Flow receipts on the hub) as done 7dc9f65b6546

Author
Andy McCall @andymccall <[email protected]>
When
· 2026-09-29 07:51 UTC
Signature
✔ signed by Andy McCall
Hash
7dc9f65b65465a7dd4d788eb377c42901c28c28d64e8711178d3b7642dbf16e3
Depends on
155313e68e15 75036530b621 fc1a466a1e66
Depended on by
9df6217f5f47
In bookmarks
agents-in-readme bare-hashes carried-not-removed carry-identical doctor-trust identical-sides keyless-tags main merge-remote-bookmark only-help-103 paths-for-resolutions-and-amend push-notes show-stat subrepo-pin-state switch-says
In tags
v0.1.0 v0.10.0 v0.11.0 v0.2.0 v0.3.0 v0.3.1 v0.4.0 v0.4.1 v0.4.2 v0.4.3 v0.4.4 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
3 atoms, 0 tree operations, 1 file

Browse the tree at this change

modified docs/backlog-overnight-2.md +7 −1
…
105 unchanged lines
106 106
  - Hub: a bookmark's changes drawn as lanes of independent changes (oxy-core `lanes`), with dependencies as edges and no merge nodes.
107 107
  - P3b: drag and drop on proposal bookmarks only. Dropping a change onto another proposes a squash, dragging a dependent chain proposes a rebase. The hub produces a plan and the author's oxy or oxygen-vscode applies and signs it (V6 has split, squash and rebase). Reordering independent changes means nothing and is not offered.
108 108
- [x] P4a The `receipt` object and attestation in the Oxygen spec and oxy-core: a signed receipt verifies on its own; the repository keeps receipts by state; `oxy receipt list|show|export|verify|import` (first part of P4, below).
109 -
- [ ] P4c The runner signs each receipt with its own identity; the hub verifies it against its known runner keys, keeps it in the repository, and shows it on the run, the check and the change.
109 +
- [x] P4c The runner signs each receipt with its own identity; the hub verifies it against its known runner keys, keeps it in the repository, and shows it on the run, the check and the change.
110 110
- [ ] P4d Flow `output` and artifacts: a job's declared outputs become blobs named by its receipt, and a release asset links to the receipt that built it.
111 111
- [ ] P4 **Signed Flow receipts**:
112 112
  - A `receipt` object type in the Oxygen spec.
…
592 unchanged lines
705 705
  - The repository indexes receipts by state. gc keeps them, their runners and their outputs while the state's changes live, and pruning a state drops its index.
706 706
  - The CLI has `oxy receipt list|show|export|verify|import`.
707 707
  - **Tests:** core round trip and tamper tests, a repo test (keep, refuse, gc, fsck) and a CLI end-to-end test. The oxygen run is green.
708 +
- 2026-09-29 **P4c done** (oxygenflow#10, oxygenhub#37).
709 +
  - **Runner:** the runner makes a composite key on first start (`runner.key` 0600, `runner.identity`). It signs each receipt for the state of the heads it fetched and for the run URL, and sends the result with `finish` as `signed_receipt`. Earth's runner key is 9006c60d4ecb.
710 +
  - **Hub checks:** a receipt must verify, be the job's receipt, and be for the run's state and repository. It must also use the key the token first used; `flow_runner_keys` binds a token to its key on first use. If a check fails, the result still stands and the run page says why the receipt was not kept.
711 +
  - **Storage and pages:** kept receipts go into the repository through `add_receipt`, under the repository's write lock. Run pages link them with the signer, change pages list their state's receipts, and `/{o}/{n}/receipts/{attest}` downloads one.
712 +
  - **Tests:** a hub end-to-end test (kept, wrong key, wrong state, download, pages) and a runner key test. flow-core's receipt and the Oxygen object hash the same.
713 +
  - **Deployed:** hub and runner. Live, hub run 30's four jobs all have signed receipts, and a downloaded one passes `oxy receipt verify`. Flow and hub runs are green.