02-sops

verification as independent worker pattern

2026-05-19·sop·status: active
verificationsub-agent-dispatchfresh-eyesadvisor-modeconfirmation-biasharness-engineering

SOP: Verification-as-independent-worker pattern

The pattern

When Ray (or a sub-agent under Ray) produces an artifact, the same agent CANNOT reliably verify its own work. Confirmation bias makes self-review read defects too generously. The fix is structural, not motivational: route every verification through a separate fresh-eyes sub-agent that has zero context on the build.

This SOP is the umbrella for that pattern across non-visual surfaces. Visual surfaces are already covered (/design-critic for static pages, /video-critic for video).

Source

Three surfaces, three skills

Surface Skill Drift to catch
Vault writes /verify-vault-write Unverified claims; weak RDCO mapping; missed sponsor disclosure; copy-paste-wall instead of paraphrase; citation gaps; broken cross-links
Strategic outputs /verify-strategic-output Overconfidence vs evidence; specific tickers/dollar-amounts without verification; founder-pushback-walked-back pattern not applied; false convergence; cherry-picked backtests
Sub-agent dispatch decisions /verify-dispatch Spec ambiguity; over-broad scope; missing stacked-pattern requirements; classifier-blocking-pattern misses (paper-trade auth, settings.json mods)

Each skill has its own SKILL.md at ~/.claude/skills/<skill>/SKILL.md. They share the structural shape of /design-critic and /video-critic: read the source-of-truth fresh, score mechanically against a rubric, return a structured PASS / ITERATE / SCRAP verdict with actionable suggestions but NO auto-rewrite of the artifact.

When to use each (tiering)

The tiering follows the implementation-notes SOP shape (REQUIRED / OPTIONAL / SKIP). Each skill applies the gate ONLY at the REQUIRED tier by default; OPTIONAL is invoke-when-uncertain; SKIP means no gate.

/verify-vault-write

/verify-strategic-output

/verify-dispatch

Trigger pattern (on-demand vs auto-pipeline)

Two ways to invoke:

  1. On-demand slash command/verify-vault-write <path>, /verify-strategic-output <path-or-recent-msg>, /verify-dispatch <draft-prompt>. Use when the producer skill doesn't auto-invoke OR when the parent agent wants a verification gate before proceeding.

  2. Auto-pipeline — producer skills that emit REQUIRED-tier artifacts MUST invoke the matching verifier as the final step before returning to the parent. Examples:

    • /research-brief and /deep-research auto-invoke /verify-vault-write on each output note before returning the path
    • /investing:build-thesis, /investing:backtest-thesis, anything producing a /decisions/ page auto-invokes /verify-strategic-output before surfacing the recommendation
    • /verify-dispatch is on-demand only (auto-gating every dispatch would 10x dispatch latency for trivial work; explicit invocation is the discipline)

How a verification skill must run (the shape)

Every skill in this family follows the same shape. The shape is enforced because skill-shape drift is itself a failure mode.

1. Fresh-eyes dispatch (MANDATORY)

The skill MUST run as a sub-agent dispatch. The parent that produced the artifact CANNOT run the skill directly — confirmation bias on its own work makes self-review unreliable.

Wrong shape:

Parent: "I wrote this vault note, let me verify it."

Right shape:

Parent: dispatch subagent with subagent_type=general-purpose
  Input: artifact path + spec/rubric path
  Subagent: reads spec fresh, judges from zero, NO build context
  Output: structured VERDICT block
Parent: ingests verdict, NEVER second-guesses the verifier

The sub-agent receives the artifact + the rubric. It does NOT receive any "the build was clean" framing or any prior notes from the producer. If the rubric has bugs, those propagate — but that's a separate problem (locked rubric discipline) and the critic surfaces them too.

2. Read source-of-truth fresh

The verifier reads the rubric / spec / source-of-truth file on EVERY invocation, never from cached memory. Stale rubrics score against the wrong target.

3. Mechanical scoring

The verifier applies the rubric as a checklist, not as a reasoning prompt. Each rubric item is PASS / FAIL with a one-line reason. Avoids the "reasoning toward a charitable verdict" failure mode.

4. Verifier pre-flight checklist (meta-drift defense)

Before scoring, every verifier confirms:

  1. I am a fresh-eyes sub-agent with zero build context. (Otherwise abort — parent's responsibility to dispatch correctly.)
  2. I read the spec / rubric / source-of-truth fresh on this invocation.
  3. I will apply the rubric mechanically and not reason my way to a charitable verdict.

This is the structural defense against the verifier itself developing confirmation bias under repeated PASS pressure (per /design-critic's "agreement bias" failure mode).

5. Structured verdict output

Single shape across all verifiers:

VERIFY-<SURFACE> VERDICT: <PASS | ITERATE | SCRAP>
Subject: <artifact path / dispatch slug>
Source-of-truth: <rubric path>

RUBRIC RESULTS:
- <rubric item>: <PASS / FAIL> — <one-line reason>
- ...

FINDINGS (only if ITERATE / SCRAP):
- <finding tag>: <description> — <specific fix recommendation>
- ...

TOP 3 ACTIONS (only if ITERATE):
1. <specific action>
2. <specific action>
3. <specific action>

The verifier returns this block to the calling parent. The parent decides whether the founder sees it.

6. No auto-rewrite

Verifiers flag and suggest. They DO NOT modify the artifact. The producer (or parent agent) implements the fix. This preserves the human-or-parent-in-the-loop discipline for the actual change.

7. Recursion stop

Verification depth = 1. Verifiers DO NOT verify each other. If /verify-strategic-output flags a finding, /verify-vault-write does NOT verify the flag. The parent acts on the finding directly OR escalates to founder.

The escalation path on a critic ITERATE is: parent agent acts on the suggestions OR escalates to founder. Not "dispatch another verifier."

Audit + escalation rules

Failure modes to watch (cross-skill)

What this pattern does NOT do

Related

Changelog