diff --git a/05_activity_log/2026-07-30.md b/05_activity_log/2026-07-30.md index 4eac38c..f96eed2 100644 --- a/05_activity_log/2026-07-30.md +++ b/05_activity_log/2026-07-30.md @@ -1380,3 +1380,52 @@ vers leurs livrables in-repo propres. (`bim`/`ifc_speckle`/`rendu`/`mobile` = VP sans livrable in-repo propre → hors chantier, légitimement 0.) **Auto-score 4Big** : 96/100. + +--- + +## Session 20260730_205901 · Buffer S8 · Fix CI check_docs (faux positif lien en code-span) + +**Tâche** : **Sprint 8 · buffer L75 (corrections finales)**. Session ouverte pour +poursuivre le chantier de cross-linking des fiches agents (`crm` était la prochaine). +**Défaut bloquant découvert au baseline** : `ci/check_docs.sh` sortait **EXIT 1** — +la gate documentaire était **rouge**, ce qui prime sur le cosmétique. + +**Cause racine** : le log de la session précédente (`05_activity_log/2026-07-30.md:1350`) +documente le *pattern* de lien cliquable via un **exemple de syntaxe entre backticks** : +`` `[`module/`](../../05_deliverables_mvp/…/README.md)` ``. La regex d'extraction du +checker (`\]\([^)]+\)`) **ne dé-échappe pas les code-spans** ; elle a donc capté cet +exemple comme un vrai lien et l'a déclaré cassé (la cible `…/README.md` avec ellipse +n'existe pas). Un lien **entre backticks n'est pourtant jamais cliquable au rendu** — +c'est de la doc, pas un lien réel à valider. (La ligne 1351, `"](../../05_deliverables_mvp"` +sans `)` fermante, n'était pas matchée → seule 1350 échouait.) + +**2 solutions envisagées (workflow #4)** : +- **A (racine)** : le checker neutralise les code-spans avant extraction des liens. +- **B (local)** : réécrire l'exemple ligne 1350 pour casser sa forme de lien. +**Choix : A.** Le chantier de cross-linking **documente ce pattern via des exemples +backtick à chaque session** — B laisserait le piège rearmé au prochain log. A est la +cause racine et **ne peut que retirer des faux positifs**, jamais masquer un vrai lien +cliquable (par définition hors backticks). + +**Fichier modifié** — `ci/check_docs.sh` : ajout d'un `sed -E 's/`[^`]*`//g'` en tête +du pipeline d'extraction (les code-spans sont vidés avant `grep -oE '\]\([^)]+\)'`). +Commentaire mis à jour pour tracer la règle. + +**Vérifs post-fix** : +- `ci/check_docs.sh` **EXIT 1 → EXIT 0** (« Aucun lien interne cassé »). +- `ci/guard_constraints.sh` EXIT 0 · `ci/validate_json.sh` EXIT 0 (inchangés). +- **Test négatif** (fichier sonde temporaire, supprimé après) : un lien cassé **hors + backticks** reste **détecté** (`does_not_exist_xyz.md` → ✗) ; le même **dans** + backticks est **ignoré**. Le fix corrige sans affaiblir la gate. + +**Anti-invention (#6)** : aucun chiffre touché. Le log historique (ligne 1350) est +laissé **tel quel** — c'est la gate qui était trop naïve, pas le log qui était faux. + +**Hors périmètre worker (VPS · #8)** : néant (changement in-repo, gate CI locale). + +**Reste du chantier fiches** (prochaine session) : `crm` (cibles README vérifiées +existantes : `workflow_vente`/`dossier_vente`/`commissions`, compteurs 25/31/25 +reconfirmés au disque), puis `devops`, `erpnext_backend`, `frontend_console`, +`onapi_legal`, `seo`. + +**Auto-score 4Big** : 96/100. diff --git a/ci/check_docs.sh b/ci/check_docs.sh index c090e0a..7d776d5 100755 --- a/ci/check_docs.sh +++ b/ci/check_docs.sh @@ -20,8 +20,11 @@ broken=0 while read -r md; do dir="$(dirname "$md")" # Extrait les cibles [texte](cible) ; ignore http(s), mailto, ancres pures, - # gabarits {{...}} et liens wiki [[...]]. - grep -oE '\]\([^)]+\)' "$md" 2>/dev/null \ + # gabarits {{...}} et liens wiki [[...]]. Les code-spans `...` sont d'abord + # neutralisés : un lien entre backticks n'est PAS cliquable au rendu (c'est un + # exemple de syntaxe), il ne doit donc jamais être validé comme lien réel. + sed -E 's/`[^`]*`//g' "$md" 2>/dev/null \ + | grep -oE '\]\([^)]+\)' \ | sed -E 's/^\]\(//; s/\)$//' \ | while read -r link; do link="${link%% *}" # retire un éventuel "titre"