Skip to content

organ(rename_notebooks): target_violation juge un CHEMIN avec une regex ancree (31 faux positifs / 31 lignes) et contredit canonical_target #17834

Description

@jsboige

Deux défauts mesurés dans la validation de cible de scripts/notebook_tools/rename_notebooks.py (organe mergé en #17801), tous deux rencontrés en appliquant la table de la série SmartContracts (#16231, commentaire 5836104610).

1. target_violation reçoit un chemin et juge une grammaire ancrée — 100 % de faux positifs

main() (l.803-808) parcourt pairs issu de load_mapping(...) — dont les entrées sont des chemins relatifs complets — et passe new tel quel à target_violation(new). Or target_violation (l.253-256) applique :

stem = re.sub(r"\.ipynb$", "", new_name, flags=re.I)
m = STEM_RE.match(stem)          # STEM_RE = ^(?P<prefix>[A-Za-z][A-Za-z0-9]*)-(?P<num>\d+)...

STEM_RE est ancrée en ^ : sur un chemin, le premier caractère est M de MyIA.AI.Notebooks/…, et le motif échoue dès le premier / ou ..

Mesure (25/09, table SmartContracts, 31 lignes) :

Appel Résultat
target_violation("MyIA.AI.Notebooks/SymbolicAI/SmartContracts/00-Foundations/SC-01-Setup-Foundry-Python.ipynb") "hors grammaire de serie (prefixe absent, index en tete ou separateur _)"
target_violation("SC-01-Setup-Foundry-Python.ipynb") None

Conséquence : --mapping imprime 31 avertissements sur 31 lignes, sur toutes les séries, quel que soit le sérieux de la table. Ce n'est pas cosmétique : le message est accompagné (l.806-807) de « une cible non canonique promet un second renommage -- le dire, ne pas le taire », et le docstring de target_violation (l.249-251) prescrit que la ligne tombe en A TRANCHER. Un opérateur qui lit ce flot peut donc re-trancher des lignes déjà canoniques, ou renoncer au contrôle — c'est-à-dire exactement l'inverse du but.

Correctif suggéré : target_violation(os.path.basename(new)) à l'appel (l.804), ou dans la fonction elle-même.

2. canonical_target et target_violation se contredisent sur la même cible

Sur SC-7b-ERC20-Lean-Verification-Companion.ipynb (noyau python3) :

  • canonical_target("SC-7b-ERC20-Lean-Verification-Companion.ipynb", "python") → SC-07b-ERC20-Lean-Verification-Companion-Python.ipynb (le titre ERC20-Lean-Verification-Companion ne se termine pas par un mot de noyau, donc la l.232 ne retire rien) ;
  • target_violation("SC-07b-ERC20-Lean-Verification-Companion-Python.ipynb") → "mot de noyau en infixe du titre" (_KERNEL_INFIX_RE, l.259, attrape -Lean-).

Le générateur de --propose produit donc une ligne que le lint du même organe déclare non livrable. Sur cette série, la table --propose contenait une ligne qui, par contrat (l.249-251), devait tomber en A TRANCHER — elle était proposée comme un renommage ordinaire.

Ce que j'ai fait de mon côté : la ligne est tenue hors de la PR de renommage et laissée en A TRANCHER avec la mesure, la décision de grammaire étant rendue au coordinateur (« Lean » y est le sujet du carnet — vérification Lean d'un ERC-20 — et non le nom du noyau, mais _KERNEL_INFIX_RE ne fait pas cette distinction).

Arbitrage attendu (un des deux) : soit canonical_target applique la même règle que le lint (retirer l'infixe), soit _KERNEL_INFIX_RE est restreint aux mots de noyau non porteurs de sens métier, soit la règle de grammaire tolère un infixe quand le mot désigne le sujet. Les deux fonctions doivent converger : aujourd'hui --propose et le contrôle de la table ne jugent pas avec le même critère.

Note de méthode

Ces deux défauts ont été trouvés en consommant l'organe, pas en le relisant. Le premier se voit sur n'importe quelle série en une commande ; le second demande de croiser les deux fonctions. Aucun des deux n'empêche le renommage — target_violation est un avertissement, pas un refus — ce qui est précisément pourquoi ils peuvent passer inaperçus longtemps.

See #16231 (série SmartContracts, où les deux ont été rencontrés).

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions