Triage Verifier
Use this skill after finding-tracker shows a finding is confident and the
current research chain has reached a natural stopping point. Do not interrupt
active code review, reversing, debugging, fuzzing, or web testing that is still
producing new evidence. This skill is the final proof gate before a finding can
be marked proofed.
A finding is proofed only when it is reproduced, proven, or otherwise undeniable
from a triager's perspective. The standard is not "the agent believes it"; the
standard is "a skeptical security triager can follow the evidence and accept the
issue, impact, and affected boundary."
Exploit-chain findings follow the same proof gate. Individual proofed component
findings do not automatically proof the chain; the verifier must see that the
combined path works or is otherwise undeniable.
Proof Gate
Mark proofed only when all required elements are present:
- Clear scope and target identity: asset, version/build/commit, account/role,
environment, and authorization context.
- Exact vulnerability claim: what boundary fails and what security property is
violated.
- Reproduction or undeniable evidence: deterministic steps, request/response,
crash input, debugger trace, source/data-flow proof, patch diff, or controlled
runtime evidence.
- Expected vs actual behavior.
- Impact evidence: data reached, privilege gained, control obtained, crash class,
cross-tenant boundary, business effect, or exploitable primitive.
- Negative control or counterfactual where feasible: unauthorized state fails,
owner succeeds, patched build does not crash, safe input does not trigger, or
mitigated config blocks the issue.
- Preconditions and constraints: privileges, feature flags, timing, rate limits,
victim interaction, browser behavior, platform, mitigations, and reliability.
- Safe, redacted PoC artifacts that a triager can run or reason through.
Do not proof when evidence is only scanner output, a hunch, a single ambiguous
response, an unreproduced crash, a decompiler guess, a fuzzer crash without root
cause, a version string match without affectedness, or an exploitability claim
without reachability.
Outcomes
Choose exactly one:
proofed: evidence meets the proof gate. Update finding-tracker with
--state proofed and a proof reference.
needs-more-work: evidence is plausible but missing a required proof element.
Add a milestone explaining the gap and return to the right research skill.
de-escalated: the finding is debunked or impact collapses. Update
finding-tracker with --state de-escalated and the debunking reason.
split-or-duplicate: proof shows this finding should merge into another
finding or split into separate root causes. Update finding-tracker
milestones before continuing.
Helper Script
Use scripts/proof_packet.py to create a stable proof packet under
data/triage-verifier/. The script enforces required proof fields and prints a
proof reference path.
python3 <skill-dir>/scripts/proof_packet.py \
--finding-id F-0001 \
--title "IDOR in invoice export" \
--target "billing.example.com" \
--claim "Changing invoice_id exports another tenant's invoice." \
--reproduction "As tenant B user, request GET /api/invoices/A/export." \
--expected "Tenant B user receives 403 or tenant-scoped not found." \
--actual "Response is 200 with tenant A invoice PDF metadata." \
--impact "Cross-tenant invoice disclosure." \
--evidence "redacted request/response pair in notes" \
--chain-step "Optional: F-0003 postcondition feeds F-0007 precondition" \
--negative-control "Logged-out request returns 401; tenant A owner request succeeds." \
--constraints "Requires authenticated standard user." \
--poc "scripts/repro_invoice_export.py"
After successful verification, mark the finding proofed:
python3 <finding-tracker-dir>/scripts/findings.py update F-0001 \
--state proofed \
--proof-ref "data/triage-verifier/F-0001-proof.md" \
--note "Triage verifier accepted reproduction and negative controls."
If verification fails, add a milestone or de-escalate instead of forcing
proofed.
Verification Workflow
- Load the finding from
finding-tracker. Confirm it is confident, not merely
discovered.
- State why the active research chain is done for now: enough evidence, no new
leads, user requested proofing, patch/report deadline, or handoff point.
- Rebuild the claim from evidence. Identify the exact target, actor, boundary,
controlled input, missing guard, and impact.
- Reproduce safely when allowed. Prefer a clean environment, clean account,
minimal input, and one variable changed at a time.
- Add negative controls. Show what should fail, what should succeed, and what
changes when the guard, patch, owner, tenant, role, config, or input changes.
- Rewrite the PoC for verification. Make it minimal, deterministic, redacted,
scoped, and self-checking. Leave screen-recordable human packaging to
auto-triage after proofing.
- For exploit chains, prove the composition: show each link's precondition,
primitive, postcondition, and the exact point where one link feeds the next.
- Decide outcome. Proof, return for more work, de-escalate, merge, or split.
- Update
finding-tracker with proof reference, milestone, or de-escalation.
If the user explicitly asks for multi-agent verification, use
subagent-orchestration before the final verifier decision. Assign debaters to
try to refute specific proof elements and provers to prepare bounded artifacts,
but keep the final proofed, needs-more-work, de-escalated, or
split-or-duplicate decision in this skill.
Verifier PoC Standards
A passable verifier PoC should:
- Be scoped to authorized assets and test data.
- State setup, accounts/roles, target version/build, environment, and cleanup.
- Reproduce the issue with the fewest steps or smallest script.
- Include expected and actual results.
- Include at least one negative control where feasible.
- Redact tokens, cookies, PII, secrets, internal customer data, and destructive
payloads.
- Avoid unnecessary automation, scanning, sleeps, race amplification, or noisy
retries.
- Fail closed with clear messages when preconditions are missing.
- Leave the target state unchanged or include safe cleanup steps.
Rewrite weak PoCs until they are verification-friendly:
- Replace vague prose with exact commands, requests, inputs, or UI steps.
- Replace screenshots-only evidence with request/response or runtime facts when
possible.
- Replace brittle timing with deterministic waits or explicit state checks.
- Replace broad exploit scripts with minimal validation scripts.
- Replace "works on my account" with role/tenant/object comparisons.
- Replace raw crash dumps with minimized input, stack, sanitizer class, and root
cause lead.
Verification By Finding Type
- Web/API: include role/tenant comparison, exact request/response, session state,
object ownership, status codes, and redacted response proof.
- Source-code: include entry point, data flow, missing guard, failing test or
reproducible call path, and patchable location.
- Binary/crash: include artifact hash, command/input, signal/exception,
minimized input, stack/register/sanitizer evidence, and control/impact limits.
- Fuzzing: include harness, engine/sanitizer, minimized crash, reproducibility,
deduplication, and root-cause handoff.
- CVE/exposure: include exact product/package version, affectedness comparison,
vendor source, compensating controls, and environment reachability.
- AI/tool boundary: include untrusted content source, model/tool decision point,
server-side policy check, exact tool/API effect, and tenant/secret boundary.
- Exploit chain: include chain finding ID, related finding IDs, chain packet,
step preconditions and postconditions, end-to-end reproduction or undeniable
composition proof, negative controls for broken links, escalated impact, and
cleanup/blast-radius limits.
De-escalation Triggers
De-escalate when:
- The issue cannot be reproduced after controlling environment and prerequisites.
- A server-side check, patch, version, configuration, or compensating control
blocks the claim.
- The data/action belongs to the same actor or tenant after canonical identity
checks.
- The crash is a harness bug, expected assertion, duplicate, or non-security
local DoS under unrealistic conditions.
- The dependency or product version is not affected.
- The PoC requires out-of-scope impact or assumptions the engagement does not
allow.
- For exploit chains, an individual link is real but the links do not compose or
the combined impact is not materially greater than an existing finding.
Record the debunking evidence in finding-tracker; do not just abandon the
finding.
Output Format
Verification outcome: <proofed / needs-more-work / de-escalated / split-or-duplicate>
Finding: <finding ID and title>
Claim: <exact vulnerability claim>
Proof summary: <why a triager should accept or reject it>
Reproduction: <minimal steps or artifact references>
Negative controls: <controls run and results>
Impact: <validated impact and limits>
PoC quality: <passable / rewritten / still weak, with reason>
Proof reference: <path or verifier artifact, if proofed>
Tracker update: <state/milestone update performed or needed>
Next action: <none / auto-triage / return to skill / patch / report / de-escalate>
Keep proof packets and final reports concise, redacted, and reproducible.
Handoff
Use finding-tracker to update state and milestones. Return to
web-app-security-inspection, code-vulnerability-review, binary-debugging,
binary-reversing, fuzz-harness-builder, or cve-research when verification
finds a specific missing proof element. Use exploit-chain-analysis when a
chain proof fails because composition, impact escalation, or related-finding
structure needs more work. Use auto-triage after proofing when the PoC
needs to be human-operated, screen recorded, or attached as a clean reproduction
kit. Use report-writer after proofing when the user needs a bounty submission,
advisory draft, internal triage report, or remediation handoff.
1---2name: triage-verifier3description: Verify confident security findings before they are marked proofed. Use when a finding has reached the `confident` state in finding-tracker and the current research chain has ended or plateaued, or when Codex needs to harden, rewrite, reproduce, package, or sanity-check a PoC for a bug bounty, audit, advisory, crash, CVE exposure, web/API issue, source-code finding, binary finding, fuzzing result, or exploit-chain finding. Do not interrupt productive investigation; use this as the proof gate before updating a finding to `proofed`.4---56# Triage Verifier78Use this skill after `finding-tracker` shows a finding is `confident` and the9current research chain has reached a natural stopping point. Do not interrupt10active code review, reversing, debugging, fuzzing, or web testing that is still11producing new evidence. This skill is the final proof gate before a finding can12be marked `proofed`.1314A finding is proofed only when it is reproduced, proven, or otherwise undeniable15from a triager's perspective. The standard is not "the agent believes it"; the16standard is "a skeptical security triager can follow the evidence and accept the17issue, impact, and affected boundary."1819Exploit-chain findings follow the same proof gate. Individual proofed component20findings do not automatically proof the chain; the verifier must see that the21combined path works or is otherwise undeniable.2223## Proof Gate2425Mark `proofed` only when all required elements are present:2627- Clear scope and target identity: asset, version/build/commit, account/role,28 environment, and authorization context.29- Exact vulnerability claim: what boundary fails and what security property is30 violated.31- Reproduction or undeniable evidence: deterministic steps, request/response,32 crash input, debugger trace, source/data-flow proof, patch diff, or controlled33 runtime evidence.34- Expected vs actual behavior.35- Impact evidence: data reached, privilege gained, control obtained, crash class,36 cross-tenant boundary, business effect, or exploitable primitive.37- Negative control or counterfactual where feasible: unauthorized state fails,38 owner succeeds, patched build does not crash, safe input does not trigger, or39 mitigated config blocks the issue.40- Preconditions and constraints: privileges, feature flags, timing, rate limits,41 victim interaction, browser behavior, platform, mitigations, and reliability.42- Safe, redacted PoC artifacts that a triager can run or reason through.4344Do not proof when evidence is only scanner output, a hunch, a single ambiguous45response, an unreproduced crash, a decompiler guess, a fuzzer crash without root46cause, a version string match without affectedness, or an exploitability claim47without reachability.4849## Outcomes5051Choose exactly one:5253- `proofed`: evidence meets the proof gate. Update `finding-tracker` with54 `--state proofed` and a proof reference.55- `needs-more-work`: evidence is plausible but missing a required proof element.56 Add a milestone explaining the gap and return to the right research skill.57- `de-escalated`: the finding is debunked or impact collapses. Update58 `finding-tracker` with `--state de-escalated` and the debunking reason.59- `split-or-duplicate`: proof shows this finding should merge into another60 finding or split into separate root causes. Update `finding-tracker`61 milestones before continuing.6263## Helper Script6465Use `scripts/proof_packet.py` to create a stable proof packet under66`data/triage-verifier/`. The script enforces required proof fields and prints a67proof reference path.6869```bash70python3 <skill-dir>/scripts/proof_packet.py \71 --finding-id F-0001 \72 --title "IDOR in invoice export" \73 --target "billing.example.com" \74 --claim "Changing invoice_id exports another tenant's invoice." \75 --reproduction "As tenant B user, request GET /api/invoices/A/export." \76 --expected "Tenant B user receives 403 or tenant-scoped not found." \77 --actual "Response is 200 with tenant A invoice PDF metadata." \78 --impact "Cross-tenant invoice disclosure." \79 --evidence "redacted request/response pair in notes" \80 --chain-step "Optional: F-0003 postcondition feeds F-0007 precondition" \81 --negative-control "Logged-out request returns 401; tenant A owner request succeeds." \82 --constraints "Requires authenticated standard user." \83 --poc "scripts/repro_invoice_export.py"84```8586After successful verification, mark the finding proofed:8788```bash89python3 <finding-tracker-dir>/scripts/findings.py update F-0001 \90 --state proofed \91 --proof-ref "data/triage-verifier/F-0001-proof.md" \92 --note "Triage verifier accepted reproduction and negative controls."93```9495If verification fails, add a milestone or de-escalate instead of forcing96`proofed`.9798## Verification Workflow991001. Load the finding from `finding-tracker`. Confirm it is `confident`, not merely101 `discovered`.1022. State why the active research chain is done for now: enough evidence, no new103 leads, user requested proofing, patch/report deadline, or handoff point.1043. Rebuild the claim from evidence. Identify the exact target, actor, boundary,105 controlled input, missing guard, and impact.1064. Reproduce safely when allowed. Prefer a clean environment, clean account,107 minimal input, and one variable changed at a time.1085. Add negative controls. Show what should fail, what should succeed, and what109 changes when the guard, patch, owner, tenant, role, config, or input changes.1106. Rewrite the PoC for verification. Make it minimal, deterministic, redacted,111 scoped, and self-checking. Leave screen-recordable human packaging to112 `auto-triage` after proofing.1137. For exploit chains, prove the composition: show each link's precondition,114 primitive, postcondition, and the exact point where one link feeds the next.1158. Decide outcome. Proof, return for more work, de-escalate, merge, or split.1169. Update `finding-tracker` with proof reference, milestone, or de-escalation.117118If the user explicitly asks for multi-agent verification, use119`subagent-orchestration` before the final verifier decision. Assign debaters to120try to refute specific proof elements and provers to prepare bounded artifacts,121but keep the final `proofed`, `needs-more-work`, `de-escalated`, or122`split-or-duplicate` decision in this skill.123124## Verifier PoC Standards125126A passable verifier PoC should:127128- Be scoped to authorized assets and test data.129- State setup, accounts/roles, target version/build, environment, and cleanup.130- Reproduce the issue with the fewest steps or smallest script.131- Include expected and actual results.132- Include at least one negative control where feasible.133- Redact tokens, cookies, PII, secrets, internal customer data, and destructive134 payloads.135- Avoid unnecessary automation, scanning, sleeps, race amplification, or noisy136 retries.137- Fail closed with clear messages when preconditions are missing.138- Leave the target state unchanged or include safe cleanup steps.139140Rewrite weak PoCs until they are verification-friendly:141142- Replace vague prose with exact commands, requests, inputs, or UI steps.143- Replace screenshots-only evidence with request/response or runtime facts when144 possible.145- Replace brittle timing with deterministic waits or explicit state checks.146- Replace broad exploit scripts with minimal validation scripts.147- Replace "works on my account" with role/tenant/object comparisons.148- Replace raw crash dumps with minimized input, stack, sanitizer class, and root149 cause lead.150151## Verification By Finding Type152153- Web/API: include role/tenant comparison, exact request/response, session state,154 object ownership, status codes, and redacted response proof.155- Source-code: include entry point, data flow, missing guard, failing test or156 reproducible call path, and patchable location.157- Binary/crash: include artifact hash, command/input, signal/exception,158 minimized input, stack/register/sanitizer evidence, and control/impact limits.159- Fuzzing: include harness, engine/sanitizer, minimized crash, reproducibility,160 deduplication, and root-cause handoff.161- CVE/exposure: include exact product/package version, affectedness comparison,162 vendor source, compensating controls, and environment reachability.163- AI/tool boundary: include untrusted content source, model/tool decision point,164 server-side policy check, exact tool/API effect, and tenant/secret boundary.165- Exploit chain: include chain finding ID, related finding IDs, chain packet,166 step preconditions and postconditions, end-to-end reproduction or undeniable167 composition proof, negative controls for broken links, escalated impact, and168 cleanup/blast-radius limits.169170## De-escalation Triggers171172De-escalate when:173174- The issue cannot be reproduced after controlling environment and prerequisites.175- A server-side check, patch, version, configuration, or compensating control176 blocks the claim.177- The data/action belongs to the same actor or tenant after canonical identity178 checks.179- The crash is a harness bug, expected assertion, duplicate, or non-security180 local DoS under unrealistic conditions.181- The dependency or product version is not affected.182- The PoC requires out-of-scope impact or assumptions the engagement does not183 allow.184- For exploit chains, an individual link is real but the links do not compose or185 the combined impact is not materially greater than an existing finding.186187Record the debunking evidence in `finding-tracker`; do not just abandon the188finding.189190## Output Format191192```text193Verification outcome: <proofed / needs-more-work / de-escalated / split-or-duplicate>194Finding: <finding ID and title>195Claim: <exact vulnerability claim>196Proof summary: <why a triager should accept or reject it>197Reproduction: <minimal steps or artifact references>198Negative controls: <controls run and results>199Impact: <validated impact and limits>200PoC quality: <passable / rewritten / still weak, with reason>201Proof reference: <path or verifier artifact, if proofed>202Tracker update: <state/milestone update performed or needed>203Next action: <none / auto-triage / return to skill / patch / report / de-escalate>204```205206Keep proof packets and final reports concise, redacted, and reproducible.207208## Handoff209210Use `finding-tracker` to update state and milestones. Return to211`web-app-security-inspection`, `code-vulnerability-review`, `binary-debugging`,212`binary-reversing`, `fuzz-harness-builder`, or `cve-research` when verification213finds a specific missing proof element. Use `exploit-chain-analysis` when a214chain proof fails because composition, impact escalation, or related-finding215structure needs more work. Use `auto-triage` after proofing when the PoC216needs to be human-operated, screen recorded, or attached as a clean reproduction217kit. Use `report-writer` after proofing when the user needs a bounty submission,218advisory draft, internal triage report, or remediation handoff.