Why bug bounty reports get rejected

The twelve checks that decide a bug bounty report

Twelve checks, distilled from 105 real case files across five platforms. The wins and the closures. Every check exists because real reports were closed for that reason. For each one: the question it asks, why reports die on it and the verdict it leads to.

1 hosted review per UTC day on your own model. No card.

Built by Tradi3: 2nd of 133 in Immunefi’s Firelight competition and 8th of 65 in Quantus.

Every check leads to a decision

Submit
Every decisive claim is backed by the supplied code and proof. File it.
Rewrite, then submit
The finding holds. The draft misstates its severity, impact, preconditions or fix.
Prove first
The claimed impact is not demonstrated on the real path yet. One artefact is missing.
Hold: duplicate
A known issue, an audit note, a branch or your own earlier report has the same root cause or the same fix.
Drop
The code contradicts the root cause, the behaviour is the design, or the rules exclude it.

The gauntlet returns exactly one of these, with one blocker and the cheapest action that removes it.

The closure reason, and the check that catches it

A report is closed at the first of these a triager reaches. Each one is answered by a check that comes before the report is filed.

The twelve checks

Each check asks one question. A report that fails the first never needs a proof.

Check 01

Actor trace

Asks

Who performs every step, and who supplies every decisive value?

Why it kills

A programme pays for what an unprivileged attacker does. When the deciding step belongs to an owner, an operator or the victim’s own approval, the report is closed as a trusted-role or user-error case, however real the flaw in the code.

Leads to

Drop

Check 02

Own-verdict reversal

Asks

Which new evidence defeats each reason you recorded when you held this finding or lowered its severity?

Why it kills

A finding reads stronger on the second look because nothing argues back. A report revived with no new evidence is closed for the reason already written in your own notes.

Leads to

Earlier verdict stands

Check 03

Design intent and counterfactual

Asks

Did the project mean this behaviour, and does the bug step add anything over the intended path?

Why it kills

Behaviour the project documented, tested or introduced as an audit fix is closed as intended. A proof that reaches the same end state without the bug step shows no loss the design did not already allow.

Leads to

Drop

Check 04

Literal impact and exclusion fit

Asks

Does an exclusion name this class, and does every clause of the impact row have an artefact behind it?

Why it kills

A triager reads the exclusions first and the impact row word by word. One matching exclusion ends the report, and one clause with nothing behind it moves the report to a lower row.

Leads to

DropRewrite, then submit

Check 05

Asset and version binding

Asks

Does the cited code exist in the scoped asset, at the revision that is deployed?

Why it kills

A bug in a branch, a mirror or an old tag is a bug in something the programme does not pay for. A proof built on another revision proves that revision and leaves the deployed one untested.

Leads to

DropProve first

Check 06

Prior-art sweep

Asks

Does a known issue, an audit note, a branch or a pull request cover the same function and consequence, or carry the same fix?

Why it kills

Duplicates are judged on root cause and on the fix. Titles, wording and the strength of the proof carry no weight, so a report on a root cause someone already wrote down is closed.

Leads to

Hold: duplicate

Check 07

Own-report family

Asks

Stated with no file and no entry point, is the broken invariant one you have already reported on this programme?

Why it kills

Two reports on one invariant are grouped as one finding, and the later one is closed against the earlier. New evidence belongs in the report that already exists.

Leads to

Hold: duplicate

Check 08

Executed end-state proof

Asks

Does the final assertion read the object the impact row names, on production code, with the command and its output in the report?

Why it kills

A proof that shows the defect and describes the loss leaves the impact unproven. Triagers pay for an end state they can see asserted, and a proof they cannot run or read inline counts as no proof.

Leads to

Prove first

Check 09

Production reachability

Asks

Does every state the proof sets up have a route from live state by public calls?

Why it kills

A test can write any state it likes. A state that no public call reaches is an artefact of the test, and the report is closed as not exploitable.

Leads to

Prove first

Check 10

Severity against the written scale

Asks

Which row of the programme’s own scale does the proof assert, after every recovery action is applied?

Why it kills

Severity is graded on the programme’s written scale, read literally. A tier claimed above the measured loss, or a loss the project can undo, is downgraded.

Leads to

Rewrite, then submit

Check 11

Submission integrity

Asks

Does what the platform stored match the draft: the proof field, the severity, the impact row?

Why it kills

The triager judges the stored submission and never sees the draft on your disk. An empty proof field, or a form that disagrees with the body, closes a finding that is real.

Leads to

Rewrite, then submit

Check 12

Private-duplicate clock

Asks

Small fix, old code, central path, checklist class: how long before someone else files it?

Why it kills

Other hunters file in private, so a clean public search says nothing about who is ahead of you. A bug that is easy to find on old, central code is found more than once, and the later reports are closed as duplicates.

Leads to

Sets a filing deadline

The executable version of each check runs inside the gauntlet.

What makes a report land

The reports that were paid share these. Each line answers one or more of the checks before the triager asks.

The eight-stage gauntlet

The same checks, run as eight stages on your draft, your code and the programme rules. The order runs the gates that end a report before the stages that cost work.

  1. Scope

    scope Checks 4, 5

    Whether the code is in the scoped asset at the deployed revision, whether the class is excluded, and whether every clause of the chosen impact row has an artefact behind it.

    Outputs
    • Binding table
    • Exclusion matches
    • Impact row, clause by clause
  2. Provenance

    provenance Checks 1, 3, 9

    Who performs each step, whether the behaviour is documented design or an audit fix, whether the bug adds anything over the intended path, and whether every precondition is reachable from live state.

    Outputs
    • Actor table
    • Intent evidence
    • Counterfactual
    • Preconditions
  3. Prior art

    prior-art Checks 6, 7, 12

    Whether a known issue, a prior audit note, a team branch or your own earlier report has the same root cause or the same one-line fix.

    Outputs
    • Root-cause fingerprint
    • Matches
    • The duplicate clock
  4. Proof

    poc Check 8

    Whether the proof runs production code on every step and ends by reading the object the impact row names, with measured numbers.

    Outputs
    • Step table: executed, mocked or narrated
    • End-state assertion
    • Measured loss
  5. Severity

    severity Check 10

    The highest row of the programme’s own scale that the proof fully asserts, after every downgrade clause.

    Outputs
    • The tier to claim
    • The one fact that moves it
  6. Triager

    triage

    The one sentence that closes this report in ten minutes, and whether the first paragraph already answers it.

    Outputs
    • Ranked rejection reasons
    • The draft sentence that triggers each
  7. Report

    report Check 11

    Whether the claims follow from the code, the proof is inline, the form and the body agree, and the limits are stated.

    Outputs
    • Claims table
    • The rewritten report
  8. Verdict

    verdict

    One decision.

    Outputs
    • One of five verdicts
    • One blocker
    • The cheapest action that removes it
    • A filing deadline

ExampleWhat stage 8 hands you · invented protocol

VerdictProve first

The seizure bug is in the code. The proof reads the return value of liquidate on a mock oracle; the impact row names the borrower’s collateral.

  • 0Critical
  • 1High
  • 0Medium
  • 1Hardening
  • 3Checked safe

One decision, one blocker, the cheapest action that removes it and a filing deadline. Read the full example dossier

Two ways to run it

Both run on your own model and your own key.

One profile at a time

Free

Pick the profile that matches the check you are on: scope, provenance, prior art, proof, severity, triager or report. One hosted review per UTC day.

  • All eleven single profiles, hosted on your own key
  • The three core profiles also export as a prompt for any chat app or local model, with paste-back
  • Review packet with a SHA-256 manifest of every file

The full gauntlet

Operator · US$10/week

One run takes the draft through all eight stages and returns the verdict dossier. Each stage reads the output of the stages before it.

  • Unlimited hosted reviews
  • The Gauntlet and Panel review
  • Four hosted reviews running at once