fix(forgejo): recycle deploy and publisher runner scratch nightly #769
Closed
coilyco-ops
wants to merge 1 commit from
aos/claude/xk86 into main
pull from: aos/claude/xk86
merge into: coilyco-flight-deck:main
coilyco-flight-deck:main
coilyco-flight-deck:aos/claude/uv47-state-ambient-taxonomy
coilyco-flight-deck:eval/ansible-slug-tidy
coilyco-flight-deck:eval/label-advocate
coilyco-flight-deck:aos/claude/mt75-kubectl-context-callsites
coilyco-flight-deck:eval/slug-pass-labels
coilyco-flight-deck:aos/claude/mt75-coredns-hairpin
coilyco-flight-deck:eval/label-devrel-relations
coilyco-flight-deck:eval/label-platform-engineer
coilyco-flight-deck:eval/label-descriptions-retitle
coilyco-flight-deck:eval/label-descriptions-roster
coilyco-flight-deck:aos/claude/wz68-mirror-push
coilyco-flight-deck:aos/claude/wz68-mirror-watch
coilyco-flight-deck:aos/claude/wz68-bot-identity
coilyco-flight-deck:aos/claude/wz68-bot-handle
coilyco-flight-deck:aos/claude/wz68
coilyco-flight-deck:aos/claude/ff54-retire-coilyco-ai-hook
coilyco-flight-deck:aos/claude/ff54-retire-issue-refs
coilyco-flight-deck:aos/claude/ue86
coilyco-flight-deck:aos/claude/yq86
coilyco-flight-deck:aos/claude/ser8-image-build-929
coilyco-flight-deck:ops/zombie-retire-secret-strays
coilyco-flight-deck:ops/917-alert-unit-name
coilyco-flight-deck:ops/917-restic-failure-alert
coilyco-flight-deck:ops/914-drop-comfyui-cname
coilyco-flight-deck:ops/914-drop-stale-dns-instruction
coilyco-flight-deck:ops/retire-coilysiren-me-mail
coilyco-flight-deck:ops/911-dns-mail-auth
coilyco-flight-deck:aos/claude/fj88
coilyco-flight-deck:ops/393-aos-pin-rollout
coilyco-flight-deck:ops/708-o11y-telegram-per-host-cache
coilyco-flight-deck:chore/claude-permissions-allow-all
coilyco-flight-deck:fix/comfyui-preflight-whatif
coilyco-flight-deck:fix/comfyui-supervisor-job-object
coilyco-flight-deck:fix/forgejo-creds-windows-ssm
coilyco-flight-deck:fix/comfyui-orphan-on-refused-restart
coilyco-flight-deck:fix/windows-projects-root
coilyco-flight-deck:fix/comfyui-restart-race
coilyco-flight-deck:windows-tasks-s4u
coilyco-flight-deck:windows-attribution-bash-shim-python
coilyco-flight-deck:fix/comfyui-whatif-verification
coilyco-flight-deck:windows-terminal-kai-tower-3026
coilyco-flight-deck:fix/setup-git-lfs-windows-path
coilyco-flight-deck:chore/drop-ward-yaml
coilyco-flight-deck:fix/terraform-docs-action-arg
coilyco-flight-deck:fix/mint-key-orphan
coilyco-flight-deck:feat/public-asset-host
coilyco-flight-deck:aos/claude/ka54-failclosed
coilyco-flight-deck:aos/claude/ka54-cleanup
coilyco-flight-deck:aos/claude/ka54
coilyco-flight-deck:aos/claude/uq98-unattended-forgejo
coilyco-flight-deck:aos/claude/uq98-disk-domains
coilyco-flight-deck:aos/claude/xk58
coilyco-flight-deck:aos/claude/aw85-bands
coilyco-flight-deck:aos/claude/ym96-docs-band
coilyco-flight-deck:aos/claude/wt57-alerts-to-mapper
coilyco-flight-deck:aos/claude/xu59-role-trailer
coilyco-flight-deck:aos/claude/ym96-verb-convert
coilyco-flight-deck:aos/claude/ym96-token-cleanup
coilyco-flight-deck:aos/claude/ym96-label-sync
coilyco-flight-deck:aos/claude/wt57-atlas-cleanup
coilyco-flight-deck:fix/mirror-unskip-sirens-echo
coilyco-flight-deck:aos/claude/uz86-session-name
coilyco-flight-deck:retire-code-fleet-watch-830
coilyco-flight-deck:codex/alacritty-link-rollout
coilyco-flight-deck:chore/mcp-beaver-fleet-watch
coilyco-flight-deck:aos/claude/attribution-interpreter
coilyco-flight-deck:aos/claude/mg96-fm
coilyco-flight-deck:aos/claude/js44
coilyco-flight-deck:coilyco-ops/deprovision-tangled-knot
coilyco-flight-deck:aos/claude/mg96
coilyco-flight-deck:aos/claude/zv96
coilyco-flight-deck:outdated-branch-815
coilyco-flight-deck:aos/claude/agent-proxy-publisher-runner
coilyco-flight-deck:aos/claude/git-attribution-pin-interpreter
coilyco-flight-deck:aos/claude/restore-tag-quarantine
coilyco-flight-deck:aos/claude/mirror-workflows-permission
coilyco-flight-deck:aos/claude/forgejo-16
coilyco-flight-deck:aos/claude/dind-mtu
coilyco-flight-deck:aos/claude/precommit-egress-proxy
coilyco-flight-deck:aos/claude/qa57-branch-protection
coilyco-flight-deck:chore/egress-proxy-open
coilyco-flight-deck:chore/egress-allow-code-forgejo
coilyco-flight-deck:aos/claude/qa57
coilyco-flight-deck:chore/aos-precommit-v0.18-bump
coilyco-flight-deck:aos/claude/ck67
coilyco-flight-deck:infra/claude/ser8-runner-force-pull
coilyco-flight-deck:aos/claude/runner-scratch-10gi
coilyco-flight-deck:aos/claude/runner-recycle-selector
coilyco-flight-deck:aos/codex/20260806t002312z-7943-00371332
coilyco-flight-deck:codex/sirens-echo-deepseek-tailnet-20260805
coilyco-flight-deck:codex/daily-aos-sync
coilyco-flight-deck:issue-756-remove-role-provider-symlink
coilyco-flight-deck:aos/codex/sirens-echo-runner-rename
coilyco-flight-deck:aos/codex/20260731t171534z-9817-e7959fba
coilyco-flight-deck:issue-697-aos-check-config
coilyco-flight-deck:issue-694-aos-convergence
coilyco-flight-deck:ops/remove-mac-models-launchd-20260729
coilyco-flight-deck:ops/remove-mac-models-20260729
coilyco-flight-deck:tailscale-proxy-converge-self-heal
coilyco-flight-deck:issue-587
coilyco-flight-deck:backup/issue-785-first-person
coilyco-flight-deck:issue-785-first-person
coilyco-flight-deck:ops/galaxy-gen-registry-rotate
coilyco-flight-deck:ops/website-deploy-runner
coilyco-flight-deck:codex/history-derived-skill-20260728
coilyco-flight-deck:ops/k3s-pod-capacity-config
coilyco-flight-deck:ops/publisher-runners
coilyco-flight-deck:codex/code-fleet-watch-v2
coilyco-flight-deck:codex/code-fleet-watch
coilyco-flight-deck:recovery/2026-07-28-triaged-branch-archive
coilyco-flight-deck:recovery/2026-07-27-local-work
coilyco-flight-deck:recovery/machine-exit-20260727
coilyco-flight-deck:issue-653-registry-retirement
coilyco-flight-deck:issue-593
coilyco-flight-deck:fix/aws-iam-ssm-import
coilyco-flight-deck:feat/warded-ssm-identity
coilyco-flight-deck:issue-500
No reviewers
Labels
Clear labels
burndown-2026-06
Backlog burndown June 2026
burndown-2026-08
Closed in the 2026-08-26 backlog burn-down. Reopen freely: state:closed label:burndown-2026-08 recovers the whole set.
autonomy
async-consult
A human needs to consult on the issue to upgrade it to headless
autonomy
epic
This issue has many units of sub work - its size makes it meaningfully exclusive with other autonomy types
autonomy
headless
The agent can perform the work on its own
autonomy
live-collab
The agent and the human need to work together in realtime
coherence-core
Core review set for the warded control plane coherence milestone. These issues form the release spine; adjacent milestone issues are stretch or supporting work.
priority
P0
priority tier
priority
P1
priority tier
priority
P2
priority tier
priority
P3
priority tier
priority
P4
priority tier
qa-fixture
Disposable issue admitted to the bounded Ward QA verification lane.
role/advocate
requires work from the Developer Advocate seat
role/director
requires work from the Portfolio Director seat
role/exec
requires work from the exec role
role/frontend
requires work from the Frontend Engineer seat
role/gamedev
requires work from the Game Developer seat
role/human
requires a person, and specifically not an agent seat
role/platform
requires work from the Platform Engineer seat
role/qa
requires work from the QA role
role/science
requires work from the Applied Scientist seat
role/sysadmin
requires work from the Systems Administrator seat
state
ambient
ambient and ephemeral work, held as a maintained document rather than a queue
No labels
burndown-2026-06
burndown-2026-08
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/infrastructure!769
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/xk86"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why
kai-server root filesystem is at 89.6 percent (461.6 GB of 514.9 GB), past the 85 percent critical line. Kubelet has been failing image garbage collection every five minutes, wanting 49.7 GB and finding ~0 bytes eligible, because every image is in use. The pressure is data, not images.
The measured cause:
forgejo-runner-recyclecovered only the three general pools plus the Flight Deck image-build runner. The scoped deploy and publisher pools use the identical 24Gi-cappedemptyDirdocker-libscratch and the identical start-time wipe, but were never in the recycle inventory, so their scratch grew for the whole pod lifetime.Pod ephemeral storage on kai-server, from the kubelet summary API:
forgejo-runner-deploy-factory-game-v3- 23.92 GB, against its own 24GisizeLimitforgejo-runner-deploy-sirens-discord-ops- 23.33 GBforgejo-runner-deploy-sirens-echo- 15.85 GBforgejo-runner-deploy-eco-app- 14.99 GBforgejo-runner-deploy-galaxy-gen- 14.57 GBforgejo-runner-deploy-ward-mcp- 5.74 GBforgejo-runner-deploy-scoped- 3.06 GBThat is 101 GB, 97 percent of all pod ephemeral storage on the node. factory-game-v3 is close enough to its
sizeLimitto be evicted.What
forgejo-runner-deploy.ymlandforgejo-runner-publisher.ymlbases too, so the inventory follows the scoped overlays rather than a hand-maintained list. Targets go from 4 to 17.emptyDirscratch contract for both newly covered bases.docs/FEATURES.mdcoverage boundary.The ser8 overlay replaces both
resourceNamesand the container list, so ser8 coverage is unchanged.Verification
ward exec forgejo-runner-recycle-teststatic validation passes:forgejo runner recycle manifest: ok. The image-entrypoint stage cannot run on an arm64 macOS host without Docker and fails there identically on unmodifiedmain, so it is not a regression from this change.pre-commit run --all-filespasses, including the Forgejo runner recycle guard and the Forgejo storage lifecycle guard.Not included
forgejo-runner-deploy-sirens-discord-opsholds 23.33 GB but has no manifest anywhere in this repo. It carries Fluxappslabels, so it was applied once and its source was later removed without a prune. It is excluded from this change because the recycle inventory is derived from tracked overlays, and because restarting a workload with no tracked manifest has no rollback artifact. It needs a separate retirement decision.Closing in favor of #770, which resolves the same incident.
The diagnosis here is correct and #770 keeps it: the scoped deploy and publisher pools carry the same 24Gi
emptyDirscratch contract as the general pools and were never in the recycle inventory. The measurements match an independent read, and thesirens-discord-opsexclusion reasoning was right.What changed is the mechanism. This PR's body says targets become derived from the scoped overlays, but the derivation lives only in
scripts/test-forgejo-runner-recycle.py. The manifest still carries 13 hand-copied 15-line container blocks and 13resourceNames, and the test then enforces that hand-maintained list. After merge therancher/kubectldigest would sit at 21 copies across two files, every runner would be enumerated twice in two cluster inventories, and every futurecoilyco-bridge/deployservice would become a required 16-line copy-paste gated by infra CI.#770 labels each scratch-bearing base with
coilyco.io/runner-scratch: recycleand selects on it. Same 17 kai-server targets and 4 ser8 targets, verified by rendering. The recycle manifest loses 97 lines, the ser8 overlay loses its whole 89-line patch set and consumes the base unpatched, and the digest appears once. The test asserts scratch and label imply each other in both directions, which catches the drift a name list cannot.Two things carried forward unchanged:
sirens-discord-opsstill needs a retirement decision, and the aggregate 24Gi-times-N ceiling still exceeds the disk.Thanks for finding this one. The scratch measurement is what made the fix obvious.
Pull request closed