ulk
dixdix de coupeEtalonneusedu contexte écritCoupes

Etalonneuse

étalonneuse du contexte écrit

audit du contexte écrit

Audite la vérité et la valeur du contexte écrit — CLAUDE.md / AGENTS.md, règles, docs chargées, skills, agents, hooks — en confrontant chaque affirmation au dépôt réel, rend un verdict par fichier (KEEP / UPDATE / MERGE / MOVE / DELETE) et, en mode optimize, applique les correctifs fichier par fichier sur confirmation. Utiliser pour « audit mémoire » / « contexte périmé » / « alléger CLAUDE.md » / « audit skills » / « optimise les agents ». Pas pour la structure documentaire (raccommodeuse) ni le contexte de session (eclusiere).

On lui ditaudit mémoire

Où elle intervient — 4 parcours

Fichier de Etalonneuse

ulk/plugins/ulk/skills/etalonneuse/SKILL.md

Etalonneuse — 340 lignes, telles qu'elles sont dans ulk.

En-tête — première ligne de chaque sortie, seule : Dix de Coupe — etalonneuse

Voix — avant la première sortie, lire ${CLAUDE_PLUGIN_ROOT}/ressources/voix.md.

Racine — ${CLAUDE_PLUGIN_ROOT} est le dossier du plugin ulk ; dans tout fichier lu ensuite, ${CLAUDE_PLUGIN_ROOT} désigne ce même dossier.

etalonneuse — Audit de vérité du contexte

Un corpus de contexte finit consulté par tous et revérifié par personne : celui qui l’a écrit n’est plus là pour dire ce qui a changé depuis.

Cet agent est la vérification manquante. Le dépôt fait foi ; le fichier de contexte n’est qu’une prétention sur ce dépôt, et une prétention se confronte.

Symptômes déclencheurs : l’agent suit mal les règles, cite des commandes qui n’existent pas, répète de vieilles erreurs, ou le fichier de contexte a doublé sans que personne ne se souvienne pourquoi.

Deux modes, le premier par défaut :

Mode Écrit ? Sortie
audit non rapport de verdicts justifiés + correctifs prêts à appliquer
optimize [chemin] oui, un fichier à la fois, sur confirmation du diff mêmes verdicts, puis application lot par lot (Phase 6)

Dans les deux cas, l’application d’un correctif est une décision humaine prise sur diff. Le mode optimize économise seulement l’aller-retour copier-coller.


Ce que etalonneuse n’est pas

La confusion coûterait cher, parce que quatre agents touchent au contexte sans le même angle — voir ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/context-truth-protocol.md § Délimitation.

Question Agent Ne pas confondre
Ce fichier existe-t-il, ce lien pointe-t-il quelque part ? raccommodeuse structure, format, liens morts
Ce fichier dit-il vrai, mérite-t-il sa place ? etalonneuse vérité et valeur du contenu
Cette carte est-elle implémentée conformément à sa spec ? peseuse conformité par carte, dans la boucle de build
La session en cours dérive-t-elle ? eclusiere %, 5 règles d’hygiène, runtime
Ce learning mérite-t-il d’entrer en mémoire longue ? archiviste vault de connaissance

Un audit etalonneuse commence par lancer raccommodeuse. Détecter les liens morts est déjà son travail : le refaire ici serait de la duplication, et etalonneuse perdrait son temps sur du mécanique au lieu du jugement.


Inventaire obligatoire avant le verdict

  1. Lancer python3 ${CLAUDE_PLUGIN_ROOT}/ressources/outils/inventory_project_markdown.py --root . --format json.
  2. Lancer node ${CLAUDE_PLUGIN_ROOT}/ressources/outils/audit-skills.cjs --format markdown ; citer la plage, les erreurs de scan et distinguer appels natifs de simples lectures de manifeste.
  3. Produire une revue pour chaque fichier éligible, selon le barème de ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/context-truth-protocol.md, avec hash, score, vérité, preuve et raison.
  4. Vérifier --reviews REVIEWS.json --require-reviewed. Refuser de conclure si visited != eligible, si une erreur subsiste, ou si une revue manque.

Phase 0 — Périmètre et prérequis

Ligne d’état — chaque sortie s’ouvre par Étape n/N — <fait> · suivant : <geste> (base-rules § Pacing).

Structure d’abord : raccommodeuse répond « ça existe ? » avant qu’etalonneuse réponde « c’est vrai ? ». Invoquer la skill ulk:raccommodeuse (outil Skill) et garder sa sortie.

Cette sortie est le fait d’entrée. Etalonneuse ne recompte pas ce qu’elle a déjà compté — elle part de ses constats pour juger. Les références mortes viennent du rapport de raccommodeuse ; la Phase 2 ne vérifie que ce qu’elle ne couvre pas (commandes, versions, symboles).


Phase 1 — Inventaire

Lister les candidats sans les lire encore. Lire tout le corpus avant de savoir ce qu’on cherche est le meilleur moyen de saturer le contexte de l’auditeur. La liste vient du script d’inventaire (§ Inventaire obligatoire avant le verdict).

Corpus prioritaire, par ordre de coût : ce qui est chargé à chaque session d’abord.

Rang Cible Pourquoi en premier
1 CLAUDE.md, AGENTS.md lu par toutes les sessions — chaque ligne est une taxe permanente
2 .claude/rules/**, .agents/rules/** chargé par chemin, souvent sans que personne ne le sache
3 protocoles hérités versionnés dans le dépôt audité masse cumulée invisible ligne à ligne
4 skills (~/.claude/skills/, .claude/skills/) descriptions en contexte permanent
5 agents (.claude/agents/*.md, plugins/ulk/skills/** sur ulk) descriptions listées à chaque session, corps chargé à l’appel
6 hooks (settings.json → hooks, scripts appelés) tournent à chaque prompt ou démarrage, sortie injectée dans le contexte
7 docs/**, plans/, output/, tasks/, archive/ coût à la consultation, mais gisement de distracteurs

La date du dernier commit est un signal, pas un verdict : un fichier ancien peut être encore juste, un fichier récent peut mentir depuis sa première ligne.

Si l’inventaire dépasse ~40 fichiers, déléguer la lecture par lots à des sous-agents (outil Agent) et ne remonter que les affirmations extraites — le contexte de l’auditeur ne doit pas devenir le problème qu’il audite.


Phase 2 — Extraire les affirmations vérifiables

Pour chaque fichier, n’extraire que ce qui peut être confronté au dépôt. C’est la différence entre un audit et une opinion.

Type d’affirmation Confrontation Code
commande, script, cible make, recette just package.json § scripts, Makefile, justfile, Taskfile AG001
chemin, dossier existence sur disque AG002
package, version lockfile (package-lock.json, go.sum, uv.lock…) AG003
composant, fonction, route, table, variable d’env recherche dans le source AG006
framework, outil mentionné présence dans les dépendances AG006

Vérifier réellement, une par une. Une affirmation citée dans un rapport sans avoir été exécutée est exactement le défaut qu’on traque.

Savoir contre quoi confronter suppose d’avoir identifié la stack : ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/stack-detection.md donne les fichiers d’autorité par écosystème — package.json et son lockfile en Node, go.mod / go.sum en Go, pyproject.toml / uv.lock en Python, Package.swift en Swift. Sans cette étape, AG001 et AG003 cherchent une commande Node dans un dépôt Go et concluent à tort qu’elle est morte.

Deux garde-fous contre le faux positif, qui décrédibilise un audit plus sûrement qu’un oubli :

  • un chemin dans un exemple illustratif, un placeholder (YYYY-MM-DD, <slug>, **), une commande valable sur une autre plateforme : ce ne sont pas des écarts ;
  • un symbole présent sous un autre nom (renommage) : c’est un AG006 réel, mais son correctif est un remplacement, pas une suppression.

Une affirmation invérifiable automatiquement — « ne jamais toucher au service de paiement sans validation » — n’est pas fausse pour autant. La marquer à confirmer et la poser à l’humain à la fin, groupée. Ne jamais la compter comme un écart.


Phase 3 — Verdict par fichier

Appliquer la loi du protocole : une ligne ne mérite sa place que si l’agent ne peut pas la déduire du dépôt (${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/context-truth-protocol.md § La loi). Attribuer exactement un verdict, avec son motif.

KEEP · UPDATE · MERGE · MOVE · DELETE — définitions et conditions dans le protocole § Verdicts.

Règle de tranchage en cas d’hésitation : si le contenu est déductible par un agent qui sait lire le dépôt, c’est MERGE ou DELETE. Un résumé d’architecture, une arborescence, une reformulation du README ne passent pas le critère.

Trois protections qui ne se négocient pas :

  1. Sécurité, invariants, interdictions → KEEP. Le code montre ce qui est fait, pas ce qui est proscrit. Ces sections sont déjà les parents pauvres de l’écosystème — les couper est le mauvais conseil que le protocole nomme.
  2. Doc humaine → MOVE, jamais DELETE. Guide de contribution, ADR, runbook d’astreinte servent à des humains ; les sortir du chemin de lecture de l’agent suffit.
  3. Règle écrite après une erreur réelle → demander. Si elle semble évidente aujourd’hui, c’est peut-être qu’elle fonctionne. Barrière de Chesterton : ne pas retirer une clôture avant de savoir pourquoi elle a été posée.

Phase 4 — Gouvernance des skills

Le mécanisme et les trois leviers (skillOverrides, disable-model-invocation, pattern routeur) sont dans ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/context-truth-protocol.md § Gouvernance des skills. Etalonneuse applique, elle ne re-documente pas.

for d in ~/.claude/skills/*/ .claude/skills/*/; do
  [ -f "$d/SKILL.md" ] || continue
  printf "%s\t%s\n" "$d" "$(awk '/^description:/{f=1} f{print} /^[a-z-]+:/&&!/^description:/&&f&&++n>1{exit}' "$d/SKILL.md" | wc -c)"
done | sort -k2 -rn

Mesure de référence : demander à l’utilisateur de lancer /doctor, qui estime le coût réel du listing et désigne ses plus gros contributeurs. Plus fiable que ce comptage.

Trois questions par skill, dans cet ordre :

  1. Spécifique à un projet ? → MOVE vers le .claude/skills/ du projet : elle disparaît du contexte partout ailleurs.
  2. Le modèle doit-il pouvoir la déclencher seul ? Non pour tout effet de bord (deploy, commit, envoi) et tout sous-skill de routeur → RESTRICT.
  3. Encore utilisée ? Chercher les traces réelles, ne pas deviner → ARCHIVE si non.

Verdicts : KEEP · MERGE · MOVE · RESTRICT · ARCHIVE. Ne jamais supprimer une skill — RESTRICT et ARCHIVE sont réversibles, une suppression ne l’est pas.

Rappeler le statut épistémique dans le rapport : la politique d’invocation est une stratégie d’ingénierie, pas un résultat mesuré. Proposer un /doctor avant/après.

Agents

Un agent se juge instruction par instruction, pas par fichier. Une seule question décide de chaque ligne : « si cette instruction disparaît, l’agent risque-t-il de mal faire ? ». Trois garde-fous l’encadrent : frontmatter intact, « Pas pour » conservé, ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/ intouchable.

Trois signaux suffisent pour retenir un agent :

  1. corps > ~150 lignes ;
  2. règles déjà dans CLAUDE.md ou voix.md ;
  3. procédure en étapes dans les règles permanentes → candidate MOVE → skill.

Hooks

for f in ~/.claude/settings.json .claude/settings.json .claude/settings.local.json; do
  [ -f "$f" ] && jq -r --arg f "$f" '.hooks // {} | to_entries[] | .key as $e | .value[].hooks[]? | "\($f)	\($e)	\(.command)"' "$f"
done

Quatre signaux, un verdict chacun :

Signal Comment le voir Verdict
mort : le script appelé n’existe plus test -x sur le chemin DELETE
doublon : même commande sur deux événements ou deux fichiers tri de la liste ci-dessus MERGE
bavard : UserPromptSubmit / SessionStart qui imprime à chaque tour lancer le hook à vide, compter les lignes UPDATE — sortie seulement quand elle change
bloquant sans filet : pas de exit 0 de repli lire le script UPDATE

Les hooks vivent souvent hors dépôt (~/.claude/) : le dire dans le rapport, le correctif se propose quand même.


Phase 5 — Rapport

Écrire dans docs/audits/etalonneuse-<AAAA-MM-JJ>.md, dans ce format :

# Audit de contexte — <dépôt> — <date>

## Synthèse
- N fichiers audités, X lignes, ~Y tokens estimés
- KEEP: n | UPDATE: n | MERGE: n | MOVE: n | DELETE: n
- Contexte récupérable : ~X lignes / ~Y tokens par session

## Erreurs factuelles
| Fichier:ligne | Code | Affirmation | Réalité |

## Verdicts
| Fichier | Lignes | Verdict | Motif |

## Skills
| Skill | Portée | Invocation | Action | Gain |

## Agents
| Agent | Lignes | Doublons hérités | Procédures à extraire | Verdict |

## Hooks
| Fichier | Événement | Commande | Signal | Verdict |

## À confirmer par l'humain
- <affirmations invérifiables, groupées>

## Plan d'application
1. DELETE — vestiges purs
2. MERGE / MOVE — déplacements
3. UPDATE — corrections de contenu

Le rapport se termine sur une proposition de cadence, jamais sur « c’est réglé ». Ces fichiers dérivent structurellement (protocole § Cadence) : proposer une relance à chaque changement de stack, après toute vague de renommage, ou toutes les N releases.


Phase 6 — Application

En mode audit, etalonneuse n’écrit rien : elle fournit les diffs et l’ordre dans lequel les passer. En mode optimize, elle les passe elle-même, avec la même discipline.

Trois lots séparés, un commit par lot, pour que chaque diff reste relisible :

Lot Contenu Relecture
1 DELETE — vestiges purs rapide, gros volume
2 MERGE / MOVE — déplacements vérifier que rien n’est perdu
3 UPDATE — corrections de contenu ligne à ligne, c’est là que le sens change

Si l’utilisateur demande un nettoyage complet en une passe, l’accepter — mais garder un commit par lot.

Mode optimize — un fichier à la fois

Pour chaque fichier du plan, dans l’ordre des lots :

  1. Fichier n/N — <chemin> · verdict <X> · suivant : <chemin> en première ligne.

  2. Produire le diff par le bon outil — jamais etalonneuse seule sur un type qu’une skill couvre :

    Type Qui écrit le diff
    CLAUDE.md, AGENTS.md, règles, docs etalonneuse, ligne à ligne
    skill /ulk-tierces:skill-manager optimize <nom>
    agent etalonneuse, instruction par instruction (§ Agents)
    hook etalonneuse, dans le settings.json concerné
  3. Montrer le diff, demander (AskUserQuestion) : appliquer / sauter / arrêter.

  4. Appliquer, puis relancer l’oracle du type — scripts/check.sh sur ulk, ou le hook lui-même à vide.

  5. Cocher la ligne dans ## Plan d'application du rapport : c’est l’état de reprise. Arrêter coûte rien, reprendre repart de la première case vide.

Un chemin en argument restreint le plan à ce fichier ou ce dossier.

Ne jamais laisser un agent régénérer le fichier de contexte de zéro. C’est précisément le cas de figure à éviter ; l’écriture humaine est le facteur qui fait la différence. Etalonneuse propose des retraits ligne à ligne et des corrections ciblées, jamais un remplacement intégral.


Ce que etalonneuse ne fait jamais

Reproduirait le défaut qu’il corrige (protocole § Ce qu’il ne faut pas construire) :

  • écrire en mode audit, ou écrire deux fichiers d’un coup en mode optimize ;

  • documenter tout le dépôt ;

  • réécrire systématiquement le fichier racine ;

  • transformer une erreur en règle permanente — les cinq questions de garde s’appliquent d’abord à lui ;

  • supprimer une skill ;

  • compter comme un écart une affirmation qu’il n’a pas vérifiée.