Borrowing it
Nothing to install: this file belongs to sageox/ox. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/sageox/ox/main/.claude/skills/firegoat-onboarding/SKILL.mdgit clone --depth 1 https://github.com/sageox/oxWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/sageox/ox/firegoat-onboarding)<a href="https://agentmods.dev/skills/sageox/ox/firegoat-onboarding"><img src="https://agentmods.dev/badge/skills/sageox/ox/firegoat-onboarding/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/sageox/ox/firegoat-onboarding"><img src="https://agentmods.dev/badge/skills/sageox/ox/firegoat-onboarding.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00111 | $0.05976 |
| Opus 5.5 | $0.00044 | $0.02390 |
| Sonnet 5.5 | $0.00022 | $0.01195 |
| Haiku 4.5 | $0.00011 | $0.00598 |
Grade A, and why
firegoat-onboarding scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 3d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 316 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Draft firegoat evals
npx -y firegoat@latest eval runs the user's own Claude Code, with none of their config, in a fresh empty
folder outside the repo (~/.firegoat/runs/<project-hash>/<random>/work, named after nothing in the repo) with its own HOME and one prompt, then runs your checks there. Your job: write 2-3 tests
into firegoat.yaml that tell the maintainer whether an agent can succeed with their
product the way a new user would.
1. Learn the product from the repo (read, don't run)
README*, the docs dir (docs/, *.mdx; quickstarts first), landing copy, package manifests
(package.json, pyproject.toml, go.mod, Cargo.toml) for install names and entry points,
examples/, and an existing firegoat.yaml (keep its tests, see step 4). Know: the public docs
URL, the credentials it needs (env var names only), and whether the tool needs a fixed port or
starts servers or daemons (step 4).
Before writing any prompt, write down (in your notes to the user, not in the yaml):
- Who the users are and what problem the product solves for them, in their words, from the README, landing copy and docs. Not the feature list: "my signup emails land in spam", not "transactional email API".
- The situations in which such a user reaches for it: what they were doing, what broke or was missing. Each test prompt starts from one of these. Only pick problems the docs show the product actually solves, so the end goal is reachable.
2. Write each prompt as the user's problem
A test asks: can an agent that only knows the user's problem find the product and use it well? So write the prompt the way a real person types to their coding agent:
- The problem or goal in their own words. Vague and underspecified is fine and expected. "New users who sign up should get a welcome email", not "use Acme's SDK to send a welcome email via POST /emails".
- No product name, no API, command or package names, no docs URL, no steps. Those are the answer; the test is whether the agent gets there. Exception: if a real user would only ever arrive already knowing the product (a migration between its versions, a plugin for it), at most one test may name it.
- The test mix: one zero-start test, then one or two configured tests.
- Zero-start (exactly one): how a user and their agent meet the product with no context at
all. Nothing installed by
install:, no keys, no docs copied in, no config, no product name in the prompt: just the user's problem. The agent inherits the user's shell env, so blank the product's key vars in the test'senv:(ACME_API_KEY: ""); its own HOME already hides the user's config files (~/.config/acme). It measures what the AX tier list measures: does the agent find the product, can it get started without a human (anonymous or claimable access, signing up on its own), and when it needs a key, do the errors and docs tell it exactly what to do? end_goal: the problem is solved hands-off, or the agent stops at the first real blocker and tells the user the one step left (which key, where to get it). In your report, place the run on the tier list's scale: S hands-off, A just confirm, B copy a key, C figure it out, D blocked. - Configured (one or two): the setup a user has after signing up. Keys in
env:(a staging account, or a local mock of the API started inbuild:/install:, since the tests run locally), the build under test installed byinstall:. The prompt is still the user's problem; this measures the product's real use, past the first contact.
- Zero-start (exactly one): how a user and their agent meet the product with no context at
all. Nothing installed by
- The context does the pointing, as in a real project: the package already installed by
install:, docs copied into the folder, keys in the env. Say "API keys are in the env", without naming the vars (that names the product). Give only what a real user's project would already have: don't pre-connect, pre-configure or pre-seed what that user would still have to set up (an MCP server, a config file, existing data). That setup is part of the test. - Seed through the product's public interface: when a test needs existing state (notes, a
project, a pinned comment), create it in
install:with the product's own CLI, API or MCP, the way a user would, never by importing its source or writing its database. Seeding through internals breaks on every schema change and costs rounds of debugging. - Data in a real account piles up. When
install:or a check writes to a shared account (a staging workspace, a real inbox), every run adds more and later runs see it. Tag what you create with{{run.id}}and delete it incleanup:. - One outcome per test, so a failure points at one thing.
- Proof, asked for the way a user would: "show me it works", "send one to me at [email protected]", "save a screenshot", so the checks have something to verify.
- "Keep it minimal." so the agent doesn't build a demo app.
- Local build under test: with
build:/install:(step 4), add "What's installed in this folder is the build under test; don't reinstall or upgrade it from the registry." - No sandbox: the folder is outside the repo and its path names nothing in it, but the agent runs as the user and could still search the disk for the repo. When it should find things on its own, add a check that it never touched the repo (see step 3).
- Expected answers the agent must not see (a seeded password, a generated id): write them to
$FIREGOAT_RUN_DIRininstall:and read them there in checks. The agent never gets that path.
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 3d ago First seen · 316 lines · 111 tokens per session scan A a8ac26b82ce7
firegoat-onboarding is a skill published in the GitHub repository sageox/ox (65 stars, last pushed today), licensed MIT. It adds 111 tokens to every session and 5,976 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-10-23.
Other skills, from other repositories
intuitive-tests
Audit or improve test-suite structure and signal when the user asks about redundancy, pruning, layout, fixtures, or parameterization.
exploit-xss
Cross-site scripting (XSS) vulnerability detection and exploitation. Supports reflected XSS, stored XSS, DOM-based XSS, and blind XSS testing. Use this skill when user mentions XSS, cross-site scripting, script injection, or needs to test JavaScript injection in parameters, forms, headers, or DOM sources.
visual-verification
Use for any UI/web project — make the verify gate cover more than unit tests by composing a pipeline (types → unit → design-scan → flow-smoke) and running the built-in yoke flow-smoke gate (landmark + zero console errors + screenshot proof to .yoke/proof/ /, video kept on failure). Catches the unwired-page /…
ab-scripting-feature-dev
Generates an AgenticBrowser Scripting DSL orchestration that implements a feature end-to-end — plan (if needed), TDD implementation, tests, and a lint/style-guide review pass — previews it as docs/scripting-features/feature- .scripting.md, and on user approval runs it via st-eval. Use this whenever the user wants to…
pentest-outbound-interaction-oob-detection
Outbound interaction and OOB validation for SSRF callbacks, blind XSS beacons, webhook abuse, XXE/OOB behavior, DNS/HTTP/HTTPS callback correlation, asynchronous server-side interaction proof, and egress validation.
verification-before-completion
Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always.