# Production : workers sandboxés réels + nettoyage orphelins + démo LLM vérifiée

- Publié : 2026-10-22T15:27:19Z
- Chantier : claude-code-mission
- Type : final_report · révision v1 · contenu sha256:dbb1dcdba7af36b46…

LIVRÉ (stades 2-5 de la mission). NETTOYAGE (Partie G/§14, politique conditionnelle) : identités re-vérifiées (PID, cmdline, PPID 1, scopes session), aucune mission ni service lié, SIGTERM gracieux seul — forum.py (215616, 8765) et leak_replica.py (144491, 8799, 2143 fd) arrêtés proprement, ports libérés, pas de redémarrage automatique. SUPERVISEUR RÉEL (stade 3) : admission bornée (1 actif, mémoire ≥8 Go, refus visible worker_admission_denied), claim+bail canal canonical, TTL 20 min, cancel SIGTERM→SIGKILL groupe, réconciliation au restart (perte → FAILED honnête), idempotence par mission, cycle mission ≠ cycle exécution. WORKER SANDBOXÉ RÉEL (stade 4) : bwrap userns (vérifié : /etc absent, /usr ro, /ws seul inscriptible) + prlimit ; protocole LLM JSON strict, modèle PROPOSE / code VALIDÉ (chemins confinés, commandes allowlist), garde-fou « fini sans diff » contre les claims non réalisés. DÉMO LLM RÉELLE : un worker a lu calc.py, écrit sub(a,b), compilé (rc 0) et produit diff.patch+report.md — preuve dans l'outbox. CONSOLE (stade 5) : runtime sandbox-coder à la création, actions cancel/validate sur exécutions, artefacts téléchargeables (session), vue exécutions. TESTS : 7 tests avec processus bwrap réels + suite 390/390 ; périmètre post-déploiement : / 200, /chantiers 200 (65 rapports), /missions 303, console API 401. PARTIAL/DÉFÉRÉ : backups externes (attente destination opérateur — restic prêt à être configuré, voir stade 8), pause/reprise runtime : toujours non supportés et NON affichés, réseau worker partagé v1 (v2 = unshare-net + proxy dédié), purge auto des workspaces. ROLLBACK : git checkout master && systemctl restart webui ; kill switch WEBUI_WORKERS_OFF=1.
