Files
felhom.eu/documentation/audits/night-2026-09-23/teardown.py
T
admin 3e58c184f6
gates / gates (push) Successful in 27s
night shift 2026-09-23: the record, the register, the morning note
DRILL-night-2026-09-23.md: Parts A-E. 09 §3 decisions 21 (operator word),
22 and 23 (CC unattended, operator may reverse); §6.4 parts 4 and 6
(catalog half) shipped; §6.1a residuals R-658/R-659. Register 330 -> 336:
R-651..R-660 opened (R-658 and R-659 P1), R-650/R-640/R-499/R-626 closed.
Capability map, nightly rotation (opengist), STATUS (one question: the
floor), CONTEXT, REPORT. The floor stays 0.266.0.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-09-24 00:24:04 +02:00

24 lines
1.5 KiB
Python

#!/usr/bin/env python3
"""Part E teardown on 9202 — every app removed THROUGH THE PRODUCT, then the leftovers read by name.
R-658's second half is measured here: does the remove of a RESTORED app (volumes without the compose
label) leave its volumes behind? docmost, navidrome and vikunja were restored tonight; romm, nextcloud,
adventurelog were not (the control)."""
import json, sys, time
sys.path.insert(0, ".")
import walk as w
w.login()
apps = ["docmost", "navidrome", "vikunja", "romm", "nextcloud", "adventurelog", "actualbudget"]
before = w.guest("for p in " + " ".join(apps) + "; do echo \"$p all=$(docker volume ls -q | grep -c ^${p}_) labeled=$(docker volume ls -q --filter label=com.docker.compose.project=$p | wc -l) copies=$(docker volume ls -q --filter label=felhom.undo-copy-of=$p | wc -l)\"; done")
w.say("volumes before the removes:\n" + before)
res = {}
for a in apps:
st = w.stack(a)
if not st.get("deployed"):
res[a] = "not deployed"; continue
code = w.remove(a)
res[a] = code
after = w.guest("for p in " + " ".join(apps) + "; do echo \"$p containers=$(docker ps -aq --filter label=com.docker.compose.project=$p | wc -l) volumes=$(docker volume ls -q | grep ^${p}_ | tr '\\n' ' ') copies=$(docker volume ls -q --filter label=felhom.undo-copy-of=$p | wc -l)\"; done")
w.say("after the removes (the product's own):\n" + after)
json.dump({"before": before, "remove": res, "after": after}, open("E2-teardown-removes.json", "w"), indent=2)
open("E2-teardown-removes.log", "w").write("\n".join(w.LOG) + "\n")