Skip to content

Fix(guard,#23547): docs/**/*.md sous eol=lf -- cablage de eol-blob-guard sur docs/ - #24724

Open
jsboige wants to merge 1 commit into
mainfrom
fix/23547-docs-eol-attribute
Open

jsboige wants to merge 1 commit into
mainfrom
fix/23547-docs-eol-attribute

Conversation

@jsboige

@jsboige jsboige commented Nov 4, 2026

Copy link
Copy Markdown
Owner

Grain: LIGHT/guard — lane myia-po-2027:CoursIA — prev: MED/guard #24703

Volet 1 sur 2 : l'attribut + son câblage (la fournée de renormalisation part en PR séparée)

docs/**/*.md text eol=lf dans .gitattributes (à la racine du dépôt, pas sous .github/). Ajouter l'attribut EST le câblage : eol-blob-guard (scripts/ci/check_eol_blobs.py, enregistrée bloquante dans fast_lane_registry.py TRANCHE19) lit les attributs à l'exécution — sans règle sous docs/, la garde ne voyait que les blobs déjà sous text/lf et restait structurellement aveugle sur tout docs/.

Mesures avant/après (exigées par l'issue)

Mesure Valeur
Blobs .md CRLF sous docs/ sur origin/main (b1e8a04, mesuré 2026-11-04) 60 / 588 (git ls-files --eol -- docs | grep -cE 'i/crlf.*\.md$')
CRLF revendiqué (eol=crlf ou -text) sous docs/ 0 — aucun blob CRLF n'est claimé, la renormalisation du volet 2 est safe
Bruit EOL d'une réécriture CRLF de docs/README.md depuis origin/main (sans règle, core.autocrlf=false) +530/−530 pour zéro ligne de contenu (530 CR injectés, git diff --cached --stat = 1060 lignes)
Précédent #22988 (head 643f8c1, 2026-10-27) +499/−499 pour un vrai diff de +10/−16 : 705 lignes de bruit sur 715

Contrôle positif (« un garde qu'on n'a jamais vu rougir n'est pas un garde »)

Sur la branche, blob CRLF planté sous le nouvel attribut (git hash-object -w --no-filters + git update-index --cacheinfo, même technique que le test d'intégration test_main_mixed_blob_flagged_rc1) sur un fichier de docs/archive/ledgers-reviews/ — la garde rend rc=1 et nomme la remédiation :

eol-guard: 1 fichier(s) avec blob CRLF ou mixte sous eol=lf -- le clone de chaque lane paraitra modifie apres chaque checkout :
  i/crlf  docs/archive/ledgers-reviews/2026-07-10-h4-sweep-5925.md
    -> git add --renormalize docs/archive/ledgers-reviews/2026-07-10-h4-sweep-5925.md

Contrôle négatif sur la branche propre : rc=0. Couverture du glob vérifiée par git check-attr text eol aux profondeurs 0 / 2 / 3 (docs/README.md, docs/reference/…, docs/archive/ledgers-reviews/…) : text: set, eol: lf partout — ** matche la profondeur arbitraire, même correction de glob que #14570 pour MyIA.AI.Notebooks.

État transitoire assumé (motif du volet 2)

Après merge, les 60 blobs CRLF existants sous docs/ passent sous attribut text eol=lf : une PR qui en touche un rougit sur eol-blob-guard, avec pour remédiation git add --renormalize <path> — la fonction-forçage voulue. Les PRs qui ne les touchent pas restent vertes (la garde ne voit que les fichiers du diff). Volet 2 = PR de fournée séparée : git add --renormalize sur les 60 .md, acceptation git ls-files --eol -- docs | grep -cE 'i/crlf.*\.md$' → 0. Une PR par classe, comme demandé au dispatch : le diff de câblage reste lisible, la fournée porte les 60 renormalisations.

Test de câblage

test_gitattributes_carries_docs_md_eol_rule (scripts/tests/test_check_eol_blobs.py) : la disparition de la ligne docs/**/*.md text eol=lf de .gitattributes fait rougir la suite. 16/16 tests verts.

Rider mécanique du pre-commit : le fichier de test entrant dans le diff a surfacé 6 appels subprocess.run(..., text=True) préexistants sans encoding= — corrigés par encoding="utf-8", errors="replace" (recette exacte du hook check-subprocess-encoding). Aucun changement de logique.

Aucun carnet touché.

See #23547 — le volet 2 (fournée) reste à livrer, l'issue ne se ferme pas ici.

🤖 Generated with Claude Code

…ard sur docs/

60 blobs .md CRLF sur 588 sous docs/ sur origin/main (2026-11-04), tous
attr/ vide : aucun CRLF revendique. L'attribut rend la garde aveuglante
sur la classe ; la renormalisation des 60 fichiers part en PR de fournee
separee. Test de cablage : test_gitattributes_carries_docs_md_eol_rule.
Au passage : encoding=utf-8 sur les 6 appels subprocess pre-existants du
fichier (exige par le hook check-subprocess-encoding des l'edition).

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

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Nov 4, 2026
@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Avertissements consultatifs

Trivial-diff advisory (#15740, non bloquant).
genre guard dans la famille META (docs/guard/ledger/readme/test) + diff de 47 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2027:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-11-04) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=3 genre=5 cap=3)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=3 genre=5 cap=3)

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2027:CoursIA a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #24127 (LIGHT/ledger, merge a 2026-11-04T05:01:42Z), #24129 (LIGHT/docs, merge a 2026-11-04T05:04:20Z), #24555 (MED/guard, merge a 2026-11-04T07:18:58Z), #24582 (MED/docs, merge a 2026-11-04T12:33:06Z), #24642 (MED/docs, merge a 2026-11-04T20:16:47Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

Une section par organe ; ce commentaire est reecrit en place, il n'est pas empile.

@github-actions github-actions Bot added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) coursia-advisory-lock-2b6ef6e8712 trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) and removed coursia-advisory-lock-2b6ef6e8712 labels Nov 4, 2026
@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #24724 (Fix(guard,#23547): docs/**/*.md sous eol=lf -- cablage de eol-blob-guard sur docs/) 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.

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

trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant