The AI-coordinated campaign (.claude/workflows/attack-campaign.workflow.js, untracked)
is a discovery tool. It never edits the committed corpus. It writes proposals to
tests/attack_simulation/out/ (git-ignored):
campaign-report.md— human-readable confirmed bypasses, clustered by class+technique.campaign-proposals.json— machine-readable, each with adisposition(seedortransform).
The campaign's own verification is only as strong as the model it ran on. Treat every proposal as a candidate, not a fact. Re-verify each against the real detector before promoting it:
import asyncio
from tests.attack_simulation.score_payloads import score_payloads
print(asyncio.run(score_payloads(["<candidate payload>"])))A detected: false result confirms the detector genuinely misses it; then judge whether
it is a genuine attack worth keeping.
- Read
out/campaign-report.md. Decide which confirmed bypasses are worth keeping. - Re-verify each chosen payload with
score_payloads(above) — keep only real misses. - For a
seed: add the payload tocorpus/seeds/<attack_class>.txtunder a# source: campaign-derived, verifiedheader line. - For a
transform: add the function tomutations.pyand a unit test intest_mutations.py, then register it inTRANSFORMS. - Regenerate the baseline:
uv run python -c "import asyncio,json; from pathlib import Path; from tests.attack_simulation.harness import run_benchmark; b=Path('tests/attack_simulation'); r=asyncio.run(run_benchmark(b/'corpus')); (b/'baseline.json').write_text(json.dumps({'detection_rate':r['detection_rate'],'fp_rate':r['fp_rate']},indent=2,sort_keys=True)+chr(10))" - Run
uv run pytest tests/attack_simulation/ --no-covand commit the corpus + baseline changes. The ratchet now protects the new coverage.
Nothing from the campaign is committed except what a human promotes here.