Cordon — enveloppes de changement déterministes
Cordon est une couche d'acceptation post-exécution pour les modifications d'agents de codage. Il prend un instantané du HEAD Git actuel, enregistre une politique explicite de chemin relatif au dépôt et de taille, puis n'accepte le résultat que si les modifications visibles par Git restent dans cette politique et que chaque vérificateur indépendant se termine avec un code de sortie zéro.
Utilisez Cordon lorsque "l'agent ne doit toucher que X" doit être vérifié par du code plutôt que mémorisé par l'agent. N'appelez pas Cordon un bac à sable : les fichiers ignorés sont en dehors de son modèle de preuve v1, et un processus avec un accès non restreint au système de fichiers peut altérer l'état de Cordon lui-même.
Choisissez un mode
Neutre vis-à-vis du fournisseur : armer, exécuter n'importe quel agent, vérifier
cordon arm "mettre à jour uniquement l'analyseur" \
--allow "src/parser/**" \
--allow "tests/parser/**" \
--deny "src/parser/generated/**" \
--max-files 8 \
--max-added-lines 400 \
--max-deleted-lines 200 \
--verify "python3 -m unittest discover -s tests"
# Exécutez vous-même l'agent de codage.
cordon check
Ce mode n'invoque jamais de service d'IA.
Wrapper Claude Code
cordon run "Corriger la régression de l'analyseur sans modifier les fichiers générés." \
--allow "src/parser/**" \
--allow "tests/parser/**" \
--deny "src/parser/generated/**" \
--verify "python3 -m unittest discover -s tests" \
--max-files 8 \
--max-added-lines 400 \
--max-deleted-lines 200 \
--max-turns 20 \
--max-budget-usd 2
Cordon lance un nouveau processus claude -p avec sortie JSON, persistance de session désactivée et mode de permission acceptEdits. Une exécution échouée/interrompue peut être reprise avec un nouveau processus en utilisant cordon resume, mais uniquement si les modifications partielles visibles par Git satisfont toujours l'enveloppe armée et que le plafond de tentatives n'a pas été atteint.
Lire le résultat
| Sortie | Signification |
|---|---|
0 | audit accepté |
2 | Cordon a refusé l'opération ou l'état/la politique est invalide |
3 | le processus agent s'est terminé, mais la politique Git ou un vérificateur a rejeté le résultat |
4 | le processus Claude encapsulé a échoué, expiré ou dépassé la limite de sortie capturée |
cordon status signale la phase actuelle et le dernier audit. cordon reset supprime uniquement .cordon/ ; il ne restaure, ne supprime ni ne valide les fichiers du dépôt.
Règles de la politique
- Au moins un motif
--allowest obligatoire. --denyl'emporte toujours sur--allow.- Les motifs sont des globs Cordon relatifs au dépôt :
*ne traverse pas/,**le fait, et?correspond à un caractère autre que/. - Cordon rejette les motifs de type absolu (
/x,./x), les octets NUL et les segments de chemin explicites./... - Le déplacement de HEAD est rejeté par défaut. Utilisez
--allow-commitsuniquement lorsque les commits font intentionnellement partie de la tâche. - Les budgets sont inclusifs : la limite exacte est acceptée ; un au-dessus est rejeté.
- Les vérificateurs sont analysés avec
shlex.splitet exécutés directement, pas via un shell. Les opérateurs shell tels que&&, les pipes et les redirections ne sont donc pas interprétés.
État et récupération
Cordon stocke l'état dans .cordon/ et enregistre /.cordon/ dans .git/info/exclude. Il ne modifie jamais .gitignore.
Cordon refuse également d'armer tant qu'un fichier suivi porte le drapeau d'index assume-unchanged ou skip-worktree, car un tel fichier ne peut pas être audité. Effacez le drapeau avec git update-index --no-assume-unchanged <chemin> au lieu de contourner le problème.
Les écritures dans l'état sémantique de Cordon sont temp-fichier + fsync + os.replace. Un inode de synchronisation de longueur nulle résolu via les métadonnées Git (cordon.lock) est maintenu avec un verrou consultatif du système d'exploitation ; il ne fait pas partie de l'état .cordon/ et n'est jamais substitué lorsqu'il est verrouillé. Le verrou empêche deux opérations Cordon de posséder le même état de dépôt simultanément, y compris l'armement/configuration ainsi qu'une tentative d'agent encapsulé. Une tentative Claude est marquée running avant le démarrage de l'enfant ; l'interruption par clavier est persistée en tant que interrupted ; les erreurs du moteur sont persistées et peuvent être reprises.
Ce que Cordon prouve — et ce qu'il ne prouve pas
Cordon peut prouver, pour la base armée et l'implémentation Git contre lesquelles il s'exécute, que les modifications visibles par Git des fichiers suivis et des fichiers non suivis non ignorés observés au moment de l'audit respectent sa politique et que les processus vérificateurs configurés se sont terminés avec un code de sortie zéro.
Il ne prouve pas :
- que les fichiers ignorés n'ont pas été touchés ;
- que le dépôt est sûr contre un processus malveillant capable de réécrire l'état ;
- qu'un vérificateur est logiquement correct ;
- que les permissions/hooks dans un environnement d'exécution d'agent ne peuvent pas être contournées ;
- que le code est sécurisé simplement parce que le diff est petit.
Revoyez le diff après acceptation. Cordon est une porte déterministe, pas un remplacement pour la révision de code ou le sandboxing au niveau du système d'exploitation.
Implémentation complète et détails des limites : README.md. Preuve source : RESEARCH.md. Tests reproductibles et limites connues : TEST_REPORT.md.