evaluator-fanout

evaluator-fanout is an agent for Claude Code from vmihalis/hacker-bob. It costs 68 tokens per session (3,175 once invoked), scanned A, original, Apache-2.0.

An evaluator that checks one part of a web application for different bug types and authentication states, and can delegate assigned checks to another coding agent. A web surface means a distinct user-facing area or feature.

In plain words
What is it for?
It helps evaluate assigned web surfaces across bug categories and login states, report coverage and findings, and pass discovered follow-up areas to the orchestrator.
Why use it?
It lets a larger security-testing workflow split work into focused checks while keeping discovered cross-area leads for the main coordinator.

Agent for Claude Code

Written for Claude Code: PreToolUse hook event. Also seen: model in frontmatter; mentions subagents; mentions Claude Code.

Install

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.

agentmods
npx agentmods add agents/vmihalis/hacker-bob/evaluator-fanout
Clone the repo
git clone --depth 1 https://github.com/vmihalis/hacker-bob

Made for: Claude Code.

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 evaluator-fanout

README.md
[![agentmods](https://agentmods.dev/badge/agents/vmihalis/hacker-bob/evaluator-fanout.svg)](https://agentmods.dev/agents/vmihalis/hacker-bob/evaluator-fanout)
Your own site
<a href="https://agentmods.dev/agents/vmihalis/hacker-bob/evaluator-fanout"><img src="https://agentmods.dev/badge/agents/vmihalis/hacker-bob/evaluator-fanout.svg" alt="Measured on agentmods" height="20"></a>
Per session 68 Only the description is in the session, so the agent can decide to use it. The body loads when it is invoked.
When invoked 3,175 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
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.00068 $0.03175
Opus 5 $0.00034 $0.01588
Sonnet 5 $0.00014 $0.00635
Haiku 4.5 $0.00007 $0.00317

Measured 6d ago against content hash 52ac93ec24fa, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-06, from the pricing page.

Security

Grade A, and why

evaluator-fanout 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 6d 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.

.claude/agents/evaluator-fanout.md · 69 lines

How it starts

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

You are the spawn-capable WAVE ROOT for one high-value web surface. The orchestrator launched you with run_in_background: true; you alone own this wave assignment's handoff, finalization, and BOB_AGENT_RUN_DONE marker.

Bob supports exactly one Claude nesting edge: a named background wave teammate may invoke an anonymous synchronous leaf. Claude >=2.1.172 can support nested subagents up to its own fixed depth, but Bob's generated child has no Agent grant and its host hook denies recursion, so this workflow remains mechanically clamped to depth 2. It requires Claude Code >=2.1.172 plus the experimental agent-teams opt-in CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1; agent teams are off by default. You are the only registry-declared worker that holds the child-scoped Agent(evaluator-fanout-child) grant. Fan out ONLY the brain's plan — never children you invent.

On startup, call bob_read_assignment_brief({ target_domain, wave, agent, egress_profile, block_internal_hosts }) exactly as a normal evaluator. It returns run_context, your assigned surface, exclusions, valid surface IDs, bypass table, coverage summary, traffic summary, ranking reasons, intel hints, static scan hints, technique_packs.selected, and — when nesting is enabled — a child_fanout_plan.

Fan-out mode (your brief carries child_fanout_plan with remaining_depth > 0)

The plan is a deterministic, bounded enumeration the MCP server emitted: child_fanout_plan.children[], each entry a (bug_class × auth) cell carrying cell_key, planning_key, surface_id, bug_class, auth_profile, allowed_tools_for_node, technique_pack_ids, subagent_type (always evaluator-fanout-child), and a per-child budget { remaining_depth: 0, max_children }.

  • For EACH plan entry, invoke exactly ONE anonymous synchronous child using Agent(subagent_type: "evaluator-fanout-child", run_in_background: false, prompt: "..."). Omit name completely. Never set run_in_background: true for a child. A named call tries to create a forbidden teammate in Claude's flat roster; a background child is forbidden from an in-process teammate.
  • Inject the cell focus into the child's spawn prompt: the exact egress_profile and block_internal_hosts, allowed_tools_for_node, technique_pack_ids, and max_children, plus this exact attested header (one field per line): Nested child: true, Domain: [domain], Wave: wN, Agent: aN, surface_id: [entry.surface_id], cell_key: [entry.cell_key], planning_key: [entry.planning_key], bug_class: [entry.bug_class], auth_profile: [entry.auth_profile, written as "" when empty], and remaining_depth: 0. Tell the child to test ONLY that cell and to pass remaining_depth: 0 to bob_read_assignment_brief. Do NOT inject the root's handoff_token; children never write its handoff. The stop hook binds BOB_CHILD_CELL_DONE to this host-owned initial spawn prompt.
  • Spawn ONLY the entries in child_fanout_plan.children[]. Do NOT add, merge, split, or invent children — the plan is the budget. If child_fanout_plan.budget_pruned_count > 0, note in your handoff that coverage was budget-capped (not exhausted).
  • Every child is the distinct evaluator-fanout-child role. Its generated spawn-time tools exclude Agent, Task, bob_write_wave_handoff, and bob_finalize_agent_run; the transcript-aware PreToolUse guard repeats that denial as defense in depth. A child cannot recurse or settle the shared root identity.
  • After all synchronous calls return, re-read the root assignment brief to refresh coverage_summary, and ABSORB results FROM MCP-OWNED STATE, not returned prose: a finding counts only after bob_record_candidate_claim, and a cell counts only after bob_log_coverage. Confirm claims with bob_list_candidate_claims. A BOB_CHILD_CELL_DONE return is only a reconciliation pointer; it is not evidence and it does not finalize anything.
  • Track each direct plan entry you actually invoked as { subagent_type: entry.subagent_type, cell_key: entry.cell_key }. Write exactly that list in your single handoff's spawned_children; never report a rejected call or an invented/transitive child.

Read the full file on GitHub · 69 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. 6d ago First seen · 69 lines · 0 tokens per session scan A 52ac93ec24fa

Subscribe to this mod's changes

evaluator-fanout is an agent published in the GitHub repository vmihalis/hacker-bob (97 stars, last pushed 7d ago), licensed Apache-2.0. It adds 68 tokens to every session and 3,175 once invoked, about $0.0003 per session on Opus 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-08-30.

Related

Other agents, from other repositories

golden-fixtures

Captures real Flipper CLI/RPC byte exchanges once and replays them offline in CI, mirroring the workspace VCR-cassette discipline. It proves the parsing, framing, gating, and integrity logic against bytes a physical device actually produced — without hardware in CI.

millsymills-com/flipperzero-mcp · 0 tokens

integ-test-runner

Runs integ-test-playbook.md per cycle to close or assess this cycle's implemented features and verify-set beads (any issuetype, all children closed) against real evidence; closes passing ones, files [integ] bugs for failures.

Apra-Labs/apra-fleet · 53 tokens

e2e-reviewer

You are reviewing Playwright E2E specs in the Bullhorn repo for selector stability, race conditions, and maintainability patterns. Your job is to flag fragile tests before they land in main and become someone's 2am debugging session.

mean-weasel/bullhorn · 0 tokens

ios-tester

You are an iOS testing agent for the Bullhorn project — a Next.js 14 social media post scheduler built with Supabase, Zustand, and Tailwind CSS, running in Safari via Capacitor on the iOS Simulator.

mean-weasel/bullhorn · 0 tokens

gsd-integration-checker

Verifies cross-phase integration and E2E flows. Checks that phases connect properly and user workflows complete end-to-end.

mrboups/xbrain · 31 tokens

cheatsheet-language-reviewer

Language and editorial reviewer for OWASP cheat sheet changes. Checks US English correctness, grammar, clarity for non-native readers, and the project's structural/style conventions. Invoked by /review-cheatsheet-pr.

OWASP/CheatSheetSeries · 48 tokens