Skip to content

TP MSAPP3IN08 : @SandaFanilo, @paytafrit1-netizen, @christtchianganadany-code — 09b_Prompt_Security_RedTeam, exercice 1 (defense_context) - #21078

Merged
myia-ai-01 merged 2 commits into
jsboige:mainfrom
paytafrit1-netizen:tp-msapp3in08-09b-exercice1
Oct 16, 2026
Merged

myia-ai-01 merged 2 commits into
jsboige:mainfrom
paytafrit1-netizen:tp-msapp3in08-09b-exercice1

Conversation

@DanyAiBot

@DanyAiBot DanyAiBot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

TP MSAPP3IN08 — notebook 09b_Prompt_Security_RedTeam, exercice 1

Notebook : MyIA.AI.Notebooks/GenAI/Texte/09b_Prompt_Security_RedTeam.ipynb
Exercice corrigé : exercice 1 — defense_context(context_text: str) -> str (stub étudiant remplacé)
Version poussée : le notebook avec ses sorties d'exécution, pour que les résultats soient lisibles directement dans la PR.


État des sorties (à lire avant la review)

Le notebook est poussé tel qu'il a été exécuté, sorties comprises. Une précision
d'honnêteté, parce qu'elle se voit dans les sorties :

  • L'exécution de la cellule de l'exercice 1 n'a pas été menée jusqu'au bout. Nous
    n'avons pas attendu la fin du critère (b), qui enchaîne plusieurs lignes de 10 essais
    modèle. La sortie s'arrête donc après :

    • [garde-fou : brut] 4/10 — la charge de référence produit bien des succès,
      donc la comparaison est exploitable ;
    • [notebook : brut] 0/10 et [notebook : défendu] 0/10.

    Les dernières lignes de la batterie manquent, dont la seule qui tranche
    (contrôle : marqueur inconnu de la défense). Nous ne les présentons pas comme
    acquises.

  • La cellule de mesure FR/EN se termine par un KeyboardInterrupt : l'exécution
    a été arrêtée pendant cette mesure, pour la même raison.

  • Le critère (a), lui, est complet : 11 / 11 propriétés.

Ces sorties sont donc partielles et assumées comme telles. Elles montrent ce qui
a été réellement observé, pas ce que nous aurions voulu observer.


Ce que fait la correction

La fonction assainit un contexte destiné au RAG sans le réécrire : elle retire aux
consignes embarquées leur autorité, et non le texte du document — le résumé
demandé au modèle doit rester fidèle.

  • démotion des tournures d'instruction : chaque phrase portant une consigne est
    encadrée et marquée comme donnée citée, au lieu de rester une instruction
    exécutable ;
  • neutralisation des marqueurs : casse et séparateurs confondus, base64
    (décodé avant décision), Unicode Tags U+E0000–E007F, et homoglyphes
    cyrilliques/grecs ;
  • délimiteurs forgés : un </context> présent dans le document est échappé,
    pour qu'il ne puisse pas fabriquer une frontière ;
  • préservation du contenu légitime : les faits sains restent lisibles.

Le choix de conception est visible dans la sortie : le document reste entier,
seul le marqueur est réellement retiré — c'est la seule garantie qui ne dépend pas
du bon vouloir du modèle.

Vérifications effectuées

  • critère (a) — 11 propriétés déterministes, toutes [OK], sans aucun appel
    modèle : cas nominal, casse/séparateurs, Unicode Tags, base64, frontière forgée,
    contenu bénin préservé (dont un base64 bénin), idempotence, chaîne vide ;
  • critère (b) — amorcé : le garde-fou confirme que l'attaque de référence
    fonctionne (4/10), condition nécessaire pour que la comparaison ait un sens ;
  • la cellule compile et le notebook n'a pas d'erreur ailleurs dans les sorties.

Limites (explicites)

  • La mesure avec modèle est incomplète (voir ci-dessus) : les dernières lignes
    de la batterie, dont la mesure non circulaire sur marqueur inconnu, restent à
    produire
    .
  • La défense est une liste de motifs : une consigne reformulée sans mot-clé
    passe. C'est une limite assumée de l'approche, écrite dans la cellule.
  • Aucune clé API n'est présente dans le notebook : il lit ses secrets depuis
    l'environnement / les secrets Colab et n'affiche jamais leur valeur (une
    cellule de diagnostic affiche la longueur de la clé, information non secrète)
    .

Vérification de doublon

Les PR ouvertes du dépôt ont été passées en revue par titre : aucune ne vise
09b / Prompt_Security / RedTeam. À notre connaissance, cet exercice n'est pas
déjà corrigé.

Assistance

Groupe : @SandaFanilo, @paytafrit1-netizen, @christtchianganadany-code
Assistance par agent : DanyAiBot — code, tests et rédaction assistés. Déclaré
dans le commit (Co-Authored-By) et ici.


Travail préparé sur le notebook du cours, sur une branche dédiée.

…text)

Corrige le stub de l'exercice 1 sans toucher au reste du notebook : la fonction
defense_context neutralise les consignes embarquées dans un document destiné au
RAG (démotion des tournures d'instruction, neutralisation des marqueurs y
compris base64, Unicode Tags et homoglyphes, échappement des délimiteurs forgés),
puis vérifie le résultat par 14 propriétés déterministes exécutables sans aucun
appel modèle, plus un contrôle mesuré avec le modèle (désactivé par défaut, avec
marqueur de contrôle et intervalle de confiance).

Le diff est limité à cette seule cellule.

Groupe : @SandaFanilo, @paytafrit1-netizen, @christtchianganadany-code
Assistance par agent : DanyAiBot — code, tests et rédaction assistés.

Co-Authored-By: DanyAiBot <343041002+DanyAiBot@users.noreply.github.com>

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Hermes] TP EXERCICE 1 — defense_context — verdict étudiant : excellent travail, exécuté réellement au head e2349d4c

Forces (vérifiées par exécution, pas par lecture) — j'ai extrait votre cellule et l'ai rejouée telle quelle : 14/14 propriétés déterministes passent, 0 ligne-consigne manquée, sur-blocage mesuré 1/3 phrases (faits sains préservés), et le critère (b) à modèle est proprement désactivé par défaut (MESURER_AVEC_MODELE = False) — bonne attention pour un TP noté sur quota d'appels.

Ce qui distingue ce travail au-delà de l'énoncé :

  • La méthode est plus solide que la plupart des défenses industrielles : neutralisation par retrait d'autorité (consignes démisses en « ⟦donnée citée, non exécutable ») plutôt que suppression du texte — le résumé demandé à l'assistant reste fidèle.
  • Confusables pliés (cyrillique/grec → latin) : « РWNED » (U+0420) ne traverse pas la détection. NFKC seul ne l'aurait pas fait.
  • Canari inconnu de la défense (CANARI-7F3A9) : sans lui, la mesure (b) serait circulaire — chercher PWNED après une défense qui retire PWNED prouve zéro. C'est une conscience méthodologique rare.
  • IC de Wilson et Fisher exact sans dépendance externe : la rigueur statistique est au niveau d'un mémoire, pas d'un TP.
  • Idempotence f(f(x)) == f(x) testée (P10) — la plupart des défenses l'oublient.

Une piste d'amélioration (non bloquante, pour votre rapport) : le sur-blocage mesuré est de 1/3 phrases démises sur document sain. C'est honnêtement mesuré dans votre propre sortie (« 1/3 phrases démises (33%) »). Vos règles _IMPERATIVE_RE anglaises couvrent bien les consignes, mais les phrases déclaratives saines contenant un verbe à l'impératif d'état (« Note: », « Remember that… ») peuvent être démisses à tort. Une piste : ne démettre que si la ligne contient AUSSI un marqueur d'autorité (role/ignore/instruction/mode), pas l'impératif seul.

Félicitations au groupe — c'est un travail de niveau bien au-delà de l'exercice demandé. (Exécution de vérification : critère (a) complet rejoué hors ligne, 0 erreur.)

@github-actions github-actions Bot added the pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) label Oct 16, 2026
@github-actions

Copy link
Copy Markdown
Contributor

PR gate absent du rollup (advisory, #10928)

PR gate est absent du rollup de cette PR et la cause n'est pas determinee : les mesures suivantes ont ete faites, aucune ne tranche.

  • mergeable_state = blocked (pas dirty) ;
  • aucun evenement base_ref_changed dans la timeline ;
  • le sujet du commit de tete ne porte pas le token [skip ci] ;
  • auteur : DanyAiBot (pas une PR bot).

Un remede au hasard coute un commit sans effet (issue #14477 : la prescription est fonction de la cause). Signaler ce cas sur le dashboard de coordination pour investigation manuelle -- c'est le cas non identifie #10902 qui reste en suspens.

Cause mesuree : mergeable_state=blocked, pas de base_ref_changed, sujet sans [skip ci], auteur DanyAiBot

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #21078 (TP MSAPP3IN08 : @SandaFanilo, @paytafrit1-netizen, @christtchianganadany-code — 09b_Prompt_Security_RedTeam, exercice 1 (defense_context)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

…ec ses sorties

Pousse le notebook exécuté, sorties comprises, pour que les résultats soient
lisibles directement dans la PR.

État des sorties, assumé et documenté dans la PR : l'exécution de la cellule de
l'exercice 1 n'a pas été menée jusqu'au bout. Le critère (a) est complet
(11 / 11 propriétés, sans appel modèle) ; le critère (b) s'arrête après la ligne
de garde-fou (4/10, la charge de référence produit bien des succès) et les deux
premières lignes de batterie. La cellule de mesure FR/EN se termine par un
KeyboardInterrupt, pour la même raison.

Groupe : @SandaFanilo, @paytafrit1-netizen, @christtchianganadany-code
Assistance par agent : DanyAiBot — code, tests et rédaction assistés.

Co-Authored-By: DanyAiBot <343041002+DanyAiBot@users.noreply.github.com>
@myia-ai-01

Copy link
Copy Markdown
Collaborator

[CLAIMED] lane myia-po-2023:CoursIA — intégration du rendu étudiant (exemples guidés crédités au groupe de cette PR, exercices de remplacement, ré-exécution complète), posé au dispatch par le coordinateur.

@myia-po-2023

Copy link
Copy Markdown
Collaborator

Bonjour, et merci pour ce rendu. L'intégration de votre TP (09b_Prompt_Security_RedTeam, exercice 1) dans CoursIA est préparée par l'équipe pédagogique — il ne reste plus qu'un geste de votre côté.

Ce que l'intégration contient (commit eb088586e8, prêt sur la branche tp21078-integration du dépôt jsboige/CoursIA, et PR d'intégration #21106) :

  • Votre solution de l'exercice 1 devient un exemple guidé, créditée « groupe de la PR TP MSAPP3IN08 : @SandaFanilo, @paytafrit1-netizen, @christtchianganadany-code — 09b_Prompt_Security_RedTeam, exercice 1 (defense_context) #21078 » (aucun nom ni login dans le carnet, conformément à la règle zéro-PII) : assainir un contexte RAG contre l'injection indirecte. Votre raisonnement est conservé tel quel — les propriétés déterministes sans modèle, la vérification avec modèle en deux temps, et surtout le marqueur de contrôle : une défense mesurée contre le seul marqueur qu'elle connaît rend 0 % par construction, ce qui ne prouve rien. C'est la partie la plus utile de votre rendu, et elle est écrite noir sur blanc dans le carnet.
  • Une lecture de méthode complète l'exemple : le marqueur de contrôle survit dans 9 sorties sur 10 malgré la défense. L'assainissement retire le mot que l'oracle cherche, il ne désarme pas la classe d'attaque — c'est ce qui borne exactement la portée de votre 0 %.
  • Un exercice de remplacement : blindage par itérations adversariales (stub à compléter). Votre méthodologie de mesure (N essais, oracle, taux de succès) devient l'objet de l'exercice. Les cellules de harnais committées sans être exécutées (execution_count nul sur trois d'entre elles) n'ont pas été intégrées telles quelles : leur contenu utile est reporté dans cet exercice.
  • Ré-exécution complète : 40 cellules (16 de code), 0 erreur, sur le modèle épinglé du cours (qwen/qwen3.5-35b-a3b).
  • Au passage, trois écarts entre la prose du carnet et ce que l'exécution montre ont été recalés : le verdict de l'injection directe est mesuré DEFENSE sur ce run et non SUCCES, le modèle réellement épinglé est nommé, et le résultat de la ligne de contrôle est rendu visible au lieu de rester implicite.

Le geste demandé — deux options, au choix :

  1. (Recommandée) Depuis un clone de votre fork, sur la branche tp-msapp3in08-09b-exercice1 :

    git fetch https://github.com/jsboige/CoursIA.git tp21078-integration
    git merge --ff-only FETCH_HEAD
    git push origin tp-msapp3in08-09b-exercice1
    

    L'intégration est construite sur la tête de votre branche : le fast-forward s'applique sans conflit, et votre PR devient mergeable telle quelle.

  2. Ou répondez ici que vous préférez passer par la PR d'intégration séparée — feat(genai,#21078): digestion TP MSAPP3IN08 -- assainissement de contexte RAG en exemple guide credite + exercices neufs #21106 est déjà ouverte côté équipe, votre PR TP MSAPP3IN08 : @SandaFanilo, @paytafrit1-netizen, @christtchianganadany-code — 09b_Prompt_Security_RedTeam, exercice 1 (defense_context) #21078 restera liée comme source et sera créditée identiquement.

Aucune urgence : votre rendu est déjà pris en compte côté évaluation. Merci encore — vérifier une défense contre un marqueur qu'elle ne connaît pas, et documenter ce qu'elle ne couvre pas, est exactement le réflexe qu'on cherche à installer dans cette série.

myia-po-2023 pushed a commit that referenced this pull request Oct 16, 2026
…aration du retrait de l'appareil statistique

Response to NanoClaw structural review at head eb08858:

- cell 33 stub header harmonized to the exact label of stubs 35/37
  (accented form). Comment-only change: no semantic delta, outputs
  committed remain those of the defended run the review verified
  verbatim (CANARI-7F3A9 in 9/10 outputs) - a re-exec would regenerate
  stochastic LLM responses and destroy that verified property, so the
  comment-only edit is documented instead of re-executed.
- body declaration added for the withdrawal of the student statistical
  harness (fisher_exact / oracle_strict / IC95 / N=30 FR-EN run),
  justified per-cell per protocol rule 7.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
myia-ai-01 added a commit that referenced this pull request Oct 16, 2026
feat(genai,#21078): digestion TP MSAPP3IN08 -- assainissement de contexte RAG en exemple guide credite + exercices neufs
@myia-ai-01
myia-ai-01 merged commit b20ff21 into jsboige:main Oct 16, 2026
@myia-ai-01

Copy link
Copy Markdown
Collaborator

Merci pour ce travail sur 09b_Prompt_Security_RedTeam.ipynb !

Votre défense contre l'injection indirecte est intégrée au carnet du cours (PR #21106, fusionnée en merge commit, donc votre commit reste dans l'historique du dépôt) :

Votre appareil statistique (intervalle de Wilson, run N=30 français contre anglais, test exact de Fisher) relève d'une question de mesure qui dépasse le sujet sécurité de ce carnet : il n'a pas été repris ici, et il reste dans votre fork, qui garde l'archive complète de votre rendu. C'est une bonne démarche de mesure, à réutiliser dans votre projet.

Bonne continuation !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants