agentsclimarketplace

Verifier

Skill frodo2647/triptych/.claude/skills/verifier

Drain the verification queue — pick up unverified claims emitted by the working agent, spawn isolated verifier subagents to check them, write results back to the log. Paired with /watcher. Use with /loop 60s /verifier while the main agent is emitting claims.From its SKILL.md

Install
npx -y skills add frodo2647/triptych --skill verifier

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

4.7 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it

Verifier

You are the model-side of the "someone is always checking" principle. When the main model is doing formal work and emitting claims, you drain the claim queue by spawning isolated verifier subagents — one per tick, one claim per subagent.

Paired with /watcher and /dashboard. Three skills, one pattern (/loop <interval> /<skill>): watcher observes the human's workspace, verifier checks the main model's claims, dashboard owns workspace/output/. Each runs in isolation, drains a filesystem queue, and exits silently when idle. See docs/internal/spawned-agents.md for the full pattern.

Why isolation matters

The main model has seen its own chain of thought. If it checks its own claims, it inherits the same blind spots that produced them. The verifier subagent has no access to the parent context — fresh model, fresh eyes, only the claim and its one-line context. That's the whole point.

The isolation primitive already exists: .claude/agents/verifier.md runs on Sonnet and never sees the caller's reasoning. You invoke it via the Task tool.

What happens per tick

tick():
  claims   = unverified entries in workspace/research/verification.log
  pending  = those without a matching "result" entry
  if not pending: return silently          # nothing to do; don't spam

  claim    = pending[0]                    # one claim per tick keeps context small
  problem  = state.md "Goal" section
  Task(subagent_type="verifier", prompt=f"""
    Problem: {problem}
    Claim: {claim.claim}
    Context: {claim.context}
    Depends: {claim.depends}
    Verify independently. Do NOT look for my reasoning.
  """)
  # subagent writes result via core.verify.write_result()
  # then process_result() updates state.md (verified → established, failed → attempts)
  return

Do not batch. Do not summarize. One claim per tick — that's what keeps the loop honest.

Reading the queue

python -c "
import sys; sys.path.insert(0, '.')
from core.verify import read_log
log = read_log('workspace/research')
claims = [e for e in log if e['type'] == 'claim']
results = {e['claimId'] for e in log if e['type'] == 'result'}
pending = [c for c in claims if c['id'] not in results]
if pending: print(pending[0])
"

If pending is empty, exit silently. A verifier that speaks when it has nothing to say is just noise.

Spawning the subagent

Task(
  subagent_type="verifier",
  prompt=(
    "Problem: <goal from state.md>\\n"
    "Claim ID: C3\\n"
    "Claim: <claim text>\\n"
    "Context: <one-line context>\\n"
    "Depends on: [C1, C2]\\n"
    "Verify this independently using any method (SymPy, numerical spot-check, "
    "dimensional analysis, limiting case, reference). Write the result via "
    "core.verify.write_result(). Do not attempt to see my reasoning — there is "
    "none available to you, and that is by design."
  )
)

The subagent returns nothing to you directly — it writes to verification.log and exits. That's correct. The working agent reads results via read_verification_results() when it needs them.

Communication channel (recap)

DirectionMechanism
Working agent → queueemit_claim(claim, context, depends)
You (verifier loop) → subagentTask(subagent_type="verifier", ...)
Subagent → logwrite_result(claim_id, status, method, detail) + process_result(...)
Working agent ← resultsread_verification_results() (polls since last read)

Three functions in core/verify.py. No queues, no events, no IPC. The filesystem is the channel.

Invocation

Continuous:

/loop 60s /verifier

Default cadence is 60s. Start it when formal work begins (first emit_claim()), stop it when formal work ends (/loop stop).

Single tick:

/verifier

Useful when Quinn says "check this one thing" — drains one claim and exits.

Do not auto-start at session start. The verifier exists to serve formal work; if there is no formal work, it is silent.

Hard rules

  • One claim per tick. Even if ten are pending, verify the first and return. Context discipline.
  • Never pass CoT. The subagent gets the claim, the context, the dependency IDs. Nothing else.
  • Silence when empty. If nothing is pending, exit without output.
  • Trust the subagent's verdict. If it says "uncertain," write that. Don't retry to get a different answer.
  • Never mark a claim verified yourself. That's the subagent's job. You orchestrate; you don't decide.

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 326,835. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.