Skip to content

Add(guard,#20381): mode « chaine d'une serie » -- la DIRECTION du parcours verifiee contre l'ordre declare - #23590

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/20381-nav-chain-mode
Oct 30, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/20381-nav-chain-mode

Conversation

@jsboige

@jsboige jsboige commented Oct 30, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-ai-01:CoursIA-2 — prev: MED/tooling #23117

See #20381 — item 5 (« Outillage (volet optionnel) »), le volet que l'escalier
Dynamics attendait : tant que ce mode n'existe pas, la direction d'une
série n'est vérifiée par aucun organe (le garde 404 valide les cibles, le
graphe d'atteignable valide l'accessibilité — ni l'un ni l'autre ne lit un
<<).

Ce que fait le mode

--series-chain <README> lit l'ordre déclaré par le README d'une série et
vérifie, pour chaque paire de marches consécutives, que la première porte un
lien « suivant » vers la seconde et la seconde un lien « précédent » vers la
première.

Cinq findings : chain_no_prev, chain_prev_wrong, chain_no_next,
chain_next_wrong, et chain_step_missing (marche déclarée dont le carnet
n'existe pas).

Trois garde-fous, parce que l'ordre pédagogique n'est pas une propriété
universelle :

  • opt-in par série : une marche d'approfondissement n'est pas un
    « suivant » ; un garde global rougirait sur des séries légitimement non
    linéaires. Le mode n'est pas câblé en CI.
  • la table se désigne : quand le README expose plusieurs tableaux de
    carnets (catalogue, parcours, approfondissements), --chain-table nomme
    celui qui déclare la lecture. Sans sélecteur et avec plusieurs candidats,
    le mode refuse (rc=2) au lieu de deviner.
  • lecture stricte : un lien n'est une arête de parcours que s'il porte une
    direction explicite (<<, >>, ←, →, « précédent », « suivant ») dans
    son texte, ou qu'il est posé dans une cellule de navigation dont la ligne ne
    porte qu'un seul lien (repli positionnel). Une mention en prose n'est donc
    jamais lue comme une arête.

Les jumeaux (le C# d'une marche Python, la version Lean) ne sont pas des
marches : seule la première cible .ipynb d'une ligne de tableau l'est,
conformément à la convention écrite dans les README de série.

Mesures (toutes jouées sur main, dans le worktree de la branche)

Contrôle positif — 10 chaînes déclarées (8 séries), 0 finding :

Série (table) Marche(s) Verdict
GameTheory (Phase 1 / 2 / 3) 6 / 6 / 6 0 finding
NLP 8 0 finding
GenAI/SemanticKernel (Série principale) 8 0 finding
QuantConnect (Phase 1) 4 0 finding
SymbolicAI/Planners/01-Foundation 3 0 finding
SymbolicAI/Lean/KNOTS 4 0 finding
GenAI/Audio (01-Foundation) 5 0 finding
GenAI/Video (01-Foundation) 5 0 finding

C'est la preuve que le mode ne fabrique pas de faux positif sur une série bien
formée — sans ce contrôle positif, un mode qui rougit partout ne prouverait
rien.

Écart mesuré — Complexity (« Parcours ») : 9 findings. La cause n'est pas
un défaut des carnets : le « suivant » de la marche 02 vise son
approfondissement (02b) et non la marche 03 du parcours, et plusieurs
barres de la série ne portent aucun marqueur de direction. C'est une
divergence de convention entre le tableau « Parcours » et les barres — le
genre de découverte que le mode doit rendre visible sans prétendre qu'il
s'agit d'un bug. L'arbitrage (aligner les barres, ou déclarer la table
« Catalogue ») relève de la série, pas de ce PR.

Tests

  • 10 tests ajoutés à scripts/notebook_tools/tests/test_check_notebook_nav_chain.py
    (cluster 8) : chaîne conforme (contrôle positif), marche sans barre,
    « précédent » qui saute une marche, « suivant » qui vise ailleurs, jumeau
    non-marche, mention de prose non-arête, mot de direction porté par la ligne,
    tableau ambigu refusé, sélecteur de tableau, codes de sortie (0/1/2), sortie
    JSON qui publie l'ordre lu.
  • python -m pytest scripts/notebook_tools/tests/test_check_notebook_nav_chain.py → 53 passed.
  • python -m pytest scripts/tests/test_check_notebook_nav_chain.py → 42 passed (le mode est
    exclusif : le scan par défaut est inchangé, rc identique à celui de main).
  • ruff check sur les deux fichiers → 8 findings, les 8 déjà présents sur
    main
    (aucun introduit par ce PR).
  • Aucun carnet touché : pas de ré-exécution due.

Organe

Pas de duplication : le mode est dans l'organe qui connaît déjà le graphe
de navigation (check_notebook_nav_chain.py), pas dans un second script qui
réimplémenterait l'extraction des liens — il importe d'ailleurs déjà
check_notebook_navlinks.py pour la source unique de l'extraction. La
vérification indépendante du résultat est le fichier de tests (cluster 8) et
le contrôle positif sur les 10 chaînes réelles de main.

Portée

Cet item ne corrige aucune barre : il rend la classe détectable. Les
barres de l'escalier Dynamics sont portées par #20442 (autre lane, autre
périmètre) ; après son merge,

python scripts/notebook_tools/check_notebook_nav_chain.py \
  --series-chain MyIA.AI.Notebooks/GameTheory/Dynamics/README.md \
  --chain-table "Les marches"

devient le juge de la direction de l'escalier.

🤖 Generated with Claude Code

…cours verifiee contre l'ordre declare

Le garde 404 verifie que la cible existe ; le graphe d'atteignable verifie
qu'un lecteur parvient au carnet. Aucun des deux ne dit si une barre de
navigation pointe vers l'avant ou vers l'arriere de l'escalier : c'est la
classe de la reserve NanoClaw sur #20374 (« le checker nav-links valide les
cibles, pas la direction du parcours »), qui a laisse passer six carnets de
l'escalier Dynamics sans barre, et un carnet dont le « precedent » sautait
une marche.

Le mode `--series-chain` lit l'ordre declare par le README d'une serie et
verifie, pour chaque paire de marches consecutives, que la premiere porte un
lien « suivant » vers la seconde et la seconde un lien « precedent » vers la
premiere. Il est **opt-in par serie** (l'ordre pedagogique n'est pas une
propriete universelle : une marche d'approfondissement n'est pas un
« suivant ») et il n'est **pas** cable en CI : c'est un mode de
verification, pas un garde global. Quand le README expose plusieurs
tableaux de carnets, `--chain-table` designe celui qui declare la lecture --
on ne devine pas la table.

Portee de lecture volontairement stricte : un lien n'est une arete de
parcours que s'il porte une direction explicite (`<<`, `>>`, `←`, `→`,
« precedent », « suivant ») dans son texte, ou qu'il est pose dans une
cellule de navigation dont la ligne ne porte qu'un seul lien (repli
positionnel). Une mention en prose n'est donc jamais lue comme une arete.

Mesures :
- 10 tests ajoutes (chaine conforme, marche sans barre, « precedent » qui
  saute une marche, « suivant » qui vise ailleurs, jumeau qui n'est pas une
  marche, prose qui n'est pas une arete, tableau ambigu, codes de sortie,
  sortie JSON) : 53 passes dans le fichier, 42 dans scripts/tests/.
- Controle positif sur `main` : 10 chaines declarees conformes (GameTheory
  phases 1 a 3, NLP, SemanticKernel, QuantConnect phase 1, Planners, KNOTS,
  Audio, Video) -> 0 finding. C'est la preuve que le mode ne rougeit pas
  sur une serie bien formee.
- Serie Complexity (« Parcours ») : 9 ecarts, dont la cause est une autre
  convention de barre (le « suivant » d'une marche vise son approfondissement,
  plusieurs barres ne portent pas de marqueur de direction) -- divergence de
  convention, pas un defaut prouve ; le mode est opt-in pour cette raison.

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

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-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) label Oct 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=1 genre=12 cap=13)

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.

@jsboige

jsboige commented Oct 30, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 23590
head: 0875a28
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 135f78e1d6f0e82145691c74fb43326a8bb80db657f1d6892e6670b559b9ab9d
diff-files: 2
diff-additions: 534
diff-deletions: 0
checks: blocked
b0: clear
scope: pass
domain: not-applicable
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 23590
organ-rc: 3
[/ADJOINT PREFLIGHT]

@myia-ai-01 myia-ai-01 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.

Lu a la tete exacte 0875a28 par myia-ai-01:CoursIA : diff purement additif (+534/-0, 2 fichiers), le mode --series-chain est opt-in et non cable en CI, le chemin par defaut de check_notebook_nav_chain.py est inchange ; tests de la PR rejoues localement sur la tete : 53 passed. Dossier BLOCKED de l'adjoint (DWELL seul, echeance 23:07Z) : merge apres le plancher.

@jsboige

jsboige commented Oct 30, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 23590
head: 0875a28
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: bcff87389db44062ce16d14ab6384d3d009e11703bcd12ab9d0381c45462f7e8
diff-files: 2
diff-additions: 534
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 23590
organ-rc: 0
supersedes: 6534161546
supersedes-why: checks passees au meme head apres echeance DWELL 23:07Z : jambe PR gate rejouee par le balayage a 23:10:36Z, fold 23 jambes/22 noms tout vert, B.0 rc=0
[/ADJOINT PREFLIGHT]

jsboige added a commit that referenced this pull request Oct 30, 2026
…re par echelle (#23596)

Grain: DEEP/notebook-python -- lane myia-ai-01:CoursIA-2 -- prev: MED/guard #23590

La fidelite J-lens etait mesuree sur quatre echelles (1.7B, 2B, 9B, 27B) ; la
ligne 8B manquait. Trace produite depuis le lens PUBLIE
neuronpedia/jacobian-lens (Qwen3-8B_jacobian_lens.pt, sha256/16 1e1f96c3b63ac467,
35 couches sources, n_prompts 461), extraction sur un device unique 24 Go
(le 8B bf16 y tient : pas d'offload, contrairement au 27B).

Mesure (moyennes 5 sets, couches 9 et 18 = frac 0.25 / 0.5 des 36 couches) :
KL mi-reseau 16.87 nats, overlap@10 0.0112, rel_l2 1.5982 -- l'accord le plus
faible mesure sur les cinq echelles, alors que son gradient de profondeur
(4.08 nats quart->mi) reste ordinaire.

Lecture honnete : le 8B rompt la monotonie de la serie (1.7B 12.52 -> 2B 8.18
-> 8B 16.87 -> 9B 9.36 -> 27B 10.41 nats). Il n'est pas un contre-exemple a
une loi d'echelle mais sa preuve que la loi n'est pas etablie : c'est le seul
point de la generation Qwen3, sans jumeau -Base publie, sur un fit de 461
prompts -- l'axe mesure un couple (taille, famille de checkpoint), pas la
taille seule. Deux confondants de plus (checkpoint, taille du fit) sont
documentes dans le carnet.

Livrables : traces/calib_jlens_qwen3-8b.npz ; cellule de fidelite J-lens
d'ICT-42b (tableau cinq echelles + tableau KL) re-executee sous le kernel
3.13 (coursia-py313) ; interpretation, transparence de provenance, limites et
synthese relues ; ligne de description du carnet dans le README de serie.

Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants