Quickstart
This page is the fastest path from an empty terminal to a referee verdict on your own agent, and then to a gate that runs on every pull request. Five steps: install, log in, connect, run an episode, gate CI.
1. Install the CLI#
curl -fsSL https://app.ironhideai.com/install.sh | bashThe installer drops a single-file CLI into ~/.ironhide/ and a wrapper on
your PATH. It needs Python 3.9 or newer and nothing else: no pip, no
dependencies, no root. Details on the
Install the CLI page.
2. Log in#
One account owns all your agents. Sign up (or log in) with your email:
ironhide loginThe first time, this proves your email with a short sign-in code and mints an
owner key — shown once, saved to ~/.ironhide/config.json with owner-only
permissions. Ironhide stores only a hash. On another machine,
ironhide login --owner-key wk_owner_... signs you back in.
3. Connect your agent#
ironhide connectconnect registers a ci agent under your account. Ironhide 2.0 is
CI-native: your agent runs inside your own pipeline and results flow inbound.
There is no endpoint for you to expose and nothing Ironhide calls outbound, so
there is no transport to choose — connect just needs two things:
- Name your project.
- Contact email.
It does not ask about data reuse: there is nothing to choose. Every run is
stamped owned, and what Ironhide keeps and reuses is the scrubbed
environment your agent ran against — not your trajectory — to grow the shared
attack library. See data rights.
On success you get an agent id and an API key (a wk_live_... token). The
token is shown once and saved to ~/.ironhide/config.json; Ironhide
stores only a hash.
ok - registered agt_9f2c1a (data owned)
IRONHIDE_API_KEY: wk_live_...
shown once - saved to ~/.ironhide/config.json (chmod 600). Ironhide stores only a hash.
Every run is owned. Ironhide keeps the scrubbed environment your agent runs
against - not your trajectory - to grow the shared attack library.
next - gate it in your pipeline:
* add the token to your CI secrets as IRONHIDE_API_KEY
* add the GitHub Action ironhide-ai/ironhide-scan@v1 (or run ironhide test in your pipeline)
* every run returns a verdict on the ironhide/referee check4. Drive a referee episode#
Run one episode end to end and read the verdict:
ironhide episode run --episode-id a103-exfil-auditorWith no --adapter, the CLI drives the episode with a harmless built-in stub
— a safe way to see the whole loop before you wire your real agent in. The
referee grades what was done during the episode and prints the verdict:
IRONHIDE EPISODE a103-exfil-auditor (tier C · preview)
verdict ................................... PASS
why ....................................... no prohibited effect observed
run_id .................................... run_4b7e…To grade your real agent, point --adapter at a callable that wraps it —
(prompt, tools) -> dict — in about ten lines:
# myapp/ironhide_adapter.py
def run(prompt, tools):
if prompt.get("episode_type") == "behavioral":
return {"detections": my_agent.review(prompt["episode"]["transcript"])}
script = prompt["episode"]["script"]
results = prompt.get("tool_results", []) # feedback from your tool calls
actions, calls = my_agent.defend(script, tools, results)
return {"actions": actions, "tool_calls": calls}ironhide episode run --episode-id a103-exfil-auditor \
--adapter myapp.ironhide_adapter:runThe verdict is categorical (PASS / FAIL, or INCONCLUSIVE when there was
nothing to grade), with a severity, the reason, and the evidence. Add --json
for the raw payload. ironhide environments lists the episodes you can run.
5. Gate CI#
Turn the referee into a check that runs on every pull request. Write the CI config (no secrets — the token stays in your CI secrets), then run the gate:
ironhide init # writes .ironhide.yml, checked in beside your code
ironhide test # runs the attack suite and gates against your baselineThe first ironhide test for a given label has nothing to compare against, so
it saves that run set as your local baseline (.ironhide/baseline-<label>.json)
and exits 0. Every later run gates against it: it prints one greppable line
and exits 0 (pass / advisory / baseline), 1 (a gated failure), or 2 (the
gate could not be evaluated — never rounded to a pass or a failure):
IRONHIDE-GATE basis=arena-l3-preview delta=-0.02 noise_floor=0.05 n=24 result=PASSironhide test starts advisory — it reports a would-be failure without
breaking the build. Flip advisory: false in .ironhide.yml once the
baseline has settled. To render a PR comment from a run, pipe
ironhide test --json into ironhide comment.
The turnkey path is the hosted GitHub Action
or GitLab CI component, which wraps
ironhide test, posts the verdict as a PR/MR comment, and surfaces it as the
ironhide/referee check.
Where to go next#
- GitHub Action: the full CI reference — inputs, verdicts, the gate line, and local reproduction.
- GitLab CI: the same referee for GitLab merge requests.
- CLI reference: every command, flag by flag.
- Install the CLI: what the installer does, where config lives, and how to point the CLI at a server.
IRONHIDE