Skip to content

docs(rules,#19297): critères de sortie de la finition de série - #19298

Merged
myia-ai-01 merged 2 commits into
mainfrom
docs/19297-finition-de-serie
Oct 5, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
docs/19297-finition-de-serie

Conversation

@myia-ai-01

Copy link
Copy Markdown
Collaborator

Grain: LIGHT/harness — lane myia-ai-01:CoursIA — prev: DEEP/lean #19271 (merge)

Sujet

Inscrit dans la règle des notebooks les critères de sortie du régime de finition de série (#19297).

Ce qui change

  • .claude/rules/notebook-conventions.md, section « Structure pédagogique » : une puce. Une série en finition a des objectifs dans son README, et chaque carnet de son chemin principal finit par trois blocs : « À retenir », « Vérifiez votre compréhension », « Pour aller plus loin ». Elle a aussi un capstone là où il vient naturellement. L'application se fait série par série, en markdown seul.
  • docs/reference/finition-de-serie.md (nouveau) : le détail.
    • le contenu attendu de chaque bloc ;
    • comment appliquer : écrire depuis le contenu du carnet, ne pas toucher deux fois un carnet en cours de renommage, pas de nouvelle taxonomie ;
    • la mesure de départ et l'ordre de passage (Search, RL, puis les séries sans objectifs).

Gouvernance

Changement normatif du harnais : il ajoute une prescription. Le mainteneur a validé le régime et ces critères en session directe le 2026-10-05, ce qui vaut sign-off (CLAUDE.md §A). La règle reste bornée :

  • elle ne s'applique qu'aux séries en finition ;
  • elle exclut toute reprise rétroactive en masse ;
  • les blocs sont du markdown, donc aucune ré-exécution (C.2) et aucune re-sérialisation de carnets non modifiés (C.3).

Validation

Hors périmètre

See #19297

🤖 Generated with Claude Code

Ajoute a la regle des notebooks les criteres de sortie d'une serie en
finition : objectifs dans le README de serie, blocs de fin de carnet
(A retenir, Verifiez votre comprehension, Pour aller plus loin), capstone
la ou il vient naturellement. Detail dans docs/reference/finition-de-serie.md.

Regime valide par le mainteneur en session directe le 2026-10-05.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) labels Oct 5, 2026
@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA a deja consomme son budget LIGHT du jour (#19149 (merge a 2026-10-05T00:29:39Z)).
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.

@github-actions github-actions Bot added the variation-genre-mismatch declared genre != genre infere depuis les chemins du diff (#10020, advisory) label Oct 5, 2026
@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

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

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.

… chemin principal sans profondeur

Precise ce que mesure le script de #19297, d'apres le rejeu de #19303 sur
le corpus : le comptage de depart inclut les titres voisins (Points cles a
retenir, Ce qu'il faut retenir, titres numerotes) ; une serie n'est finie
qu'aux titres du tableau, et la mesure separe renommer d'ecrire. Le chemin
principal comprend les sous-dossiers, hors _archive/_output et exclusions
nommees au README -- pas une profondeur de dossier (ML : 23 carnets sur 128
au filtre depth<=1).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@jsboige

jsboige commented Oct 5, 2026

Copy link
Copy Markdown
Owner

[ADJOINT] #19298 — pas de dossier tiers : un seul obstacle, et c'est un minuteur

Demande du dispatch ai-01 du 2026-10-05 (finition de série #19297). Le dossier [ADJOINT PREFLIGHT] n'est pas émis, et c'est le résultat du contrat, pas un défaut de mesure.

Obstacle unique mesuré. python scripts/check_run_state.py --pr 19298 : toutes les jambes au vert, sauf une — PR gate = failure, et son output.title dit ce qu'elle est : DWELL -- tete du 2026-10-05T12:34:22Z, 8 min -- plancher 120 min ; ecoule a 2026-10-05T15:07:00Z. Cette jambe est un minuteur, elle ne nomme aucun défaut du code. mergeStateStatus: BLOCKED découle de là.

Pourquoi pas de dossier. Le champ checks n'a qu'une valeur d'attestation (latest-wins-green). Un failure au dernier started_at la contredit — l'organe le re-vérifie lui-même contre les check-runs vivants depuis #16957, donc un READY posté maintenant serait rejeté. Reste la forme BLOCKED, que l'organe accepte ; je ne l'utilise pas ici : les surfaces de discussion survivent au minuteur, un dossier checks: BLOCKED resterait donc en place après l'échéance et attesterait « non mergeable » d'une PR devenue verte sans qu'aucun geste ne l'ait écrit. Un dossier périmé qui vieillit mal vaut moins qu'un commentaire qui dit l'heure.

Ce qui est mesuré et conforme, au head 3f41d8c7af37927d54d08bb75221239e121e3e5d :

Champ Mesure
body lu (Grain en ligne 1, gouvernance, validation, hors-périmètre)
comments-reviewed / reviews-reviewed / threads-reviewed 2 / 0 / 0 — les deux commentaires sont les advisories github-actions G-VAR-2 et G-VAR-2/3, non bloquants par construction
surfaces-sha256 17b090ffe8e4015474fa53e2c1a9f648c818299fe7e4380202ec04952c090a32
diff 2 fichiers, +49/−0 : .claude/rules/notebook-conventions.md (+1) et docs/reference/finition-de-serie.md (+48, nouveau)
scope conforme au body : « 2 fichiers, +1 ligne dans la règle et un fichier de doc ». Le lien relatif ../../docs/reference/finition-de-serie.md depuis .claude/rules/ résout bien vers le fichier ajouté, et la puce ajoutée porte le renvoi attendu. Aucun .ipynb, aucun script, aucun workflow touché — donc C.2/C.3 non exposés, comme le body l'annonce
domain le body déclare le changement normatif du harnais et son sign-off (session directe du mainteneur du 2026-10-05, CLAUDE.md §A). Les critères écrits dans docs/ sont cohérents avec l'EPIC #19297 (trois blocs, objectifs de README, capstone, ordre de passage Search → RL → séries sans objectifs)
B.0 python scripts/check_unaddressed_nits.py 19298 → rc=0, aucun nit non levé

Geste. Rien à corriger côté code. Après l'échéance (15:07Z), la jambe se ré-agrège au balayage (pr-gate-stale-sweep.yml, cadence mesurée 2 h 33 – 5 h 18, #15197) ou tout de suite en rejouant la jambe (gh run rerun 37310479822 --job 111764375191). Je re-stampe le dossier à ce moment-là, sur les mêmes surfaces si rien d'autre n'a bougé.

@jsboige

jsboige commented Oct 5, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19298
head: 3f41d8c
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 55bf2f7d486bb7ab1130c5204fd7f6339bcf42761bf259f19c69a09f51d10b80
diff-files: 2
diff-additions: 49
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19298
organ-rc: 0
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 679254c into main Oct 5, 2026
27 of 28 checks passed
jsboige added a commit that referenced this pull request Oct 6, 2026
…19298

Le garde docs-index est absolu sur main : finition-de-serie.md, entre
apres le rebase de la PR, doit etre atteignable depuis docs/README.md.
Organ rc=0 sur l'arbre fusionne (217 docs vivants atteignables),
8/8 tests, fast_lane --only docs-index-guard exit 0.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 6, 2026
…eignables + organe de couverture (#19260)

* docs(consolidation,#13748): index docs/ complet -- 62 docs rendus atteignables + organe de couverture

L'index `docs/README.md` revendiquait « tous atteignables » : la mesure
first-hand le dementait, 62 des 216 `*.md` vivants (hors `archive/`) etaient
inatteignables depuis l'index, directement ou via un index de sous-repertoire.

- 62 lignes ajoutees dans les sections existantes (reference, lean, ledgers,
  ict, genai, curriculum, ci, ml, notebook-metadata, racine) et deux sections
  pour les repertoires sans section propre (`docs/dotnet/`, `docs/xai-shap-strategy/`
  + `docs/test-fixtures/`).
- le compte ecrit en tete d'index (« 146 live ») est retire : il derivait de
  plus de soixante fichiers. Conformement a l'arbitrage user du 2026-09-24
  (#17029), un compte qui derive ne se remet pas a jour, il se supprime au
  profit d'un invariant tenu par un organe.
- `scripts/check_docs_index.py` mesure la seule metrique que l'index s'est
  donnee (atteignabilite en fermeture transitive depuis `docs/README.md`),
  sort 1 des qu'un doc vivant devient inatteignable, et porte un controle
  positif (`--expect-unreachable N`) pour qu'un arbre propre ne soit pas
  confondu avec un chemin de detection mort. La fermeture ne sort jamais de
  `docs/` : elle peut sous-crediter, jamais sur-crediter (fail-closed).
- `scripts/tests/test_check_docs_index.py` : 8 tests, dont l'acceptance lue
  sur l'arbre reel (0 inatteignable) et les deux codes de sortie.

Le finding prioritaire de l'audit (4 `*-detail.md` cites par les rules =
liens morts) ne reproduit pas : les 39 liens `../../docs/**` des
`.claude/rules/*.md` resolvent tous, et `scripts/check_docs_links.py` rend
0 lien casse sur 8252. Les memes documents etaient en revanche absents de
l'index -- c'est cette moitie-la qui etait reelle, et elle est corrigee ici.

See #13748

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

* fix(ci,#13748): cabler l'organe d'index docs/ -- TRANCHE18, garde bloquant absorbe

Reserve de revue Hermes sur #19260 : `scripts/check_docs_index.py` n'etait cable
nulle part (`grep -rln check_docs_index .github/workflows/ scripts/ci/` vide des
deux cotes) alors que le README de `docs/` cite son `exit 1` comme l'invariant.
Un invariant que personne n'execute n'est pas un invariant.

- `scripts/ci/fast_lane_registry.py` : TRANCHE18, garde ABSOLU (non-delta,
  sans `needs_base` ni `swap_paths`), `absorbed=True` -- sans absorption le job
  always-on l'emet en conclusion NEUTRE sous `fast-lane (ombre): `, soit
  exactement le defaut signale.
- `scripts/ci/fast_lane.py` : import et agregation de TRANCHE18.

Controles executes a la main :

- positif : organe `rc=0` (216/216 atteignables) ; fast-lane `phase 1
  docs-index-guard : exit 0`, aucun bloquant en echec ;
- negatif : un doc temoin non indexe sous `docs/` fait rendre `rc=1` a l'organe
  et `phase 1 docs-index-guard : exit 1` au moteur -- « au moins un bloquant en
  echec ». Temoin retire, arbre re-verifie vert ;
- `scripts/tests/test_fast_lane.py` : 82 passed, dont le test de parite
  registre->moteur ;
- `scripts/tests/test_check_absorbed_check_run_identity.py` : 11 passed.

See #19260

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

* docs(consolidation,#13748): post-rebase -- le garde attrape 16473-consolidation-acceptance-2-log

Rebase sur main (d1df57e) : la resolution du conflit docs/README.md
prend le cote de main (triage racine #19283/#19318 : qc-research,
data-policy et claim-implicit-check deplaces, main les reference deja
aux bons endroits). Le garde alors rougit : le ledger 16473 ajoute sur
main par 84c99c3 est inatteignable -- premiere capture reelle de
l'organe apres son cablage. Ligne d'index ajoutee.

check_docs_index: 216/216 atteignables, rc=0 ; tests 8/8.

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

* docs(index,#19260): indexer reference/finition-de-serie.md arrive par #19298

Le garde docs-index est absolu sur main : finition-de-serie.md, entre
apres le rebase de la PR, doit etre atteignable depuis docs/README.md.
Organ rc=0 sur l'arbre fusionne (217 docs vivants atteignables),
8/8 tests, fast_lane --only docs-index-guard exit 0.

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

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
myia-ai-01 added a commit that referenced this pull request Oct 6, 2026
…esurable (#19303)

* feat(tools,#19297): organe check_series_finish -- finition de série mesurable

Implementation du regime de finition valide par le mainteneur (cf
docs/reference/finition-de-serie.md, PR #19298) :
- README de serie doit avoir une section `## Objectifs d'apprentissage` (H2/H3 strict)
- Chaque carnet du chemin principal doit avoir 3 blocs H2/H3 :
  `## A retenir`, `## Verifiez votre comprehension`, `## Pour aller plus loin`

Criteres mesures sur le corpus reel (1492 carnets au 2026-10-05) :
- A retenir : 14 % des carnets
- Verifiez votre comprehension : 1 %
- Pour aller plus loin : 18 %
- Objectifs README : manquant dans 5 series sur 14 (Complexity, Compression, NLP, RL, SymbolicAI)

API : `--series <nom> --json` (sortie JSON) ou `--report` (sortie texte).
Codes de sortie : 0 (serie finie), 1 (au moins 1 carnet manque 1 bloc, ou README
sans Objectifs), 2 (serie inconnue, nom invalide).

Tests : 24 verts (TestCheckNotebookBlocks, TestCheckReadme, TestRunCheck, TestMainCLI)
avec carnets synthetiques (lecon #19215 : 17 tests verts, plantage sur le vrai
corpus -- ici on isole en tmp_path via monkey-patch SERIES_ROOT).

Rejeu sur le corpus reel : 0/9 series testees finies (ML 0/23, Search 0/73,
RL 0/22, SymbolicAI 0/171, Complexity 0/6, Compression 0/1, NLP 0/5+,
Probas 0/28, GameTheory 0/94). C'est la mesure de depart ; les series
passees en finition recevront leurs blocs en priorite 1 (Search carte validee
#19253, RL #19255, puis les 4 series sans Objectifs).

Grain: MED/tooling -- lane myia-ai-01:CoursIA-2 -- prev: LIGHT/infra #19057

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(tools,#19303): 3 defauts revue coord -- capstone \b, mesure recursive, canonique vs variantes

Issue #19303, revue coord 05/10 (c.5994494493) :

1. **Capstone regex `\b`** : le pattern `n/?a` matchait le 'na' de 'analyse' (et de
   'analyse des besoins', etc.) dans tous les READMEs. Capstone_phrase valait
   'na' sur ML/Search/Probas/GameTheory/RL/SymbolicAI/Complexity/NLP. Fix :
   `n\s*/?\s*a` est devenu `\bn\s*/?\s*a\b` (word boundary explicite des deux
   cotes). Ajout d'un test `test_capstone_pas_de_match_dans_analyse` qui verifie
   qu'un README avec 'analyse approfondie' ne detecte pas de capstone.

2. **Filtre `depth > 1`** : retirait la majorite des carnets (ML 105/128, Search
   69/159, SymbolicAI 132/320, Probas 34/77). La doc finition-de-serie.md dit
   pourtant : "Le chemin principal d'une serie est l'ensemble de ses carnets,
   sous-dossiers compris." Mesure recursive par defaut, exclusion _archive /
   _output / .ipynb_checkpoints uniquement. Nouveau test `test_serie_mesure_recursive`.

3. **Instrument != doc** : separation `canonique` (titres du tableau de la doc)
   et `variante` (titres voisins reconnus, ex. 'Summary', 'Quiz', 'Bibliographie').
   Sortie structuree : pour chaque bloc, deux booleens `canonique[cle]` /
   `variante[cle]`, et `renommer` = variantes sans canal canonique (a renommer),
   `missing` = blocs absents (a ecrire). Compteurs agreges `renommer_total` et
   `ecrire_total` au niveau serie. Permet de repartir le travail (le 14%/1%/18%
   du comptage de depart sont en realite des variantes a renommer, pas des
   blocs absents a ecrire).

Tests : 31 pytest, 0.22s, tous verts (24 + 7 nouveaux = variantes + capstone
\b + tests renommer).

Grain: MED/tooling -- lane myia-ai-01:CoursIA-2 -- prev: MED/tooling #19305

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(tools,#19303): nit-fixes revue 6004712644 -- _norm mort + H2 docstring

La revue 6004712644 releve 2 nits non bloquants apres retrait des 5
commits README de la branche (qui sont transferes dans la PR dediee
feature/19297-readme-finish-objectifs, a venir) :

1. **l.98 _norm mort** : la fonction `_norm` etait definie mais jamais
   appelee (recherche tolerante sur accents). Retire, ainsi que
   l'import `unicodedata` devenu orphelin.
2. **docstring dit H2 mais regex `#{2,3}` accepte H2/H3** : la
   docstring module (l.8) et la docstring `verifie_3_blocs` (l.128)
   disent "H2" ou "3 blocs H2" ; la regex `H2_H3_HEADING_RE` accepte
   2 ou 3 caracteres `#`. Aligne la doc sur le code : "H2/H3".

31/31 tests verts apres les 2 retouches (les tests isoles en tmp_path
ne voient pas _norm et ne comptent pas les H3 explicitement -- la
couverture tient).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(tools,#19478): nit-fixes check_series_finish -- docstring + exclusion suffixe *_output.ipynb

Suivi des residus de la revue f9f2b2f (organe check_series_finish,
PR #19303), declares dans l'issue #19478 :

1. **Docstring l.14-15 obsolete** : "le chemin principal exclut les
   sous-dossiers archive/output, et ne considere que les carnets
   presents au top-level d'une sous-serie (pas les recursifs
   profond)" -- le code est recursif (`root.rglob`, l. 113), et c'est
   ce que la revue avait demande. Reecrit selon le comportement
   reel, en citant finition-de-serie.md.

2. **Exclusion par suffixe de fichier** : `_output` ne portait que
   sur les dossiers (par `split("/")`). Un fichier `X_output.ipynb`
   isole etait comptabilise comme carnet de la serie. Le corpus
   actuel n'en contient aucun hors `_archive` (verifie), donc
   l'effet est nul aujourd'hui -- mais la regle manquait. Corrige
   par ajout d'un test d'exclusion par `p.name.endswith("_output.ipynb")`,
   avec controle non-regression sur les segments `_archive` /
   `_output` / `.ipynb_checkpoints` deja exclus.

3. **Tableau du body de #19303** : "A ecrire" affiche " -- " pour
   5 series alors que l'organe rend des nombres (RL 104,
   SymbolicAI 934, Complexity 30, Compression 3, NLP 15).
   Constat, pas d'action : le premier rapport d'organe post-merge
   qui cite ces series se regle dans le tableau.

Critere de fermeture #19478 : (1) + (2) corriges + tests ; (3)
constate. 5/5 tests PASSED (test_excludes_file_with_output_suffix
+ test_does_not_exclude_carnet_with_output_in_middle_of_name +
test_excludes_output_directory_recursively +
test_excludes_archive_and_checkpoints_segments +
test_recursive_deep_subdirectory_is_included).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: jsboige <jsboige@gmail.com>
Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige
jsboige deleted the docs/19297-finition-de-serie branch October 7, 2026 07:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-genre-mismatch declared genre != genre infere depuis les chemins du diff (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants