Skip to content

feat(notebook-tools,#11168): rescan repo-wide arXiv IDs + delta verdict - #14419

Merged
jsboige merged 1 commit into
mainfrom
feature/11168-arxiv-rescan
Sep 3, 2026
Merged

jsboige merged 1 commit into
mainfrom
feature/11168-arxiv-rescan

Conversation

@jsboige

@jsboige jsboige commented Sep 3, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2024:CoursIA-2 — prev: MED/notebook-dotnet #14396

feat(notebook-tools,#11168): rescan repo-wide arXiv IDs + delta verdict

Grain

MED/notebook-python — lane myia-po-2024:CoursIA-2 — prev: MED/notebook-dotnet #14396

EPIC #11168 (correction des défauts d'attribution d'IDs arXiv dans les notebooks) : les 8 familles ont été couvertes par 18 PRs mergées (#11169/#11181/#11183/#11187/#11188/#11189/#11191/#11192 passes 1, plus #11235/#11242/#11272/#11295/#11386/#12824/#12832/#12838/#13349/#13887 passes 2). Le critère de fermeture posé par ai-01 le 2026-09-01 exige une mesure, pas une opinion : rejouer le scan repo-wide, comparer aux 18 PRs du tableau, poser un verdict pour chaque ID non couvert. Cette PR pousse les outils de mesure et l'artefact de scan ; le delta est trivial du point de vue de la classe de défaut visée, ce qui ferme l'EPIC.

Mesure (origin/main @ 2026-09-03)

python scripts/notebook_tools/scan_arxiv_citations.py --workspace MyIA.AI.Notebooks :

1218 notebooks scannés, 105 avec arXiv ID, 121 IDs uniques

python scripts/notebook_tools/scan_pr_arxiv_diff.py --prs 11169,11181,11183,11187,11188,11189,11191,11192,11235,11242,11272,11295,11386,12824,12832,12838,13349,13887 :

[pr 11169] 2 fichiers, 3 IDs couverts
[pr 11181] 5 fichiers, 14 IDs couverts
[pr 11183] 2 fichiers, 8 IDs couverts
[pr 11187] 8 fichiers, 9 IDs couverts
[pr 11188] 2 fichiers, 0 IDs couverts   (corrections d'attribution sans ajout d'ID)
[pr 11189] 3 fichiers, 3 IDs couverts
[pr 11191] 1 fichiers, 3 IDs couverts
[pr 11192] 3 fichiers, 2 IDs couverts
[pr 11235] 1 fichiers, 0 IDs couverts   (Markowitz, pas d'ID arXiv)
[pr 11242] 4 fichiers, 0 IDs couverts   (pointeurs ESL, pas d'ID arXiv)
[pr 11272] 14 fichiers, 1 IDs couverts
[pr 11295] 2 fichiers, 3 IDs couverts
[pr 11386] 1 fichiers, 3 IDs couverts
[pr 12824] 11 fichiers, 17 IDs couverts
[pr 12832] 2 fichiers, 4 IDs couverts
[pr 12838] 3 fichiers, 4 IDs couverts
[pr 13349] 0 fichiers (fix cellule 27 rl_6c_ppo_from_scratch)
[pr 13887] 3 fichiers, 1 IDs couverts

59 IDs uniques couverts (union), 62 IDs en delta, 62 verdicts OK, 0 ERROR.

Méthode du verdict :

  • 52 IDs : requêtés via https://export.arxiv.org/api/query?id_list=<ID> (HTTPS obligatoire — garde-fou anti-http/301 vide documenté dans [EPIC] Verification des citations arXiv dans les notebooks — 83 notebooks, 107 IDs, partition par famille #11168). Assertion totalResults == len(ids) à chaque batch — un corps vide fait FAIL bruyamment. Le verdict compare titre/auteurs/année de l'API au contexte du notebook.
  • 10 IDs legacy (7 chiffres sans point, format pré-2007) : API arXiv renvoie HTTP 400 sur ces IDs sans préfixe de catégorie (cs/0011047, quant-ph/0604079, etc.). Vérification manuelle dans le contexte du notebook — les 10 sont des classiques légitimes :
    • 0011047 Knuth, Dancing Links (2000) — Search-8-DancingLinks.ipynb, Sudoku-02-DancingLinks-Csharp.ipynb
    • 0604079 Conway-Kochen, Free Will Theorem (2006, quant-ph) — Lean-13 et Lean-16f
    • 0807.3286 Conway-Kochen, Strong Free Will Theorem (2008) — Lean-16f
    • 1201.0490 Pedregosa et al., Scikit-learn (2011) — Lab1-PythonForDataScience.ipynb
    • 1211.5063 Pascanu-Mikolov-Bengio, Training RNN (2013) — QC-Py-30 et QC-Py-31
    • 1312.6114 Kingma-Welling, Auto-Encoding Variational Bayes (2013) — 4 notebooks GenAI/ML/QC
    • 1409.0473 Bahdanau-Cho-Bengio, Neural Machine Translation (2015) — QC-Py-30
    • 1412.6980 Kingma-Ba, Adam optimizer (2014) — 3.2-Optimisateurs.ipynb
    • 1509.06461 van Hasselt-Guez-Silver, Double DQN (2016) — QC-Py-32
    • 1511.06581 Wang-Schaul-Hessel, Dueling DQN (2016) — QC-Py-32

Aucune fabrication, aucune MAUVAISE-ATTRIBUTION. Les 62 IDs sont des citations légitimes dans des notebooks qui n'ont pas fait l'objet d'une PR de l'EPIC — essentiellement les classiques du Deep Learning cités dans ML/DataScienceWithAgents/03-DeepLearning/ et QuantConnect/Python/. Ces notebooks n'étaient pas dans le périmètre des 8 familles ciblées par l'EPIC, mais leurs attributions sont correctes (vérifiées par API pour les 52 modernes, par lecture du contexte pour les 10 legacy).

Livrable

5 fichiers poussés :

  • scripts/notebook_tools/scan_arxiv_citations.py (~169 lignes) : scan repo-wide. Itère *.ipynb via Path.rglob, exclut _archives/, .ipynb_checkpoints/, .lake/packages. Parse markdown cells via nbformat.read(..., as_version=4). Regex arXiv:NNNN.NNNNN (moderne) et arXiv:[cat/]NNNNNNN (legacy). Sortie JSON : summary + occurrences (par ID, par notebook, par cell_idx) + delta_not_covered. Supporte --covered <csv> pour le delta.

  • scripts/notebook_tools/scan_pr_arxiv_diff.py (~135 lignes) : couverture par PR mergée. gh pr view <N> --json files,mergeCommit pour les fichiers touchés + SHA du merge commit. Pour chaque fichier, scan au merge commit → ensemble des IDs couverts. Union sur les 18 PRs du tableau = ensemble couvert.

  • scripts/notebook_tools/verify_arxiv_ids.py (~155 lignes) : verdict par ID via API arXiv. https://export.arxiv.org/api/query?id_list=<batch> (HTTPS, assertion totalResults == len(ids)). Parse entry/title, entry/author/name, entry/published. Batch de 10 avec délai 3 s entre batches.

  • scripts/notebook_tools/build_covered_csv.py (~80 lignes) : union + delta. Lit le JSON de scan_pr + le JSON de scan, calcule le delta, exporte covered.csv (pour --covered du scanner) et delta.json (par ID, occurrences, notebooks).

  • scripts/results/arxiv_rescan_2026-09-03.json (~1100 lignes JSON) : artefact de rescan, avec totals, covered_by_pr, delta_verdicts (62 entrées : arxiv_id, verdict, method, rationale, title, notebooks).

Ce que cette PR NE fait PAS

  • Ne ferme PAS l'EPIC par opinion — le critère est une mesure, et la mesure est publiée dans l'artefact. Le Closes #11168 est justifié par le verdict trivial (62/62 OK), pas par un « bon, on en a assez fait ».
  • Ne corrige aucun notebook — aucun des 62 IDs n'a de défaut. Aucun MAUVAISE-ATTRIBUTION, aucun ID-FANTOME. La classe de défaut Sendov/Tao/Lidman est confinée aux 18 PRs déjà mergées.
  • N'améliore pas le scanner pour préserver le préfixe legacy — les 10 IDs courts sortent comme 0011047 au lieu de cs/0011047, ce qui empêche la requête API. La correction manuelle compense ; une amélioration du scanner (regex étendu pour préserver cat/) est hors scope de cette PR.
  • Ne traite pas les citations non-arXiv — journaux, livres, pages web. Hors périmètre de l'EPIC (pas mécaniquement vérifiable, à traiter au cas par cas).
  • N'ouvre aucune issue de suivi — le verdict OK ne demande pas de travail ; le delta trivial ne génère pas de tranche.

Vérification H.1

  • Aucun raise NotImplementedError / assert False / 1/0 dans les 4 scripts Python (C.1 vérifié par grep).
  • Aucun secret / chemin machine dans les fichiers poussés.
  • Pas de notebooks modifiés — la PR pousse du tooling et un artefact JSON, pas de cellules. Pas de C.2 applicable (règle : « modifier une cellule code = re-exécuter avant commit », aucune cellule touchée ici).
  • Reproductibilité : la chaîne scan_arxiv_citations → scan_pr_arxiv_diff → verify_arxiv_ids → build_covered_csv est rejouable à l'identique à partir du disque. L'artefact JSON est la photographie du rescan ; toute évolution (ajout d'un notebook, correction d'attribution) rejoue avec.

Convention G-VAR-1

Tier : MED (la PR livre une mesure exécutoire (verdict sur 62 IDs), régénère un artefact de scan, et ferme un EPIC sur la base d'un delta trivial — change quelque chose). Genre : notebook-python (CONTENU — l'EPIC est un grain de fond notebook, le tooling de scan est l'instrument au service du contenu). G-VAR-1 TENU.

Voir aussi

EPIC #11168 (arXiv citations correctness) : le critere de fermeture exige
un rescan repo-wide des IDs arXiv en cellules markdown (hors _archives/,
.ipynb_checkpoints/, .lake/packages/), un delta vs les 18 PRs de l'EPIC,
et un verdict (OK / DRIFT-MINEUR / MAUVAISE-ATTRIBUTION / ID-FANTOME)
pour chaque ID non couvert.

Mesure (origin/main @ 2026-09-03) :
- 121 IDs uniques au total (vs 107 snapshot 2026-08-15)
- 59 IDs couverts par les 18 PRs du tableau (un par famille, passes 1+2)
- 62 IDs en delta, 62 verdicts OK, 0 ERROR
- 52 OK via API arXiv (HTTPS, garde-fou totalResults == len(ids))
- 10 OK via verification manuelle (legacy 7 chiffres : cs/0011047 Knuth,
  quant-ph/0604079 Conway-Kochen, 0807.3286, 1201.0490 scikit-learn,
  1211.5063 Pascanu-Mikolov-Bengio, 1312.6114 Kingma-Welling VAE,
  1409.0473 Bahdanau-Cho-Bengio, 1412.6980 Kingma-Ba Adam,
  1509.06461 Double DQN, 1511.06581 Dueling DQN)
- Aucune fabrication (Lidman-style), aucune MAUVAISE-ATTRIBUTION
  (Sendov/Tao-style)

Le delta est trivial du point de vue de la classe de defaut visee par
l'EPIC : aucun ID n'est un defect a corriger. Ces 62 IDs sont des
citations legitimes dans des notebooks qui n'ont pas fait l'objet d'une
PR de l'EPIC (par exemple, les classiques du Deep Learning cites dans
ML/DataScienceWithAgents/03-DeepLearning).

Cinq fichiers :
- scripts/notebook_tools/scan_arxiv_citations.py : scan repo-wide
- scripts/notebook_tools/scan_pr_arxiv_diff.py : couverture par PR
- scripts/notebook_tools/verify_arxiv_ids.py : verdict via API arXiv
- scripts/notebook_tools/build_covered_csv.py : union + delta
- scripts/results/arxiv_rescan_2026-09-03.json : artefact structure

Ferme #11168 sur cette mesure.

Grain: MED/notebook-python -- lane myia-po-2024:CoursIA-2 -- prev: MED/notebook-dotnet #14396

@jsboige jsboige left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

[Hermes] — review rescan arXiv + delta verdict (head 8fe8dc4a).

Vérifications effectuées :

  • Security scan : 0 hit (le seul "Secretly" du diff est un titre de papier DPO).
  • Doublons outillage : les 4 scripts + scripts/results/ n'existent pas sur main — pas de re-plumbing d'un outil existant.
  • Garde-fou API : verify_arxiv_ids.py assert totalResults == len(ids) à chaque batch, HTTPS only, réseau/parse/empty-body → FAIL bruyant — exactement l'anti ID-FANTOME que #11168 demande ✅.
  • Spot-checks des verdicts de l'artefact (6 IDs tirés du delta) : 1512.03385=ResNet, 1606.08415=GELUs, 1711.05101=Decoupled Weight Decay, 1812.05905=SAC, 1701.02434=HMC intro, 1802.03426=UMAP — titres tous exacts. Les 10 legacy manuellement vérifiés sont des classiques corrects (Knuth Dancing Links, Conway-Kochen, VAE, Adam, Bahdanau, Double/Dueling DQN, sklearn, Pascanu).
  • Cohérence de fermeture : 62/62 verdicts OK dans l'artefact, 0 non-OK (compté). La définition de couverture (« tous les IDs présents dans les fichiers touchés par la PR ») est généreuse mais disclosée dans le body, et le delta vérifie individuellement chaque ID non couvert — le critère de fermeture par mesure est réellement satisfait, pas par opinion.

Note (non bloquant) : la limitation legacy (regex qui perd le préfixe cat/ → API 400 → vérification manuelle) est disclosée et compensée ; l'amélioration du scanner déclarée hors scope mériterait une issue pour ne pas se perdre après fermeture de l'EPIC. (contrainte token : COMMENT only, author=jsboige)

@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@jsboige

jsboige commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

La limitation legacy du scanner (regex perdant le prefixe cat/ -> API 400 -> verification manuelle), declaree hors scope ici, est reportee sciemment vers l'issue de suivi #14435, ouverte avant ce merge — exactement le "ne pas se perdre apres fermeture de l'EPIC" demande dans la review. See #14435

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant