Why
Gauntlet is the best-fit repo in the coilysiren portfolio to adopt Dagger:
- Already a multi-container pipeline.
docker-compose.yml has api, demo, and test services with healthcheck-gated dependencies. This is exactly what Dagger replaces — the compose topology becomes a typed Python function where test depends on api.as_service(), with real caching between runs.
uv already in use. Dagger's Python SDK is first-class and plays nicely with uv. pyproject.toml needs no changes.
- Dagger's LLM/agent primitives map onto what Gauntlet is. Dagger shipped LLM-native pipeline nodes in 2025 — pipeline steps can call Anthropic/OpenAI with tool-use, sandboxed per run. Gauntlet already orchestrates Anthropic + OpenAI as attacker/inspector; running those inside Dagger gives per-run caching, parallelism, and a trace UI for free.
- Matrix runs become trivial. The (attacker × inspector × target) combinatorial explosion is ugly in compose or pytest. In Dagger it's a
map over a list of configs.
- Local = CI. Same function runs on laptop and in GitHub Actions. No duplicated pipeline definitions, no "works on my machine."
Scope
Non-goals
- Not adopting Dagger in other coilysiren repos yet (backend is a candidate second, but after this beachhead proves out)
- Not replacing
invoke/tasks.py workflows outside CI
Context
Why
Gauntlet is the best-fit repo in the coilysiren portfolio to adopt Dagger:
docker-compose.ymlhasapi,demo, andtestservices with healthcheck-gated dependencies. This is exactly what Dagger replaces — the compose topology becomes a typed Python function wheretestdepends onapi.as_service(), with real caching between runs.uvalready in use. Dagger's Python SDK is first-class and plays nicely with uv.pyproject.tomlneeds no changes.mapover a list of configs.Scope
dagger-ioto dev dependencies viauvci.py(orgauntlet/ci/) with adagger.Client-based moduleapiservice → Dagger function returning aServicedemoservice → Dagger function that consumesapitestservice → Dagger function runningpytest -m "not docker"test()function composing the threedagger call teststepdocker-compose.ymlonce parity is reachedREADME.md/CONTRIBUTING.mdwith the new dev loopNon-goals
invoke/tasks.pyworkflows outside CIContext