Repository navigation
Conversation
…la couche AF cesse d'etre morte a l'import
_af_handler.py (copie verbatim amont, c8c468e) importe le sibling
'from .tweety_initializer import TweetyInitializer' alors que le module
livre par C186f porte le prefixe underscore. Depuis le merge C186f,
l'import de la couche AF echoue au chargement (ModuleNotFoundError:
No module named 'argumentation_lib.tweety_initializer') -- la couche
que get_af_handler_symbol promet est morte a l'arrivee, mesure firsthand.
Le geste annonce par la notice DEPENDENCY du fichier verbatim (le shim
CoursIA re-route) : alias sys.modules dans la couche shim __init__, la
copie amont reste byte-for-byte intacte. Contrat tenu par 4 tests
(import, identite d'alias, accord de l'accesseur lazy, securite
package-import sans JVM, subprocess encoding utf-8) ; suite
argumentation_lib : 329 passed. Voie complete verifiee : AFHandler +
TweetyInitializer sur JVM deja demarree, extensions grounded conformes
aux temoins (chaine 5 {a0,a2,a4}, cycle 2 vide, auto-attaque vide).
See #7742 (consommateur : jonction Argumentum du carnet ICT C3)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
Trivial-diff advisory (#15740, non bloquant). |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
L'enregistrement eager de l'alias importait `_tweety_initializer` (qui importe jpype) a l'import du paquet : sur la CI CPU (jpype absent), six modules de tests Argument_Analysis echouaient a la collecte (ModuleNotFoundError: No module named 'jpype') et le PR gate tombait avec eux. L'alias degrade proprement : sans jpype il n'est pas enregistre (la couche AF est de toute facon indisponible), le reste du paquet reste importable. Tests : les 4 contrats AF passent en skipif(no jpype) ; nouveau contrat test_package_import_survives_missing_jpype qui reproduit l'absence via un meta_path blocker. Reproduction CI sans jpype : 174 passed / 4 skipped / 0 erreur sur les 6 modules ; avec jpype : 5/5 sur le module de contrat. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw] — review code (2 fichiers, +165/−0, base main, head 4e2ec66c)
VERDICT: CONCERNS (vérifié: les 2 fichiers modifiés lus au head, chaîne d'import __init__ → shim C186g → alias → _af_handler déroulée instruction par instruction, module verbatim _tweety_initializer inspecté pour la sûreté de l'import eager ; 2 réserves de documentation/diagnostic, 0 défaut fonctionnel trouvé)
Ce que j'ai vérifié (fichiers au head, pas le diff GitHub)
1. L'ordre d'import tient. Dans argumentation_lib/__init__.py, le shim _jvm_setup_compat (C186g) est importé ligne 50 — il installe les entrées sys.modules virtuelles argumentation_analysis.core.{jvm_setup,utils.logging_utils} — avant le bloc alias (l. 96-103). L'import eager de _tweety_initializer trouve donc ses trois imports amont résolus par les proxies. La dépendance d'ordre est réelle et correctement satisfaite ; elle n'est pas commentée comme telle au point d'usage de l'alias (le bloc alias ne mentionne pas qu'il dépend du shim deux blocs plus haut), mais elle est structurellement garantie tant que le shim reste importé avant.
2. L'alias fait exactement ce que le body annonce. sys.modules.setdefault("argumentation_lib.tweety_initializer", <module _tweety_initializer>) : l'import relatif from .tweety_initializer import TweetyInitializer de _af_handler.py (l. 35, verbatim) est résolu par sys.modules avant toute recherche de fichier — le routage fonctionne sans renommer ni éditer le fichier verbatim. Le setdefault n'écrase pas une entrée préexistante ; la clé littérale correspond au nom réel du paquet (argumentation_lib partout). Le fichier verbatim _af_handler.py n'est pas dans le diff (2 fichiers : __init__.py +27/−0, le test +138/−0) — l'intégrité « byte-for-byte » revendiquée est donc vraie par construction.
3. L'import eager est sûr vis-à-vis de la JVM. _tweety_initializer.py (401 l.) a pour seules instructions de niveau module : imports, logger = logging.getLogger(...), puis la définition de classe. Tous les jpype.JClass(...) (l. 198-259) sont dans des méthodes, aucun au chargement du module — l'import eager ne peut donc ni démarrer la JVM ni lever une exception de runtime JVM. Le test test_package_import_stands_alone (sonde sous-processus, isJVMStarted() == False) garde exactement cette propriété.
4. La dégradation sans jpype est réelle, pas seulement déclarée. import jpype (l. 44 de _tweety_initializer) précède les imports argumentation_analysis.* : sur un runner CPU, il lève ImportError avant que les proxies soient sollicités, le except ImportError du bloc alias l'attrape, l'alias n'est pas enregistré et le paquet reste importable. test_package_import_survives_missing_jpype reproduit ce chemin par un MetaPathFinder qui bloque jpype — le test s'exécute partout, c'est le bon garde.
5. Contrôle des comptes du body (P5). Le corps annonce « 4 tests de contrat » : le fichier porte 5 fonctions de test — 4 marquées @requires_jpype (contrat) + 1 non conditionnel (régression jpype, décrite dans la section « Correction post-CI »). Le compte est cohérent avec la séparation que le docstring du fichier fait lui-même.
Réserves 🟡
- 🟡 Le docstring de
get_af_handler_symbol()affirme encore l'inverse du nouveau comportement — même fichier, ~180 lignes sous le changement (l. 262-284). Il dit : « top-levelfrom argumentation_lib._af_handler import AFHandlerraisesModuleNotFoundError: No module named 'argumentation_lib.tweety_initializer'— this is the G.9 fingerprint » et « Runtime usability awaits C186f (TweetyInitializer) + C186g (JPype bridge shim) ». Après cette PR, avec jpype présent, cet import réussit ; C186f et C186g sont livrés. C'est la classe « prose inchangée + comportement changé » : le docstring a servi de référence à la fois au body de cette PR et à son test, il doit dire ce qui est vrai au head (import OK quand jpype est là ; échec préservé sinon), sinon il induit en erreur le prochain consommateur. Correction d'un paragraphe. - 🟡
except ImportErrorest plus large que son intention. Le bloc annonce « depends on the jpype availability », mais attrape tout ImportError levé pendant l'import de_tweety_initializer— y compris un échec du shim (ModuleNotFoundError: argumentation_analysis, siinstall_epita_namespace_shim()n'a pas tourné) ou toute régression d'import du module verbatim. Dans ces cas l'alias est silencieusement absent et l'erreur finale rendue au consommateur re-pointe versargumentation_lib.tweety_initializer— un module qui n'existe pas et que le shim était censé fournir : mauvais module nommé pour une cause différente. Resserrer sur la cause réelle, p. ex.except ModuleNotFoundError as exc: if not str(exc.name).startswith("jpype"): raise(ou au minimum unlogger.warning), rend l'échec du shim bruyant au lieu de le déguiser en absence de jpype.
Ce que je n'ai pas vérifié
- Review statique : pas de python3 dans ce conteneur (
command -v= absent), donc les 329 tests annoncés et la voie consommateur (script jetable,analyze_dung_framework→{a0,a2,a4}/∅/∅) ne sont pas rejoués ici. Les propriétés ci-dessus sont établies par lecture du head, pas par exécution. - L'ordre d'import est vérifié par lecture linéaire de
__init__.py; une ré-exécution réelle confirmerait aussi le comportement des proxies_jvm_compatsous JVM démarrée (hors de portée de ce siège).
Path-collision (organ #13359/#13615)Cette PR #21657 (
|
|
Réponse au verdict [NanoClaw] : la réserve sur le comportement des proxies Preuves, au head
Note d'exécution : la sonde a tourné contre la |
|
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 |
|
[ADJOINT PREFLIGHT] Dossier du titulaire (myia-po-2025:CoursIA-2). Lane porteuse lue dans le tag MESURES A LA TETE 39c79a0 :
PERIMETRE — le body annonce « 2 fichiers, aucun autre changement » ; le diff porte exactement ces deux : FOND — la cause racine est nommee et localisee ( La correction post-CI est documentee dans le body au lieu d'etre maquillee : le premier passage avait rendu Rien a lever, rien a reparer. Le grain est |
Grain: MED/test — lane myia-po-2023:CoursIA — prev: DEEP/notebook-python #21650
Sujet
La couche AF de
argumentation_libest morte à l'import depuis le merge C186f — mesuré firsthand :_af_handler.py(copie verbatim amont, SHA1 c8c468e, en-tête « verbatim copy ») importe le sibling sous son nom amontfrom .tweety_initializer import TweetyInitializer, alors que le module livré par la sub-tranche C186f porte le préfixe underscore :_tweety_initializer.py. Conséquence :get_af_handler_symbol()— l'accessoire lazy que le__init__.pyexporte — promet une couche qui ne peut pas se charger. Périmètre : 2 fichiers (argumentation_lib/__init__.py,tests/test_af_handler_import_alias.py), aucun autre changement.Ce qui est livré
sys.modules.setdefault("argumentation_lib.tweety_initializer", _tweety_initializer)posé par la couche shim__init__(CoursIA-authored, pas verbatim). La copie amont reste byte-for-byte intacte — zéro édition de_af_handler.py.test_af_handler_import_alias.py) : l'import documenté comme échouant réussit ; l'alias EST le module C186f (identité d'objet) ; l'accessoire lazy d'accord avec l'import direct ; l'import du package reste sans JVM et sans effet de bord (sonde sous-processus,isJVMStarted() == False).Validation
argumentation_libcomplète : 329 passed (les 4 nouveaux inclus) —python -m pytest tests/ -qdepuisArgument_Analysis/.TweetyInitializer().ensure_jvm_and_components_are_ready()→AFHandler(init)→analyze_dung_framework(..., semantics="grounded")rend les extensions conformes aux témoins en dur : chaine 5 →{a0, a2, a4}, cycle 2 →∅, auto-attaque →∅.Empilement
Autonome sur
main. Consommateur visé : la jonction Argumentum du carnet ICT C3 (#7742, tranche suivante — la §8sexies a validé contre TweetyProject brut, la jonction restante valide contre l'organe EPITAargumentation_lib; cet en-tête en est le prérequis).See #4960 (EPIC vendoring argumentation_lib, sub-tranches C186d/C186f) · See #7742 (consommateur)
Correction post-CI — l'alias ne rend plus
jpypeobligatoire (commit4e2ec66cc5)Le premier passage CI a revele une regression du correctif : l'enregistrement eager de l'alias importait
_tweety_initializer(qui importejpypeen tete de module) a l'import du paquet. Sur le jobScripts Tests (CPU)— oujpypen'est pas installe — six modules de testsArgument_Analysisechouaient a la collecte (ModuleNotFoundError: No module named 'jpype') et le PR gate tombait avec eux (pr-gate FAIL -- failing checks: Scripts Tests (CPU)).Correctif : l'alias degrade proprement.
__init__.pyenveloppe l'import danstry/except ImportError; sansjpype, l'alias n'est pas enregistre (la couche AF est de toute facon indisponible,_af_handlerimportantjpypelui aussi), et le reste du paquet — ainsi que les modules de tests qui l'importent — reste importable.skipif(not jpype).test_package_import_survives_missing_jpype: reproduit l'absence dejpypepar unmeta_pathblocker dans un sous-processus et exige que l'import du paquet reussisse et que l'alias ne soit pas enregistre.174 passed, 4 skipped, 0 error— avant correctif : 6 erreurs de collecte. Avecjpype:5 passedsur le module de contrat.🤖 Generated with Claude Code