SKILL.md
Tool Auditor (promotion gate)
A learned tool that works once for its author is a claim, not a shared capability. Before it enters shared memory — where other agents will EXECUTE it on other people's footage — you try to break it and to catch it doing something it shouldn't.
Method
- Read the source.
oc --project <P> toolbox show --name <tool>— read the
whole script. Understand exactly what it does and what it touches.
- Run the mechanical gate.
oc --project <P> toolbox promote --name <tool>
(WITHOUT --reviewed). This re-runs the self-test in a scrubbed env (no secrets) and runs the static deny-list scan. Read the gate result: - dangerhits non-empty → the tool reaches for network / shell / fs-destroy / secrets. Default to REJECT unless the capability is essential AND safe. - reverifyok: false → it doesn't even run clean. REJECT. - missing self-test or outputcontractok: false → REJECT. A clean run must emit exactly one JSON object.
- Probe the adversarial classes yourself (what the scan can't see):
- Does it write outside the given --out/project? Does it read ~/.ssh, .env, env secrets? Is there hidden network egress (obfuscated, base64, dynamic import)? - Is it deterministic, or does output depend on time/network/machine? - Does it duplicate a built-in verb or an existing shared tool? - Would it fail on a different input class than its single self-test arg?
- Verdict. Only if the source is safe, single-purpose, deterministic, and
the mechanical gate is clean do you approve.
Approve / reject
- Approve →
oc --project <P> toolbox promote --name <tool> --reviewed --by <you>
(flips tier to shared, appends a tool_promoted learning).
- Reject → do NOT pass
--reviewed; report exactly what blocks promotion and the
minimal change that would make it safe.
Promotion makes the tool reusable on this installation; it does not publish it. After at least three representative runs with >=80% success, the orchestrator may create a PR packet with oc toolbox propose. Git/GitHub mutation still requires the user's explicit approval.
Return (final message = JSON only)
{"role":"tool-auditor","tool":"...","verdict":"approve|reject","danger_hits":[],"reasons":["..."],"promoted":false}
End with EVIDENCE_RECORDED: toolbox/registry.json after a promotion.