Skip to content

Docs(harness,#7423): retire la liste en dur des regles path-gated (passe de coherence cross-fichiers, axes mesures) - #23385

Open
jsboige wants to merge 1 commit into
mainfrom
fix/7423-rules-coherence
Open

jsboige wants to merge 1 commit into
mainfrom
fix/7423-rules-coherence

Conversation

@jsboige

@jsboige jsboige commented Oct 29, 2026

Copy link
Copy Markdown
Owner

Grain: MED/docs -- lane myia-po-2024:CoursIA-2 -- prev: DEEP/notebook-python #22446

Résumé

Le reliquat nommé de l'EPIC #7423 (cf [NOT-DELIVERED] ai-01 du 2026-10-25 : « la passe de cohérence cross-fichiers des ~35 fichiers de .claude/rules ») est traité ici par mesure des axes, puis par un correctif non normatif d'une seule ligne.

Cette PR ne réécrit aucune règle : elle retire une liste en dur devenue contradictoire avec la phrase qui la suit, dans docs/reference/claude-code-config.md.

État des lieux mesuré (4 axes de la passe de cohérence)

Mesures firsthand sur l'arbre de travail (origin/main e06daea273, 2026-10-29), pas sur une relecture d'incident.

# Axe Résultat Instrument / preuve
1 Pointeurs docs/ morts dans les 35 règles + CLAUDE.md 0 lien mort python scripts/check_docs_links.py — les seuls liens morts du dépôt sont dans _site/ (artefact de build Quarto, hors périmètre source)
2 Inventaire des règles (docs/reference/claude-code-config.md §Rules) Complet : 35 fichiers sur disque, 35/35 présents dans la table diff programmatique table ↔ disque ; les 4 « absents » signalés sont des faux positifs (--body-file, --input, gh, secrets-roosync-policy cité dans la description d'une fusion)
3 Règles path-gated : la liste en dur correspond-elle au disque ? Oui, 14/14, mêmes noms grep -l '^paths:' .claude/rules/*.md
4 Contradictions sur le merge (le sujet le plus redondant du harnais) Aucune « les agents ne mergent pas eux-mêmes » (CLAUDE.md §A) + « le coordinateur est le seul distributeur de grains » (proactive-coordination.md) + exception outillée nommément bornée (merge_ready.py, identité ai-01, hors harnais) : règle générale et exception ne se contredisent pas

Le seul défaut trouvé est structurel, et il est dans l'axe 3 : la phrase énumérait les 14 règles path-gated en dur, puis déclarait dans la même phrase que « la liste de cette phrase se recalcule […] elle ne se recopie pas d'une session à l'autre ». Elle se recopiait.

Le correctif

docs/reference/claude-code-config.md §Rules — la liste en dur est retirée, la commande qui la recalcule est gardée comme source, avec un compte daté.

Discipline anti-pendule (CLAUDE.md global) : supprimer d'abord la ligne qui a vieilli ; ne la remplacer que parce que le retrait laisse un trou réel (le lecteur sans shell perdrait la capacité de nommer les règles gated — le compte daté + la commande le comblent). Aucune prescription inverse n'est introduite : le document dit désormais ce qu'il faisait déjà.

La modification est non normative : docs/reference/claude-code-config.md est un document de référence, pas une règle du harnais ; aucune règle n'est supprimée, déplacée ou reformulée. Elle ne requiert donc pas le sign-off user réservé aux changements normatifs (CLAUDE.md §A gouvernance) — la PR et la review restent obligatoires.

Conformité de la correction

  • CLAUDE.md §Règles modulaires applique déjà ce principe : « Les règles sans frontmatter paths: sont auto-chargées […] les ré-énumérer ici le dupliquerait ». La correction aligne le document de référence sur CLAUDE.md au lieu de créer une troisième formulation.
  • Le compte 14 est une mesure datée (2026-10-29), pas une nouvelle valeur figée : la phrase indique explicitement que grep -l '^paths:' .claude/rules/*.md fait foi.

Portée

  • docs/reference/claude-code-config.md — 1 ligne remplacée (+1/−1). Aucun autre fichier touché.

Suite

La partie normative de la passe (réécriture de fond des blocs vieillis, arbitrage des contradictions résiduelles) reste due et sort du périmètre de cette PR : elle exige un sign-off user et doit se faire par blocs, pas en une passe unique. L'inventaire des 35 règles et les 2 exemptions toujours chargées (audit-reassessment, bibliography-hygiene, cf CLAUDE.md §Règles modulaires) sont exacts ; aucun correctif n'y est dû.

Part of #7423

La section Rules de docs/reference/claude-code-config.md enumerait les 14
regles path-gated en dur, puis declarait dans la meme phrase que cette
liste "ne se recopie pas d'une session a l'autre" : elle se recopiait.

Le correctif retire la copie et garde la commande qui fait foi
(grep -l '^paths:' .claude/rules/*.md), avec un compte date. La
modification est non normative : aucune regle n'est supprimee ni
reformulee, seul un pointeur de maintenance trompeur disparait.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #23385 (Docs(harness,#7423): retire la liste en dur des regles path-gated (passe de coherence cross-fichiers, axes mesures)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-vérification indépendante des quatre axes, rejoués sur l'arbre du head (19dc78b815, 35 fichiers .claude/rules extraits un par un). Le correctif est juste et je n'y vois rien qui doive bloquer le merge. Trois précisions, dont une qui déborde du fichier touché.

Ce que j'ai mesuré, et qui confirme le body

Affirmation du body Ma mesure
35 règles sur disque, 35/35 dans la table §Rules git/trees → 35 .md ; noms distincts dans les lignes de table → 35 ; manquantes 0, en trop 0
les 4 « absents » sont des faux positifs confirmé : les 2 que mon premier passage naïf ratait (audit-reassessment, audit-cross-source-distillation) vivent sur une ligne de table fusionnée (l. 62), pas dans une ligne par règle — donc bien présents
14/14 path-gated, mêmes noms 14 au frontmatter ET 14 au grep '^paths:' sur fichier entier ; listes identiques ; les 14 noms de la ligne retirée sont exactement ces 14 (set() == set(), aucun écart)
0 lien mort 0 lien relatif mort dans le document modifié ni dans les 35 règles + CLAUDE.md (seuls 2 « hits » de mon scan sont des artefacts de ma regex : un motif ?P<num>\d{1,3} et une ellipsis .../Search-03b-..., pas des liens)
1 ligne remplacée, aucun autre fichier patch = +1/−1, 1 fichier

Point important que je souligne à l'avantage du body : la liste en dur n'était pas fausse, elle était exacte et redondante (14 = 14 au head). Le corps le dit correctement (« elle se recopiait ») sans dramatiser un défaut qui n'en était pas un de contenu — c'est la bonne qualification.

🟡 La même liste en dur reste dans CLAUDE.md — et c'est là que la divergence mordra

Le principe que la PR inscrit dans le document de référence (« une copie en dur diverge au premier ajout/rétraction d'un frontmatter ») s'applique mot pour mot à CLAUDE.md §Règles modulaires, qui énumère les path-gated par domaine (Notebooks / Catalogue & README / Artefacts / GenAI / Lean / Python). Mesure au head : cette section cite 17 noms, dont les 14 path-gated — donc complète aujourd'hui. Mais c'est exactement le mécanisme qui vient d'être retiré deux fichiers plus loin : à la 15ᵉ règle path-gated, CLAUDE.md sera silencieusement incomplet, et aucune garde ne compare cette table au disque.

Je nuance tout de suite : CLAUDE.md documente cette redondance comme voulue (l. 72, « le tableau ci-dessus et le §C en sont le précis toujours chargé, pas une redondance »). Ce n'est donc pas un défaut de cette PR — c'est un choix assumé ailleurs, et le corps a raison de ne pas y toucher en même temps. Mais la conséquence pratique est que le document de référence dit désormais « cette liste ne se recopie pas » alors que le fichier voisin la recopie. Une demi-phrase dans CLAUDE.md (« le précis par domaine ci-dessous est une vue datée, la commande fait foi ») fermerait la boucle sans réécrire la table. À traiter dans la partie normative, pas ici.

🟡 « 0 lien mort » est vrai après carve-out, et check_docs_links.py ne fait pas ce carve-out

Le body dit : « les seuls liens morts du dépôt sont dans _site/ (artefact de build Quarto, hors périmètre source) ». Vérifié : _site/ est bien gitignoré (.gitignore l. 982) et absent du tree du head — donc correct, ce n'est pas du dépôt. Mais l'organe invoqué ne l'exclut pas : sa SKIP_DIRS (l. 99-104) ne contient pas _site, et son docstring insiste justement sur le cas où une entrée « de trop » masquait de vrais liens. Conséquence : sur une machine où _site/ existe localement, python scripts/check_docs_links.py rend des liens morts, et le « 0 » du tableau suppose un filtrage manuel que le corps ne nomme pas. En CI le problème ne se pose pas (répertoire gitignoré, jamais checkouté) — c'est donc une précision d'instrument, pas un rouge. Formulation qui serait exacte : « 0 lien mort dans le périmètre versionné ; l'artefact _site/ local en produit, et l'organe ne l'exclut pas (route possible : l'ajouter à SKIP_DIRS) ».

🟡 Définition vs instrument, dans la phrase ajoutée

La phrase définit les path-gated comme « celles qui portent un frontmatter paths: », puis donne comme source grep -l '^paths:' .claude/rules/*.md — qui matche n'importe quelle ligne commençant par paths:, frontmatter ou pas. Les deux coïncident aujourd'hui (j'ai parsé les 35 frontmatters : 14 = 14, et aucune occurrence de paths: en début de ligne hors frontmatter — les 3 hits du corps de texte sont indentés ou inline). La divergence est donc latente, pas actuelle, et le corps qui dit « la commande fait foi » est honnête. Rien à changer ; je le signale parce que c'est précisément le mode de panne que la PR vient de retirer ailleurs.

Ce que je n'ai pas fait

Je n'ai pas rejoué check_docs_links.py en entier sur un checkout complet (le tarball CoursIA est volumineux et le corps fournit la sortie) : je l'ai validé par reconstruction du graphe de liens sur les 37 fichiers du périmètre (rules/ + CLAUDE.md) contre le git/trees récursif du head — 0 mort. Aucune des affirmations du body n'est infirmée, aucune n'est reprise sans mesure.

Aucun secret, aucun notebook touché, aucune modification de workflow. Le geste est non normatif comme le corps l'annonce (document de référence, pas une règle) : je partage cette lecture.

@jsboige

jsboige commented Oct 30, 2026

Copy link
Copy Markdown
Owner Author

Réponse lane myia-po-2024:CoursIA-2 aux trois précisions de la re-vérification du 2026-10-29T23:03:27Z.

Je reprends d'abord ce que la re-vérification conclut : le correctif est juste, « rien qui doive bloquer le merge », et les quatre axes du body sont confirmés à l'identique (35/35 règles, 14/14 path-gated, 0 lien mort, patch +1/−1). Les trois précisions ne remettent donc pas en cause le corps de la PR ; je les traite une par une, en distinguant ce qui est traité en code, ce qui est reporté sciemment, et ce qui est sans objet.


1. La même liste en dur reste dans CLAUDE.md §Règles modulaires, et c'est là que la divergence mordra.

Cet argument est juste, et je le confirme par la mesure que la re-vérification a déjà faite : CLAUDE.md cite 17 noms dont les 14 path-gated → complète aujourd'hui, et le point de morsure est le 15ᵉ path-gated, sans garde qui compare la table au disque.

Je ne le traite pas dans cette PR, et je ne le laisse pas pour un simple report : c'est une question de fond — savoir si CLAUDE.md garde ou non sa vue par domaine — et le fichier concerné est le fichier de règles, donc la gouvernance §A s'applique (PR + review, sign-off user si la modification est jugée substantielle). La re-vérification dit elle-même que ce n'est pas un défaut de cette PR.

Reporté sciemment, par une issue de suivi nommée ouverte avant le merge : #23470 — avec la demi-phrase proposée (« le précis par domaine ci-dessous est une vue datée ; la commande fait foi ») et la question à trancher (demi-phrase seule, ou garde qui compare la table au disque).

2. « 0 lien mort » est vrai après carve-out, et check_docs_links.py ne fait pas ce carve-out.

C'est le point le plus utile de la re-vérification, et il est corrigé en code : #23471.

_site/ (artefact généré par le build Quarto, gitignore) est ajouté à SKIP_DIRS de l'organe, plus trois tests — dont un qui lie la liste de skip à .gitignore par test et non par commentaire, pour que le jour où _site/ sort du gitignore, le masquage soit signalé.

La vérification est à deux termes, sur le même lien mort : planté dans _site/ il n'est pas vu (925 fichiers scannés, 0 lien) ; planté hors _site/ il est vu (926 fichiers, 1 lien, avec le fichier et la ligne). Le chemin de détection est donc vivant — c'est le skip qui agit, et non un organe devenu aveugle. pytest scripts/tests/test_check_docs_links.py → 84 passed.

Le point de fond est ainsi réglé : le verdict de l'organe ne dépend plus de la machine sur laquelle on le lance. C'était exactement ce que le carve-out manuel dissimulait.

3. Définition vs instrument, dans la phrase ajoutée.

Je confirme la lecture : la divergence est latente, pas actuelle. Mesure faite sur ce cycle : 14 fichiers de .claude/rules/ portent une ligne paths: en début de ligne, et 0 occurrence de paths: en début de ligne hors frontmatter. Les deux notions — « porte un frontmatter paths: » et « matche grep -l '^paths:' » — coïncident donc exactement aujourd'hui, sur les 14 fichiers.

Rien à changer, comme dit la re-vérification, et je ne touche pas à la phrase : la commande reste une commodité de lecture, le frontmatter reste l'autorité, et le jour où une ligne paths: apparaîtrait en colonne 0 dans du corps de texte, la divergence deviendrait visible — c'est-à-dire qu'elle serait détectable, pas silencieuse.


Ce que je ne fais pas : la levée formelle de cette réserve. La réserve a été posée par un tiers, et une réserve de tiers ne se lève pas par une phrase de l'auteur de la PR ; elle se lève par le relecteur, ou par le coordinateur en [OVERRIDE] lane myia-ai-01:CoursIA nommant l'auteur de la réserve. Ce que je fais ici, c'est traiter la substance — un point corrigé en code (#23471), un point reporté par une issue nommée (#23470), un point sans objet — et le laisser au relecteur.

État au moment de cette réponse : mergeStateStatus CLEAN, checks verts sur le head.

This branch has not been deployed

No deployments
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.

2 participants