fix(worker): ruim /tmp op tussen iteraties en meld een volle /tmp (ISS-14) #90

Merged
janpeter merged 1 commit from fix/tmp-sweep into master 2026-09-28 12:36:49 +02:00
Owner

Fixes max2 ISS-14.

Probleem

De PR_REVIEW van Ops-dashboard#260 bleef opnieuw starten. De codex-worker op max2 faalde elke geclaimde job met ENOSPC bij /tmp/job-<id>/payload.json. /tmp is een tmpfs van 2 GB en zat vol met PR-clones die de agent zelf had gemaakt (/tmp/pr-review-<job>: 1,1 GB, /tmp/pr95-review: 514 MB, met node_modules). Niets ruimde die op. De DB toonde alleen "agent did not complete job within 2 attempts".

Fix

  • bin/tmp-sweep.sh:
    • wist tussen iteraties alles van de agent-gebruiker direct onder /tmp, behalve tsx-*, node-compile-cache en verborgen entries;
    • doet eerst chmod -R u+rwX: de codex-sandbox laat read-only bomen achter, en root kan ze niet wissen (cap_drop ALL);
    • schrijft TMP_PRESSURE als /tmp daarna boven AGENT_TMP_WARN_PCT (80) blijft;
    • faalt nooit.
  • run-agent.sh: roept het aan op elke plek waar log-cleanup.sh draait (start, overload, na elke iteratie). Er loopt dan geen job.
  • health-server.js: /health geeft 503 tmp-low zolang de marker bestaat.

Bewijs

  • __tests__/tmp-sweep.test.ts: 5 gevallen, eerst rood en daarna groen. De volledige suite geeft 208/208; dezelfde 13 dispatch-suites laden lokaal niet, net als op master.
  • Wegwerpcontainer van het live scrum4me-agent-codex:local-image met read-only root, tmpfs /tmp, cap_drop ALL, no-new-privileges en -u agent:
    • een gewone rm op de read-only boom faalt (zoals in productie);
    • tmp-sweep.sh wist alles behalve de caches (30% → 0%);
    • met een ander bestand dat /tmp vult komt TMP_PRESSURE op 90.

Uitrol

Image-rebuild en redeploy van de workers op beide hosts: redeploy_all_workers op max2, redeploy_all of update_mcp_worker op 154. Beide ontsleutelen eerst de worker-DB-env, en de worker-recreate op 154 bounce't postgres niet meer (ISS-40).

🤖 Generated with Claude Code

Fixes max2 **ISS-14**. ## Probleem De PR_REVIEW van Ops-dashboard#260 bleef opnieuw starten. De codex-worker op max2 faalde elke geclaimde job met `ENOSPC` bij `/tmp/job-<id>/payload.json`. `/tmp` is een tmpfs van 2 GB en zat vol met PR-clones die de agent zelf had gemaakt (`/tmp/pr-review-<job>`: 1,1 GB, `/tmp/pr95-review`: 514 MB, met `node_modules`). Niets ruimde die op. De DB toonde alleen "agent did not complete job within 2 attempts". ## Fix - **`bin/tmp-sweep.sh`:** - wist tussen iteraties alles van de agent-gebruiker direct onder `/tmp`, behalve `tsx-*`, `node-compile-cache` en verborgen entries; - doet eerst `chmod -R u+rwX`: de codex-sandbox laat read-only bomen achter, en root kan ze niet wissen (cap_drop ALL); - schrijft `TMP_PRESSURE` als `/tmp` daarna boven `AGENT_TMP_WARN_PCT` (80) blijft; - faalt nooit. - **`run-agent.sh`:** roept het aan op elke plek waar `log-cleanup.sh` draait (start, overload, na elke iteratie). Er loopt dan geen job. - **`health-server.js`:** `/health` geeft 503 `tmp-low` zolang de marker bestaat. ## Bewijs - `__tests__/tmp-sweep.test.ts`: 5 gevallen, eerst **rood** en daarna groen. De volledige suite geeft 208/208; dezelfde 13 dispatch-suites laden lokaal niet, net als op master. - **Wegwerpcontainer van het live `scrum4me-agent-codex:local`-image** met read-only root, tmpfs `/tmp`, `cap_drop ALL`, `no-new-privileges` en `-u agent`: - een gewone `rm` op de read-only boom faalt (zoals in productie); - `tmp-sweep.sh` wist alles behalve de caches (30% → 0%); - met een ander bestand dat /tmp vult komt `TMP_PRESSURE` op 90. ## Uitrol Image-rebuild en redeploy van de workers op beide hosts: `redeploy_all_workers` op max2, `redeploy_all` of `update_mcp_worker` op 154. Beide ontsleutelen eerst de worker-DB-env, en de worker-recreate op 154 bounce't postgres niet meer (ISS-40). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(worker): ruim /tmp op tussen iteraties en meld een volle /tmp (max2 ISS-14)
All checks were successful
CI / Compose config (pull_request) Successful in 4s
CI / Build-arg coverage (pull_request) Successful in 9s
CI / Docker build (pull_request) Successful in 1m40s
d0e53db546
/tmp is een kleine RAM-tmpfs (agent-codex: 2 GB). De codex-agent kloont er
zelf PR's in (/tmp/pr-review-<job> mét node_modules) en niets ruimde dat op.
Na ~10 uur reviews was /tmp vol en faalde elke job op ENOSPC bij
/tmp/job-<id>/payload.json. De DB toonde dan alleen "agent did not complete
job within 2 attempts" en de job ging telkens opnieuw rond (Ops-dashboard#260,
2026-09-28).

- bin/tmp-sweep.sh:
  - wist tussen iteraties alles van de agent-gebruiker direct onder /tmp,
    behalve tsx-*, node-compile-cache en verborgen entries;
  - doet eerst `chmod -R u+rwX`, omdat de codex-sandbox read-only bomen
    achterlaat en root in de container zonder DAC_OVERRIDE niets kan wissen;
  - schrijft TMP_PRESSURE als /tmp daarna nog boven AGENT_TMP_WARN_PCT
    (default 80) zit;
  - faalt nooit.
- run-agent.sh roept het aan op elke plek waar log-cleanup.sh draait: bij de
  start, na een overload en na elke iteratie.
- health-server.js geeft /health 503 `tmp-low` zolang TMP_PRESSURE bestaat.

Tests: __tests__/tmp-sweep.test.ts, 5 gevallen, eerst rood en daarna groen.
De volledige suite geeft 208/208; dezelfde 13 dispatch-suites laden niet
lokaal, net als op master. Bewezen in een wegwerpcontainer van het live
codex-image met read-only root, tmpfs /tmp, cap_drop ALL,
no-new-privileges en -u agent: een gewone rm faalt, de sweep wist alles
behalve de caches, en de marker komt op 90%.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
janpeter merged commit 01458002bc into master 2026-09-28 12:36:49 +02:00
Sign in to join this conversation.
No reviewers
No labels
severity/s3
No milestone
No project
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
janpeter/scrum4me-docker!90
No description provided.