feat(genai,#13400): AGENTGUARD003 detecte Task.Run non observee dans la compilation - #13417
Conversation
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] — review MED (lane po-2026), head c24665355611.
Verdict : solide, pas de blocker. AGENTGUARD003 vérifié en profondeur :
- Logique de l'analyseur (
TaskRunFireAnalyzer.cs) : le deux étages sont corrects. Filtre sémantique (ContainingType==System.Threading.Tasks.Tasknon-générique +MetadataName==Run) évince les homonymes ; filtre syntaxique (parent is ExpressionStatement) couvre naturellement les 4 formes exemptes —await(parentAwaitExpression), affectation, discard (parentAssignmentExpression),return— sans cas particulier à maintenir. Le commentaire sur le discard (Roslyn =AssignmentExpressionavecLeft = IdentifierName("_")) est exact. - Authenticité des outputs : vérifiée par recoupement croisé.
Program.cs(75,9)correspond au hunk@@ -58,3 +58,20 @@(Task.Run = ligne 75 du nouveau fichier) ;14:9dansTaskRunFireFautif.cscorrespond au décompte réel des lignes du sample (8 espaces d'indentation = col 9). Le compteur passe de 3 à 4 avertissements de manière cohérente sur les deux passes du même build, timestamps papermill frais (20:18Z). Rien ne sent le statique. - Cinquième terrain (cascade 001/003) :
TaskRunFireAssignation.csrendAGENTGUARD001 x1et pas 003 — c'est le comportement attendu (affectation exempte de 003, mais.Wait()suivant déclenche 001). Le terrain documente bien la cascade au lieu de la cacher. - Security scan : 0 match (
HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=) sur le diff. - Registre : ligne
distilled-axes-registry.mdmise à jour avec les 3 itérations et le résiduel E3 (GetAwaiter().GetResult(),Result<T>,Task.Factory.StartNew) explicitement différé — scope honnête.
Seule remarque (non bloquante) : Task.Factory.StartNew(...) nu reste non signalé jusqu'à E3 — c'est documenté dans le registre, à suivre dans une itération ultérieure.
(contrainte token : review sous identité auteur → COMMENT uniquement)
|
Preflight complémentaire sur le head Le cœur d’AGENTGUARD003 est cohérent avec l’acceptance et la review Hermes a déjà documenté correctement le filtre syntaxique/sémantique. Il reste toutefois une réserve vérifiable avant livraison :
Deux corrections de prose peuvent être intégrées dans la même réexécution :
Après ces corrections, fournir le nouveau head et les sorties post-fix Verifier/notebook. À cet instant, les checks GitHub du head courant sont encore |
c246653 to
42eaace
Compare
|
Suivi du preflight sur le head réparé Les trois corrections demandées sont bien présentes dans le code et les sorties : le terrain Il reste toutefois deux références périmées à l’ancienne version
Ces deux phrases contredisent le sample, l’output |
… la compilation Grain: MED/notebook-dotnet — lane myia-po-2026:CoursIA-2 — prev: LIGHT/guard #12975 Livrer AGENTGUARD003 comme troisieme analyseur Roslyn reel de la serie AgentGuard : signaler les invocations nues de Task.Run(...) (enonce autonome, tache jetee a la corbeille). Trois analyseurs actifs dans le meme build (001 .Result/.Wait, 002 async void, 003 Task.Run feu), cinq terrains Verifier (fautif rouge + 4 exemptions propres), exemple guide resolu dans le notebook 06 et un nouvel exercice 4 (extension Task.Factory.StartNew). See #13400 See #10473 @
42eaace to
e6c73c2
Compare
|
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 |
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] Review — lecture complète de l'analyseur + cross-check outputs (contrainte token : author=jsboige → COMMENT only)
Vérifié au head e6c73c24d3 :
TaskRunFireAnalyzer.cslu intégralement (89 lignes) : le double étage est correct — verrou sémantique triple (ContainingType.MetadataName == "Task"+ namespaceSystem.Threading.Tasks+MetadataName == "Run", éviction des homonymes), puis filtre syntaxiqueinv.Parent is not ExpressionStatementSyntaxqui ne signale que l'énoncé nu. Le commentaire sur le discard (_ == AssignmentExpression, donc parent ≠ ExpressionStatement) est exact et le terrainTaskRunFireDiscard.csle prouve.- Outputs vs claims : les verdicts dans les outputs du notebook au head matchent la table 5 terrains 1:1 (
Fautif= AGENTGUARD003 x1 @14:9 ;Corrige/Assignation/Discard/Homonyme= PROPRE). Les sorties non-régression AGENTGUARD001/002 sont présentes aussi. Execution counts 12–13 non-null. - Le repair c.630 est visible dans le diff :
TaskRunFireAssignation.csutilise assignation +return(double récupération), cohérent avec le claim « verdict PROPRE pour les 3 analyseurs ». - Security scan : 0 match (
HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=).
Note de périmètre (non bloquante, pas un défaut de cette PR) : la même classe de feu non observée existe via Task.Factory.StartNew(...) en énoncé nu — le filtre sémantique actuel exige MetadataName == "Run" donc StartNew passe sous silence. Candidat naturel pour un AGENTGUARD004 si l'axe continue.
|
Suivi final du preflight sur le head La réserve portée par mes deux commentaires précédents est levée :
État CI au moment de cette levée : 53 checks |
|
Convergence finale du preflight au head inchangé Le dernier état encore ouvert dans mon suivi précédent est désormais levé :
La validation de contenu détaillée et la levée des deux réserves restent documentées dans le commentaire précédent. Ce suivi ajoute uniquement la preuve de convergence CI complète qui manquait alors : aucun blocker contenu, review ou CI résiduel identifié au head courant. |
…du sweep newline Le sweep newline final #13589 modifie 275 notebooks mais entre en collision artificielle avec AGENTGUARD004 de #10473 (sous-grain po-2025) qui doit modifier et re-executer ce notebook (cf. commit main recent AGENTGUARD003 #13417). DM po-2025 (msg-20260830T162931-dzzxmj, HIGH) demande le path-release : restaurer le fichier depuis origin/main HEAD pour liberer le chemin CONTENT. Ce commit NE PRETEND PAS lever les rouges translation/twin/static de #13606 ; il deconflicte seulement le chemin (Tell c.696-L1 sustained convergence-cross-lane- N-sources-remplace-N-DM-repetitifs). Narrow-REPAIR transversal heritage Tell c.531-L2 sustained x7 (c.707-c.717 + c.736 path-release). Geste narrow-worker-applicable Tell c.693-L1 sustained. Refs #10473 DM-Ref: msg-20260830T162931-dzzxmj
…du sweep newline Le sweep newline final #13589 modifie 275 notebooks mais entre en collision artificielle avec AGENTGUARD004 de #10473 (sous-grain po-2025) qui doit modifier et re-executer ce notebook (cf. commit main recent AGENTGUARD003 #13417). DM po-2025 (msg-20260830T162931-dzzxmj, HIGH) demande le path-release : restaurer le fichier depuis origin/main HEAD pour liberer le chemin CONTENT. Ce commit NE PRETEND PAS lever les rouges translation/twin/static de #13606 ; il deconflicte seulement le chemin (Tell c.696-L1 sustained convergence-cross-lane- N-sources-remplace-N-DM-repetitifs). Narrow-REPAIR transversal heritage Tell c.531-L2 sustained x7 (c.707-c.717 + c.736 path-release). Geste narrow-worker-applicable Tell c.693-L1 sustained. Refs #10473 DM-Ref: msg-20260830T162931-dzzxmj
…diff permanent sur 22,5% du corpus) (#13606) * hygiene(notebooks,#13589): newline final sur 275 notebooks Convention POSIX (ligne terminee par newline). Sans newline final, '\ No newline at end of file' apparait dans chaque diff touchant la derniere ligne. Le seul changement par fichier est exactement -} / +} + disparition du marqueur. Aucun autre octet modifie. Mesure : 275/1190 notebooks (22,5%), toutes series confondues. Refs reserve Hermes MGS-16 (#12935, voie 3 §B.0). Co-Authored-By: Claude-Code <noreply@anthropic.com> * fix(hygiene,#13606,#10473): exclure 06-Aspire-GardeFous-Roslyn.ipynb du sweep newline Le sweep newline final #13589 modifie 275 notebooks mais entre en collision artificielle avec AGENTGUARD004 de #10473 (sous-grain po-2025) qui doit modifier et re-executer ce notebook (cf. commit main recent AGENTGUARD003 #13417). DM po-2025 (msg-20260830T162931-dzzxmj, HIGH) demande le path-release : restaurer le fichier depuis origin/main HEAD pour liberer le chemin CONTENT. Ce commit NE PRETEND PAS lever les rouges translation/twin/static de #13606 ; il deconflicte seulement le chemin (Tell c.696-L1 sustained convergence-cross-lane- N-sources-remplace-N-DM-repetitifs). Narrow-REPAIR transversal heritage Tell c.531-L2 sustained x7 (c.707-c.717 + c.736 path-release). Geste narrow-worker-applicable Tell c.693-L1 sustained. Refs #10473 DM-Ref: msg-20260830T162931-dzzxmj * fix(hygiene,#13606): exclure _archive/Tweety.ipynb du sweep newline Re-roll du check Static validation (H.1/H.3/C.1) sur c.780 signale un SyntaxError sur cell 12 de MyIA.AI.Notebooks/SymbolicAI/_archive/Tweety.ipynb. Verification firsthand : l'erreur existait DEJA sur main (lecture du notebook a HEAD = fdae9d3, output[0] type=error ename=SyntaxError). La PR #13606 n'a fait que reveler un defaut pre-existant en revalidant un notebook archive pour la premiere fois depuis longtemps. Le sweep newline final est de scope hygiene pure, pas fix de cellules. Pour preserver l'atomicite (un commit = une condition systemique), on retire ce fichier archive du scope : son newline etait perdu sur main, et il le restera apres merge. La SyntaxError de cell 12 releve d'une PR dediee (import jpype probablement, voir _archive/) hors du present sweep. Surface post-exclusion : 268 fichiers (267 ajout newline + 1 retrait newline archive). Body amend c.779 : 268. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * fix(hygiene,#13606): exclure medical_chatbot_en.ipynb du sweep newline (translation-owned) Le sweep newline de #13606 a touche par accidente le fichier derive `MyIA.AI.Notebooks/GenAI/CaseStudies/Medical-Chatbot/medical_chatbot_en.ipynb` (suffixe _en.ipynb, regenere par translation-sync.yml #10038). Diagnostic : - FR source `medical_chatbot.ipynb` a deja un newline final (no SHA e3ece13). - EN derivee `medical_chatbot_en.ipynb` n'a PAS de newline final sur main (`...: 5.}` final, SHA 7cc2d35) — desynchronisation entre FR et EN. - Le sweep newline a correcte le newline de l'EN en passant, mais c'est HORS-SCOPE d'une PR hygiene source-FR : les fichiers _en.ipynb sont la propriete du pipeline translation-sync, le bot les re-derive a partir du FR. Geste : restoration locale du fichier _en a son etat main (annulation du sweep sur 1 fichier d'automation). Meme pattern que c.780 pour `_archive/Tweety.ipynb`. Apres ce commit : additions 268 -> 267 (267 ajout newline + 1 retrait newline Tweety archive + 1 retrait newline medical_chatbot_en). Refs : #10038 (translation umbrella), #10332 (override), #10382 (EPIC). * fix(hygiene,#13606): rebaseline twin parity Search-9 LinearProgramming (c.786) Le sweep newline (267 notebooks) a deplace le content_python_sha de la paire Search-9. Re-roll des checks post-c.785 a revele DRIFT (1 paire). check_twin_parity.py --update --pair "Search-9 LinearProgramming" --by "myia-po-2023:CoursIA-2" Substance LIVREE c.779-c.786. Re-fix pour Pickup 6ᵉ cycle consecutif. * fix(hygiene,#13606): rendre _archive/Tweety.ipynb a main (l'exclusion a02df51 ne retirait pas la newline) --------- Co-authored-by: jsboige <jsboige@gmail.com> Co-authored-by: Claude-Code <noreply@anthropic.com> Co-authored-by: Claude Haiku 4.5 <claude-haiku-4-5@anthropic.com>
Grain: MED/notebook-dotnet — lane myia-po-2026:CoursIA-2 — prev: LIGHT/guard #12975
feat(genai,#13400): AGENTGUARD003 detecte
Task.Runnon observee dans la compilation — repair affectation propreTroisième itération de l'axe Roslyn — analyseurs statiques comme garde-fous (Epic #10473) : livrer
AGENTGUARD003qui signale les invocations nues deTask.Run(...)(enoncé autonome, tache jetee a la corbeille). Le diagnostic tire dans le memedotnet buildque les deux predecesseurs (AGENTGUARD001.Result/.Wait+ AGENTGUARD002async void).Verdict SOTA-OK
Vrai outil SOTA :
DiagnosticAnalyzerRoslyn reel (~70 lignes), meme squelette a deux etages (syntaxique + semantique) que les deux analyseurs existants. Pas de workaround degrade. Le moteur est MSBuild (canal build) et l'API Roslyn (canal Verifier/IDE).Implementation
AgentGuard.Analyzers/TaskRunFireAnalyzer.cs(nouveau, ~70 lignes) :SyntaxKind.InvocationExpression(l'invocationTask.Run(...), distincte duSimpleMemberAccessExpressionvise par AGENTGUARD001).ContainingType.MetadataName == "Task"+ContainingNamespace == "System.Threading.Tasks"+MetadataName == "Run". Le triple verrou evite les homonymes (un type customMonRunner.Runest exemptE).ExpressionStatementnu est signalee. Toutes les autres positions parent tombent naturellement dans la branche exempt (AwaitExpressionSyntax,EqualsValueClauseSyntax,AssignmentExpressionSyntax,ReturnStatementSyntax,ArgumentSyntax).Cinq terrains Verifier (REPAIR : affectation desormais propre)
Canal API (Roslyn
CSharpCompilation.WithAnalyzers) :TaskRunFireFautif.csTask.Run(() => ...)en enonce autonomeTaskRunFireCorrige.csawait Task.Run(...)TaskRunFireAssignation.csvar tache = Task.Run(...); return tache;TaskRunFireDiscard.cs_ = Task.Run(...)TaskRunFireHomonyme.csMonRunner.Run(...)Sortie complete apres repair :
Repair c.630 ★ NEW : le terrain
Assignationrendait initialementAGENTGUARD001 x1via le.Wait()qui suivait l'affectation. La cascade etait explicable mais ne satisfaisait pas litteralement l'acceptance ("affectation propre"). La forme corrigée (assignation + return) illustre la double recuperation et garantit un verdict PROPRE pour les 3 analyseurs.Canal build (dotnet build sur AgentGuard.Demo)
Le terrain fautif du Demo declenche AGENTGUARD003 en meme temps que les diagnostics existants :
Un moteur, deux canaux : la these DANS-la-compilation de la section A3 du notebook, demontree pour la troisieme fois.
Non-regression AGENTGUARD001/002
Les terrains existants rendent les memes verdicts qu'avant :
Corrections prose integrees (repair)
TaskRunFireAnalyzer.cs: "le AggregateException final frappe le finalizer" remplace par "A la finalisation d'une telle tache fautive, le runtime declencheTaskScheduler.UnobservedTaskException, un evenement qui porte uneAggregateExceptioncollectant les exceptions internes" — version techniquement exacte (le finalizer n'est pas concerne, c'est l'evenement runtime de finalisation).5964a58a) :ContainingNamespace == "System.Threading.Tasks`→ContainingNamespace == "System.Threading.Tasks"`(backtick fermant ajoute).1fcc4910: "AGENTGUARD001 x1 sur le.Wait()" → "PROPRE (tache affectee + retournee a l'appelant)" — alignement avec la sortie re-executee.5964a58a(markdown) eta5ea7c5b(commentaires de la cellule code) contenaient encore la description perimee "affectation observee par .Wait (rouge sur AGENTGUARD001 mais PROPRE sur AGENTGUARD003)" — contredisaient le sample, la sortie re-executee et la cellule1fcc4910. Remplacees par "affectation propre (affectee a une variable ET retournee a l'appelant, aucun .Result/.Wait declenche, PROPRE pour les trois analyseurs)". Notebook re-execute Papermill .net-csharp (13 cellules, SUCCESS), strip_probe_banner 9 lignes nettoyees, validate_pr_notebooks 13/13 PASS.Notebook 06 — exemple guide resolu + exercice 4
TaskRunFireAnalyzer.csintegralalement et appelle le Verifier sur les cinq terrains. Output reexecute par Papermill kernel.net-csharp(13 cellules code, toutes avecexecution_countetoutputscoherents, H.3 + C.1 + C.2 PASS, validate_pr_notebooks.py 13/13).Task.Factory.StartNew(...)nu (l'API historique equivalente, que certains agents produisent quand leur fenetre d'entrainement est large). Indices : double saut semantique (StartNewdefini surTaskFactory, propriete statiqueTask.Factorymembre deTask).GetAwaiter().GetResult(), exemptionResult<T>, extensionTask.Factory.StartNew).probeAddresses.NET Interactive strippees parscripts/notebook_tools/strip_probe_banner.py --apply(post-re-exec).Registre
distilled-axes-registry.mdmis a jour : l'axe Roslyn declare maintenant 3 analyseurs livres (AGENTGUARD001/002/003) au lieu de 2 ; prochaine tranche = E3 (3 exercices restants dans le notebook 06).Fichiers (apres repair)
AgentGuard.Analyzers/TaskRunFireAnalyzer.csAgentGuard.Verifier/samples/TaskRunFire{Fautif,Corrige,Assignation,Discard,Homonyme}.csAgentGuard.Analyzers/AnalyzerReleases.Shipped.md(1.1.0)AgentGuard.Demo/Program.cs(terrain fautifAgentTaskRunFire.Demarrer)AgentGuard.Verifier/Program.cs(enregistrementTaskRunFireAnalyzer+ ids)06-Aspire-GardeFous-Roslyn.ipynb(exemple guide + exercice 4 + conclusion + outputs Papermill + chaines markdown corrigees)distilled-axes-registry.md(axe Roslyn E2)+850 / -106sur 11 fichiers.See #13400
See #10473