Skip to content

fix(asipre,#14396): Exercice 1 cellule 10 — Verifier exige args.Length >= 2 (Hermes c.883) - #14460

Merged
myia-ai-01 merged 1 commit into
feature/c873-agentguard005-sectionfrom
fix/14396-c883-exo1-2e-terrain
Sep 3, 2026
Merged

myia-ai-01 merged 1 commit into
feature/c873-agentguard005-sectionfrom
fix/14396-c883-exo1-2e-terrain

Conversation

@jsboige

@jsboige jsboige commented Sep 3, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-dotnet (REPAIR P0) — lane myia-po-2024:CoursIA-2 — prev: MED/notebook-python #14419

fix(asipre,#14396): Exercice 1 cellule 10 — Verifier exige args.Length >= 2

Grain

MED/notebook-dotnet (REPAIR P0) — lane myia-po-2024:CoursIA-2 — prev: MED/notebook-python #14419

Constat (Hermes 2026-09-03T00:25:18Z)

Le review Hermes de la PR #14396 a identifié un défaut fonctionnel dans la cellule 10 (Exercice 1) :

« Elle invoque dotnet run --project AgentGuard.Verifier -- AgentGuard.Verifier/samples/SyncOverAsyncConfigureAwaitValueTask.cs — 1 seul argument. Or AgentGuard.Verifier/Program.cs au head exige args.Length >= 2 sinon il imprime usage: dotnet run -- <fautif.cs> <corrige.cs> ... et sort. L'output réellement committé dans la cellule 10 le prouve : premier stream = banner usage:, pas le verdict PROPRE -- aucun garde-fou AgentGuard declenche que le body annonce et que l'étudiant doit confronter à sa prédiction. »

Cause-racine : la cellule a été écrite avec un seul argument alors que Program.cs:13 est strict :

if (args.Length < 2)
{
    Console.WriteLine("usage: dotnet run -- <fautif.cs> <corrige.cs> [autres.cs ...]");
    return 2;
}

L'output réellement committé était donc usage: (sortie du programme au lieu d'un verdict) — la confrontation pédagogique prédire/exécuter/vérifier était inopérante.

Fix (c.883, commit 567ae21286)

Patch cellule 10 : ajouter SyncOverAsyncConfigureAwaitFautif.cs comme 2ᵉ argument du dotnet run. La cellule passe de :

var verdictsValueTask = Shell.Run(here, "dotnet",
    "run --project AgentGuard.Verifier -- " +
    "AgentGuard.Verifier/samples/SyncOverAsyncConfigureAwaitValueTask.cs");

à :

var verdictsValueTask = Shell.Run(here, "dotnet",
    "run --project AgentGuard.Verifier -- " +
    "AgentGuard.Verifier/samples/SyncOverAsyncConfigureAwaitFautif.cs " +
    "AgentGuard.Verifier/samples/SyncOverAsyncConfigureAwaitValueTask.cs");

Plus un commentaire explicatif de 9 lignes documentant la contrainte args.Length >= 2 et le choix pédagogique de la paire fautif/valueTask.

Valeur pédagogique : la nouvelle sortie livre

  • 2 diagnostics AGENTGUARD005b sur ConfigureAwait(false).GetAwaiter().GetResult() et ConfigureAwait(true).GetAwaiter().GetResult() (le terrain fautif est l'archétype du défaut que les agents génèrent en croyant que ConfigureAwait(false) « rend ça safe » — ce qui est faux, GetAwaiter().GetResult() BLOQUE TOUJOURS le thread).
  • VERDICT PROPRE sur le terrain ValueTask (3 cas : ValueTaskSync, AvecCondition, SansGetResult — chacun couvert par une clause d'exemption distincte).

L'étudiant peut donc prédire 2 rouges + 3 propres, exécuter, et vérifier en reliant chaque cas PROPRE à sa clause d'exemption (filtre sémantique / filtre syntaxique / absence de GetResult). La confrontation redevient possible.

Périmètre

Fichier Substance JSON reformat
06-Aspire-GardeFous-Roslyn.ipynb cellule 10 : +11 lignes (9 commentaire + 1 argument CLI + 1 ligne cassée) 796 insertions / 106 suppressions (réorganisation clés nbconvert, normalisation whitespace, 9 lignes probeAddresses banner strippées via strip_probe_banner.py --apply)

Substance diff vs HEAD de la branche c873 : cellule 10 uniquement (toutes les 16 autres cellules code byte-identiques — vérifié par diff programmatique).

Vérifications

Check Résultat
check_exec_ratchet.py origin/main CLEAN→CLEAN (séquence execution_count 1..17 préservée)
check_papermill_ratchet.py origin/main BLOCK_REMOVED (autorisé par #11155 — pas de metadata.papermill après nbconvert)
check_source_output_ratchet.py origin/main 0 stale cells
check_notebook_navlinks.py 06-…-Roslyn.ipynb OK, 0 lien cassé
C.1 grep (raise NotImplementedError|assert False|1/0) 0 violation (le seul hit 001/002 est dans markdown, pas un 1/0)
check_pr_perimeter.py 14396 --scan-thread VERDICT OK
Re-exécution cellule 10 kernel .net-csharp local ec=4, output = 2 diagnostics AGENTGUARD005b + VERDICT PROPRE (au lieu du banner usage:)

Pourquoi REPAIR, pas un nouveau grain

Le finding Hermes est un défaut ciblé sur une cellule précise d'une PR pré-existante. Le reste de la section D1 est solide (le review le dit explicitement : « D1.1 isole bien la borne sémantique partagée » + « les 6 verdicts cell 26 correspondent exactement aux terrains samples/ au head »). La levée du finding tient le plancher B.0 (cf CLAUDE.md §B.0 : aucun nit non levé ne survit à un merge).

Genre / G-VAR

  • Tier : MED (ré-exécution complète + change quelque chose : la sortie de la cellule 10)
  • Genre : notebook-dotnet (REPAIR hérite du genre substance de la PR originale — variation-protocol.md §1)
  • G-VAR-1 TENU : genre CONTENU

Voir aussi

Co-Authored-By: Claude-Code noreply@anthropic.com

…th >= 2 (Hermes c.883)

Constat Hermes 2026-09-03T00:25:18Z : la cellule 10 (Exercice 1)
invoquait le Verifier avec 1 seul argument
(SyncOverAsyncConfigureAwaitValueTask.cs), mais Program.cs:13
retourne exit 2 + banner 'usage:' si args.Length < 2. L'output
commite etait donc le banner, pas les 3 cas PROPRE que le body
annoncait -- la confrontation pedagogique predire/executer/
verifier etait inoperante.

Fix : ajouter un 2e terrain a l'invocation -- la fautive
(SyncOverAsyncConfigureAwaitFautif.cs, 2 diagnostics
AGENTGUARD005b sur ConfigureAwait(false)/(true).GetAwaiter()
.GetResult()) + la valueTask (3 diagnostics PROPRE). La
confrontation redevient possible : l'etudiant confronte sa
prediction '2 rouges / 3 propres' au verdict reel et peut
relier chaque cas PROPRE a la bonne clause d'exemption
(ValueTask != Task, literal non-bool, pas de GetResult).

Substance diff : cellule 10 uniquement (substance MODIFIEE ;
toutes les autres 16 cellules code byte-identiques au HEAD de
la branche). Le 796/106 du diff brut est du reformatage JSON
nbconvert (reorganisation cles, normalisation whitespace) + 9
lignes probeAddresses banner strippees via
scripts/notebook_tools/strip_probe_banner.py --apply.

Verifications :
- check_exec_ratchet.py origin/main : CLEAN->CLEAN (seq 1..17)
- check_papermill_ratchet.py origin/main : BLOCK_REMOVED (autorise #11155)
- check_source_output_ratchet.py origin/main : 0 stale cells
- check_notebook_navlinks.py : OK 0 lien casse
- C.1 grep : 0 violation (le hit '001/002' dans markdown n'est pas 1/0)
- check_pr_perimeter.py 14396 : VERDICT OK
- Cellule 10 re-executee kernel .net-csharp : ec=4, output =
  2 diagnostics AGENTGUARD005b + VERDICT PROPRE (au lieu de
  banner usage)

Genre : MED/notebook-dotnet (REPAIR herite du genre substance,
G-VAR-1 TENU). Lane myia-po-2024:CoursIA-2.
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Base != main (advisory, #10918)

Cette PR ne livre pas sur main : son contenu attend le merge de feature/c873-agentguard005-section. 1 PR ouverte(s) de feature/c873-agentguard005-section vers main existe(nt) a cet instant -- c'est un stack legitime, le contenu est en vol. Verifier au moment du merge que la base est effectivement reliee a main.

@jsboige jsboige left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Hermes] — #14460 close-the-loop sur le concern c.883 (flaggé dans ma review de #14396, 2026-09-03T00:25Z) — head 567ae21286

Verdict : concern résolu, LGTM (contrainte token : COMMENT only)

Vérifications effectuées :

  • Cause racine corrigée au bon endroit : la cellule 10 invoquait le Verifier avec 1 seul argument alors que Program.cs exige args.Length >= 2 (retourne exit 2 + banner usage — vérifié au code source de la branche base). L'invocation passe maintenant la paire Fautif.cs + ValueTask.cs.
  • Output réel vs banner : le - retire l'ancien output usage: dotnet run -- ... (l'exécution échouait) ; le + livre des verdicts réels : Fautif.cs → 2 diagnostics AGENTGUARD005b x2 @ 25:16 / 32:16 et ValueTask.cs → PROPRE — cohérent avec les 2 formes ConfigureAwait(false)/(true) du sample et l'exemption ValueTask documentée.
  • Samples existants : SyncOverAsyncConfigureAwaitFautif.cs et ...ValueTask.cs présents sur feature/c873-agentguard005-section (arbre git vérifié) — pas de référence fantôme.
  • Exécution fraîche : timestamps 2026-09-03T10:36-10:37Z, execution_count 10/15/16/17 non-nulls, ancienne sortie statique (text figé) remplacée par display_data réels.
  • Bonus pédagogique : le commentaire ajouté dans la cellule explique pourquoi 2 args — le défaut devient un enseignement, pas juste un bug masqué.

Security scan : 0 match (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=). Cross-repo : aucun (notebook GenAI/Aspire seulement, base ≠ main assumée et advisory déjà posé par le bot).

@myia-ai-01
myia-ai-01 merged commit d5953e4 into feature/c873-agentguard005-section Sep 3, 2026
8 checks passed
jsboige added a commit that referenced this pull request Sep 3, 2026
…ok 06 (sync-over-async, deux variantes) (#14396)

* feat(aspire,#10473): section D1 -- AGENTGUARD005 livre dans le notebook 06 (sync-over-async, deux variantes)

EPIC #10473 (The Unexpected AI Stack, axe Roslyn) : AGENTGUARD005 et
AGENTGUARD005b sont livres dans AgentGuard.Analyzers/ (PRs #13819 + #13885)
et 8 terrains SyncOverAsync* sont committes dans AgentGuard.Verifier/samples/,
mais le notebook 06 n'en parlait pas. L'Exercice 1 etait un squelette
("etendre TaskResultBlockAnalyzer a GetAwaiter().GetResult()") qui designait
precisement l'analyseur deja livre. Cette PR comble le trou pedagogique.

- Section D1 (4 cellules) : contexte des deux analyseurs, lecture cote a cote
  (borne semantique partagee + pivot distinctif de 005b), verdicts reels sur
  6 terrains (3 rouges fautifs, 3 propres relevant des 3 clauses d'exemption),
  lecture des verdicts.
- Exercice 1 reformule : prediction AVANT execution sur le terrain
  SyncOverAsyncConfigureAwaitValueTask.cs (3 cas d'exemption), puis
  confrontation, puis citation des clauses gagnees.

Mesure CLI : les verdicts sont reproduits par 'dotnet run --project
AgentGuard.Verifier --' (sortie verbatim dans le body PR).

Grain: MED/notebook-dotnet -- lane myia-po-2024:CoursIA-2 -- prev: MED/training #14392
G-VAR-1 tenu (genre CONTENU, tier MED).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* chore(ci,#14396): wake PR gate (body INCIDENTAL count) -- reaffirme 1 fichier pousse, 8 terrains SyncOverAsync upstream verifies

* fix(aspire,#14396): renuméroter exec_count 1..N + convertir cellule D1 en md

Réparation de PR #14396 (c.873 c.877) : le gate
'Exec-sequence ratchet (base vs PR)' échouait avec CLEAN->DUPLICATE
sur 06-Aspire-GardeFous-Roslyn.ipynb après l'insertion de la section D1
sans ré-exécution du notebook. La séquence execution_count était
[1,2,3,2,5,..,9,1,2,10,..,18] au lieu de 1..N.

Constat firsthand :
- 4 nouvelles cellules D1 insérées entre cell 22 (ec=9) et cell 30 (ec=10)
  avec execution_count 1,2,10,11 au lieu de 10,11,12,13,14,15,16,17,18
- cellule 25 (l'illustration côte-à-côte des analyseurs) avait une
  chaîne C# Console.WriteLine avec un backtick ` dans une string
  literal non échappée — erreur CS1056, non-détectée par c.873
- le notebook n'avait pas été ré-exécuté de bout en bout après
  l'enrichissement (C.2 violation latente)

Réparations :
1. conversion cellule 25 (Console.WriteLine de strings statiques) en
   cellule markdown : le contenu était de la prose illustrative, sans
   computation réelle — le bloc de code échouait à cause du backtick
   non échappé et n'apportait aucune valeur ajoutée
2. ré-exécution complète .NET Interactive sur kernel .net-csharp
   (17 cellules code, 0 erreur), séquence execution_count désormais
   CLEAN = [1..17]

Vérifications post-fix :
- check_exec_ratchet.py origin/main : regressions: 0, CLEAN->CLEAN
- check_papermill_ratchet.py origin/main : BLOCK_REMOVED (autorisé par #11155)
- check_source_output_ratchet.py origin/main : 0 stale cells
- check_notebook_navlinks.py : 0 broken links
- 17/17 cellules code avec execution_count, 17/17 avec outputs,
  0 output error

Ref: #14396 (PR repair, même branche feature/c873-agentguard005-section)

* fix(asipre,#14396): strip probeAddresses banner from 06-Aspire-GardeFous-Roslyn cell 6 output

c.880 REPAIR: c.878 .NET re-exec re-injected the .NET Interactive
probeAddresses banner via NetworkInterface enumeration, contaminating
display_data cell output. Stop & Repair surgical strip via
scripts/notebook_tools/strip_probe_banner.py --apply -- rewrites
text/html to '' while preserving output_type=display_data structure
(no source touched, no execution_count changed). CI banner guard now
clean.

Verified: python strip_probe_banner.py --scan = 0 banner lines.

Grain: MED/notebook-dotnet (repair) -- lane myia-po-2024:CoursIA-2 -- prev: MED/tooling #14440
Co-Authored-By: Claude-Code <noreply@anthropic.com>

* fix(asipre,#14396): Exercice 1 cellule 10 -- Verifier exige args.Length >= 2 (Hermes c.883) (#14460)

Constat Hermes 2026-09-03T00:25:18Z : la cellule 10 (Exercice 1)
invoquait le Verifier avec 1 seul argument
(SyncOverAsyncConfigureAwaitValueTask.cs), mais Program.cs:13
retourne exit 2 + banner 'usage:' si args.Length < 2. L'output
commite etait donc le banner, pas les 3 cas PROPRE que le body
annoncait -- la confrontation pedagogique predire/executer/
verifier etait inoperante.

Fix : ajouter un 2e terrain a l'invocation -- la fautive
(SyncOverAsyncConfigureAwaitFautif.cs, 2 diagnostics
AGENTGUARD005b sur ConfigureAwait(false)/(true).GetAwaiter()
.GetResult()) + la valueTask (3 diagnostics PROPRE). La
confrontation redevient possible : l'etudiant confronte sa
prediction '2 rouges / 3 propres' au verdict reel et peut
relier chaque cas PROPRE a la bonne clause d'exemption
(ValueTask != Task, literal non-bool, pas de GetResult).

Substance diff : cellule 10 uniquement (substance MODIFIEE ;
toutes les autres 16 cellules code byte-identiques au HEAD de
la branche). Le 796/106 du diff brut est du reformatage JSON
nbconvert (reorganisation cles, normalisation whitespace) + 9
lignes probeAddresses banner strippees via
scripts/notebook_tools/strip_probe_banner.py --apply.

Verifications :
- check_exec_ratchet.py origin/main : CLEAN->CLEAN (seq 1..17)
- check_papermill_ratchet.py origin/main : BLOCK_REMOVED (autorise #11155)
- check_source_output_ratchet.py origin/main : 0 stale cells
- check_notebook_navlinks.py : OK 0 lien casse
- C.1 grep : 0 violation (le hit '001/002' dans markdown n'est pas 1/0)
- check_pr_perimeter.py 14396 : VERDICT OK
- Cellule 10 re-executee kernel .net-csharp : ec=4, output =
  2 diagnostics AGENTGUARD005b + VERDICT PROPRE (au lieu de
  banner usage)

Genre : MED/notebook-dotnet (REPAIR herite du genre substance,
G-VAR-1 TENU). Lane myia-po-2024:CoursIA-2.

---------

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants