Finding Custody
A confirmed finding is not finished when the vendor patches it. It is an asset
you are still holding: a working technique, an understanding of a class, and
usually a PoC that runs. Most methodologies end at "reported". Everything after
that point — what you say, what you keep, what you delete, and what would make
you revisit — is governed by nothing, which is why it is governed by habit.
Two claims this skill is built on:
Silence has operational requirements. Deciding not to publish is not the
zero-cost option; it is a custody obligation with a start date and no
automatic end.
The patch is a disclosure you did not write. A fix describes the bug,
authored by the people who understand it best, shipped publicly. Whatever the
patch reveals is revealed on the vendor's schedule, not yours.
This skill takes no position on whether to publish. It exists so that the
decision is made once, deliberately, with a written reason and a condition that
reopens it — rather than defaulting to silence and then never looking again.
Composes with the library:
- remediation-driven-reporting — the sibling: how the report gets the class
fixed; this skill governs everything you did not put in it
- beyond-the-sink — the reason class-level disclosure matters: a confirmed
bug is a template, and lateral replication is the highest-ROI move in
existence, for you and for everyone else
- decision-record-discipline — the format for a decision with a revisit
trigger
- claim-provenance-discipline — the finding's epistemic level must survive
into the private record too
- secret-lifecycle-discipline — a PoC is a credential-grade asset: same
storage, retention, and rotation-of-access thinking
- irreversible-action-gate — publication is irreversible; so is deleting
your only copy of the evidence
Part 1 — Three things you can disclose, and they are not equivalent
Separate them before deciding anything, because "did you disclose it?" is a
question about which of these three you moved:
| Layer |
What it is |
Who needs it |
What it costs to release |
| Instance |
This endpoint, this version, this parameter |
The vendor that owns it |
Low after the patch; the instance is dead |
| Mechanism |
The class — the invariant that gets violated and how |
Every vendor whose product has the class |
High: it is a template, and it survives the patch |
| Method |
How you hunt for it — the question family, the search that surfaced it |
Nobody, unless you choose to teach it |
Highest: it generates instances nobody has found yet |
The common intuition inverts this. People carefully redact the instance and
freely describe "the interesting technique" — which hands over the two layers
with leverage and withholds the one that is already patched.
Practical consequences:
- "It's already patched" is not the criterion. It settles the instance
layer only. The mechanism is exactly as live as it was.
- The vendor needs the mechanism, not just the instance — otherwise they
fix your input and keep the class (see
remediation-driven-reporting
Part 3). Full mechanism to the party that can fix it is not the same act as
full mechanism to everyone.
- A class that spans multiple vendors is a coordination problem before it is
a publication question. The ordering matters — see Part 2.
- Method-level teaching has a real defensive case (it is how the next
generation of auditors learns), but it is a separate decision from this
finding, made deliberately and stripped of live instances.
Part 2 — The window opens with the patch, not with your writeup
Patch diffing is a discipline of its own, and it exists because the fix is the
highest-quality description of the bug ever written. A silent patch is not a
secret patch; it is a public artifact with the answer in it.
So model the timeline honestly:
report → vendor fix → patch ships → [ window ] → class derivable by anyone
The window's length is a property of the class, not of your discretion. A
one-line input filter on a rare code path is quiet for a long time; a
restructuring of how two components exchange a parsed value is legible almost
immediately.
What follows from this:
- Do not plan on the silence. Plan on the window. If your protection
strategy is "nobody will notice", it has already failed for anyone who
watches that repo's commits.
- When the class spans several products, the first patch starts everyone's
clock. Every unreported sibling is exposed from that moment, by a signal
you triggered. That is the strongest argument for reporting the siblings
before the first patch ships, and for asking the first vendor about their
release timing.
- Use the window deliberately. It is the period in which siblings can be
reported and fixed with the least ambient risk. Spending it is a choice; so
is letting it pass.
- The vendor's advisory text is also a disclosure decision — one someone
else makes about your finding. If the class matters, that is worth a sentence
in your report: what level of detail you would prefer the advisory carry,
and why. They may decline. Ask anyway.
Part 3 — Custody: a PoC is a live asset
You are holding something that works. Treat it with the same discipline as a
credential (secret-lifecycle-discipline), because that is what it is.
Inventory, honestly — most people underestimate this list:
- the PoC itself, and every intermediate script that also works
- notes, screenshots, recordings, terminal scrollback
- any data you touched while confirming — even a single object read from a
system to prove cross-tenant access
- the report draft, and every copy in mail, chat, ticketing, or a shared drive
- every third-party service that saw it: an AI assistant's transcript, a
cloud session, a pastebin, a CI log, a screenshot in a support ticket,
a translation tool. If a model helped you build the PoC, the PoC is in that
history and its retention is not yours to set.
Then apply four rules:
- Separate storage. Not in your day-to-day repo, not in the folder you
screen-share from. Encrypted at rest, with the target's name not in the
filename.
- Delete the data, keep the method. Anything you obtained from a live
system during confirmation is the vendor's data, not your evidence. Keep
the fact that you read it and the hash if you need proof; destroy the
content. Holding another party's data is the part of this work that is
hardest to justify afterwards.
- Set a retention date at the moment you file the report, not "later".
Default it to fix-verified plus a fixed period.
- Name who else has it. Every co-researcher, every tool, every backup.
A PoC in three places has three compromise scenarios.
Then run the scenario in one sentence: if my machine, repo, or cloud account
were compromised tomorrow, what would the attacker inherit? If the answer is
working exploits for services still in production, the custody plan is the
finding's most under-tested control.
Part 4 — Write the decision down, with a trigger that reopens it
An undocumented "I don't publish" is not a decision; it is a default that never
gets re-examined. Use decision-record-discipline's shape:
## Finding <id> — disclosure decision
Class: <the invariant / mechanism, in one line>
Reported to: <party> on <date> | fix status: <verified / pending / declined>
Instances known: <reported> / <believed to exist, unconfirmed, where>
Decision: instance disclosed to <n> vendors; mechanism NOT published;
method NOT published
Rationale: <why — the class is portable, siblings unreported, etc.>
Revisit if:
- the class appears in the wild or in someone else's publication
- the last affected vendor ships a fix (window opens; see Part 2)
- a vendor declines to fix, or goes silent past <date>
- an affected product is EOL'd with the class unfixed
- <date>: unconditional re-read of this record
Custody: PoC at <location>, retention until <date>, copies held by <who>
Successor: <who inherits this if I am not here>
Two fields people skip and should not:
- The unconditional re-read date. Circumstances move. A decision that is
correct in one context and never revisited becomes a default again.
- The successor. If the class dies with your laptop while it is still live
in production, the silence stopped protecting anyone and started protecting
nothing.
Anti-patterns
- Treating "reported and patched" as the end of the finding's life.
- Assuming a silent patch keeps the mechanism private — the diff is public.
- Redacting the instance carefully while narrating the method, which is the
layer with the most leverage.
- Withholding the mechanism from the vendor out of publication habit. They
cannot fix a class they were not told about.
- Reporting one product and sitting on the siblings while the first patch ships
and starts their clock.
- Keeping the PoC in the working repo, or in a folder that gets screen-shared.
- Retaining data obtained during confirmation because it "proves" the finding.
- Forgetting the third-party transcripts, logs, and assistant histories that
hold a full copy of the PoC under someone else's retention policy.
- A "never publish" with no rationale, no revisit trigger, and no expiry.
- No successor, so a live class in production has exactly one person keeping it
alive as knowledge.
1---2name: finding-custody3description: Govern what happens to a confirmed finding once it is reported and you are not going to publish it — the difference between disclosing an instance, a mechanism, and a hunting method; the patch-diffing window that leaks the class whether or not you write a word; custody of the PoC and of any data you touched confirming it; and a written decision with a revisit trigger instead of an undocumented default. Use whenever a finding is confirmed and the question turns to who is told what, whenever a writeup, talk, blog post, CVE text, or conference submission is considered, whenever the same class exists in products nobody has reported yet, and whenever a working PoC needs somewhere to live. Trigger on "should we publish", "write it up", "embargo", "CVE text", "the vendor patched it", "can I blog about this", "who else has this bug", "where do I keep the PoC", or a finding going quiet with no record. It never argues for or against publishing; it makes the decision explicit, bounded, and revisitable.4---56# Finding Custody78A confirmed finding is not finished when the vendor patches it. It is an asset9you are still holding: a working technique, an understanding of a class, and10usually a PoC that runs. Most methodologies end at "reported". Everything after11that point — what you say, what you keep, what you delete, and what would make12you revisit — is governed by nothing, which is why it is governed by habit.1314Two claims this skill is built on:1516> **Silence has operational requirements.** Deciding not to publish is not the17> zero-cost option; it is a custody obligation with a start date and no18> automatic end.1920> **The patch is a disclosure you did not write.** A fix describes the bug,21> authored by the people who understand it best, shipped publicly. Whatever the22> patch reveals is revealed on the vendor's schedule, not yours.2324This skill takes no position on whether to publish. It exists so that the25decision is made once, deliberately, with a written reason and a condition that26reopens it — rather than defaulting to silence and then never looking again.2728Composes with the library:2930- **remediation-driven-reporting** — the sibling: how the report gets the class31 fixed; this skill governs everything you did *not* put in it32- **beyond-the-sink** — the reason class-level disclosure matters: a confirmed33 bug is a template, and lateral replication is the highest-ROI move in34 existence, for you and for everyone else35- **decision-record-discipline** — the format for a decision with a revisit36 trigger37- **claim-provenance-discipline** — the finding's epistemic level must survive38 into the private record too39- **secret-lifecycle-discipline** — a PoC is a credential-grade asset: same40 storage, retention, and rotation-of-access thinking41- **irreversible-action-gate** — publication is irreversible; so is deleting42 your only copy of the evidence4344---4546## Part 1 — Three things you can disclose, and they are not equivalent4748Separate them before deciding anything, because "did you disclose it?" is a49question about which of these three you moved:5051| Layer | What it is | Who needs it | What it costs to release |52|---|---|---|---|53| **Instance** | This endpoint, this version, this parameter | The vendor that owns it | Low after the patch; the instance is dead |54| **Mechanism** | The class — the invariant that gets violated and how | Every vendor whose product has the class | High: it is a template, and it survives the patch |55| **Method** | How you hunt for it — the question family, the search that surfaced it | Nobody, unless you choose to teach it | Highest: it generates instances nobody has found yet |5657The common intuition inverts this. People carefully redact the instance and58freely describe "the interesting technique" — which hands over the two layers59with leverage and withholds the one that is already patched.6061Practical consequences:6263- **"It's already patched" is not the criterion.** It settles the instance64 layer only. The mechanism is exactly as live as it was.65- **The vendor needs the mechanism, not just the instance** — otherwise they66 fix your input and keep the class (see `remediation-driven-reporting`67 Part 3). Full mechanism to the party that can fix it is not the same act as68 full mechanism to everyone.69- **A class that spans multiple vendors is a coordination problem before it is70 a publication question.** The ordering matters — see Part 2.71- **Method-level teaching has a real defensive case** (it is how the next72 generation of auditors learns), but it is a separate decision from this73 finding, made deliberately and stripped of live instances.7475## Part 2 — The window opens with the patch, not with your writeup7677Patch diffing is a discipline of its own, and it exists because the fix is the78highest-quality description of the bug ever written. A silent patch is not a79secret patch; it is a public artifact with the answer in it.8081So model the timeline honestly:8283```84report → vendor fix → patch ships → [ window ] → class derivable by anyone85```8687The window's length is a property of the class, not of your discretion. A88one-line input filter on a rare code path is quiet for a long time; a89restructuring of how two components exchange a parsed value is legible almost90immediately.9192What follows from this:9394- **Do not plan on the silence. Plan on the window.** If your protection95 strategy is "nobody will notice", it has already failed for anyone who96 watches that repo's commits.97- **When the class spans several products, the first patch starts everyone's98 clock.** Every unreported sibling is exposed from that moment, by a signal99 you triggered. That is the strongest argument for reporting the siblings100 *before* the first patch ships, and for asking the first vendor about their101 release timing.102- **Use the window deliberately.** It is the period in which siblings can be103 reported and fixed with the least ambient risk. Spending it is a choice; so104 is letting it pass.105- **The vendor's advisory text is also a disclosure decision** — one someone106 else makes about your finding. If the class matters, that is worth a sentence107 in your report: what level of detail you would prefer the advisory carry,108 and why. They may decline. Ask anyway.109110## Part 3 — Custody: a PoC is a live asset111112You are holding something that works. Treat it with the same discipline as a113credential (`secret-lifecycle-discipline`), because that is what it is.114115Inventory, honestly — most people underestimate this list:116117- the PoC itself, and every intermediate script that also works118- notes, screenshots, recordings, terminal scrollback119- **any data you touched while confirming** — even a single object read from a120 system to prove cross-tenant access121- the report draft, and every copy in mail, chat, ticketing, or a shared drive122- **every third-party service that saw it**: an AI assistant's transcript, a123 cloud session, a pastebin, a CI log, a screenshot in a support ticket,124 a translation tool. If a model helped you build the PoC, the PoC is in that125 history and its retention is not yours to set.126127Then apply four rules:1281291. **Separate storage.** Not in your day-to-day repo, not in the folder you130 screen-share from. Encrypted at rest, with the target's name not in the131 filename.1322. **Delete the data, keep the method.** Anything you obtained from a live133 system during confirmation is the *vendor's* data, not your evidence. Keep134 the fact that you read it and the hash if you need proof; destroy the135 content. Holding another party's data is the part of this work that is136 hardest to justify afterwards.1373. **Set a retention date at the moment you file the report**, not "later".138 Default it to fix-verified plus a fixed period.1394. **Name who else has it.** Every co-researcher, every tool, every backup.140 A PoC in three places has three compromise scenarios.141142Then run the scenario in one sentence: *if my machine, repo, or cloud account143were compromised tomorrow, what would the attacker inherit?* If the answer is144working exploits for services still in production, the custody plan is the145finding's most under-tested control.146147## Part 4 — Write the decision down, with a trigger that reopens it148149An undocumented "I don't publish" is not a decision; it is a default that never150gets re-examined. Use `decision-record-discipline`'s shape:151152```153## Finding <id> — disclosure decision154Class: <the invariant / mechanism, in one line>155Reported to: <party> on <date> | fix status: <verified / pending / declined>156Instances known: <reported> / <believed to exist, unconfirmed, where>157158Decision: instance disclosed to <n> vendors; mechanism NOT published;159 method NOT published160Rationale: <why — the class is portable, siblings unreported, etc.>161162Revisit if:163 - the class appears in the wild or in someone else's publication164 - the last affected vendor ships a fix (window opens; see Part 2)165 - a vendor declines to fix, or goes silent past <date>166 - an affected product is EOL'd with the class unfixed167 - <date>: unconditional re-read of this record168169Custody: PoC at <location>, retention until <date>, copies held by <who>170Successor: <who inherits this if I am not here>171```172173Two fields people skip and should not:174175- **The unconditional re-read date.** Circumstances move. A decision that is176 correct in one context and never revisited becomes a default again.177- **The successor.** If the class dies with your laptop while it is still live178 in production, the silence stopped protecting anyone and started protecting179 nothing.180181---182183## Anti-patterns184185- Treating "reported and patched" as the end of the finding's life.186- Assuming a silent patch keeps the mechanism private — the diff is public.187- Redacting the instance carefully while narrating the method, which is the188 layer with the most leverage.189- Withholding the mechanism from the *vendor* out of publication habit. They190 cannot fix a class they were not told about.191- Reporting one product and sitting on the siblings while the first patch ships192 and starts their clock.193- Keeping the PoC in the working repo, or in a folder that gets screen-shared.194- Retaining data obtained during confirmation because it "proves" the finding.195- Forgetting the third-party transcripts, logs, and assistant histories that196 hold a full copy of the PoC under someone else's retention policy.197- A "never publish" with no rationale, no revisit trigger, and no expiry.198- No successor, so a live class in production has exactly one person keeping it199 alive as knowledge.