grahama1970/battle

Orchestrateur de compétition de sécurité entre équipes Rouge et Bleue. Exécute des batailles de longue durée avec des milliers d'interactions, notation et génération d'informations.

Qu'est-ce que battle ?

Battle est un orchestrateur de compétition de sécurité qui oppose une équipe Rouge (attaque) à une équipe Bleue (défense) dans une boucle compétitive longue durée. Chaque équipe exploite l'ensemble des compétences `.pi/skills` pour attaquer ou défendre une base de code cible. Battle prend en charge des invariants projet-spécifiques via un Juge pluggable, des campagnes d'invariants pour tester le plancher contractuel et au-delà, et une lignée adaptative pour documenter les correctifs. Sur le plan architectural, Battle est une compétence d'orchestration qui planifie les rounds, choisit les personnalités, répartit les sous-agents, provisionne les environnements Docker, collecte les reçus, note les signaux d'exécution, rédige des rapports et persiste l'apprentissage. Les preuves PixiJS sont uniquement un affichage des reçus ; elles ne valident pas le fonctionnement complet de l'orchestrateur, des sous-agents ou de l'isolation.

Compatible avec✓Claude Code~Codex CLI~Cursor✓Antigravity✓OpenCode
npx skills add https://github.com/grahama1970/agent-skills/tree/main/skills/battle

Installed? Explore more Productivité et collaboration skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

STOP. LISEZ CE SKILL.MD EN ENTIER AVANT D'APPELER UN POINT DE TERMINAISON.

Compétence Battle

Orchestrateur de compétition de sécurité entre équipes Rouge et Bleue

Oppose une équipe Rouge (attaque) à une équipe Bleue (défense) dans une boucle compétitive longue durée. Chaque équipe exploite l'ensemble des compétences .pi/skills pour attaquer ou défendre une base de code cible.

Batailles invariantes (le cas courant)

Le système de notation par défaut de Battle cible l'exploitation (panne système, injection de commandes), mais l'utilisation réelle la plus fréquente d'une boucle antagoniste Rouge/Bleue est la vérification d'un INVARIANT SPÉCIFIQUE AU PROJET : "aucune fuite de valeurs PII", "le grand livre est équilibré", "l'analyseur ne perd aucun enregistrement", "la vérification d'autorisation ne peut être contournée".

Fournissez un Juge pluggable d'invariant -- un petit module indépendant judge(target_dir, params) -> {passed, violations, evidence} (schéma battle.invariant_result.v1). L'objectif de Rouge devient "produire une entrée qui fait échouer le Juge" ; celui de Bleu est "la faire réussir" ; le marqueur lit le résultat du Juge, jamais l'auto-déclaration d'un agent. Les Juges sont en échec par défaut : un juge qui génère une erreur est un INVARIANT ÉCHOUÉ, jamais un succès silencieux.

python3 -m battle_skill.invariant_judge \
  --juge fixtures/reference-judges/no_data_leak_judge.py \
  --cible <dossier-de-sortie-libérée> \
  --params '{"politique": "politique.json", "sous_dossier_sortie": "corpus"}'

fixtures/reference-judges/no_data_leak_judge.py est l'invariant de confidentialité de l'anonymiseur en tant que Juge : il analyse indépendamment la sortie libérée (scalaires JSON incluant échappements décodés, expansion numérique, cellules SQLite + schéma DDL + entiers d'en-tête, texte/CSV, rapport.json, et stdout/stderr capturés) pour toute valeur de politique dans toute représentation.

Recherche sur la famille de variation contractuelle (composition Battle générique)

Battle n'est pas spécifique à un projet. Pour tout projet ou compétence avec un acceptance_contract.bundle.v1, Battle doit développer chaque élément de contrat via Dogpile avant de revendiquer une couverture antagoniste complète :

./run.sh plan-de-variation-contrat \
  --lot-acceptation /chemin/vers/lot_acceptation.json \
  --source-dogpile brave-search \
  --source-dogpile arxiv \
  --sortie /tmp/plan-variation-battle.json

La sortie est battle.contract_variation_plan.v1. Il s'agit d'un contrat Battle en trois phases, pas d'une note informelle :

  1. Phase 1 : réussir le plancher gelé de l'acceptance_contract.bundle.v1.
  2. Phase 2 : après cette réussite, rassembler $état-projet, les reçus Battle actuels, la recherche $dogpile filtrée par source, et les propositions du réviseur $ask one-shot.
  3. Phase 3 : geler les résultats utiles de la Phase 2 en cas déterministes, les exécuter, et conserver la preuve de lignée adaptative pour les victoires de Rouge, les correctifs de Bleu et la relecture.

Le plan mappe chaque cas d'acceptation vers des pistes de recherche Dogpile avec source et des familles de variation réutilisables. Utilisez des filtres --source-dogpile répétables lorsqu'une phase Battle n'a besoin que de certains fournisseurs Dogpile comme brave-search, arxiv, github-search, youtube, brave-questions, feeds, wayback, ou context7 au lieu de l'éventail complet des sources. Les familles de variation réutilisables incluent l'équivalence de représentation, l'encodage/normalisation, les différentiels d'analyseurs, les limites de surface de libération, la conversion avec perte, les faits scindés/composés, l'échelle, la tentative/concurrence, l'autorisation, et les limites de fuite d'échec. Dogpile et Ask sont uniquement des entrées de recherche : ils découvrent des familles de variation significatives et des preuves sources. Battle gèle ensuite les familles sélectionnées en générateurs déterministes, exécute la cible réelle dans des portes de preuves Docker/QEMU/jumeau numérique, émet battle.case_receipt.v1 par cas, agrège avec battle.campaign_aggregate.v1, et conserve les classes de workflow comme cas $agentic-evals. Une porte de libération sérieuse devrait s'attendre à des centaines de cas déterministes et environ 20 à 30 classes d'évaluation conservées lorsque la surface contractuelle est large ; les portes de fumée plus petites doivent s'étiqueter comme fumée.

Campagnes d'invariants (tester le plancher contractuel, puis attaquer au-delà)

Une bataille invariante juge une sortie. Une campagne invariante fait générer par Rouge la MATRICE complète des "versions" d'entrée que la spécification de la cible nomme -- chaque format x chaque représentation x les cas limites documentés -- PLUS des tests aléatoires, exécute la cible réelle sur chacun, et le Juge note chaque sortie. Chaque cas émet un battle.case_receipt.v1 avec les champs de pré-vérification du dispositif, d'exécution, de rejet, de Juge de sécurité, de Juge fonctionnel optionnel, et de verdict. Une campagne RÉUSSIT uniquement si tous les reçus de cas réussissent, les cas MUST_ACCEPT requis sont effectivement acceptés et jugés fonctionnellement, les cas MUST_REJECT requis sont rejetés en toute sécurité, et l'battle.campaign_aggregate.v1 calculé n'a aucun cas échoué ou incomplet. Une version qui échoue est une victoire concrète et reproductible pour Rouge.

Pour les cibles d'anonymisation/confidentialité, le contrat d'acceptation n'est que le plancher. Lorsqu'un acceptance_contract.bundle.v1 existe, la construction de l'arène peut le passer comme acceptance_floor à l'adaptateur de production. Battle échoue alors par défaut à moins que chaque id de acceptance_cases[] ne corresponde à au moins un cas de générateur de campagne dans les required_case_ids du profil ; ce sont les versions antagonistes minimales qui DOIVENT réussir avant que tout test aléatoire supplémentaire ou les cas hors contrat importent. Battle doit également exécuter une campagne hors contrat qui attaque les surfaces qu'un brief client omet souvent : clés JSON et clés dupliquées, en-têtes/dialectes/cellules multilignes CSV, identifiants/valeurs par défaut/valeurs générées/index partiels/déclencheurs SQLite, noms de fichiers, rapport.json, stdout/stderr, encodages alternatifs, et pièges de représentation de même identité. Une simple relecture de la matrice du brief est une preuve de fumée, pas une preuve Battle complète.

python3 -m battle_skill.invariant_campaign \
  --générateur fixtures/reference-generators/anon_brief_matrix.py \
  --cmd-exéc-cible 'docker run --rm -v {entrée}/corpus:/essai/entrée/corpus:ro -v {entrée}/politique.json:/essai/entrée/politique.json:ro -v {sortie}:/essai/sortie anonymization-trial run' \
  --juge fixtures/reference-judges/no_data_leak_judge.py \
  --params-gen '{"fuzz": 20}' --params-juge '{"sous_dossier_sortie": "corpus"}'

fixtures/reference-generators/anon_brief_matrix.py produit les versions du brief d'anonymisation : les quatre formats, chaîne JSON/int/float/scientifique, SQLite TEXT/INTEGER/REAL, Unicode NFC/NFD, BOM, échappement JSON \u, SQLite CHECK-littéral, plus fuzz. Il porte également les cas limites de la table ronde d'essai oai : valeurs de téléphone formatées de politique stockées sous forme de numériques JSON/SQLite à chiffres uniquement, la même identité ensemencée dans tous les formats concernés, et les pièges de perte de zéro non significatif / grand flottant. fixtures/reference-generators/anon_beyond_brief_matrix.py est l'échelon suivant requis pour la preuve de confidentialité/anonymisation : il essaie les surfaces non évidentes de schéma/chemin/encodage/journal/limite de libération qui vont au-delà du contrat d'acceptation littéral. Un générateur + cmd-exéc-cible + juge est un trio pluggable : pointez-le vers la matrice de spécification et l'invariant de tout projet.

Le Juge sans fuite de données prend également en charge un profil d'interprétation d'adhésion explicite pour la sémantique de transformation. Ces garanties sont DÉSACTIVÉES sauf si déclarées dans --params-juge, donc Battle n'étend pas silencieusement le contrat après avoir vu un échec :

{
  "profil_interprétation": {
    "décodeurs": ["base64", "base64url", "hex"],
    "reconstruction_locale_enregistrement": true,
    "max_octets_décodés": 4096
  }
}

Avec ce profil, les valeurs scalaires/token entières base64/base64url/hex sont décodées une fois et les champs scalaires JSON/CSV/SQLite adjacents au niveau de l'enregistrement peuvent reconstruire une valeur de politique complète. Le décodage récursif arbitraire, les jointures globales de champs, et le pliage de caractères visuellement ambigus restent en dehors de la porte de blocage par défaut.

Après que Rouge trouve des cas échoués et que Bleu corrige la cible, émettez le reçu de lignée reproductible au lieu de résumer en prose :

./run.sh reçu-lignée-invariant \
  --campagne-rouge /tmp/résultat-rouge.json \
  --campagne-relecture /tmp/résultat-relecture.json \
  --cible oai-trial \
  --sortie /tmp/lignée-battle.json

Un battle.invariant_adaptive_lineage.v1 RÉUSSI prouve que Rouge a trouvé des cas limites contractuels, Bleu a supprimé ces victoires de Rouge, et la relecture indépendante du Juge a réussi.

Ensuite, Battle doit produire un rapport validé par $créer-rapport avec le contexte $état-projet et une table d'exploits explicite. Le rapport est l'artefact de décision lisible par l'homme ; les reçus restent l'autorité. Générez d'abord un état de projet frais, puis rendez le rapport :

RACINE_ÉTAT_PROJET=/chemin/vers/cible ../état-projet/run.sh rapport --json --sortie /tmp/état-projet.json
./run.sh rapport-invariant \
  --campagne /tmp/brief-battle-fuzz.json \
  --campagne /tmp/battle-au-delà-brief.json \
  --lignée-adaptative /tmp/lignée-battle.json \
  --état-projet /tmp/état-projet.json \
  --cible oai-trial \
  --sortie-json /tmp/rapport-battle.json \
  --sortie-md /tmp/rapport-battle.md

Pour la revue terminale par l'agent du projet, utilisez des fiches lorsque les cas ont de longues preuves :

./run.sh rapport-invariant \
  --campagne /tmp/brief-battle-fuzz.json \
  --campagne /tmp/battle-au-delà-brief.json \
  --état-projet /tmp/état-projet.json \
  --cible oai-trial \
  --sortie-json /tmp/rapport-battle.json \
  --sortie-md /tmp/rapport-battle.md \
  --fiches-terminal

rapport-invariant est une commande CLI Typer. Elle écrit le JSON machine sur stdout et conserve le rapport Battle humain sur stderr. Utilisez --fiches-terminal pour la revue normale par l'agent du projet des preuves Battle : il regroupe les fiches sous les titres Plancher du contrat d'acceptation, Exploits hors contrat, Lignée adaptative, et Autres cas de campagne, puis imprime un bloc ============== par cas avec Portée, Cas, Parent d'acceptation, Attendu, Résultat, Exemple, Pourquoi Battle vérifie cela, Recherche associée, Lignée adaptative, et Preuve du Juge. Si un reçu d'adaptateur de production porte acceptance_floor.case_map, les fiches du plancher contractuel montrent le(s) id(s) parent AC-* ; sinon Parent d'acceptation est non enregistré dans le reçu du cas. Si un reçu a exemple, pourquoi_choisi, refs_recherche, ou refs_source, les fiches montrent ces champs exacts ; sinon les exemples/justifications sont déterministes à partir de l'id du cas et la recherche est signalée comme non enregistrée dans le reçu du cas.

--tableau-terminal reste l'alias de vue d'ensemble compact pour --résumé-terminal : tous deux impriment le plancher contractuel, la pression Rouge, l'appel du marqueur, et une ligne de tableau de cas par attaque. Dans un terminal interactif, Battle utilise le tableau coloré de Rich (RED_WIN rouge, réussites propres vert, arrêts sécurisés jaune) et honore NO_COLOR ; en capture/CI, il tombe dans du texte brut déterministe pour que les journaux et tests restent stables.

rapport-invariant écrit create_report.report.v1, le valide via skills/create-report/run.sh validate, rend le Markdown via skills/create-report/run.sh render, et ajoute ## Tableau des exploits. Le tableau doit être simple et scannable : une ligne par cas d'attaque, avec les colonnes Portée, Contractuel ?, Lignée adaptative ?, Cas, Exploit / attaque, Pourquoi choisi, Attendu, Résultat, et Preuve du Juge. Portée sépare les cas contractuel du plancher d'acceptation des sondes hors contrat ; Pourquoi choisi explique les sondes non contractuelles ; Lignée adaptative ? marque les victoires Rouge qui ont été corrigées et rejouées ; RED_WIN bloque la libération. Le tableau est dérivé de battle.case_receipt.v1 lorsqu'il est présent, en se rabattant sur le case_log hérité uniquement pour les anciens reçus de campagne. Une clôture Battle sans ce rapport manque de la surface de décision même si les reçus de campagne réussissent.

Limite de finalité

La finalité de Battle est le backend de compétition de sécurité Rouge/Bleue : configuration autorisée de la cible, exécution isolée, génération d'attaque Rouge, génération de défense Bleue, relecture indépendante du Juge, reçus du marqueur, lignée adaptative, et apprentissage durable. La lignée adaptative est une boucle d'apprentissage backend qui génère, évalue, sélectionne, et promeut ou rejette les preuves enfants Rouge/Bleue à partir des reçus soutenus par le Juge.

PixiJS est uniquement une surface de spectateur/relecture pour les reçus Battle. Une réussite PixiJS prouve que les reçus enregistrés peuvent être inspectés dans une relecture amusante ; elle ne prouve pas que l'orchestrateur Battle, les sous-agents pilotés par fournisseurs, l'isolation Docker/QEMU, le planificateur de nuit, le marqueur, ou l'apprentissage mémoire fonctionnent. Ne concluez pas à la préparation du Battle central à partir des seules preuves PixiJS, et ne bloquez pas la lignée adaptative backend sur le polissage de la relecture au-delà de l'inspectabilité fidèle des reçus.

Architecture

Le Battle de production est une compétence d'orchestration, pas un grand moteur de sécurité sur mesure. Le processus hôte doit planifier les rounds, choisir les personnalités, répartir les sous-agents, provisionner les environnements d'exécution Docker, collecter les reçus, noter les signaux d'exécution durs, écrire des rapports, et persister l'apprentissage. Le code cible et le code généré par les équipes doivent s'exécuter uniquement à l'intérieur de Docker.

Invariants de production requis :

  • Rouge et Bleu sont des équipes de sous-agents. Chaque sous-agent réparti doit inclure une personnalité explicite sélectionnée par l'orchestrateur pour ce tour. Plusieurs personnalités par équipe peuvent s'exécuter simultanément lorsque le tour bénéficie de la largeur.
  • L'exécution Battle nécessite un manifeste security.target_authorization.v1 avant le démarrage de Docker, QEMU, la configuration de l'environnement d'exécution cible, la délégation Hack, la relecture de preuve, ou la relecture de correctif. Le manifeste lie la portée projet/opérateur et l'identité cible ; ce n'est pas un avis juridique et ne prouve pas le succès de l'exploit ou l'efficacité du correctif.
  • L'exécution de $hack de l'équipe Rouge est une responsabilité de sous-agent, pas une import Python Battle. Battle effectue ou planifie une analyse/recherche/rappel mémoire, construit la liste d'exploits candidats, choisit la personnalité Rouge, répartit un sous-agent agent-skills/agents/Tau avec ce contrat, et enregistre le reçu d'exploit retourné.
  • Les transferts et reçus de sous-agents doivent suivre la forme de contrat JSON compacte de style Tau utilisée par tau.agent_handoff.v1 et tau.subagent_receipt.v1, avec des champs spécifiques à Battle ajoutés par-dessus plutôt qu'un protocole ad hoc séparé.
  • Battle appelle des contrats de sous-agents Tau modulaires. Tau et le harnais de boucle/agentique possèdent l'exécution des sous-agents et utilisent scillm comme appelant LLM/modèle. Battle possède la sélection d'équipe, l'attribution de personnalité, les environnements d'exécution Docker, la tenue de score, les artefacts, et la mémoire.

…

[tronqué pour la traduction]

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

grahama1970/acceptance-contract

Turn a client brief, zip bundle, directory, or single requirements file into a typed acceptance-contract bundle with extracted requirements, acceptance checks, open questions, an immutable-goal draft, and a create-report-backed decision report. Use when users say acceptance contract, brief to requirements, freeze the goal, create immutable goal, amend immutable goal, build a Battle requirements bundle, or extract requirements from this bundle.

grahama1970/agent-ecosystem

Canonical map and shared contracts for the agent-governance ecosystem: the pi.receipt_envelope.v1 boundary envelope, the component graph, and the rules for which component owns which schema. Use when wiring a skill or extension into the shared receipt world, when asking how shame, triage-error, tau, ask, project-watchdog, ops-herdr, ponytail, and Memory fit together, or when validating an envelope.

grahama1970/agentic-evals

Agentic evaluation of skills using multi-trial fixtures, deterministic command assertions, trajectory checks, safety constraints, and evidence-backed readiness scoring. Use when users ask for agentic evals, multi-trial skill evaluation, skill trajectory validation, or readiness scoring for a skill workflow.

grahama1970/agent-inbox

File-based inter-agent messaging with headless dispatch. Check inbox, send bugs/requests to other projects, automatically spawn headless agents to fix bugs, and track progress via task-monitor.

grahama1970/agents-registry

Generate and query the centralized agent identity registry. Scans .pi/agents/*/AGENTS.md, parses frontmatter, outputs agents-registry.json and optionally syncs to /memory for semantic search.

grahama1970/agent-status

Artifact-driven status surfaces for long-running project-agent work. Maintains status.json, events.jsonl, proof manifests, and a stale-aware STATUS.html so humans can tell where the agent is, what passed, what is still unproven, and what decision or action is next — without dashboard theater.

grahama1970/align

Round-based context alignment before execution. Use when the human, project agent, WebGPT, scillm, ask, dogpile, memory, or project-knowledge may each hold different facts about a task; especially before ambiguous design, infographic, product workflow, high-stakes implementation, plan-iterate, project-infographic, or multi-review work.

grahama1970/analytics

Flexible data science analytics for any dataset. Auto-discovers schema, recommends charts, exports to create-figure. Works with JSONL, JSON, CSV from any source.

grahama1970/analyze-chatterbox-emotions

Evaluate generated Chatterbox voice files as voice-quality artifacts: affect match, arousal/valence proxies, pause placement, intelligibility inputs, clipping, loudness, and discontinuity flags. Use when reviewing Chatterbox emotional tags, pauses, Turbo/base affect delivery, Persona Dream utterance renders, or whether generated speech matches an intended product-facing affect.

grahama1970/analyze-elf

Reverse-engineer features from ELF binaries. Extracts CLI commands, state machines, protocols, Zod schemas, and data models. Automatically generates a /create-walkthrough prosecution brief with Mermaid diagrams. Uses /treesitter for AST analysis of bundled JS/TS source.

grahama1970/animation-vocabulary

Reverse-lookup glossary that turns a vague description of a web animation or motion effect into its exact term ("the bouncy thing when a popover opens" → Pop in; "the iOS rubber-band scroll" → Rubber-banding). Use when the user asks "what's it called when…", or describes a motion effect without knowing its name and wants the right word to prompt an AI or designer with. For naming an effect, not designing or building one.

grahama1970/anonymize-data

Anonymize supported CSV, JSON, UTF-8 text, and SQLite files using an explicit policy through the oai-trial project. Use for anonymize data, pseudonymize exports, redact policy literals, or discover and explicitly approve fuzzy name aliases. The skill is a thin CLI/Docker interface, not another engine.

grahama1970/anvil

Heavy-duty "No-Vibes" debugging and hardening orchestrator. Use this for complex, stubborn bugs where `review-code` has failed, or for "Red Teaming" (hardening) a codebase. Runs multiple agents in parallel (Thunderdome) using git worktree isolation.

grahama1970/apple-design

Apple's approach to interface design and fluid, physical motion, translated for the web. Use when building or reviewing gesture-driven UI, spring animations, drag/swipe/sheet interactions, momentum and interruptible transitions, translucent materials and depth, typography (optical sizing, tracking, leading), reduced-motion, or the design foundations (feedback, spatial consistency, restraint) behind Apple-style interfaces.

grahama1970/argue

Multi-persona structured debate orchestrator. Personas research via /dogpile, consult colleagues via /ask, and argue toward nuanced synthesis on complex questions.

grahama1970/arxiv

Search arXiv for papers and extract knowledge into memory. Use `search` to find papers, `learn` to extract knowledge.

grahama1970/ask

Use when the user asks to query project memory, ask an oracle, use supported browser-backed reviewers, run Tau roundtable/single-handler workflows, ask Pi-native subagents from within Pi, run persona/deep-review workflows, generate image prompts, check OS/project health through composed skills, or run an ask DAG. This skill is the executable /ask runtime; do not replace it with an informal subagent, plain web search, or hand-written review; inside Pi, explicit Pi-native subagent targets are routed through the pi-subagents tool as an Ask target type.

grahama1970/assess

Step back and critically reassess project state. Use when asked to "assess", "step back", "fresh eyes", "check alignment", "sanity check", "health check", "prune documentation", or "evaluate what's working". Offers documentation pruning and doc-code alignment analysis. Offer to run after major changes (don't auto-run).

grahama1970/assistant

Shared GPT + classifier inference gateway for persona monitor tasks. Routes validation and classification through a 4-tier cascade: heuristic → classifier → local GPT → scillm.

grahama1970/assistant-lab

Self-improvement workbench for /assistant. All the tools needed to diagnose, train, evaluate, and promote models in a continuous loop. The "warm pond" where /assistant evolves its own inference stack.

Skills associés