sparring — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited sparring (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Use this skill after it has been selected for a sparring request with another CLI agent. The skill turns that request into a concrete workflow through the bundled sparring harness.
Production rule: use ask-session with a unique temporary state file. The same command creates the provider-native session on the first turn and resumes it on later turns. Use tmux only when non-interactive CLI mode is unavailable or when the user explicitly wants a live attachable TUI session; do not expose tmux as a second normal workflow.
After this skill is selected, use it only for sparring-style requests with another model or CLI agent. Do not use it for ordinary non-interactive shell commands where stdout alone is the requested result.
This skill expects:
bin/sparctl, lib/print-agent.sh, and lib/tmux-agent.sh files from this skill folder.claude or codex.timeout from GNU coreutils for non-interactive CLI calls.tmux only when using explicit live TUI mode.Resolve the harness path in this order:
<skill directory>/bin/sparctl.<skill directory>.SPARRING_HOME is explicitly set, it may override the bundled path for testing only.bin/sparctl exists, report SPARRING_HARNESS_MISSING and include the skill directory you checked.Do not silently fall back to raw tmux when sparctl is missing; the harness contains the tested session and tmux behavior.
Use the user's request language for the opponent prompt and for the final response.
If the user writes in Russian, send the opponent a Russian prompt and return Russian output. If the user writes in English, send the opponent an English prompt and return English output. If the user mixes languages, prefer the dominant language of the task.
When asking the opponent for structured output, include the language requirement explicitly:
Answer in Russian because the user's original request is in Russian.Opponent names in the user's request describe intent; harness names describe installed CLI backends. The model used behind each backend depends on that CLI's own configuration.
The bundled non-interactive providers support these CLI backends:
| Harness backend | CLI command |
|---|---|
claude | claude -p |
codex | codex exec |
Common wording for claude: Claude, Claude Code, Anthropic CLI, the Claude CLI.
Common wording for codex: Codex, Codex CLI, OpenAI Codex, GPT through Codex.
Do not treat backend names as model names. Claude Code, GPT-5, or another model may be configured behind an installed CLI. If the user names only a model family, do not silently choose a backend unless the request or current context clearly says which installed CLI should represent it. Ask a short clarification or use an explicitly configured harness/backend.
Before using a provider, check that the corresponding CLI exists:
command -v claude
command -v codexIf the CLI is missing, report it directly and do not substitute another agent silently.
Use the resolved bundled sparctl path. In examples below, $SPARRING_HARNESS means the executable at <skill directory>/bin/sparctl.
Default command for a fresh sparring session:
$SPARRING_HARNESS ask-session <name> /tmp/<name>-sparring.log "<prompt>" /tmp/<name>-turn.txtCommand meanings:
ask-session: non-interactive CLI call with provider-native session state (claude --session-id then claude --resume; codex exec then codex exec resume) plus a local audit file.Non-interactive providers receive prompts through stdin, not argv. This keeps long session prompts away from process listings and avoids shell argument-size limits. Empty successful provider answers are treated as errors by the harness.
Use this loop for planning, architecture discussion, brainstorming, second opinions, code review, and normal dialogue:
ask-session with a unique temporary state file. Reuse that same state file for follow-up turns in the same sparring flow. Do not reuse old state files for unrelated requests because provider-native session state can carry stale context.ask-session state file and send the next turn through it.The opponent must answer directly in the provider response captured by the harness. Do not ask the opponent to create files, write plans, save notes, update repository files, or put the full answer somewhere else for later reading. The harness already writes the provider response to the configured output file; extra opponent-created artifacts make the sparring loop easy to misread or prematurely stop.
If the opponent says it needs to reference evidence, it should quote or summarize the relevant evidence in the direct answer. If the opponent cannot answer without missing data, it should list the missing data directly in the answer instead of creating a separate file or asking the main agent to inspect an artifact.
After every opponent answer, explicitly decide whether another sparring turn is useful. Continue the sparring when the next turn can still change the recommendation, especially when any of these are true:
Stop the sparring only when the key claims are verified or clearly marked as unverified, high-impact disagreements are resolved or preserved as explicit trade-offs, and another turn is unlikely to improve the decision. Do not turn the first opponent answer into a final user-facing synthesis when the gate says a focused rebuttal would still be useful.
The opponent prompt should make the opponent work in layers, not jump straight into implementation details:
The goal is not artificial agreement. The goal is the best tested solution after criticism. If consensus is not possible, preserve the disagreement as an explicit trade-off with reasons.
For the opponent prompt, adapt this shape into the user's language:
<User task in the original language>
You are the second participant in a sparring session. Do not accept the framing automatically: check whether the task is understood correctly, challenge weak assumptions, identify unnecessary complexity, and then answer the concrete request. Also check whether the proposed approaches, patterns, libraries, APIs, and tooling are current rather than outdated; when freshness matters and you have web access, use web search or current documentation before recommending a solution. Answer in the same language as the user's task. Do not edit files.
Do not create files, plans, notes, or other artifacts. Put the full answer directly in this response. If you need to cite evidence, quote or summarize it here instead of writing it elsewhere.
First fix the subject of discussion: restate the understood task, main goal, important constraints, and key assumptions. Then check the high-level framing, freshness of approaches/tools, and possible simplifications. After that, list the disputed points that should be challenged or decided before a final conclusion.
If required user data is missing, say exactly what is missing and why the decision is blocked. Do not invent missing data or continue on hidden assumptions.
Important: models often tend to agree with and please the user or another agent. In this role, counterbalance that bias: test assumptions critically, name weak points directly, and do not agree if the position seems incomplete, overcomplicated, outdated, or wrong. At the same time, do not argue artificially when the arguments are genuinely strong.
If the main agent's next turn contains doubts or objections to your position, do not agree automatically: defend your assessment where it is strong, clarify weak spots, and state explicitly what should be reconsidered.Fresh sparring session:
$SPARRING_HARNESS ask-session claude /tmp/claude-sparring.log "<prompt>" /tmp/claude-turn.txt
$SPARRING_HARNESS ask-session codex /tmp/codex-sparring.log "<prompt>" /tmp/codex-turn.txtUse tmux mode only when non-interactive CLI mode is unavailable, fails due limits/auth, or the user explicitly wants an attachable live session. Decide this operationally; do not present tmux as a separate standard mode unless it remains running for the user.
$SPARRING_HARNESS start [--replace] <name> <agent-command>
$SPARRING_HARNESS start claude
$SPARRING_HARNESS start --replace claude
$SPARRING_HARNESS ask-watch <name> "<prompt>" /tmp/<name>-watch.txt
$SPARRING_HARNESS transcript <name> /tmp/<name>-transcript.txt
$SPARRING_HARNESS stop <name>Here <name> is the harness agent name, for example claude; the tmux session is named spar-<name>. Persistent starts are safe by default: start <name> fails if spar-<name> already exists. Use --replace only when intentionally killing and recreating that session. If start reports SPAR_SPAWN_SESSION_EXISTS, do not retry with --replace automatically; ask whether the user wants to attach, stop, or replace the existing session.
Tell the user they can attach manually with:
tmux attach -t spar-<name>For non-interactive CLI mode, the full answer is written directly to the output file. Read it with the file reading tool using offsets/limits if it is long.
For tmux mode, prefer ask-watch or transcript for very long answers because rendered scrollback can be noisy and bounded.
If using non-interactive CLI mode, cleanup temporary output/state files after summarizing unless the user asks to keep them. This is mandatory for routine review/sparring: after reading /tmp/<name>-turn.txt, remove it; remove /tmp/<name>-sparring.log when the dialogue will not continue.
If the user asks for an ongoing tmux sparring session, leave it running and report the attach command.
If the user asks for a quick tmux test, cleanup after the test:
$SPARRING_HARNESS stop <name>Report briefly:
ask-session or tmux), but keep mechanics secondary to the decision.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.