pi-daemon1.3

Reference

GitHub Actions artifact storage

Pi Daemon retains workflow artifacts only when they are needed to diagnose a failure or prove a security-sensitive release action. GitHub release assets are not Actions artifacts and are governed by the release process instead.

Retention policy

Producer Upload condition Retention Reason
macOS Nix CI failure only 7 days Bounded phase logs for CI diagnosis; successful runs need no bulk archive
GitHub Pages shared publisher 1 day Short-lived Pages deployment artifact of the pinned Nix static output

Do not upload caches, complete stores, successful test trees, prompts, model output, credentials, environment dumps, tokens, or arbitrary runner paths as artifacts. A job summary and required check result are the evidence for a successful ordinary CI run.

Pages publication

The Pages workflow calls the shared self-hosted publisher (harryaskham.github.io publish-pages.yml). It builds the pinned Pandoc/Nix site with nix build .#pages, validates the expected files, and deploys a short-lived Pages artifact. Verify the public HTML URLs after a publication.

Inventory and cleanup

Cleanup uses the Actions artifacts API only. It never uses the release-assets endpoint, so published release tarballs and checksum sidecars are out of scope. Always inventory first and delete only reviewed numeric artifact IDs.

Set the repository explicitly and produce a non-mutating inventory:

repo=harryaskham/pi-daemon
gh api "repos/$repo/actions/artifacts" --paginate \
  --jq '.artifacts[] | [.id, .name, .size_in_bytes, .created_at, .expires_at, .expired] | @tsv'

To identify stale successful macOS archives created before this policy, filter the same read-only inventory by exact name and a reviewed cutoff:

repo=harryaskham/pi-daemon
cutoff=2026-08-30T00:00:00Z
gh api "repos/$repo/actions/artifacts" --paginate \
  --jq '.artifacts[] | select(.name | startswith("nix-macos-")) | select(.created_at < "'"$cutoff"'") | [.id, .name, .size_in_bytes, .created_at] | @tsv'

Review that output before any deletion. For each exact approved ID, read it back and then delete it from the Actions artifact endpoint:

repo=harryaskham/pi-daemon
artifact_id=REVIEWED_NUMERIC_ID
gh api "repos/$repo/actions/artifacts/$artifact_id" \
  --jq '[.id, .name, .size_in_bytes, .created_at] | @tsv'
gh api --method DELETE "repos/$repo/actions/artifacts/$artifact_id"

Do not turn this into an unreviewed age-based deletion loop. Do not call repos/$repo/releases/assets/...; that is a separate immutable release surface.