Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

vole
Clone

Read only, no credentials:

https://rodent.software/git/vole.git

Write over SSH with a registered key:

git clone ssh://git@0.0.0.0:2222/vole.git

A free and open-source forge that lives in your Git repo.

Phase 7 slice 4: a published release cannot change under its link

948a6d7dcdacb72d6f90074ac0e5f9999314c4f4 · Keenan Nemetz · 17d ago · parent 85cc89fe

Phase 7 slice 4: a published release cannot change under its link

The last piece of the release story is the one that makes the download links
trustworthy: pre-receive now refuses to move or delete a tag that has artifacts
attached, and on the metadata branch refuses removing a pointer or re-pointing
one at different bytes. Comparing blob ids is enough — a pointer's id is its
text, so "unchanged" needs no parsing and cannot be fooled by reformatting.

Adding an artifact stays legal: an artifact is published when its pointer lands,
so an addition invalidates nothing.

The rules sit with the integrity checks rather than the review gate, because a
download that can change bytes is broken whoever pushed it. An admin may
override, with a line in data/audit.log, following the force-push precedent: a
mistyped tag is otherwise unrepairable, and an unaudited override leaves no trace
of the bytes that changed under somebody's link.

Four refusals are tested through a writer account (moved tag, deleted tag,
removed pointer, re-pointed pointer), plus the admin override and its audit line.

README.md +7−2

@@ -66,8 +66,7 @@ Working today:
66 66 - An instance ed25519 key generated at first boot (used for metadata signing in
67 67 Phase 7)
68 68
69 Not yet: workflow artifact uploads, LFS locking, and release immutability (a tag that has
70 artifacts can still be moved until Phase 7's last slice lands).
69 Not yet: workflow artifact uploads, LFS locking.
71 70 Signature verification is deferred,
72 71 not planned: the SSH handshake already establishes who pushed, so signing approvals
73 72 would restate it for a verifier this deployment does not have (see the roadmap).
@@ -280,6 +279,12 @@ Artifacts are reachable by `vole gc` because the pointers live on the `vole` bra
280 279 vole gc --dry-run # the published artifact is a reachable root
281 280 ```
282 281
282 A release with artifacts is immutable from the moment they land: the server refuses to
283 move or delete that tag, to remove a pointer, or to re-point one at different bytes
284 (`pre-receive`), so a saved download keeps meaning what it said. Adding another artifact
285 is fine — that invalidates nothing. An admin can still repair a mistyped release, and the
286 override is written to `data/audit.log`.
287
283 288 ## Hosting a site
284 289
285 290 A repository's `pages` branch is a website at `<repo>.<pages_domain>`. Nothing is