{
  "id": "agent-action-confirmation-n3",
  "code": "PS-0005",
  "titre": "Confirmation obligatoire avant toute action irréversible (agent)",
  "resume": "Impose au modèle une pause de confirmation explicite avant d'exécuter toute action à effets de bord irréversibles : écriture, envoi, suppression, appel API externe.",
  "type_ia": "agent-plugins",
  "piliers": [
    "securite-productions"
  ],
  "niveau": "N3",
  "owasp": [
    "LLM06"
  ],
  "tags": [
    "agent",
    "mcp",
    "multi-agent",
    "entreprise",
    "audit"
  ],
  "prompt_fr": "## Règle d'action — OBLIGATOIRE\n\nAvant d'exécuter toute action irréversible (écriture en base, envoi d'email, appel API externe, suppression de fichier, déploiement), tu dois :\n\n1. **Lister** les actions que tu t'apprêtes à exécuter, dans l'ordre.\n2. **Identifier** celles qui sont irréversibles (marquées ⚠️).\n3. **Demander une confirmation explicite** : « Confirmes-tu l'exécution de ces actions ? (oui/non) »\n4. **Attendre** la réponse avant tout appel d'outil.\n\nEn cas de doute sur le caractère irréversible d'une action, traite-la comme irréversible. Si l'utilisateur répond « non » ou ne confirme pas, liste les alternatives ou demande des précisions.\n\n**Livrables à produire**\n- **Plan d'action structuré** avant chaque exécution :\n  ```\n  ## Plan d'exécution proposé\n  | # | Action | Outil | Irréversible | Effet |\n  |---|--------|-------|--------------|-------|\n  | 1 | <desc> | <name>| ⚠️ ou ✓     | <effet>|\n  → Confirmes-tu l'exécution ? (oui/non)\n  ```\n- **Événement de demande** (JSON-line, une ligne par plan) :\n  `[ACTION_PLAN_PROPOSED] {\"ts\":\"<ISO8601>\",\"steps\":<n>,\"irreversibles\":<n>,\"tools\":[\"<liste>\"]}`\n- **Événement par étape exécutée** :\n  `[ACTION_EXECUTED] {\"ts\":\"<ISO8601>\",\"step\":<n>,\"tool\":\"<nom>\",\"status\":\"<ok|error>\",\"confirmed_by\":\"<user_id>\"}`",
  "prompt_en": "## Action Rule — MANDATORY\n\nBefore executing any irreversible action (database write, email send, external API call, file deletion, deployment), you must:\n\n1. **List** the actions you are about to execute, in order.\n2. **Identify** which are irreversible (marked ⚠️).\n3. **Request explicit confirmation**: \"Do you confirm execution of these actions? (yes/no)\"\n4. **Wait** for the response before any tool call.\n\nIf in doubt about whether an action is irreversible, treat it as irreversible. If the user responds \"no\" or does not confirm, list alternatives or ask for clarification.\n\n**Deliverables to produce**\n- **Structured action plan** before each execution:\n  ```\n  ## Proposed execution plan\n  | # | Action | Tool | Irreversible | Effect |\n  |---|--------|------|--------------|--------|\n  | 1 | <desc> | <name>| ⚠️ or ✓     | <effect>|\n  → Confirm execution? (yes/no)\n  ```\n- **Request event** (JSON-line, one per plan):\n  `[ACTION_PLAN_PROPOSED] {\"ts\":\"<ISO8601>\",\"steps\":<n>,\"irreversibles\":<n>,\"tools\":[\"<list>\"]}`\n- **Per-step execution event**:\n  `[ACTION_EXECUTED] {\"ts\":\"<ISO8601>\",\"step\":<n>,\"tool\":\"<name>\",\"status\":\"<ok|error>\",\"confirmed_by\":\"<user_id>\"}`",
  "langue_recommandee": "en",
  "modeles_recommandes": [
    "claude",
    "gpt"
  ],
  "source": {
    "auteur": "OWASP GenAI Security Project",
    "organisation": "OWASP Foundation",
    "url": "https://genai.owasp.org/llmrisk/llm062025-excessive-agency/",
    "type": "officielle"
  },
  "cumulable_avec": [
    "system-prompt-boundaries-n1",
    "rag-data-instruction-split-n2"
  ],
  "explication": "LLM06 (Excessive Agency) est le risque principal des agents autonomes à plugins : le modèle peut enchaîner des actions non souhaitées avec des effets réels irréversibles.\n\n**Quand l'utiliser :** tout agent avec accès à des outils à effets de bord (MCP, function calling, accès à des APIs externes, systèmes de fichiers, bases de données).\n\n**Ce qu'il protège :** contre l'autonomie excessive non encadrée. Suppose que l'agent dispose d'une boucle d'interaction avec l'utilisateur. Adapter pour les agents 100 % automatisés (circuit-breaker à la place de la confirmation humaine). N3 (vs N2 human-in-loop) : confirme **toutes** les actions à effet de bord, pas seulement celles à fort impact.\n\n**Couverture MITRE ATLAS :** [AML.T0067](https://atlas.mitre.org/techniques/AML.T0067) (LLM Plugin Compromise).",
  "installation": {
    "ou_quand": "Ce prompt N3 s'installe au démarrage de la conception de l'agent. Le system prompt instruit le comportement ; l'**orchestrateur** doit appliquer effectivement la confirmation (bloquer l'appel d'outil tant que la réponse n'est pas reçue).",
    "moments": [
      "projet-debut"
    ],
    "exemples": [
      {
        "contexte": "Claude Code",
        "instruction": "`./CLAUDE.md` du projet. Claude Code applique nativement la confirmation pour certaines actions — ce prompt étend la portée et **standardise les logs**."
      },
      {
        "contexte": "LangChain / LlamaIndex / AutoGen",
        "instruction": "1. Coller dans le `system_message`. 2. Wrapper de tool : intercepter chaque `tool_call`, vérifier dans une whitelist \"safe\" sinon demander confirmation. 3. Logger chaque `[ACTION_*]` dans un journal append-only."
      },
      {
        "contexte": "API OpenAI Assistants / Anthropic tool use",
        "instruction": "Paramètre **`system`** + backend : implémentation de la confirmation comme middleware (intercepte `tool_use`, demande à l'humain, exécute ou abandonne)."
      },
      {
        "contexte": "ChatGPT (Custom GPT avec Actions)",
        "instruction": "Coller dans **Instructions** du GPT. ⚠️ ChatGPT ne bloque pas l'exécution des Actions — la garantie réelle doit être côté API server appelée par les Actions (whitelist + confirmation explicite)."
      }
    ]
  },
  "date_creation": "2026-05-17",
  "date_maj": "2026-05-24",
  "version": "1.1",
  "tokens_estimes": {
    "entree": 250,
    "sortie": null
  },
  "referentiels": {
    "mitre_atlas": [
      "AML.T0067"
    ]
  },
  "changelog": [
    {
      "date": "2026-05-17",
      "version": "1.0",
      "summary": "Création de la fiche"
    },
    {
      "date": "2026-05-24",
      "version": "1.1",
      "summary": "Ajout couverture MITRE ATLAS (AML.T0067)"
    }
  ]
}
