apo

apo is a skill for Claude Code, Codex from samikuikka/apo. It costs 69 tokens per session (1,512 once invoked), scanned A, original, MIT.

A task-testing tool for AI agents. It turns expected agent behaviour into executable task files that run an agent, check its outputs, and report PASS or FAIL with evidence.

In plain words
What is it for?
Writing agent task specifications, supplying test files, connecting an existing agent through an adapter, publishing task catalogs, and reviewing runs, traces, outputs, and check results.
Why use it?
It replaces manual checking with repeatable runs and clear verdicts. Developers can see which checks failed and rerun the task after changing the agent.

Skill for Claude CodeCodex

Written for no agent in particular: nothing here depends on one.

Needs its repository: it reads a path above its own folder, which exists only inside the repository. The line is import { runMyAgent } from "../src/agent"; // your real agent.

Good fit Writing agent task specifications, supplying test files, connecting an existing agent through an adapter, publishing task catalogs, and reviewing runs, traces, outputs, and check results.

Compare 6 skills from other repositories ↓
Install

Getting it into your agent

It runs from inside its repository, so the clone comes first — what it calls does not travel with the file alone.

Clone the repo
git clone --depth 1 https://github.com/samikuikka/apo
agentmods
npx agentmods add skills/samikuikka/apo/apo

Made for: Claude Code, Codex.

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

agentmods badge for apo

README.md
[![agentmods](https://agentmods.dev/badge/skills/samikuikka/apo/apo/github.svg)](https://agentmods.dev/skills/samikuikka/apo/apo)
Your own site
<a href="https://agentmods.dev/skills/samikuikka/apo/apo"><img src="https://agentmods.dev/badge/skills/samikuikka/apo/apo/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.

agentmods 80×15 button for apo

Your own site · 80×15
<a href="https://agentmods.dev/skills/samikuikka/apo/apo"><img src="https://agentmods.dev/badge/skills/samikuikka/apo/apo.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 69 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 1,512 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce invoked
Fable 5.1 $0.00069 $0.01512
Opus 5.5 $0.00028 $0.00605
Sonnet 5.5 $0.00014 $0.00302
Haiku 4.5 $0.00007 $0.00151

Measured 2d ago against content hash afb1bde54c3d, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

Grade A, and why

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

skills/apo/SKILL.md · 115 lines

How it starts

The opening of the file, as written. The whole thing — 115 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Apo — write tasks for your agent

Apo turns "what my agent must be capable of" into an executable spec. A task is a .eval.ts file: fixtures go in, the real agent runs through an adapter, and checks assert the outcome. The result is a verdict — PASS/FAIL with per-check evidence. Read it like test output, fix the agent, rerun.

Vocabulary: a task is the spec of correct behavior; a run is one execution; the verdict is its PASS/FAIL plus the check breakdown; the trace is the tool/generation calls the agent made; deliverables are the structured outputs the adapter collected.

The four pieces

Piece What it is
Real agent Your code — the LLM call or agent function that already exists in this repo
Adapter Thin bridge (defineAdapter) that drives the agent turn by turn
Task <task-id>/<task-id>.eval.ts — adapter + checks + options
Inputs <task-id>/files/ — fixtures the task loads (files.read)

Adapter — the minimal bridge

// e2e/my-adapter.ts
import { defineAdapter, registerApoTracing } from "@apo-ai/sdk/agent-task";
import { z } from "zod";
import { runMyAgent } from "../src/agent"; // your real agent

await registerApoTracing(); // routes the agent's gen_ai.* spans into the run trace

export const myAdapter = defineAdapter({
  name: "my-agent",
  deliverables: { summary: z.string() },
  // What to hand the agent each turn; return null to end the conversation.
  turn: async ({ files, transcript }) =>
    transcript.length > 0 ? null : await files.read("instructions.md"),
  async initialize() {
    return {}; // per-run state, threaded into every later context
  },
  async startSession(ctx) {
    return {
      // report the model your agent actually resolved — apo never picks it
      runConfiguration: { model: process.env.MY_AGENT_MODEL ?? "gpt-4o-mini" },
      async sendUserTurn(turn) {
        const response = await runMyAgent(String(turn));
        return { response };
      },
    };
  },
  async collectDeliverables() {
    return { summary: "what the agent produced" };
  },
});

Read the full file on GitHub · 115 lines

Changes

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.

  1. 2d ago First seen · 115 lines · 69 tokens per session scan A afb1bde54c3d

Subscribe to this mod's changes

apo is a skill published in the GitHub repository samikuikka/apo (4 stars, last pushed today), licensed MIT. It adds 69 tokens to every session and 1,512 once invoked, about $0.0003 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-14.

Related

Other skills, from other repositories