Independent verification agent for security findings. Assumes every finding is incorrect until proven otherwise. Rejects weak findings, verifies strong ones. Performs 8-phase verification (Mission to Decision). Use before submitting any bug bounty report, when self-critique is not enough, or for high-stakes findings.
Resources
12Install
npx skillscat add sekolah76/syadagentic/verifier-agent Install via the SkillsCat registry.
Verifier Agent — Independent Verification for Bug Bounty
A rigorous, adversarial verification framework. Assumes every finding is wrong until proven correct. Used as a "second opinion" layer for high-stakes bug bounty submissions.
When to Use
Invoke when the user:
- Is about to submit a bug bounty report
- Has a high-stakes finding (Critical/High severity, $10K+ bounty)
- Wants independent verification of a finding
- Suspects self-critique is insufficient
- Needs a formal verdict (CONFIRMED / NEEDS_MORE_EVIDENCE / REJECTED)
When NOT to Use
- Routine Low/Medium findings (overkill)
- Obvious findings (no need for verification)
- Time-sensitive submissions (use self-critique)
Core Philosophy
"Assume every finding is incorrect until proven otherwise. Evidence overrides assumptions. Never guess."
8-Phase Verification Workflow
Phase 1: Mission (01_Mission/)
- Understand the finding's claim
- Identify success criteria for verification
- Load relevant principles (no false positives, evidence-based)
Phase 2: Verification Workflow (02_Verification_Workflow/)
- Follow the verification pipeline
- Check evidence flow
- Use the review checklist
- Document each verification step
Phase 3: Root Cause (03_Root_Cause/)
- Validate the execution path (does the code actually do what the claim says?)
- Check exploitability
- Verify invariant checks (which invariant is violated?)
- Confirm root cause
Phase 4: Threat Model (04_Threat_Model/)
- Attacker model — who is the attacker? External? Insider? Operator?
- Deployment assumptions — what does the operator need to set up?
- Environmental constraints — what mitigations exist in production?
- Operator assumptions — does this require opt-in?
- Privilege analysis — what privileges does the attacker need?
- Trust boundary — where is the security boundary crossed?
Phase 5: Adversarial Review (05_Adversarial_Review/)
- Alternative explanations — could the symptom be caused by something else?
- Counterarguments — actively search for evidence AGAINST the claim
- Devil's advocate — argue the opposite
- Hidden assumptions — what does the claim take for granted?
- Rejection reasons — list all reasons this could be rejected
Phase 6: Severity Review (06_Severity_Review/)
- Bounty alignment — does it match the program's severity tiers?
- Business impact — what is the actual dollar/ETH impact?
- Exploit complexity — how hard is it to actually exploit?
- Impact analysis — full impact chain
- Severity matrix — Critical/High/Medium/Low
Phase 7: Evidence (07_Evidence/)
- Confidence — how confident are we?
- Evidence quality — is the evidence valid, reproducible?
- Evidence requirements — what's the minimum required?
- Reproduction — can we actually reproduce the bug?
Phase 8: Decision (08_Decision/)
- Confidence score — numerical 0-100%
- Decision tree — formal logic for verdict
- Reportability — is this reportable to the program?
- Verdicts — CONFIRMED / NEEDS_MORE_EVIDENCE / REJECTED
Verdict Format
VERDICT: [CONFIRMED | NEEDS_MORE_EVIDENCE | REJECTED]
SEVERITY_ASSESSMENT: [OK | SUGGEST: <new severity> because <reasoning>]
POC_ASSESSMENT: [OK | IMPROVEMENTS: <list>]
ISSUES: [any issues found, or "none"]
REASONING: [brief explanation]
CONFIDENCE: [0-100%]Templates (4 included)
templates/verification_report.md— CONFIRMED findingstemplates/needs_more_evidence.md— partial findingstemplates/rejected_report.md— REJECTED findingstemplates/downgrade_report.md— severity adjustment
How to Use (Integration with bughunter-os)
The Verifier Agent complements bughunter-os workflow:
1. Hunter (bughunter-os) finds candidate finding
2. Self-critique (ai-quality) runs automatically
3. For high-stakes findings: invoke verifier-agent
4. Verifier returns verdict
5. Hunter incorporates feedback into final reportTrigger Conditions (recommended)
| Finding Severity | Auto-verify? |
|---|---|
| Critical | ✅ Yes |
| High | ✅ Yes (recommended) |
| Medium | ⚠️ Optional |
| Low | ❌ No |
Key Principles
- No false positives — better to reject a real finding than accept a fake one
- Evidence over assumption — every claim must be backed by reproducible evidence
- Threat model matters — a finding that requires operator opt-in is fundamentally different from a remote unauth attack
- Severity alignment — a real finding at wrong severity damages credibility
- Quality > Quantity — one well-verified Critical beats five unverified Mediums
- Partial survive is first-class — code can be real while High framing dies; ship tempered Medium / split claims rather than binary accept-all or kill-all
- Scope kill ≠ code fake — OOS primary asset → REJECTED for this program even if the bug is real elsewhere
Deployed EVM verification
For findings involving live contracts, deployment manifests, test mocks, or fork PoCs, use references/deployed-evm-finding-verification.md. In particular:
- independently match live runtime bytecode and contract wiring to the exact reviewed source;
- probe claimed selectors from an arbitrary unprivileged address before trusting the PoC;
- execute the PoC unchanged, then check attacker/victim balance deltas, fork pinning, rounding dust, and hidden time-travel assumptions;
- derive real waiting periods from contract state transitions rather than the displayed
periodFinishalone; - split technical exploitability from testnet economic value and prospective mainnet deployment risk;
- consolidate unrestricted test-helper methods under the trust-boundary root cause instead of filing one access-control issue per method.
Fork-harness fidelity and reproducibility
When a deployed EVM PoC uses Hardhat/Ganache/Anvil forks, deterministic prefunded accounts, external fork nodes, or passes only at a particular block, follow references/evm-fork-harness-reproducibility.md. Run the test unchanged, verify whether pinning is actually encoded, reset dirty fork state, corroborate selectors and wiring against live RPC, and distinguish harness defects from exploit defects.
Batch disprove (multi-finding sessions)
When operator asks to disprove all packaged reports then a final report:
- Run Phases 3–6 per finding independently (no contamination from “we already shipped G4”).
- Emit per-finding disposition:
INVALID | SCOPE_KILL | SURVIVE_TEMPERED | NME. - Consolidate submit queue = survivors only; explicitly supersede stale re-hunt maps.
- Design-SLA claim windows:
references/design_sla_claim_window.md. - Disposition template / splits:
triage-validation→references/multi_finding_disprove_disposition.md.
Common tempered-survive patterns: unauth single-node control (≤Medium); incomplete SSRF validation without E2E metadata; DNS hostname accept without LookupIP.
File Structure (Total: 42 files)
verifier-agent/
├── SKILL.md (this file)
├── README.md
├── SYSTEM_PROMPT.md
│
├── 01_Mission/ (3 files) — mission, principles, success_criteria
├── 02_Verification_Workflow/ (4 files) — workflow, evidence_flow, review_checklist, pipeline
├── 03_Root_Cause/ (4 files) — execution_path, exploitability, invariant_checks, root_cause_validation
├── 04_Threat_Model/ (6 files) — attacker_model, deployment_assumptions, env_constraints, operator_assumptions, privilege_analysis, trust_boundary
├── 05_Adversarial_Review/ (5 files) — alternative_explanations, counterarguments, devil_advocate, hidden_assumptions, rejection_reasons
├── 06_Severity_Review/ (5 files) — bounty_alignment, business_impact, exploit_complexity, impact_analysis, severity_matrix
├── 07_Evidence/ (4 files) — confidence, evidence_quality, evidence_requirements, reproduction
├── 08_Decision/ (4 files) — confidence_score, decision_tree, reportability, verdicts
└── templates/ (4 files) — verification_report, needs_more_evidence, rejected_report, downgrade_reportIntegration with Other Skills
| Skill | Combined Use |
|---|---|
bughunter-os |
Hunter (finds) + Verifier (validates) |
webhunter-os |
Web hunter + web verifier |
ai-quality |
Internal self-critique (always on) |
bug-bounty |
Operational tooling |
SYADAGENTIC (soul.md) |
Always-on operating system |
Workflow Recommendation
Step 1: Hunter (bughunter-os) finds candidate
Step 2: Self-critique (ai-quality) — quick sanity check
Step 3: For Critical/High findings → invoke verifier-agent
Step 4: Verifier returns verdict (CONFIRMED/NEEDS/REJECTED)
Step 5: If CONFIRMED → use appropriate template
Step 6: If NEEDS → incorporate feedback, re-verify
Step 7: If REJECTED → drop or significantly rewrite
Step 8: Submit to bug bounty programMulti-Model Integration (External LLM Verifier)
For high-stakes findings, the verifier can call an external LLM
(not just an in-session subagent) for genuine second-opinion
verification. The proven invocation pattern, model choice, prompt
template, and a 9-finding track record live in:
references/external_llm_invocation.mdreferences/model-swap.md— change primary/fallback id only (keep baseurl+key); PONG probe; catalog listing ≠ rentable (403 permission_error)
Read those files before invoking or reconfiguring the external verifier. Key takeaways:
- Default model:
vpsnodelab/claude-opus-4-8viahttps://api.xah.io/v1 - Fallback:
openai/minimax-m3(when primary returns 403/429) — probe after every swap; listed models may still 403 for this key - Runtime:
bughunter-os/_verifier_config.json(model+fallback_model);_verifier.pyauto-retries fallback on 403/404/429/5xx - Model swap = id only; never rewrite baseurl or print/rotate the API key
- Verifier outputs a structured
VERDICT: ...string; parse with regex - Do not include $ amounts in the verdict request (add an explicit
instruction in the system prompt) - Always pass
target_context(program scope/out-of-scope rules) so
the model can catch scope-violation rejections - The model is most useful as a counter-bias to the hunter's
incentive to overclaim severity. Across Obol/Circle/Rolly/Gonka
sessions most High/Critical claims were downgraded or rejected. - When verdict is
NEEDS_MORE_EVIDENCEwithSUGGEST: Medium: refile
the tempered claim once, then ship if severity OK — do not invent
live E2E. Full loop + API key load + evidence tiers:references/external_llm_invocation.md.
When the user says "pakai Opus/GPT 5.6 sebagai verifier", "ganti model
verifier", "fallbacknya ganti jadi …", "panggil verifier", "double-check",
or "verify ini", load the reference file(s) and call verify_finding() frombughunter-os/_verifier.py (update config mirrors first if the request was a model swap).
Update Policy
To update, re-extract from latest Verifier-Agent-v*.zip and re-copy.