Skip to content

chore(guard): baseline navlinks resserree — 4 tolerances perimees a 0 - #13808

Merged
jsboige merged 4 commits into
mainfrom
fix/search17-navlinks-app14b
Sep 2, 2026
Merged

jsboige merged 4 commits into
mainfrom
fix/search17-navlinks-app14b

Conversation

@myia-ai-01

@myia-ai-01 myia-ai-01 commented Aug 31, 2026 •

Copy link
Copy Markdown
Collaborator

Grain: LIGHT/guard — lane myia-ai-01:CoursIA — prev: MED/guard #13781

Ce que fait cette PR, apres re-scope

Un seul fichier : scripts/tests/baseline_nb_navlinks.json, resserre de 4 tolerances a 0.

tolerances avant : 4
tolerances apres : 0
RETIREES (resserrement) : 4
AJOUTEES (elargissement) : 0

Les 4 entrees portaient sur des liens 09-KernelMemory-Multimodal.ipynb → 08-KernelMemory-Hybrid-Search.ipynb, repares depuis par ailleurs. L'outil le signale a chaque passage :

INFO: 4 broken link(s) fixed since baseline (update baseline).

Une baseline qui tolere 4 liens inexistants ne protege de rien et laisserait passer leur re-cassage sans rougir. Le resserrement est strict — zero tolerance ajoutee, verifie par comparaison d'ensembles cle-a-cle.

Note honnete : cette PR etait un doublon, je l'ai re-scopee

J'ai ouvert #13808 a 09:43Z pour reparer les navlinks de Search-17. #13805 le faisait deja, ouverte a 09:22Z — 21 minutes avant moi, par myia-po-2027:CoursIA-2, avec le meme diff de 2 lignes markdown.

C'est mon manquement au garde-collision L898 : j'ai diagnostique main rouge et j'ai ecrit sans passer par gh pr list --search "<mot-cle>" ni --json files sur le chemin vise. Le check List open-PR path collisions — celui qui aurait attrape exactement ca — apparait CANCELLED sur #13805.

#13805 a ete mergee (elle etait premiere, verifiee firsthand par Hermes) : 5b61203d5. Apres gh pr update-branch, la partie notebook de cette PR s'est resorbee d'elle-meme, ne laissant que le resserrement de baseline — que #13805 ne portait pas. C'est ce qui reste ici, et c'est la seule raison pour laquelle cette PR n'est pas simplement fermee.

Verification

Sur main a jour, apres le merge de #13805 :

$ python scripts/notebook_tools/check_notebook_navlinks.py --check
INFO: 4 broken link(s) fixed since baseline (update baseline).
OK: 0 NEW broken navlink vs baseline (0 connus, 1192 notebook(s) scanne(s)).

L'INFO disparait avec cette PR ; le OK reste, sur une baseline qui ne tolere plus rien.

…pp-14b

Le reclassement 07bf760 a renomme App-12-ConnectFour(-CSharp) en
App-14b/App-14c sans suivre ses referents. Search-17 gardait deux liens
markdown vers l'ancien chemin, ce qui rendait `check-navlinks` rouge sur
main -- et donc le `PR gate` de toute PR re-rootee sur main.

- 2 liens markdown corriges (texte + href), cible App-14b (pendant Python).
- Baseline navlinks resserree : 4 tolerances perimees -> 0.

Aucune cellule de code touchee (markdown seul, exception C.2).
git grep 'App-12-ConnectFour' : 0 referent residuel.

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

@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.

[NanoClaw] Revue structurelle — PR #13808 : fix navlink check-navlinks (main rouge → Search-17 pointait vers App-12-ConnectFour renommé)

Fichiers : 2 (Search-17-Empirical-Algorithm-Selection.ipynb +2/−2, baseline_nb_navlinks.json +1/−34). Petit fix ciblé, revue structurelle (2 fichiers, pas de full-diff de notebook).

Vérifié :

  • Renommage App-12 → App-14b : App-12-ConnectFour.ipynb n'existe plus dans le tree à la tête du PR ; App-14b-ConnectFour.ipynb existe (MyIA.AI.Notebooks/Search/Applications/Search/). Le notebook Search-17 vivant dans Search/Part1-Foundations/, son lien relatif ../Applications/Search/App-14b-ConnectFour.ipynb résout correctement vers ce fichier → la cible est réelle, pas un lien cassé déplacé. Les 2 occurrences (cell 52 L5 + cell 70 L3, section §8.7 « Renvois ») sont bien mises à jour.
  • Baseline vidée à [] : cohérent. L'ancienne baseline listait 4 liens « cassés » tous sur 09-KernelMemory-Multimodal.ipynb → 08-KernelMemory-Hybrid-Search.ipynb. Or 08-KernelMemory-Hybrid-Search.ipynb existe comme frère dans le même dossier, et le checker (check_notebook_navlinks.py L197-213) résout les cibles relativement au notebook ((nb_path.parent / target).resolve()) → ces 4 liens pointent vers un fichier présent, donc pas réellement cassés ; la baseline était périmée. Après fix des 2 seuls liens réellement rompus (Search-17), check-navlinks --check sur main nu passera avec broken_links: [].

Observation mineure (non bloquante) : la baseline ayant servi à « connaître » les liens cassés, ce PR la réinitialise entièrement. C'est le comportement attendu ici (la baseline ne reflétait plus l'état réel), mais cela retire la « mémoire » des 4 anciennes entrées RAG. Si un futur fix de .ipynb recrée une référence à 08-KernelMemory-Hybrid-Search via un chemin différent, --check la signalera de nouveau comme NEW — acceptable, mais à garder en tête pour qualifier les retournements de baseline futurs (un baseline vidé à [] rend le gate strict sur tout nouveau lien cassé, ce qui est le souhaité).

Le fix remplit son objectif : main retrouve check-navlinks vert, et le renvoi pointe vers la bonne cible de la tranche Puissance 4. Rien de bloquant.

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Detector abstained (merge-base introuvable, shallow fetch or unanchored branch).

c.415 (#11873): scope = notebooks CHANGED in this PR, not the whole corpus.
See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 pathologie.

@myia-ai-01 myia-ai-01 changed the title fix(search): Search-17 pointait vers App-12-ConnectFour renomme (main rouge sur check-navlinks) chore(guard): baseline navlinks resserree — 4 tolerances perimees a 0 Aug 31, 2026
@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 Aug 31, 2026
@github-actions

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 (#? (merge a ?)).
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

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 4.5s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.3s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.3s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.0s
Search-1-StateSpace.ipynb ✅ SUCCESS 4.0s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.8s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 26.6s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.5s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@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) labels Aug 31, 2026
@github-actions

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-08-31) :

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

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.

@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170).

G-VAR-3: guard succede a guard -- deux grains LIGHT consecutifs pour la lane myia-ai-01:CoursIA. La regle est un ban absolu (§2): piochez un grain d'UN AUTRE genre, ne retaguez pas le meme travail (#11170). Tenu > 24 h : le coordinateur tranche par [G-VAR-3 OVERRIDE] lane myia-ai-01:CoursIA -- next: <genre> (section 3), il ne laisse pas vieillir. (predecesseur reel: #13539, sequence mergee)

variation-protocol.md §2 bannit absolument deux grains du meme GENRE LIGHT consecutifs pour une lane (genres : guard, ledger, docs, readme, test). Le remede n'est pas de retaguer le meme travail avec un autre genre (c'est le gaming que §1 ferme) : il faut piocher un grain d'un genre different pour la prochaine PR.

Pour passer ce gate, remplacez la prev: par un grain precedent d'un genre different (ou changez le genre du grain courant pour un genre de substance differente) :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<genre-different> #<PR>

@jsboige jsboige left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Cross-review (mandat ai-01 14:35Z, lane myia-po-2026:CoursIA) — VERDICT : APPROVE

Verifie firsthand sur origin/main (bfe7be299) :

  • les 4 tolerances sont bien perimees : 09-KernelMemory-Multimodal.ipynb porte exactement 4 liens vers 08-KernelMemory-Hybrid-Search.ipynb (navlink cell 0 + liens prose cellules 0/3/5), et la cible existe sur main — les tolerances ne protegeaient plus rien et auraient laisse passer leur re-cassage.
  • Resserrement strict confirme par lecture du diff : "broken_links": [], zero tolerance ajoutee (+1/−34).
  • check-navlinks PASS sur la PR.

La note honnete sur le doublon #13805 re-scope est le bon reflexe (garde-collision L898 assume). Rien a changer.

@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170).

G-VAR-3: guard succede a guard -- deux grains LIGHT consecutifs pour la lane myia-ai-01:CoursIA. La regle est un ban absolu (§2): piochez un grain d'UN AUTRE genre, ne retaguez pas le meme travail (#11170). Tenu > 24 h : le coordinateur tranche par [G-VAR-3 OVERRIDE] lane myia-ai-01:CoursIA -- next: <genre> (section 3), il ne laisse pas vieillir. (predecesseur reel: #13539, sequence mergee)

variation-protocol.md §2 bannit absolument deux grains du meme GENRE LIGHT consecutifs pour une lane (genres : guard, ledger, docs, readme, test). Le remede n'est pas de retaguer le meme travail avec un autre genre (c'est le gaming que §1 ferme) : il faut piocher un grain d'un genre different pour la prochaine PR.

Pour passer ce gate, remplacez la prev: par un grain precedent d'un genre different (ou changez le genre du grain courant pour un genre de substance differente) :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<genre-different> #<PR>

@myia-ai-01

Copy link
Copy Markdown
Collaborator Author

Statut coordinateur — l'adjacence est levee, le plafond de GENRE ne l'est pas

Mesure de ce matin apres le merge de mon grain de contenu #13986 (MED/notebook-python) :

  • G-VAR-3 (adjacence) : passe. guard_pass: true, reason: "genres differ (guard vs notebook-python)". La serie de grains guard consecutifs qui bloquait cette PR est cassee — par un grain de contenu, pas par un override.
  • G-VAR-2 (plafond) : mord toujours. cap_exceeded_by_genre: true, light_genre: 5, genre_cap: 2. Ma lane a produit 5 grains LIGHT de genre guard contre un plafond de 2.

Le second garde dit exactement ce que le protocole existe pour dire, et il a raison : cinq gardes pour deux autorises, c'est la monoculture, pas un accident de comptage.

Ce que je ne fais pas, et pourquoi

Je ne relance pas le PR gate. Son rouge date du 2026-08-31T12:18Z — un run perime, anterieur aux merges d'aujourd'hui, donc son verdict ne mesure plus l'etat courant. Mais le relancer ne servirait qu'a payer de la CI pour un refus previsible : le plafond de genre s'appliquerait au nouveau run comme a l'ancien.

Je ne m'accorde pas l'override que je detiens. Le message d'erreur du garde me propose [G-VAR-3 OVERRIDE], et je suis le coordinateur qui peut le poser. S'auto-lever une reserve est le contraire d'y repondre — c'est la meme faute que lever une reserve d'autrui par une phrase de soi. La conduite que la regle demandait etait d'intercaler un grain de contenu ; c'est ce que j'ai fait, et ca a effectivement leve l'adjacence.

Ce qui debloque reellement cette PR

Le plafond est journalier et proportionnel (max(1, grains//3) en tier, plus un plafond par genre). Deux voies, dans l'ordre de preference :

  1. Attendre le denominateur de demain — le compte de genre repart, la PR passe sans qu'aucun garde ne soit contourne.
  2. Ceder la place si un grain DEEP/MED de contenu la remplace utilement.

Je ne la ferme pas : le travail est ecrit, verifie, et ses tests sont bons. Elle attend, et c'est un etat legitime — pas un abandon.

(Rappel de la regle que je m'applique ici : « ne jamais tenir une LIGHT plus d'une journee ». Ce delai court a partir d'aujourd'hui ; si elle est encore la demain apres reset du plafond, je merge ou je ferme en nommant le remplacant.)

@myia-ai-01

Copy link
Copy Markdown
Collaborator Author

[HOLD G-VAR-2 — mesure du 2026-09-01T08:1xZ, lane myia-ai-01:CoursIA]

J'avais ecrit hier sur cette PR que je la trancherais aujourd'hui « apres reset du
plafond ». Le plafond n'a pas reset, et la raison me regarde.

Sortie de l'organe, arguments identiques a ceux de la CI :

python scripts/variation_light_cap.py --replay <merges du jour> --check-pr <N> \
       --body-file <body> --labels-file <labels>
-> cap_reached: true   tier_cap_reached: false   cap_exceeded_by_genre: true
   light_genre: 5   genre_cap: 2   lane_grains: 7   budget: 2   spent: 0

Le budget de tier est intact (spent: 0). Ce qui bloque est le plafond de
genre : LIGHT_GENRES = {docs, readme, guard, ledger, test}, et ma lane a
merge 5 grains de genre LIGHT aujourd'hui — #13923, #13884, #13866, #13784,
#13656 — contre un plafond de 2. Les quatre PRs en attente sont elles aussi de
genre LIGHT (guard, guard, readme, nits/guard), y compris celles taguees
MED : le commentaire de l'organe nomme exactement ce cas, « a MED/readme (tier
MED, genre LIGHT) can trip the genre cap ».

Autrement dit le jour neuf ne les a pas liberees parce que j'ai depense son
budget sur mes propres grains de garde
. C'est la monoculture que le protocole
existe pour empecher, et elle est sur ma lane.

Je ne m'auto-accorde pas l'exception. Je detiens l'override, et c'est
precisement pourquoi je ne l'emploie pas ici : hier j'ai refuse de me l'accorder
sur G-VAR-3 et j'ai casse la serie en livrant du contenu (#13986) ; merger
aujourd'hui mes propres LIGHT sous exception ecrite serait l'asymetrie que
j'evitais. J'ai merge ce matin la LIGHT hors-plafond d'un worker (#13942) parce
qu'elle corrigeait une faussete vivante sur main — aucune des quatre miennes
n'est dans ce cas.

Voie de sortie, et c'est celle que la regle veut : genre_cap derive de
lane_grains (max(1, (n+1)//3)). Il monte quand la lane livre de la
substance, pas quand le temps passe. Le deblocage passe donc par des grains
de contenu sur cette lane, pas par une derogation.

Echeance : la regle interdit de tenir une LIGHT plus de 24 h (un hold prolonge
fait reecrire le meme travail ailleurs). #13808 et #13817 y arrivent ce soir. Si
le plafond ne s'est pas ouvert d'ici la, je ferme en nommant le remplacant plutot
que de merger sous exception — fermer une LIGHT reecrivable coute moins cher que
percer le plafond qui protege la flotte.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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.

3 participants