Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add OutlineDriven/odin-claude-plugin --skill agent-surface-forgegit clone --depth 1 https://github.com/OutlineDriven/odin-claude-pluginWrote 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/outlinedriven/odin-claude-plugin/agent-surface-forge)<a href="https://agentmods.dev/skills/outlinedriven/odin-claude-plugin/agent-surface-forge"><img src="https://agentmods.dev/badge/skills/outlinedriven/odin-claude-plugin/agent-surface-forge.svg" alt="Measured on agentmods" 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.00079 | $0.01858 |
| Opus 5 | $0.00039 | $0.00929 |
| Sonnet 5 | $0.00016 | $0.00372 |
| Haiku 4.5 | $0.00008 | $0.00186 |
Grade A, and why
agent-surface-forge 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 2d 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.
This is a copy
100% identical to agent-surface-forge — 0 lines differ, which has more behind it and is treated as the original. This page carries a canonical link to it rather than competing with it.
How it starts
The opening of the file, as written. The whole thing — 74 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Agent surface forge
Contract
| Field | Bound contract |
|---|---|
| Trigger | User asks to audit or repair agent surfaces — plugin configs, agent definitions, skills, CLAUDE.md/AGENTS.md, docs, prompts, commands, or hooks. Not for deep one-skill improvement — use skill-improver. |
| Authority | Reversible local writes, only with --apply, only to HIGH-certainty autoFix:yes findings on the named plugin/agent/skill/docs/prompt/claudemd/hooks surfaces. Rollback: revert any applied edit whose re-analysis introduces a new HIGH finding. |
| Side effect | Local file edits to HIGH + autoFix:yes items only under --apply; re-verifies after each edit. No suppression state, no model routing, no external analyzer binary. |
| Done | Surface audit report produced with all HIGH findings complete in default output, MEDIUM/LOW shown only under --verbose, and under --apply each HIGH finding removed without new HIGH issues. |
Inputs
target(optional): path to audit; defaults to.. Taken from the first non-flag argument.--apply(optional flag): apply only HIGH-certainty findings withautoFix: yes. Absent means report only.--verbose(optional flag): include MEDIUM and LOW findings. Default output shows HIGH plus MEDIUM/LOW summary counts.--focus=<type>(optional): comma-separated subset ofplugin,agent,skill,docs,prompt,claudemd,hooks,cross-file. Unknown values are rejected.
Procedure
- Parse intent. Extract
target,--apply,--verbose,--focus. Reject unknown focus values against the valid set above before any file access. Done when: target and flags are parsed and unknown focus values are rejected. - Discover files per analyzer family using these globs; keep concrete path lists and never pass globs to workers as the target contract:
- plugin:
plugins/*/.claude-plugin/plugin.json,.claude-plugin/plugin.json,**/.claude-plugin/plugin.json - agent:
**/agents/*.md - skill:
**/SKILL.md - claudemd:
CLAUDE.md,AGENTS.md,**/CLAUDE.md,**/AGENTS.md - docs:
docs/**,README.md,CHANGELOG.md - prompt:
commands/**,prompts/**,**/commands/*.md,**/prompts/*.md - hooks:
hooks/**,**/hooks/** - cross-file: enabled only when two or more of plugin/agent/skill/claudemd/prompt are present
Skip analyzers with no discovered files. Under
--focus, skip every non-focused family even if files exist. Done when: concrete file lists are discovered per analyzer family with non-focused families skipped.
- plugin:
- Launch parallel analyzers in one
taskbatch. Dispatch one generictaskworker for each analyzer family that has files. Give each worker the analyzer name, exact file list,--verbosestate, check catalog below, and required JSON return shape. Parallelize by analyzer family, never by file shards, because cross-surface consistency depends on seeing all relevant files for a family. Done when: one task worker is dispatched per analyzer family with files. - Check catalog per family. Every finding needs file, line or section, observed evidence, and a concrete fix; classify each by issue label: excess surface, duplication, structure, or correctness.
- plugin: manifest fields explicit and bounded;
nameanddescriptionpresent; no excess or duplicated permissions; structure valid. - agent: frontmatter parses;
nameanddescriptionpresent and bounded; no duplicated or contradictory directives; structure valid. - skill: frontmatter parses;
namematches the directory;descriptionpresent and bounded; no excess surface, duplication, or structural drift; sections internally consistent. - claudemd: directives explicit and bounded; no duplicated or contradictory rules; no stale aliases; structure valid.
- docs: referenced paths exist; no duplicated or contradictory content; structure valid.
- prompt: command and prompt definitions explicit and bounded; no duplicated commands; structure valid.
- hooks: hook scripts explicit and bounded; no duplicated handlers; structure and syntax valid.
- cross-file: links between surfaces resolve; no duplicated or contradictory definitions across families; names referenced in one surface exist in the target surface. Done when: each analyzer family has its check catalog applied.
- plugin: manifest fields explicit and bounded;
- Analyzer contract. Each worker reports only observed findings as JSON:
Use native tools directly:{ "analyzer": "plugin|agent|skill|docs|prompt|claudemd|hooks|cross-file", "findings": [ {"file":"path","line":1,"check":"missing_description","certainty":"HIGH","autoFix":false,"evidence":"...","fix":"..."} ], "summary": {"high":0,"medium":0,"low":0,"autoFixableHigh":0} }findandreadfor presence and frontmatter;searchscoped to discovered files for regex and field checks;ast-grepfor command snippets, shell patterns, and hook bodies where syntax matters; codegraph MCP for cross-file symbols, callers, and impact when indexed, falling back toast-grepplus scoped text search; repomix (pack_codebaseorpnpm dlx repomix --compress) only for large repos to build a digest for the workers. Done when: each worker returns findings in the required JSON shape. - Deduplicate. Stable key:
analyzer|file|line|check|normalized evidence. If two analyzers report the same underlying defect, keep the higher certainty; if equal, keep the one with narrower file/line evidence. Done when: findings are deduplicated by stable key. - Aggregate. Sort by certainty HIGH then MEDIUM then LOW, then analyzer, file, line. Count totals by analyzer and certainty. Done when: findings are sorted and totals are counted.
- Report. Default output: executive summary table, all HIGH findings, MEDIUM/LOW counts, and the HIGH auto-fixable list. Under
--verbose, include MEDIUM and LOW sections with issue labels. Done when: the report is emitted with the correct verbosity. - Apply guarded fixes, only when
--applyis present: filter tocertainty === HIGH && autoFix === true; group by analyzer; edit the minimal lines required; re-read changed files after each edit; never apply MEDIUM or LOW fixes automatically. Done when: all HIGH autoFixable findings are applied (under --apply) or listed as safe edits (without --apply). - Verify the fix set. Re-run only the analyzers whose files changed. A fix passes if the exact HIGH finding is gone and no new HIGH finding appears in the changed file. If a fix introduces a new HIGH issue, revert that fix and keep the finding in the report as manual. Done when: every applied fix is verified with no new HIGH findings, or reverted findings are labeled manual.
What ships with it
2 files 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.
- 2d ago First seen · 74 lines · 79 tokens per session scan A 5e7e0222ab73
agent-surface-forge is a skill published in the GitHub repository OutlineDriven/odin-claude-plugin (35 stars, last pushed today), licensed Apache-2.0. It adds 79 tokens to every session and 1,858 once invoked, about $0.0004 per session on Opus 5. A static security scan graded it A with 0 findings. It is 100% identical to agent-surface-forge, differing in 0 lines, and is treated as a copy.
Other skills, from other repositories
systematic-debugging
Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes.
local-ai-agents
Build local-first AI agents that run entirely on a developer workstation with Microsoft Foundry Local and Qwen function-calling models. Covers Small Language Models (SLMs), the OpenAI-compatible local endpoint, sandboxed local tools, local RAG with Chroma, local MCP servers, hybrid cloud/local routing, and the…
next-cache-components-adoption
Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the cacheComponents flag, work through a flood of blocking-prerender / instant validation errors, run the cache-components-instant-false codemod, or…
chat-pet-sprite-creation
Use when creating or changing VS Code chat pet sprite art, sprite sheets, state animations, eye treatments, Stable/Insiders variants, or pet transitions under src/vs/workbench/contrib/chat/browser/widget/media/chatPet.
cpu-profile-analysis
Analyze V8/Chrome CPU profiles (.cpuprofile) and DevTools trace files (Trace-.json). Use when: profiling performance, investigating slow functions, comparing code paths, finding bottlenecks, analyzing timeToRequest, understanding call trees from sampling profiler data, analyzing layout/paint/rendering, investigating…
insight-error-page
Write or audit an insight-kind error page for the Next.js dev overlay. Use when creating a new errors/ .mdx page, auditing an existing one, or checking that a page matches the framework fix cards. Covers page structure, title alignment, FixCard cards with Copy prompt button, code snippets, terminology verification…