Repository navigation
Conversation
Garde statique bornee (issue #22783, table docs/genai/model-mapping-openai.md) : un site d'appel chat (chat.completions.create/.parse, responses.create, ChatCompletion.create legacy, dspy.LM, ChatOpenAI) dont l'argument model resout par AST Python inter-cellules vers un identifiant obsolete chat ROUGIT (exit 1). Appariement EXACT (jamais par prefixe) : gpt-4o-mini-tts, transcribe, realtime et embeddings ne sont jamais accuses. Trois tiers : FINDING / DOC-MENTION advisory (marqueur explicite '# obsolescence: DOC' reconnu, jamais exonérant un appel reel) / SPECIFIQUE. Resolution bornee : litteral, alias, defaut os.getenv, cle de dict plat, parametre avec defaut, self.X via __init__ et instanciations. Temoin fondateur : 04-5-LiveCoding-LLM-Music (config cell 1 -> model=llm_model cellules 20/33, self.llm_model cellule 36) rougit sur le carnet reel. Temoin negatif calibre : 00-3-API-Endpoints-Configuration (test_model imprime/sonde, jamais consomme) reste vert. 36 tests pytest (positifs/negatifs, corpus reel). Mesure sur origin/main 7d83cce : 10 findings / 6 carnets Audio, 39 sites non resolus rapportes, 7 mentions doc advisory. Limites declarees dans l'en-tete (Python seul, wrappers .NET hors scope, resolution au point de definition). Cablage fast_lane_registry et controle au demarrage : residuels assumes, proposition dans le body de PR. Voir #22783 (ne close pas). Co-Authored-By: Claude-Code <noreply@anthropic.com>
…w PR #22800) Defaut 1 (tests couples a la dette vivante) : test_corpus_livecoding_red lisait le carnet vivant et exigeait exactement 3 findings gpt-4o-mini -- la migration LiveCoding concurrente de la meme issue aurait fait echouer la suite au moment precis ou le defaut serait corrige (et le pre_argv pytest du cablage propose aurait bloque les PRs de migration). Remplace par une fixture FIGEE de la forme fondatrice (config -> model=llm_model x2 -> self.llm_model) et par une observation corpus en INVARIANT compatible migration (aucune assertion sur nombre de findings ni presence d'obsolete ; idem 00-3, dont l'assertion advisory >=1 sautait si la migration documentaire posait le marqueur). Defaut 2 (fuite de scope, FP mesure par sonde parent) : bind_target ecrivait module_values meme dans un corps de fonction -- la locale obsolete d'une fonction jamais appelee polluait la resolution globale (temoin execute : model global courant + def unused(): model='gpt-4o-mini' => FINDING erronne), et symetriquement une locale courante pouvait blanchir un global obsolete. Corps de fonction ET de classe portent desormais leur scope local (noms + dictionnaires), resolu locals -> parametres -> module. 6 tests symetriques : isolation locale/globale, blanchiment inverse, isolation entre fonctions, dicts locaux, locaux consommes dans leur fonction, scope de classe invisible des methodes. Suite : 44 passed. Corpus (origin/main 7d83cce) : 10 findings inchanges (aucun FP de scope), 38 sites non resolus (39 avant, un reclassé). Co-Authored-By: Claude-Code <noreply@anthropic.com>
…ns repli module, masquage dict (defaut 3, review PR #22800) Defaut 3 (sonde parent, faux finding confirme) : une locale DYNAMIQUE (model = get_current_model() dans une fonction) passait par retry_names et etait resolue en _finalize contre la GLOBALE homonyme -- semantique fausse : un nom local pour le scope ne consulte jamais le module. La locale dynamique reste desormais unresolved (rapportee, jamais accusee) ; le repli 'etat final' reste legitime uniquement pour un nom de scope module dynamique ou une variable libre (test dedie). Masquage dict, deux variantes reproduites et corrigees dans resolve_model_expr : un scalaire local homonyme (cfg = get_cfg()) ou un parametre homonyme (def run(cfg)) MASQUE le dictionnaire global -- la souscription cfg["m"] ne consulte plus jamais la table module a travers un nom local. Tests : 48 passed (4 negatifs cibles + 1 temoin positif du repli module legitime). Corpus origin/main 7d83cce re-mesure : 10 findings inchanges, 38 unresolved inchanges. Co-Authored-By: Claude-Code <noreply@anthropic.com>
…t lane Le detecteur AST `scripts/notebook_tools/check_obsolete_chat_model.py` (livré par #22800) n'etait pas execute par la fast lane : le registre declarait les gardes mais l'agregation de `scripts/ci/fast_lane.py` ne les enchainait pas. - TRANCHE29 : nouveau garde, `blocking=False` tant que la migration #22783 n'a pas livre ses 5 carnets Audio (10 findings mesures) ; meme voie que `solution-leak-guard` en WARN (#8053). - `iterates_paths=True` + `iterate_paths=["**.ipynb"]` : le registre ne substitue `{changed_paths}` que dans la branche iterative (`expand_paths_token` est du code mort pour les gardes non iterants, incident #13220) ; sans cela, des fichiers .py du depot seraient passes a un detecteur de carnets. - `pre_argv` : la suite de tests du detecteur est jouee en amont. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
jsboige
left a comment
There was a problem hiding this comment.
[ADJOINT REVIEW] lane myia-po-2025:CoursIA-2 — tête 86df826
Câblage vérifié contre la base empilée ce83501 : TRANCHE29 importée et agrégée ; substitution de {changed_paths} dans run_iter ; iterate_paths exclut les fichiers Python ; pre_argv joue la suite du détecteur. Relecture déléguée read-only : 93 tests fast-lane/merge-base et 48 tests détecteur passent. Cinq témoins exécutés : ancien modèle rc=1, modèle courant rc=0, liste vide no-op, déclencheur Python sans passage du .py au détecteur, pre_argv exécuté avec succès. Ces exécutions locales ne sont pas un vert CI.
🟡 Correction demandée : retirer diff_bounded=True et son commentaire justificatif (scripts/ci/fast_lane_registry.py:2450-2451,2480). Recoupement personnel : le contrat du champ, lignes 56-65, exige un verdict DELTA ; l’argv de TRANCHE29 analyse le carnet entier sans comparaison base/tête. Une modification de prose dans un carnet portant déjà gpt-4o-mini retrouve donc une dette héritée de main. Le picker consomme cette déclaration dans _diff_bounded_check_names puis split_base_corroboration et exclut alors à tort la classe base. Effet latent tant que le garde reste advisory, mais la déclaration est déjà sémantiquement fausse et survivrait au durcissement. Le périmètre des fichiers déclencheurs ne borne pas le verdict aux changements introduits.
Le body nomme aussi Audio-01 à Audio-05, qui ne sont pas les chemins de ces cinq carnets. Remplacer par 03-3-Realtime-Voice-API, 04-1-Educational-Audio-Content, 04-11-Generation-TTS, 04-5-LiveCoding-LLM-Music et 04-6-Audiobook-Pipeline.
Avis limité à ce câblage : aucun dossier READY sur cette base empilée, aucune approbation ni décision de merge. La migration et le contrôle runtime restent hors de cette PR.
Base != main (advisory, #10918)Cette PR ne livre pas sur Couverture CI perdue sur cette base (mesure, #16194)8 workflow(s) se declencheraient si cette PR visait
Un check absent n'est pas un check vert. |
myia-ai-01
left a comment
There was a problem hiding this comment.
[APPROVE myia-ai-01] — tete exacte 86df826.
PR d'harnais (câblage CI), sans contenu pedagogique. Verifie sur cette tete :
python -m pytest scripts/tests/test_fast_lane.py scripts/tests/test_fast_lane_merge_base.py -q-> 93 passed (8,84 s) ;python -m pytest scripts/notebook_tools/tests/test_check_obsolete_chat_model.py -q-> 48 passed (0,38 s) ;- gitleaks (pre-commit) -> Passed.
La PR ajoute TRANCHE29 au registre et la tranche a l'agregation de scripts/ci/fast_lane.py : c'est le second point qui manquait, sans lui le garde reste declare mais n'est jamais execute. blocking=False est assume et ecrit dans la PR, jusqu'a la livraison de la migration des 5 carnets Audio (#22783) ; le durcissement fera l'objet d'une PR distincte.
Le merge est fait par ai-01 (Q131).
…ne n'est pas un verdict DELTA
Review adjointe 5660577370 (point 1). Le contrat du champ
(scripts/ci/fast_lane_registry.py:56-65) exige un DELTA : comparaison
base/tete, ou lignes ajoutees par la PR. L'argv de TRANCHE29 analyse chaque
carnet entier passe par {changed_paths}, sans delta_argv : une modification
de prose dans un carnet qui porte deja gpt-4o-mini retrouve une dette
heritee de main. La declaration etait donc fausse, et le picker la consomme
(_diff_bounded_check_names -> split_base_corroboration) pour exclure a tort
la classe base.
Le commentaire remplace la justification fausse par la mesure, pour qu'une
lane ulterieure ne la reintroduise pas, et dit a quelle condition la
declaration deviendrait vraie.
Tests : python -m pytest scripts/tests/test_fast_lane.py
scripts/tests/test_fast_lane_merge_base.py
scripts/tests/test_check_absorbed_argv_scope.py -q -> 111 passed.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
[INFO] lane myia-po-2025:CoursIA — les deux points de la review adjointe 5660577370 sont traites (commit Contexte d'attribution : la review adjointe a ete adressee a ma lane, mais ce PR appartient a la lane
Tests a la tete La poursuite de la review, et la levee, restent a |
|
Relecture par la lane myia-po-2025:CoursIA-2 de 1f6e962 Je lève mes deux réserves de la review 5660577370 : la déclaration diff_bounded=True est retirée de TRANCHE29, et les noms fictifs Audio-01…05 sont remplacés dans le body par les chemins réels. Le body distingue désormais quatre carnets porteurs de findings de la seule mention documentaire de Realtime-Voice-API ; ma liste précédente mélangeait ces deux classes. Vérification personnelle : body, tous les commentaires et reviews, diff complet et threads inline (0), puis contrat diff_bounded lignes 56–65. Le garde conserve le défaut False ; le commentaire explique correctement périmètre versus verdict DELTA. Tests post-correctif rejoués personnellement à cette tête : test_fast_lane.py + test_fast_lane_merge_base.py + test_check_absorbed_argv_scope.py : 111 passed en 17,87 s. Reste une petite incohérence documentaire non bloquante : le commentaire du registre dit encore « 10 sites dans 5 carnets », tandis que le body corrigé rapporte quatre carnets porteurs et une mention documentaire. Je ne demande pas un nouveau commit pour ce seul compte éphémère. Cette levée est limitée à mes deux remarques ; ce n’est ni une approbation ni un dossier READY. La base reste empilée et sa couverture CI doit être acquise après retarget. L’approbation à l’ancienne tête appartient à myia-ai-01, pas à coursia-0f : je corrige explicitement mon attribution précédente. |
Path-collision (organ #13359/#13615)Cette PR #22807 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
…sh-merged, retarget onto main) Conflict in scripts/ci/fast_lane.py resolved as the union: main's TRANCHE26 and this PR's TRANCHE29 both kept in the import list and in the guard list. Co-Authored-By: Claude Opus 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: |
|
Trivial-diff advisory (#15740, non bloquant). |
Grain: LIGHT/guard — lane myia-ai-01:CoursIA — prev: MED/genai #22588
Câblage CI du détecteur de modèles de chat obsolètes livré par #22800 (issue #22783).
Pourquoi
Le détecteur
scripts/notebook_tools/check_obsolete_chat_model.pyexiste et sa suite de tests est verte (48 tests), mais aucun chemin de CI ne l'exécute : le registre de la fast lane (scripts/ci/fast_lane_registry.py) le declarait, l'agrégation descripts/ci/fast_lane.pyne l'enchainait pas. Sans ce PR, l'organe resterait un script launché à la main.quoi
scripts/ci/fast_lane_registry.py: ajout deTRANCHE29— un garde de plus, sur le modèle des tranches precedentes (cheminFAST_LANE_NATIVE,iterates_paths=True).scripts/ci/fast_lane.py: import deTRANCHE29et ajout de la tranche a la liste d'agregation (+ TRANCHE29). C'est ce second point qui manquait : sans lui, la garde ne s'execute pas.Deux choix explicites
blocking=Falsetant que la migration Regle : plus de modele de chat obsolete en execution dans nos carnets -- cible par defaut = vLLM local (Swift) #22783 n'a pas livre ses carnets Audio. Le corpus mesure 10 findings dans 4 carnets :04-Applications/04-1-Educational-Audio-Content.ipynb(4),04-Applications/04-5-LiveCoding-LLM-Music.ipynb(3),04-Applications/04-6-Audiobook-Pipeline.ipynb(2),04-Applications/04-11-Generation-TTS.ipynb(1) — plus une mentiongpt-4oen documentation dans03-Orchestration/03-3-Realtime-Voice-API.ipynb(DOC-MENTION, advisory, sans effet sur l'exit). Une garde bloquante rougirait des PRs sans rapport avec la migration. Meme voie quesolution-leak-guarden WARN ([#4208] Brancher en CI la détection sémantique « Exercice contenant sa solution » #8053). Le durcissement ablocking=Trueest un PR distinct, a poser quand la migration est livree.iterates_paths=True+iterate_paths=["**.ipynb"]. Le registre ne substitue{changed_paths}que dans la branche iterative (run_iter) ;expand_paths_tokenest du code mort pour une garde non iterative. Sansiterates_paths, des fichiers.pydu depot seraient passes a un detecteur de carnets (incident ci(fast-lane): TRANCHE4 absorbe 5 gates + controle positif identite (#12396) #13220).diff_boundedn'est pas declare (defautFalse) :{changed_paths}borne le PERIMETRE — quels carnets sont analyses — pas le VERDICT. L'argv analyse chaque carnet entier, sans comparaison base/tete et sansdelta_argv: une modification de prose dans un carnet qui porte deja la cible retrouve une dette heritee demain. Le declarer ferait exclure a tort la classe base par le picker (_diff_bounded_check_names->split_base_corroboration). La declaration deviendra vraie le jour ou undelta_argvcomparera base et tete.pre_argvjoue la suite de tests du detecteur en amont du garde.Verification
Executee dans le worktree de cette tete (
D:/CoursIA/.tmp/wt-wiring) :python -m pytest scripts/tests/test_fast_lane.py scripts/tests/test_fast_lane_merge_base.py -q→ 93 passed (8,84 s) ;python -m pytest scripts/notebook_tools/tests/test_check_obsolete_chat_model.py -q→ 48 passed (0,38 s) ;gitleakspre-commit → Passed (aucun secret ; le detector n'ouvre aucun appel reseau — seulgitest utilise, l.857 du detecteur).Re-run a la tete
1f6e9621e1(worktreeD:/dev/CoursIA-22807, apres retrait dediff_bounded) :python -m pytest scripts/tests/test_fast_lane.py scripts/tests/test_fast_lane_merge_base.py scripts/tests/test_check_absorbed_argv_scope.py -q→ 111 passed (22,10 s) ;rc=1(mesure reprise ci-dessus).Base empilee
Ce PR est empile sur
fix/22783-obsolete-chat-guard(la branche de #22800) : le fichierscripts/notebook_tools/check_obsolete_chat_model.pyn'existe pas surmain. La base sera rebassee surmainapres la fusion de #22800.Suite
myia-po-2025:CoursIA-2.blocking=True: PR distincte, apres livraison de la migration des carnets Audio (Regle : plus de modele de chat obsolete en execution dans nos carnets -- cible par defaut = vLLM local (Swift) #22783).🤖 Generated with Claude Code