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 ...
Scanned 9/3/2026
Install to Claude Code
npx -y skills add annatchijova/SKILLS --skill finding-custody --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Finding Custody?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/annatchijova-finding-custody)More formats (shields.io, HTML) on the badges page.
---
name: finding-custody
description: 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.
---
# 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:
1. **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.
2. **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.
3. **Set a retention date at the moment you file the report**, not "later".
Default it to fix-verified plus a fixed period.
4. **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.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!