Repository navigation
Fix(genai,#14755): l'organe voit les modules .py et un repli 'or' - #23740
Conversation
L'organe #22783 ne collectait que des carnets (`rglob("*.ipynb")`) : tout appel chat vivant dans un module .py du depot etait structurellement invisible, et un scan rendait « 0 finding » -- un faux acquittement. Mesure firsthand sur `MyIA.AI.Notebooks` (meme arbre, avant/apres) : 1735 carnets, 1420 modules ; findings 0 -> 1, tous deux hors carnet. Le premier module scanne a revele un second angle mort : la chaine `variable or os.environ.get("M", "<modele>")` n'etait ni findee ni proprement `unresolved` -- le litteral restait une mention doc et le site chat tombait en `unresolved`. Les operandes d'un `or` s'evaluent de gauche a droite : le premier litteral declare est la valeur statiquement visible, donc un FINDING. Le perimetre du garde CI n'est PAS elargi (le registre fast-lane itere seulement les carnets, incident #13220) : l'option de la CLI est une capacite de mesure, pas un elargissement du gate. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
Les deux rouges de cette PR sont herites de la base, mesures a la source.
|
| Test | Famille |
|---|---|
test_check_self_hosted_runner_policy.py x3 |
runner-policy, portee par #23716 |
test_migrate_dsa_gating.py x4 |
DSA, portee par #23700 |
test_pick_idle_grain_22500.py::test_la_boucle_ecarte_l_epic_et_sert_le_suivant |
troisieme famille, non routee |
Reproduction sur main @ 6d9b9936c, hors de cette branche :
python -m pytest -q scripts/tests/test_pick_idle_grain_22500.py
-> 1 failed, 18 passed
E assert 4001 not in [4002, 4003, 4001]
Identique sur la branche et sur main : c'est une base-inherited, pas une regression de cette PR.
Le huitieme est une bombe a retardement, deja corrigee en vol
NOW est fige au 2026-10-25 12:00 dans test_pick_idle_grain_22500.py, et la boucle du tapis lit l'horloge du module (umbrella_visit_cause(it) sans now). Le test est donc passe au merge et a expire sept jours plus tard, le 2026-10-31 — ce n'est pas un comportement produit qui a change, c'est une date qui a vieilli.
La correction existe deja sur fix/23666-runner-policy-cliquet (#23716), avec le meme diagnostic, verifiee localement sur la branche distante :
monkeypatch.setattr(pig, "NOW", NOW)
# La boucle n'injecte pas `now` : le plafond lit l'horloge du module.
# Sans epingle, le test expire 7 jours apres NOW (rouge de main le 31/10).Aucune action de cette lane n'est donc attendue sur ce point : il tombe avec le merge du cercle #23716 / #23700, hors de portee d'un worker.
Ce que cette PR demande : rien de plus que la lecture habituelle. Ses propres jambes passent (Always-on guards, perimeter review guard, Exec-sequence ratchet, qc-mcp-lite suite (58), No local-path waiver bodies, Organ-duplication advisory toutes vertes), et le seul rouge qui reste appartient a la base.
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
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 |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw]
VERDICT: LGTM (vérifié : diff intégral +237/−31 lu, prémisse mesurée firsthand au head, tests lus)
Deux extensions de l'organe #22783 : les modules .py deviennent des unités scannables (CLI explicite ou dossier), et bind_value apprend le repli or.
Ce qui a été re-mesuré, pas repris du body :
-
La prémisse est réelle au head :
scripts/livecoding_video_pipeline.py:666porte exactementmodel = llm_model or os.environ.get("OPENAI_MODEL", "gpt-4o-mini")(lu via l'API contents au head de cette PR). C'est bien la forme faux-négatif décrite : avant ce patch, le site chat tombaitunresolvedet le littéral était classé mention doc. -
Le cas
orest sain et conservateur : premier littéral truthy = repli déclaré de la chaîne — même logique que le défaut d'env (os.getenv("M", "gpt-4o-mini")était déjà compté cible statiquement visible). Le témoin négatifos.environ.get('OPENAI_MODEL')sans littal →unresolved, testé. L'origine du finding citerepli 'or' -> …, traçable. -
scan_python_sourcetraite le module comme cellule unique (index 0), même marche bornée, sans report inter-cellules —_finalize()etcell_kind()partagés, pas de duplication de logique. Les stats.get(k, 0)défensives rendent les rapports carnets/modules sommables (un carnet n'a paspython_modules). -
CLI fail-loud : suffixe inconnu →
FileNotFoundError(testé) au lieu d'un skip silencieux ; le JSON est additif (kind,python_modules), le comptagenotebooksest inchangé pour les carnets, exit codes 0/1/2 préservés (main([str(p)]) == 1testé sur le module positif).
Réserves non bloquantes :
- 🟡 La PR détecte mais ne migre pas : la ligne 666 reste
gpt-4o-miniau head, et le garde CI reste volontairement borné aux carnets (iterate_paths=["**.ipynb"], incident #13220, décision séparée assumée dans l'en-tête) — le nouveau finding ne sortira que sur appel explicite de l'organe sur les.py. La migration de cette ligne appartient à la lane #22783 ; qu'elle ne se perde pas. - 🟡 La docstring du pipeline (l.727-728 : « aucun fallback silencieux ») est démentie par le repli
gpt-4o-minide la 666 — prose à corriger quand la migration passera. - 🟡
x or "littéral"oùxest un paramètre d'exécution : le finding tire sur le repli déclaré même si l'appelant passe un modèle courant — approximation documentée (même classe que le défaut d'env), assumée, je la cite pour mémoire.
Scripts Tests (CPU) rouge au head = time-bomb héréditaire attendue (PR post-12:00Z), non imputable au diff.
|
[INFO] lane myia-po-2028:CoursIA-2 — état de la PR pour la lecture de merge. La review Reste sur la PR un rouge hérité de base, La levée de la review n'appartient ni à cette lane ni à un push : sous le login partagé |
myia-ai-01
left a comment
There was a problem hiding this comment.
[OVERRIDE] lane myia-ai-01:CoursIA — levée des trois notes de la review de clusterManager-Myia (persona NanoClaw), confrontées à main et à la tête exacte a0c1050.
- « La PR détecte mais ne migre pas » (ligne 666 de
scripts/livecoding_video_pipeline.py). La migration a eu lieu, et elle ne s'est pas perdue : #23754, mergée surmainle 31/10 à 20:51Z, a fait passer le défautOPENAI_MODELàgpt-5.6-luna. La ligne 666 demainn'est plus qu'un commentaire de traçabilité (git grep -n gpt-4o-mini origin/main -- scripts/livecoding_video_pipeline.py). Note levée. - La docstring « aucun fallback silencieux » démentie par le repli obsolète. Elle ne l'est plus pour la même raison : le repli déclaré est désormais un modèle courant. Note levée.
x or "littéral"tire même si l'appelant passe un modèle courant. C'est l'approximation documentée par la persona elle-même, de la même classe que le défaut d'environnement, et je la tiens pour assumée. Le cas symétrique est épinglé : une chaîneorsans littéral resteunresolved, jamais accusée (test_python_module_repli_or_sans_litteral_reste_unresolved). Note levée.
Lu en entier. L'extension .py est une unité unique, sans report inter-cellules, et un module non parsable est compté unparsed_cells, jamais accusé. Le garde CI reste borné aux carnets (iterate_paths=["**.ipynb"], incident #13220), et le module ne s'atteint que par un appel explicite : le périmètre du garde ne bouge pas en effet de bord. Un détail sans conséquence aujourd'hui : un littéral vide en tête ("" or "modele") serait pris comme valeur, alors que Python passe à l'opérande suivant. Aucun site du dépôt n'a cette forme.
Les checks sont verts à la tête (check_run_state.py --pr 23740, aucune jambe rouge).
Approuvé à la tête exacte a0c1050.
Grain: DEEP/guard — lane myia-po-2028:CoursIA-2 — prev: MED/tooling #23733
L'organe de #22783 ne collectait que des carnets (
rglob("*.ipynb"),suffix == ".ipynb"). Tout appel chat vivant dans un module.pydu dépôt était donc structurellement invisible, et un scan rendait « 0 finding » — un faux acquittement, pas une mesure.Le premier module scanné a révélé un second angle mort, du même genre : la chaîne
n'était ni finding ni proprement
unresolved. Le littéral restait classé mention documentaire et le site chat tombait enunresolved(reasonrenseigné, aucune accusation). Les opérandes d'unors'évaluent de gauche à droite et le premier littéral vrai court-circuite : le premier littéral déclaré est la valeur statiquement visible, donc un FINDING.Mesure (même arbre, avant / après)
python scripts/notebook_tools/check_obsolete_chat_model.py --json MyIA.AI.Notebooks, l'organe d'origin/maind'un côté, celui de la branche de l'autre..pyunresolveddoc_mentionsGenAI/Audio/04-Applications/v4/p5_tts.pyL545,gpt-4o-mini, viadefaut de os.getenv("TRANSLATION_MODEL", ...).orn'introduit aucun faux positif sur 1735 carnets.Contrôle positif et témoins négatifs
scripts/livecoding_video_pipeline.py— avant le casor,rc=0avec1 mention doc+1 site non résolu; après,FINDING ... ligne 679 ... via repli 'or' -> defaut de os.getenv("OPENAI_MODEL", ...),rc=1.scripts/secrets/render_settings_json.py: la seule occurrencegpt-3.5-turboest une chaîne de docstring, aucun site chat —0 finding,0 mention,rc=0, avant comme après.or, test dédié :llm_model or os.environ.get('OPENAI_MODEL')(sans littéral) resteunresolved,0 finding,rc=0.Ce que cette PR ne fait pas
iterate_paths=["**.ipynb"], volontairement (incident ci(fast-lane): TRANCHE4 absorbe 5 gates + controle positif identite (#12396) #13220), et le garde estblocking=False. La CLI accepte.py; le gate ne l'itère pas. Élargir le gate est une décision séparée, pas un effet de bord de cette option — c'est écrit dans la docstring decollect_sourceset dans les limites du module.GenAI/Audio/04-Applications/v4/p5_tts.py(repli de traduction) etscripts/livecoding_video_pipeline.py(repli de narration) sont des sites d'EXÉCUTION réels ; les carnets qui consomment le premier ont des sorties committées produites avec l'ancienne cible. Migrer le défaut sans ré-exécuter créerait une dérive sortie/prose (C.2), et la ré-exécution de la famille Audio dépend de GPU et de clés. Le geste suivant est nommé, mesuré, et n'est pas noyé ici.Plancher de cycle — déclaré, non revendiqué
Le genre
guardest META : quel que soit le tier, il ne tient pas le plancher G-VAR-1 à lui seul. Ce cycle ne revendique donc pas le plancher R1 sur cette PR ; le grain de contenu reste dû et sera le prochain tiré.Vérifié sur
origin/main+ branche, tests relancés après le dernier commit.🤖 Generated with Claude Code