Ironhide logoIRONHIDETest Your Agent

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 | bash

The 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 login

The 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 connect

connect 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 check

4. Drive a referee episode#

Run one episode end to end and read the verdict:

ironhide episode run --episode-id a103-exfil-auditor

With 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:run

The 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 baseline

The 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=PASS

ironhide 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.