SYSTÈME / Le Corps

Anatomie de Shyrka

Shyrka est le vaisseau-mère : une pieuvre, un corps distribué. Ses organes ne sont pas inventés — ils existent, éparpillés. Les voici rassemblés. Ce qui est bâti se tient en plein ; ce qui reste à bâtir demeure transparent.

Bâti À la main

Index des garde-fous

Les fiches ci-dessus montrent les garde-fous d’un organe à la fois. Cet index répond à l’autre question : ce script-là, il empêche quoi, et sur quel geste ? Un garde-fou par ligne, classé par nom de fichier.

51 règles · 51 scripts · 47 refusent, les autres préviennent

Garde-fous du harness : fichier, déclencheur, et ce que chacun empêche.
FichierDéclencheurCe qu’il empêche
bin/sync-schema.shUserPromptSubmit*

Avant de raisonner sur des données, l'assistant relit la structure réelle des bases — et sait laquelle il regarde. Deux bases différentes portent des tables de même nom : un diagnostic conduit sur la mauvaise conclut avec assurance et se trompe entièrement. Le nom d'une table est un homonyme, jamais une preuve d'identité.

refuse · Les Yeux · 4 incidents

scripts/check-db-mutation.shPreToolUseBash

Quand une donnée est lue à la fois par la base et par le code, on modifie le code d'abord, la donnée ensuite. L'ordre inverse produit un état que rien ne sait plus lire, et qui ne se voit qu'à l'affichage — c'est-à-dire chez le visiteur.

refuse · Le Système immunitaire

scripts/hook-attachment-read-gate.shPreToolUseBash · Read

Aucune pièce jointe reçue par courriel n'est ouverte avant d'avoir été analysée. L'analyse antivirus est un préalable bloquant, pas une précaution facultative : lire d'abord et vérifier ensuite n'a plus aucun intérêt.

refuse · La Sécurité · 2 incidents

scripts/hook-autonomie-nuit-invariants.shPreToolUseBash

Le travail de nuit tourne sur de la capacité déjà payée, jamais à la consommation — et il s'arrête avant le matin. Basculer sur une facturation à l'usage ne se verrait pas : les nuits se dérouleraient normalement, la facture arriverait en fin de mois. Et une nuit qui déborde mange les premières heures du lendemain, qui sont les plus productives.

refuse · Le Métabolisme · 3 incidents

scripts/hook-client-comm-no-call.shPreToolUseBash

Un message client ne propose pas d'appel téléphonique. L'écrit laisse une trace que les deux parties peuvent relire, et n'impose pas à quelqu'un de se rendre disponible pour comprendre où en est son projet. Le canal reste écrit, y compris quand le sujet est délicat — surtout quand il l'est.

refuse · La Voix

scripts/hook-client-content-write-requires-approval.pyPreToolUseBash

Écrire dans le catalogue d'un client suppose un accord humain enregistré, posé après avoir vu un échantillon. Le contenu éditorial est un cas à part : il n'a ni revue de code, ni test capable de dire qu'une formulation est la bonne. Le seul juge possible est humain — son accord doit donc être une donnée vérifiable, pas une phrase dans une lettre de mission.

refuse · La Voix · 1 incident

scripts/hook-client-email-no-self-blame.shPreToolUseBash

On corrige avant de dire. Un message qui annonce un problème encore ouvert en s'en attribuant la faute apprend au client qu'on lui a cassé quelque chose, qu'on le sait, et qu'on verra plus tard — trois mauvaises nouvelles pour une. S'excuser d'avance ne rassure personne : ce qui rassure, c'est la chose réparée.

refuse · La Voix

scripts/hook-deploy-builds-from-head.shPreToolUseBash

Ce qui part en ligne est construit à partir de l'état enregistré, jamais des fichiers en cours d'édition. Plusieurs sessions travaillent sur la même machine : partir du disque embarquerait le travail inachevé d'une autre — et le détruirait au passage. L'état enregistré est le seul qui soit relisible et réversible.

refuse · La Circulation · 1 incident

scripts/hook-docker-exec-php-www-data.shPreToolUseBash

Vider le cache d'un site en tant qu'administrateur laisse intacts les fichiers appartenant au serveur web. La suppression échoue en silence, et le site continue de servir l'ancienne version — au point qu'une relecture automatique jugeait une page déjà corrigée. Quatre occurrences de la même classe d'erreur avant que ce hook existe.

refuse · Le Système immunitaire · 2 incidents

scripts/hook-docker-inspect-secret-leak.shPreToolUseBash

La configuration d'un conteneur peut porter un mot de passe : il est passé en argument de démarrage, pas seulement dans les variables d'environnement. En afficher la configuration pour diagnostiquer une panne suffit donc à publier ce mot de passe dans l'historique. La sortie doit être filtrée ou capturée, jamais imprimée telle quelle.

refuse · La Sécurité

scripts/hook-docker-rm-volume.shPreToolUseBash

Supprimer un conteneur sans supprimer son volume laisse les données derrière lui. Le conteneur suivant repart alors sur un état ancien que personne n'a choisi, et le disque se remplit de volumes orphelins que plus rien ne nomme.

refuse · Le Squelette · 2 incidents

scripts/hook-doctrine-requires-hook.shPostToolUseWrite|Bash

Écrire une règle oblige à écrire, dans le même geste, le mécanisme qui la fait respecter. Une doctrine sans mécanisme est un vœu : elle tient quelques semaines, puis cède un soir de fatigue, et personne ne s'en aperçoit. Quand la règle relève du jugement humain et ne peut pas être mécanisée, cela se dit explicitement plutôt que de se remettre à plus tard.

refuse · La Boucle de conscience · 2 incidents

scripts/hook-email-draft-via-facade.shPreToolUseAskUserQuestion

Un message client se prépare par le canal prévu, qui envoie automatiquement une copie de relecture. L'assistant ne demande pas dans la conversation « je te le montre ? » : cette question déplace la revue dans un fil qu'on lit vite, alors que la copie, elle, arrive là où on lit vraiment. Le brouillon est le geste ; la relecture n'est pas une politesse.

refuse · La Voix

scripts/hook-getrow-limit-prestashop.shPostToolUseEdit|Write|MultiEdit|NotebookEdit

Certaines fonctions de lecture ajoutent déjà une limite à la requête ; en écrire une seconde produit une erreur que la base ne signale presque pas. Le motif est fréquent et la conséquence discrète — c'est exactement le genre de défaut qui traverse une relecture sans être vu, et que seule une machine attrape.

refuse · Le Système immunitaire · 1 incident

scripts/hook-git-add-all-block.shPreToolUseBash

Plusieurs sessions de travail partagent le même dépôt. Enregistrer « tout ce qui a changé » emporterait le travail en cours d'une session voisine dans un commit qui ne le concerne pas. Chaque enregistrement nomme donc explicitement les fichiers qu'il embarque.

refuse · Le Système nerveux · 1 incident

scripts/hook-git-destructive-worktree-gate.shPreToolUseBash

Supprimer un espace de travail dont les commits n'ont pas encore rejoint la branche commune fait disparaître ce travail sans bruit. Ce garde-fou exige la preuve que rien ne sera perdu avant d'autoriser la suppression.

refuse · Le Système nerveux · 3 incidents

scripts/hook-git-track-artifact-block.shPreToolUseBash

Un fichier régénéré automatiquement n'est pas versionné. Suivi comme du travail humain, il se re-signale modifié à chaque exécution, et bloque la fin de séance de toutes les autres sessions — qui n'y sont pour rien. Régénérable et sans contenu propre : cela s'ignore, cela ne s'archive pas.

refuse · Le Squelette

scripts/hook-ia-applies-migrations-not-alex.shStop*

Les opérations techniques — migrations de base, commandes d'infrastructure — sont exécutées par l'assistant, pas déléguées à l'humain sous couvert de relecture. Renvoyer une commande à taper déplace le risque sans le réduire, et transforme une revue en exécution à l'aveugle. Le seul geste réservé reste la mise en ligne chez un client.

refuse · La Circulation · 2 incidents

scripts/hook-inline-secret-paste-block.shPreToolUseBash

Un mot de passe ou une clé d'API collé en clair dans une commande ne franchit pas cette ligne. Le secret vit dans un fichier d'environnement jamais versionné ; on le désigne par son nom de variable, jamais par sa valeur. Huit incidents distincts ont nourri cette règle — c'est le garde-fou le plus rappelé du système.

refuse · La Sécurité · 8 incidents

scripts/hook-live-emitter-dry-run-first.shPreToolUseBash

« Lancer pour voir » un outil qui envoie des messages, c'est envoyer. Sur une file alimentée en continu, tout état qu'on vient de lire est déjà périmé : la file constatée vide il y a trois minutes ne dit rien de maintenant. Vérifier qu'un automate est bien branché se fait à blanc ; le mode réel n'est pas un test, c'est l'action.

refuse · Le Système immunitaire · 1 incident

scripts/hook-llm-via-claude-p.shPreToolUseEdit|Write

Un automate interne qui a besoin d'un modèle de langage passe par la voie commune, sur de la capacité déjà payée. Nommer un fournisseur en dur le fait sortir de ce cadre et le rend dépendant d'une clé : le jour où elle manque, les appels échouent tous, un repli silencieux écrit des verdicts de complaisance en base, et la suite du système les prend pour argent comptant.

refuse · Le Métabolisme · 2 incidents

scripts/hook-loi-de-conservation.shPreToolUse · Stop* · Edit|Write

Certains textes sont relus par l'assistant à chaque appel : instructions permanentes, index de mémoire, descriptions des savoir-faire. Leur croissance se paie mille fois par jour. Chaque registre a donc un plafond, et ajouter suppose de retirer — ce qui oblige à choisir ce qui mérite vraiment d'être toujours présent.

refuse · Le Cerveau-Mémoire

scripts/hook-merge-head-orphelin-jamais-conclure.shPreToolUseBash

Une fusion de travaux qui n'apporte aucune ligne ne se conclut pas. Elle produirait un enregistrement affirmant qu'un travail a été intégré, alors qu'il ne l'est pas — et les fusions suivantes, le croyant déjà fait, ne le rejoueraient jamais. Le travail disparaît, et l'historique jure du contraire.

refuse · Le Système nerveux · 2 incidents

scripts/hook-mergeback-verify-by-sha.shPreToolUseBash

Vérifier qu'un travail a bien rejoint la branche commune se fait en citant son identifiant, pas en comparant la branche à elle-même. La seconde formulation répond toujours oui — elle a l'air d'une vérification et n'en est pas une. Une preuve qui ne peut pas échouer ne prouve rien.

refuse · Le Système nerveux

scripts/hook-no-drift-outside-chantier-perimeter.pyPreToolUseEdit|Write

Quand une session s'éloigne du périmètre qu'elle s'était donné, elle est prévenue — et on lui indique la commande exacte pour poursuivre ailleurs. Elle n'est pas arrêtée : la dérive n'est pas une faute, c'est une bifurcation, et le sujet est souvent bon, simplement au mauvais endroit. Un avertissement sans porte de sortie se contourne ; un avertissement qui donne la sortie se suit.

prévient · Le Système nerveux · 4 incidents

scripts/hook-no-llm-in-market-decision.shPreToolUseEdit|Write

Un modèle de langage n'est pas le bon organe pour décider d'un marché financier. Non par manque de qualité : il répond en secondes là où la décision se joue en millisecondes, il lit une information déjà intégrée aux prix, et il produit une justification convaincante pour n'importe quelle décision — y compris un tirage au sort. C'est de la conviction sans information, et elle n'est pas falsifiable.

refuse · La Délibération

scripts/hook-no-process-env-in-client-composables.shPreToolUseEdit|Write|MultiEdit|NotebookEdit

Les variables d'environnement du serveur ne franchissent pas la frontière du navigateur. Un fichier partagé entre le serveur et le client qui les lit directement casse la page une fois chargée — et surtout, il expose côté visiteur des valeurs qui n'avaient aucune raison d'y être. Ce qui doit être public se déclare explicitement comme tel.

refuse · La Sécurité · 1 incident

scripts/hook-no-rebase-on-shared-branch.shPreToolUseBash

Réécrire l'histoire d'une branche que d'autres utilisent déjà casse leur copie sans les prévenir. Sur une branche partagée, on ajoute — on ne réécrit pas.

refuse · Le Système nerveux

scripts/hook-no-source-envhost.shPreToolUseBash

Charger un fichier de secrets dans un terminal en fait fuir des morceaux. Le shell interprète chaque ligne : une valeur contenant un caractère spécial est lue comme une commande, échoue, et le message d'erreur affiche le fragment. Rien ici n'a l'air d'une impression de secret — c'est ce qui rend le réflexe si difficile à voir.

refuse · La Sécurité · 1 incident

scripts/hook-no-url-removal-without-301.shPreToolUseBash

Aucune adresse publique ne disparaît sans redirection. Une page retirée sans renvoi devient une erreur pour les visiteurs et pour les moteurs ; l'outil qui l'a retirée, lui, signale une réussite, et la perte n'apparaît que des semaines plus tard dans les statistiques. Le contrôle a donc lieu avant l'exécution, pas dans un rapport après coup.

refuse · La Peau · 1 incident

scripts/hook-note-state-claim-unverified.shPreToolUseBash

Une note est une photo datée, jamais un état. Toute affirmation sur ce qui EST se revérifie à la source vivante avant d'être répétée, et cite d'où elle vient — sinon c'est un ouï-dire que le lecteur suivant recopiera à son tour, avec l'assurance que donne l'écrit. Trois affirmations fausses dans une même séance ont suffi à établir la règle : toutes venaient d'une note exacte le jour où elle a été prise.

prévient · La Boucle de conscience · 3 incidents

scripts/hook-pre-commit-transcript-scan.shPreToolUseBash

Avant d'enregistrer un travail, l'historique de la séance est relu à la recherche des erreurs qui viennent de se produire — celles qui se retapent. Une erreur qu'on ne nomme pas revient : elle a déjà tout ce qu'il faut pour cela, sauf le souvenir. Le rappel ne bloque qu'une fois : la deuxième tentative passe, parce qu'un garde-fou qu'on ne peut jamais dépasser finit par être désactivé.

refuse · La Sécurité · 1 incident

scripts/hook-psql-column-separator-block.shPreToolUseEdit|Write

Lire plusieurs colonnes d'une base en insérant son propre séparateur ne fonctionne pas : l'outil en insère déjà un, et ce caractère devient du contenu. Une sentinelle de référencement a ainsi mesuré un caractère de trop sur chaque titre, signalé comme trop longs des titres corrects, puis réécrit en boucle du bon contenu — et le rapport « tout est conforme » a été rédigé en lisant l'instrument faussé.

refuse · Le Système immunitaire · 2 incidents

scripts/hook-psql-write-requires-on-error-stop.shPreToolUseBash

Une écriture en base doit s'arrêter à la première erreur. Sans cette option, le client SQL sort en « succès » même quand la transaction a été annulée ou qu'aucune ligne n'a été modifiée : le code de retour ne prouve rien, et seule la relecture du contenu prouve quelque chose. Une fiche produit a perdu sa traduction ainsi, sans la moindre alarme.

refuse · Le Système immunitaire

scripts/hook-secret-file-print-block.shPreToolUseBash

Le contenu d'un fichier de secrets ne s'affiche jamais à l'écran. Chercher une variable dans un tel fichier en imprime aussi la valeur : le geste paraît anodin, et la clé se retrouve dans l'historique de la session, qui est archivé. On peut en compter les lignes ou en lister les noms ; jamais en lire les valeurs.

refuse · La Sécurité · 1 incident

scripts/hook-ship-block.shPreToolUseBash

Mettre un site client en ligne reste un geste humain. L'assistant peut préparer, tester et déployer les environnements internes, mais la publication vers la production d'un client demande une décision explicite. La règle est portée par la flotte elle-même : chaque site déclare s'il accepte une publication automatique, et le défaut est non.

refuse · Le Système immunitaire · 3 incidents

scripts/hook-sitemap-index-must-be-followed.shPreToolUseEdit|Write

Un plan de site qui renvoie vers d'autres plans de site se suit jusqu'au bout. Une vigie qui s'arrêtait au premier niveau ne testait qu'une petite fraction des pages et annonçait sereinement zéro erreur chaque matin — pendant que des centaines d'adresses référencées menaient au vide. Un contrôle partiel qui ne dit pas qu'il est partiel se lit comme un contrôle complet.

refuse · Les Yeux

scripts/hook-sql-escape-roundtrip.shPreToolUseEdit|Write

Doubler un antislash avant de l'écrire en base est un réflexe hérité d'un autre moteur de base de données. Sur PostgreSQL il n'échappe rien : il AJOUTE un caractère. Le texte part correct et revient corrompu, sans erreur nulle part — les colonnes étant libres, rien ne le signale. Ce hook garde la reprise de ce réflexe.

refuse · Le Système immunitaire · 1 incident

scripts/hook-sql-interpolation-block.pyPreToolUseEdit|Write

Insérer une valeur directement dans le texte d'une requête SQL est une porte ouverte, même quand la valeur paraît sûre. Un plafond mesurait déjà cette dette, mais il ne faisait que la constater : elle remontait d'une vingtaine de cas par jour. Ce hook refuse toute modification qui en ajoute — la voie propre étant de lier les valeurs, ce qui rend la question sans objet.

refuse · Le Système immunitaire

scripts/hook-sql-quoted-default.shPreToolUseEdit|Write

Une valeur par défaut ne doit pas contenir ses propres guillemets. Sinon la base enregistre les guillemets comme faisant partie de la valeur, et chaque colonne existe désormais en deux populations qui ne se répondent plus : toute recherche en rate une moitié. Rien ne proteste — la base accepte, le type est correct, et la scission est invisible jusqu'au jour où un décompte tombe faux.

refuse · Le Système immunitaire · 2 incidents

scripts/hook-ssh-key-test-isolation.shPreToolUseBash

Tester qu'une clé d'accès est bien refusée exige d'isoler cette clé. Sinon le système en propose une autre à sa place, l'authentification réussit, et le test conclut que tout va bien — alors qu'il vient de valider une clé qu'on ne lui avait pas demandé d'essayer. Un test négatif qui répond oui est pire que pas de test.

refuse · La Sécurité · 1 incident

scripts/hook-stop-cicatrice.shStop*

À la fermeture d'une séance, les corrections de la journée sont relues pour décider lesquelles méritent d'être gravées. Toutes ne le méritent pas : une coquille n'apprend rien. Ce qui mérite d'être retenu, c'est ce qui a déjà été commis une fois — sans ce geste, la leçon reste dans l'historique, où personne ne la relit.

refuse · Le Cerveau-Mémoire · 1 incident

scripts/hook-stop-uncommitted-warn.shStop*

Rien d'achevé ne reste non enregistré à la fin d'une session. Du travail qui n'existe que dans les fichiers de la machine n'est ni relisible, ni réversible, ni transmissible : il sera écrasé par le prochain qui passe. Le filtre ne retient que ce que la session en cours a réellement modifié, pour ne pas bloquer sur le chantier d'un autre.

refuse · Le Système nerveux · 2 incidents

scripts/hook-tache-fail-verifie-livrable.shPreToolUseBash

Avant de déclarer un travail raté, on lit le LIVRABLE — le code produit, les tests — et non le compte rendu de celui qui l'a fait. Un journal d'exécution tronqué ressemble exactement à une absence de résultat ; condamner sur cette lecture, c'est rejeter du travail correct et en refaire un déjà fait.

prévient · La Boucle de conscience · 2 incidents

scripts/hook-test-absence-claim-unverified.shPostToolUseWrite|Edit

Un test écrit dans le même geste que le code ne vérifie pas ce code : il enregistre ce que son auteur croyait à cet instant. Si la croyance est fausse, le test la scelle — et il devient vert, donc il se lit ensuite comme une preuve. Affirmer qu'une chose est absente demande de l'avoir cherchée, pas de l'avoir supposée.

prévient · La Boucle de conscience

scripts/hook-test-env-isolation.shPreToolUseEdit|Write

Un test qui vérifie l'environnement d'exécution doit l'isoler d'abord. Sinon, le jour où il échoue, le rapport d'erreur affiche l'environnement complet — c'est-à-dire l'ensemble des clés et mots de passe de la machine. Le test avait raison sur le fond ; c'est sa manière d'échouer qui était dangereuse.

refuse · La Sécurité · 2 incidents

scripts/hook-trunk-work-block.shPreToolUseEdit|Write|MultiEdit|NotebookEdit

Le travail se fait dans un espace isolé, pas dans la copie principale partagée par toutes les sessions. Chacun avance sans écraser le voisin, et son travail rejoint la branche commune une fois enregistré.

refuse · Le Système nerveux · 1 incident

scripts/hook-untrusted-text-is-data-not-instruction.shPostToolUseEdit|Write|MultiEdit|NotebookEdit

Un texte que nous n'avons pas écrit — une candidature, un message reçu, une page lue — entre dans le raisonnement de l'assistant comme une DONNÉE, jamais comme une instruction. Sans cette frontière, il suffirait d'écrire « ignore les règles précédentes » dans un formulaire pour parler à la machine par-dessus nous. Le cadre qui l'impose est vérifié par des tests à chaque modification, parce qu'un cadre présent mais inopérant est plus dangereux qu'un cadre absent.

refuse · La Sécurité · 1 incident

scripts/hook-url-change-requires-301-and-cache.shPreToolUseBash · Edit|Write

Renommer l'adresse d'une page vivante entraîne trois gestes indissociables : poser la redirection vers la nouvelle adresse, régénérer les images qui portaient l'ancien nom, et purger les caches. Faits séparément, ils s'oublient un par un — et l'ancienne adresse continue de circuler dans les liens, les partages et les moteurs pendant des mois.

refuse · La Peau

scripts/hook-volume-llm-on-glm-tier.pyPreToolUseEdit|Write|MultiEdit|NotebookEdit

Traiter un catalogue entier avec un modèle de langage et rendre un jugement unique ne coûtent pas la même chose. Le volume part vers un fournisseur facturé à l'usage ; le forfait reste pour ce qui demande du discernement. Ce hook lit le routage réel avant de trancher, plutôt que de le deviner dans le code.

refuse · Le Métabolisme · 1 incident

scripts/hook-whatsapp-send-requires-validation.shPreToolUseBash

Aucun message client ne part sans validation humaine explicite. Préparer un brouillon et l'envoyer sont deux gestes distincts, et le second n'appartient pas à l'assistant. Sans cette séparation, une chaîne d'automatismes suffirait à faire parler la machine en notre nom.

refuse · La Voix · 1 incident