Hold every kept archive by a manifest so the store's collector keeps it (hq issue 253) #53

Merged
mesh-admin merged 1 commits from fix/every-kept-archive-is-held into main 2026-10-05 16:15:15 +00:00
Contributor

The store's stock collector keeps only what a manifest names, and archives were bare blobs: its first night would have deleted every bundle the mesh keeps (stopgap: dry run, mesh-catalog #62).

  • PublishArchive puts a deterministic OCI holder manifest (empty config {}, one tar+gzip layer) by digest after the blob, and holds an archive it finds already uploaded; a hold that fails fails the build.
  • The sweep holds every kept archive before letting anything go (backfills today's bare blobs); LetGo removes the holder, then the link.
  • The five-recent-builds reason applies only to modules the mesh holds (forgotten modules keep nothing).
  • collection [--json]: kept archives held / unheld / missing, what is eligible, safe_to_collect — the gate for turning the dry run off.
  • No schema change; references and machines' fetch path unchanged.

Tests: fake-registry tests (holder deterministic, Hold idempotent + backfills, LetGo order, PublishArchive holds), keep-set tests, and a live test against registry:2.8.3 running garbage-collect: held and backfilled archives survive, bare and let-go ones are deleted. Rebased on main; full suite with fresh postgres + NATS: all packages pass. Independently reviewed: no must-fix.

The store's stock collector keeps only what a manifest names, and archives were bare blobs: its first night would have deleted every bundle the mesh keeps (stopgap: dry run, mesh-catalog #62). - `PublishArchive` puts a deterministic OCI holder manifest (empty config `{}`, one `tar+gzip` layer) by digest after the blob, and holds an archive it finds already uploaded; a hold that fails fails the build. - The sweep holds every kept archive before letting anything go (backfills today's bare blobs); `LetGo` removes the holder, then the link. - The five-recent-builds reason applies only to modules the mesh holds (forgotten modules keep nothing). - `collection [--json]`: kept archives held / unheld / missing, what is eligible, `safe_to_collect` — the gate for turning the dry run off. - No schema change; references and machines' fetch path unchanged. Tests: fake-registry tests (holder deterministic, Hold idempotent + backfills, LetGo order, PublishArchive holds), keep-set tests, and a live test against registry:2.8.3 running `garbage-collect`: held and backfilled archives survive, bare and let-go ones are deleted. Rebased on main; full suite with fresh postgres + NATS: all packages pass. Independently reviewed: no must-fix.
mesh-admin added 1 commit 2026-10-05 16:15:11 +00:00
The store's garbage-collect marks only from manifests, and archives were
published as bare blobs, so the first real collection would delete every
archive the mesh keeps. PublishArchive now puts a deterministic OCI holder
manifest (empty config, one layer) beside each archive; the sweep holds every
kept archive before it lets anything go, which backfills existing bare blobs,
and lets go of an archive holder-first. A forgotten module no longer keeps its
five recent builds (ADR 0189). `collection [--json]` reports kept archives
held/unheld and what may be let go, so the dry run can be lifted on evidence.
jschoubben force-pushed fix/every-kept-archive-is-held from 1799e232f8 to 01c5ab2aab 2026-10-05 16:15:12 +00:00 Compare
mesh-admin merged commit ed25fd68e2 into main 2026-10-05 16:15:15 +00:00
mesh-admin deleted branch fix/every-kept-archive-is-held 2026-10-05 16:15:16 +00:00
Author
Contributor

Delivery novox/mesh-controller@ed25fd68e202 — held since 2026-10-06T23:05:28Z

Held for a person: merged without a passing check: only a person decides that it goes on — mesh-delivery.release with why lets it go on.

Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step

  • tier 0: mesh-controller
  • tier 1: build-agent
  • tier 2: route-proxy
  • ace: receives build-agent, route-proxy
  • g14: receives build-agent
  • novox: receives mesh-controller, build-agent, route-proxy
  • shanks: receives build-agent
  • build-agent keeps data (ADR 0233): what it holds is backed up before it moves
  • route-proxy provides route: its consumers are sent again after it
  • route-proxy keeps data (ADR 0233): what it holds is backed up before it moves

Transitions

  • 2026-10-06 23:05 (new) → proposed (announced): novox/mesh-controller#53 merged; its head was not heard by this owner, so it is made from the forge's word
  • 2026-10-06 23:05 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides that it goes on

The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.

<!-- mesh-delivery:view --> **Delivery** `novox/mesh-controller@ed25fd68e202` — **held** since 2026-10-06T23:05:28Z Held for a person: merged without a passing check: only a person decides that it goes on — `mesh-delivery.release` with why lets it go on. **Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step - tier 0: mesh-controller - tier 1: build-agent - tier 2: route-proxy - ace: receives build-agent, route-proxy - g14: receives build-agent - novox: receives mesh-controller, build-agent, route-proxy - shanks: receives build-agent - build-agent keeps data (ADR 0233): what it holds is backed up before it moves - route-proxy provides route: its consumers are sent again after it - route-proxy keeps data (ADR 0233): what it holds is backed up before it moves **Transitions** - 2026-10-06 23:05 (new) → proposed (announced): novox/mesh-controller#53 merged; its head was not heard by this owner, so it is made from the forge's word - 2026-10-06 23:05 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides that it goes on The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
This repo is archived. You cannot comment on pull requests.