Skip to content

feat(ticket-081): fixos cleanup --docker-volumes — select and remove unused volumes safely - #111

Merged
ifuri-validator-agent[bot] merged 2 commits into
mainfrom
ticket/081-docker-volumes-cleanup
Oct 13, 2026
Merged

ifuri-validator-agent[bot] merged 2 commits into
mainfrom
ticket/081-docker-volumes-cleanup

Conversation

@tom-sapletta-com

Copy link
Copy Markdown
Contributor

On 2026-10-13 the host had 397 unused Docker volumes (89 GB). fixos only counted them; removing 18 model volumes (55.5 GB) needed manual docker volume rm. The only volume path was cleanup --full "Docker Total" → docker system prune -a --volumes, deleting every unused volume at once (including data such as git mirrors).

fixos cleanup --docker-volumes (also -c docker-volumes):

  • lists unused volumes with name, Compose project, age and size (du, then non-interactive sudo -n du, else "rozmiar nieznany"), largest first;
  • --match ollama,huggingface, --days N, --list, --dry-run, --json;
  • removes only selected volumes, re-checking each is still dangling and unreferenced right before docker volume rm;
  • --yes never selects data-looking names (mirror, git, db, postgres, backup, …).

--full "Docker Total" now runs the bounded build-cache prune and points to --docker-volumes.

Live --list on this host: 379 unused volumes, 34.8 GB of known size; ifuri-onedev_mirror-data and mcp_git-repo-storage flagged as data.

Tests: 6 new; full suite 881 passed / 5 skipped; ruff clean (incl. pre-existing I001/RUF012 in the touched mixin); governance GOV-PASS.

🤖 Generated with Claude Code

tom-sapletta-com and others added 2 commits October 13, 2026 21:29
…unused volumes safely [ticket-081]

Lists unused volumes with name, Compose project, age and size, filters
by --match/--days, re-checks each volume right before docker volume rm,
and --yes never selects data-looking volumes. cleanup --full no longer
runs docker system prune -a --volumes.

Co-Authored-By: Claude <noreply@anthropic.com>
…der --yes [ticket-081]

Co-Authored-By: Claude <noreply@anthropic.com>

@ifuri-validator-agent ifuri-validator-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Validator approval after policy checks for exact head e3011f43dc7aa80effff4a0fa8c3c20760769be4.

Ticket: ticket-081
Correlation ID: local-semcod-fixos-pr-111-ticket-081
Model: openai/cursor-auto
Reviewed diff chunks: 3
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 3 diff chunk(s). The visible chunk implements selective Docker-volume cleanup with conservative automatic selection, explicit handling of data-looking names, non-interactive size probing, and a per-volume liveness recheck immediately before removal. No unresolved code or security defect is evident in this chunk. | The visible chunk safely replaces the broad Docker volume-prune recommendation with a bounded builder-cache prune, documents the new selective workflow, and includes focused tests for listing, filtering, protected-name handling, and removal-time safety. All supplied required checks passed. | The visible chunk adds focused regression tests confirming that invalid selection, list mode, dry-run mode, and full storage analysis do not remove Docker volumes; that full analysis uses the bounded builder-cache prune command; and that representative application-data volume names are protected while cache/model names are not falsely classified. All protected required checks passed.
Advisory findings: none
The LLM output above is advisory and was not used as the approval trust root.
Semantic review prerequisite: not_required; policy 676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7.

Actual PR impact radar

Exact range: d0d37038727598ab0234d06de40952c3114e9cd2...e3011f43dc7aa80effff4a0fa8c3c20760769be4
Change digest: 15a9c4a40f1ca64d859810b599197dac3f3aec15db65ffc0dc40fa217fadd248
Score: 60/100 (L), estimated 72 min, split recommended: true
Affected services/components: repository-wide/unclassified

Machine-readable radar JSONL and SVG
{"actual_change":{"additions":521,"base_sha":"d0d37038727598ab0234d06de40952c3114e9cd2","binary_files":0,"categories":{"code":3,"configuration":1,"docs":1,"tests":1},"change_digest":"15a9c4a40f1ca64d859810b599197dac3f3aec15db65ffc0dc40fa217fadd248","comparison":"d0d37038727598ab0234d06de40952c3114e9cd2...e3011f43dc7aa80effff4a0fa8c3c20760769be4","deletions":6,"file_count":6,"files":["fixos/cli/_cleanup_docker_volumes.py","fixos/cli/cleanup_cmd.py","fixos/diagnostics/_storage_container_mixin.py","project/ticket-081/README.md","project/ticket-081/intent.json","tests/unit/test_cleanup_docker_volumes.py"],"head_sha":"e3011f43dc7aa80effff4a0fa8c3c20760769be4","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":2,"scope":4,"uncertainty":3,"validation":1},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":72,"within_budget":false},"impact":{"components":["I001","claude.com","fixos","project","tests"],"files":["I001/RUF012","claude.com/claude-code","fixos/cli/_cleanup_docker_volumes.py","fixos/cli/cleanup_cmd.py","fixos/diagnostics/_storage_container_mixin.py","project/ticket-081/README.md","project/ticket-081/intent.json","tests/unit/test_cleanup_docker_volumes.py"],"public_interfaces":[],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":60,"split":{"parts":[{"estimated_minutes":13,"name":"Implement I001","scope":["I001"]},{"estimated_minutes":13,"name":"Implement claude.com","scope":["claude.com"]},{"estimated_minutes":13,"name":"Implement fixos","scope":["fixos"]},{"estimated_minutes":13,"name":"Implement project","scope":["project"]},{"estimated_minutes":13,"name":"Implement tests","scope":["tests"]},{"estimated_minutes":15,"name":"Validate and project to trackers","scope":["tests","planfile","github/gitlab/jira projections"]}],"reason":"estimated_minutes_exceed_budget","recommended":true},"standards":[{"id":"wellmanifest/dsl","revision":"6c60fc4e0dd1f1bb74f46a7745e28019908d1203","version":"0.1.0-dev"},{"id":"wellmanifest/ticket-lifecycle","revision":"5bf581907a87b46a13a73e6c033d3abe4d9a306f","version":"0.1.0-dev"},{"id":"wellmanifest/git-lifecycle","revision":"7d77d4b7af57e69bc75c3a0290b3a4805c5c4438","version":"0.2.0-dev"},{"id":"wellmanifest/logs","revision":"48c284ef7a069055c0bcb6b900147ce5e65f8b43","version":"0.3.0"}],"ticket_ref":"ticket-081"}
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-081: feat(ticket-081): fixos cleanup --docker-volumes — select and remove unused volumes safely</title><rect width="128" height="128" rx="12" fill="#f8fafc"/><g stroke-width="1"><polygon points="64,55 72,61 69,71 59,71 56,61" fill="none" stroke="#d7dde5"/><polygon points="64,47 80,59 74,78 54,78 48,59" fill="none" stroke="#d7dde5"/><polygon points="64,38 89,56 79,85 49,85 39,56" fill="none" stroke="#d7dde5"/><polygon points="64,30 97,53 84,92 44,92 31,53" fill="none" stroke="#d7dde5"/><polygon points="64,21 105,51 89,99 39,99 23,51" fill="none" stroke="#d7dde5"/><line x1="64" y1="64" x2="64" y2="21" stroke="#aab4c0"/><line x1="64" y1="64" x2="105" y2="51" stroke="#aab4c0"/><line x1="64" y1="64" x2="89" y2="99" stroke="#aab4c0"/><line x1="64" y1="64" x2="39" y2="99" stroke="#aab4c0"/><line x1="64" y1="64" x2="23" y2="51" stroke="#aab4c0"/></g><polygon points="64,30 105,51 79,85 59,71 48,59" fill="#fb923c" fill-opacity="0.45" stroke="#c2410c" stroke-width="2"/><circle cx="64" cy="64" r="3" fill="#c2410c"/><g font-family="sans-serif" font-size="7" fill="#334155"><text x="64" y="11" text-anchor="middle">SCO</text><text x="114" y="48" text-anchor="middle">COU</text><text x="95" y="107" text-anchor="middle">UNC</text><text x="33" y="107" text-anchor="middle">VAL</text><text x="14" y="48" text-anchor="middle">DEL</text></g><text x="64" y="124" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#0f172a">L · 72m</text></svg>
Merge will be attempted after this approval when explicitly authorized. ## Decision record (recomputable)
DECISION D-081-7357
TICKET ticket-081
HEAD_SHA e3011f43dc7aa80effff4a0fa8c3c20760769be4
CORRELATION_ID local-semcod-fixos-pr-111-ticket-081
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["test-summary=PASS","test-debian=PASS","test-alpine=PASS","test-fedora=PASS","test-arch=PASS","test-ubuntu=PASS","test (3.11)=PASS","test (3.10)=PASS","governance / remote lifecycle=PASS","test (3.12)=PASS","governance / enforce=PASS","onedev/local-verify=PASS"]
INPUT required_checks = ["onedev/local-verify","test (3.10)","test (3.11)","test (3.12)","test-summary"]
INPUT required_checks_source = "protected registry (env/request)"
INPUT reviewer_login = "ifuri-validator-agent[bot]"
INPUT semantic_review_assessment = {"schema":"subactor.validator/semantic-review-assessment/v1","subject":{"repository":"semcod/fixos","pull_request":111,"head_sha":"e3011f43dc7aa80effff4a0fa8c3c20760769be4","base_sha":"d0d37038727598ab0234d06de40952c3114e9cd2","diff_sha256":"66679b3c4664b32659a4b6b6546f81c1c15907e38f017d1eabeb283670ccbace"},"policy":{"policy_schema":"subactor.validator/semantic-review-policy/v1","policy_version":1,"policy_sha256":"676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7","required":false,"critical_paths":[],"observed_paths":["fixos/cli/_cleanup_docker_volumes.py","fixos/cli/cleanup_cmd.py","fixos/diagnostics/_storage_container_mixin.py","project/ticket-081/README.md","project/ticket-081/intent.json","tests/unit/test_cleanup_docker_volumes.py"]},"grounding":"full-diff-not-per-finding-proof","execution_authority":false,"status":"not_required","reason":null,"review_sha256":null,"unresolved":[]}
INPUT superseded_checks = []
INPUT ticket_radar_receipt = {"schema":"subactor.ticket-radar/v1","base_sha":"d0d37038727598ab0234d06de40952c3114e9cd2","head_sha":"e3011f43dc7aa80effff4a0fa8c3c20760769be4","change_digest":"15a9c4a40f1ca64d859810b599197dac3f3aec15db65ffc0dc40fa217fadd248","score":60,"complexity":"L","estimated_minutes":72,"split_recommended":true,"services":[],"authority":"ADVISORY","promotion":"FORBIDDEN"}
VERDICT APPROVE AUTHORITY DETERMINISTIC
REJECTED REQUEST_CHANGES BECAUSE NO_UNSAFE_CHANGE_REASON_FOUND
ADVISORY llm_verdict = "APPROVE" MODEL "openai/cursor-auto"
ASSERT VERDICT_AUTHORITY != "ADVISORY"

@ifuri-validator-agent
ifuri-validator-agent Bot merged commit f92edb8 into main Oct 13, 2026
12 checks passed
@ifuri-validator-agent
ifuri-validator-agent Bot deleted the ticket/081-docker-volumes-cleanup branch October 13, 2026 19:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant