Skip to content

feat: audit and explicitly clean orphan plugin dependencies (W2-2) - #484

Merged
cdeust merged 11 commits into
mainfrom
fix/green-deps-cleanup
Sep 6, 2026
Merged

cdeust merged 11 commits into
mainfrom
fix/green-deps-cleanup

Conversation

@cdeust

@cdeust cdeust commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Symptôme

W2-2 / F10 : chaque identité de plugin possède son deps, sans commande permettant de contrôler les répertoires devenus inutiles. PR empilée sur #483.

Cause racine

Les registres disponibles ne prouvent pas l'absence d'une identité dans tous les projets, réglages gérés ou sessions vivantes. Les plugins inline/synced peuvent ne pas être enregistrés et la normalisation d'identité est non injective. Une suppression automatique par différence d'ensembles serait injustifiée. Source : Claude Code, référence plugins.

Changement

Le launcher propose --cleanup-deps --dry-run (défaut), puis --apply avec au moins un --plugin-id vérifié explicitement par le propriétaire. Il protège l'identité courante, les installations et les références de settings, même désactivées, dans les projets connus. Registres incomplets/corrompus, scopes inconnus, doublons JSON et identités inline/synced sont refusés. Les dossiers non identifiés restent indéterminés.

L'audit optionnel ne s'exécute qu'au démarrage du serveur mcp_server si CORTEX_CLAUDE_DIR est explicite. Aucun import de nettoyage ni scan de registre dans les hooks ou workers ; les imports de maintenance sont paresseux. Les arguments ordinaires d'un module restent transmis.

Le retrait ne vise que le sous-répertoire deps. Accès par descripteurs, O_NOFOLLOW, refus des liens/fichiers spéciaux et relecture des protections avant chaque retrait ; identité parente et fichiers frères conservés. Python 3.10 permet l'audit mais refuse l'application faute de rmtree(dir_fd), ajouté en 3.11. Sources : Python os, Python shutil.rmtree.

Preuve

Base 7ea80be4cbcbc8c0f54e5e2a2693c811a0a2e4a9. Python 3.13.7, macOS ARM64. 35 tests stdlib passent en 0,639 s : arbres factices avec identités protégées/orphelines/courantes, registres corrompus ou changeants, liens, scopes inconnus, conservation des frères et dispatch avant bootstrap. Deux tests supplémentaires au patch initial vérifient l'absence totale d'import de nettoyage pour les hooks/workers et l'audit unique du serveur explicite.

.venv/bin/python -m unittest tests_py.scripts.test_launcher_cleanup tests_py.scripts.test_launcher_cleanup_registry tests_py.scripts.test_launcher_cleanup_fs tests_py.scripts.test_launcher_cleanup_cli
bash /private/tmp/cortex-green-local-gates.sh w2-2 tests_py/scripts/

Gates locaux terminés code 0 : Ruff/format 1 428 fichiers, craftsmanship, Pyright zéro diagnostic ; scripts 865 passed, 5 skipped, 341 subtests en 12,57 s ; suite complète 7 641 passed, 221 skipped, 341 subtests en 133,71 s. PostgreSQL volontairement indisponible sur socket privé inexistant ; dépendances et SQLite de tests privés. Journal /private/tmp/cortex-green-w2-2-gates.log, charge initiale 4,05 / 10 cœurs, disque 61 GiB avant/après. SHA final 288603fb5758522eddf81f3d6d572b09abf61f55. CI externe 34044760164 terminée verte sur ce SHA.

Les tests ne touchent que des arbres temporaires. Aucun ~/.claude réel inspecté, aucun nettoyage de production. Les 3,3 Go du constat F10 restent à vérifier par le propriétaire ; ce changement ne revendique aucun espace effectivement libéré.

Conformité

Nouveaux modules sous 300 lignes, fonctions sous 40 lignes/quatre paramètres. launcher.main demeure inchangé. Aucune entrée baseline ajoutée. Dépendances et opérations de maintenance limitées à la bibliothèque standard. Un seul travail lourd local à la fois.

Candidats issues

Aucun verrou de registre interprocessus n'est documenté par Claude. L'absence dans les seuls registres connus ne suffit pas : le propriétaire vérifie aussi les autres scopes et arrête les sessions avant --apply. Suppression automatique au démarrage abandonnée pour cette cause démontrée. Aucun ticket créé.

Runbook

Propriétaire uniquement : CORTEX_CLAUDE_DIR=/absolute/claude-root CLAUDE_PLUGIN_DATA=/absolute/claude-root/plugins/data/current-identity python3.11 scripts/launcher.py --cleanup-deps --dry-run --plugin-id old@marketplace ; vérifier les candidats et autres scopes, arrêter les sessions concernées, puis remplacer --dry-run par --apply. La suppression conserve le dossier d'identité et ses autres fichiers. Aucun passage effectué pendant cette tâche.

@cdeust
cdeust changed the base branch from perf/green-hook-matchers to main September 6, 2026 21:52
@cdeust
cdeust merged commit 9d0dfb8 into main Sep 6, 2026
29 checks passed
@cdeust
cdeust deleted the fix/green-deps-cleanup branch September 8, 2026 16:01
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