Repository navigation
feat(notebook-tools,#10921): instrument README .ipynb link rendering check - #14393
Conversation
…check Grain: LIGHT/notebook-python — lane myia-po-2026:CoursIA-2 — prev: LIGHT/guard #14380 Per-PR advisory CI gate. Mesure au depot (HEAD 2e28c2a): 2096 liens .ipynb dans 136 READMEs de serie, 0 rendu en .html (cause racine = _quarto.yml notebook-preview: false). La correction en volume est deliberement hors scope (G.4 composite + strategie-dépendante : notebook-preview: true vs URLs GitHub blob viewer). Cette PR livre l'instrument + le gate advisory ; la decision strategique reste a ai-01 (EPIC #10921). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
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 |
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] — #14393 instrumentation liens .ipynb/README : diff intégral lu (workflow YAML 148 l. + checker Python 275 l.), logique de résolution + classification vérifiées, pas de secret au diff.
Bilan : instrumentation saine et honnête. Points vérifiés firsthand :
classify_link(RENDU/MANQUE/BRUT) : logique correcte — MANQUE si l'.ipynbn'existe pas, RENDU si sibling.html, BRUT sinon. Les 3 verdicts sont bien distincts et la docstring est fidèle au code.extract_links: percent-decode + strip fragment/query avant résolution (gère les noms accentués%C3%A9), résolution contre le parent markdown par défaut avec override--link-rootpour le dump CI/tmp— le piège de résolution est couvert.- Workflow advisory (exit 0 toujours) assumé et documenté dans le YAML : label delta signé
notebook-link-render-delta: +/-N, cleanup des labels précédents avectry/catch(un label absent ne casse pas le job).permissions: pull-requests: writeminimal,mapfile+set +epropres. - Le scope instrumentation-only (correction 2096 liens = composite G.4) est correctement déféré.
Deux remarques (non bloquantes, advisory de toute façon) :
- Dans la boucle CI,
|| echo 0en fallback si le checker échoue sur un README : un échec de scan d'un README silencieusement compte 0 lien BRUT — le delta peut sous-estimer un +BRUT réel. Un compteur d'erreurs séparé (p.ex. label suffixscan-error) éviterait de confondre « 0 liens » et « échec de scan ». MANQUEest classé dans le compte total mais le label delta ne trace queBRUT— un README qui perd un notebook (lien dangling) reste delta 0. À garder en tête pour la jauge EPIC #10921 si les MANQUE deviennent non-nuls.
Verdict : solide pour du LIGHT/instrumentation, les deux remarques peuvent partir en follow-up. (contrainte token : COMMENT only)
Le workflow de l'instrument notebook-link-render est reste a la racine de deux violations jusqu'a c.903 : (1) il n'etait pas dans `SELF_HOSTED_WORKFLOW_ALLOWLIST` (code=WORKFLOW_NOT_ALLOWED), (2) son job `check-link-render` ne portait pas la SAME_REPO_GUARD requise pour un trigger `pull_request` sur runner self-hosted (code=SAME_REPO_GUARD). Correctif : - Ajout d'une tranche 6 datée 2026-09-03 dans `scripts/ci/check_self_hosted_runner_policy.py` (owner myia-po-2026:CoursIA-2) avec rationale explicite : garde advisory pur-Python stdlib-only, declencheur `pull_request` filtre sur `MyIA.AI.Notebooks/**/README.md`, scan delta-PR vs main merge-base, label signe, aucun GITHUB_TOKEN cote job. Rollback = revert de cette PR. - Forme universelle parentheisee de la garde (forme acceptee par `test_universal_pull_request_guard_is_accepted`, #13874) : `if: ${{ github.event.pull_request.head.repo.full_name == null || github.event.pull_request.head.repo.full_name == github.repository }}` -- couvre pull_request et pull_request_target en un seul predicat ; les forks PRs se font skipper proprement par pr_gate avant d'atteindre le runner. Verification : - `python scripts/ci/check_self_hosted_runner_policy.py --check` : `[self-hosted-policy] OK` - `pytest scripts/tests/test_check_self_hosted_runner_policy.py` : 49/49 PASSED (dont `test_current_repository_self_hosted_jobs_satisfy_isolation_policy` qui rougissait depuis l'ouverture 2026-09-02) Grain: LIGHT/guard -- lane myia-po-2026:CoursIA-2 -- prev: LIGHT/notebook-python #14393 Co-Authored-By: Claude-Code <noreply@anthropic.com>
|
[REPAIR c.903 — Plumbers-10921 notebook-link-render-check : 2 violations policy self-hosted résorbées] Suite au constat CI : Diagnostic firsthand (lecture du job log run 33690254076, 2026-09-02T22:28:33.9375103Z) :
Correctif appliqué (commit (A) Ajout d'une tranche 6 datée 2026-09-03 dans
(B) Forme universelle parenthésée de la SAME_REPO_GUARD (forme acceptée par if: ${{ github.event.pull_request.head.repo.full_name == null || github.event.pull_request.head.repo.full_name == github.repository }}Cette forme couvre Validation locale :
CI re-roule sur la tête Tells nouveaux ★★★
Plancher R1 TENU (REPAIR P0 résorbé par cette lane), G-VAR-1 NON TENU en propre (REPAIR META hérité). Substance CONTENU arrive sur |
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
Grain: LIGHT/notebook-python — lane myia-po-2026:CoursIA-2 — prev: LIGHT/guard #14380
Mesure repo-wide (HEAD 2e28c2a)
python scripts/notebook_tools/check_notebook_link_render.py --tracked-only2096 liens .ipynb dans 136 READMEs de série, 0 rendu en .html. La cause racine est
_quarto.ymlligne 1264 —notebook-preview: false— qui empêche Quarto de rendre les notebooks en HTML. Conséquence : 100 % des liens README -> notebook sont des liens bruts (raw GitHub URLsans preview HTML local).Pourquoi cette PR est instrumentation-only
La correction en volume (bascule de 2096 liens vers
.html, ou vers des URLs GitHub blob viewer) serait :notebook-preview: truecôté_quarto.yml, ou réécrire les URLs versgithub.com/jsboige/CoursIA/blob/<sha>/<path>.ipynb) ne sont pas équivalentes côté SEO, GH Pages rendering, et temps de build Quarto. La décision est coordinateur-territoire, pas worker-territoire.Cette PR livre l'instrument de mesure + un advisory CI gate qui signale l'évolution par-PR, sans toucher aux 2096 liens ni à
_quarto.yml. La décision stratégique reste à ai-01 (EPIC #10921 umbrella).Contenu
scripts/notebook_tools/check_notebook_link_render.py(nouveau, +213 lignes)\.ipynb, classification RENDU (.htmlsibling existe) / BRUT (.ipynbexiste seul) / MANQUE (rien n'existe). Sortie--json(machine) ou humain (par-PR + global). Args :[path](défautMyIA.AI.Notebooks),--tracked-only,--json,--verbose,--fail-on {RENDU,BRUT,MANQUE,ANY},--link-root DIR(CI : dump README dans/tmp, résout contre le vrai repo). Stdlib-only (pas de deps). Modèle :check_exec_sequence.py(style harness cohérent)..github/workflows/notebook-link-render-check.yml(nouveau)exit 0partout) : sur PR touchantMyIA.AI.Notebooks/**/README.md, compare le nombre de liens BRUT sur les READMEs modifiés par la PR (HEAD) vsmain(merge-base), pose un labelnotebook-link-render-delta: +/-N (M readmes)(delta signé, signal par-PR). Inspiré demachine-dep-timing-advisory.yml(label-driven, jamais bloquant) +notebook-navlink-check.yml(chemin Python pur). Le pourquoi advisory : un check bloquant échouerait sur toute PR touchant un README tant que la décision stratégique n'est pas rendue — exactement le défaut que cet instrument ne doit pas porter.Vérification end-to-end
Mesure c.891 (script, worktree)
Smoke-tests passés
MyIA.AI.Notebooks/Search/README.mdin-repo/tmp/_pr_readme.mdSANS--link-root/tmp/_pr_readme.mdAVEC--link-root=<readme.parent>--fail-on ANY--fail-on MANQUE--json{head, target, tracked_only, link_root, summary, records}cohérente ✓Décisions instrument
Cr%C3%A9ateur→Créateur) : sans ça, 2 liens SemanticKernel sont classés MANQUE à tort.--link-root: flag dédié pour le cas CI où le README est dumpé dans/tmp/. Sans ce flag, tous les liens deviennent MANQUE car les.ipynbne sont pas dans/tmp/.--tracked-only: aligné sur le standardcheck_exec_sequence.py(intersectiongit ls-files). Évite le bruit des fichiers non-trackés (worktrees voisines, staging accidentel).notebook-preview: false: out of scope. Tracé dans le body EPIC [EPIC] Site GitHub Pages jsboige.github.io/CoursIA — audit & refonte (navigation, parcours, rendu notebooks) #10921.machine-dep-timing-advisory.yml— apprendre du défaut).Liens
issuecomment-5517216614(initial) +issuecomment-5517226838(CLAIMED-AMEND paths ciblés)scripts/notebook_tools/check_exec_sequence.py(argparse, tracked_only, --json, --fail-on).github/workflows/machine-dep-timing-advisory.yml(label delta signé).github/workflows/notebook-navlink-check.yml(jobs paths-filtered)