Trailmark Variant Neighborhood
Expand one seed issue into graph-derived variant candidates. This skill
generates review targets, not confirmed findings.
When to Use
- A finding is confirmed or plausible and variants may exist
- The vulnerable pattern depends on call context
- The issue involves a shared sink, source, validator, interface, override,
trait, hook, handler, adapter, or critical type
- The next step is to seed
variant-analysis, semgrep-rule-creator,
static-analysis, or manual review
When NOT to Use
- No seed issue exists. Use discovery or triage first.
- The pattern is purely syntactic and already obvious. Use
semgrep-rule-creator directly.
- The question is exploit-chain composition across multiple findings. Use a
composition workflow.
- The goal is remediation verification. Use a remediation-review workflow.
- The seed cannot be bound to a graph node.
Rationalizations to Reject
| Rationalization |
Why It Is Wrong |
Required Action |
| "Nearby code means variant" |
Proximity is only a candidate reason |
Rank it as a review target |
| "Only exact same names matter" |
Variants often share sinks or preconditions, not names |
Expand across callers, callees, interfaces, and types |
| "Every candidate is a finding" |
This skill outputs candidates for review |
Avoid vulnerability claims |
| "Unreachable candidates can be ignored completely" |
They may become reachable after refactors |
Rank lower or list as deferred |
| "Graph candidates replace semantic pattern work" |
Graph structure finds locations, not root-cause semantics |
Hand off to variant-analysis, Semgrep, CodeQL, or manual review |
Workflow
Variant Neighborhood Progress:
- [ ] Step 1: Normalize and bind the seed
- [ ] Step 2: Expand graph neighborhoods
- [ ] Step 3: Rank candidates
- [ ] Step 4: Extract variant pattern guidance
- [ ] Step 5: Emit handoff packet
Step 1: Normalize And Bind The Seed
Accept finding text, file/line, function name, or output from
trailmark-finding-triage. Bind the seed to a Trailmark node and record the
root cause in plain language.
If the seed has no concrete graph binding, stop before inventing variants.
Step 2: Expand Neighborhoods
Use the dimensions in
references/neighborhood-patterns.md:
- shared callers
- shared callees and sinks
- entrypoint path neighbors
- interface, override, trait, and implementation siblings
- file or module cluster neighbors
- taint or privilege-boundary peers
- type and state-reference neighbors
Bound expansion to avoid candidate floods.
Step 3: Rank Candidates
Rank with references/ranking.md. Prioritize
entrypoint-reachable, tainted, boundary-adjacent, high-blast-radius, shared
sink, same-interface, and close-distance candidates. Penalize test, mock,
generated, vendor, unreachable, and trusted-internal-only candidates.
Step 4: Extract Pattern Guidance
Summarize what should be searched for syntactically and what requires semantic
review. Identify whether follow-up belongs in:
variant-analysis
semgrep-rule-creator
static-analysis with CodeQL or SARIF-producing tools
- manual review
Step 5: Emit Handoff Packet
Use references/output-format.md. Include
ranked candidates, inclusion reasons, exclusions, limitations, and the
variant-analysis handoff.
Stop Conditions
- No graph binding exists
- Candidate count is too high and the root cause is underspecified
- Trailmark cannot analyze the target language
- The seed is only in test, generated, or vendor code and the user did not say
that code is in scope
1---2name: trailmark-variant-neighborhood3description: "Expands one confirmed or suspected vulnerability into a Trailmark graph neighborhood of variant candidates by finding sibling functions, shared callers and callees, common sensitive sinks, common entrypoint paths, interface implementations, override relationships, type/reference neighbors, and structurally similar nodes. Use after one issue is found to seed variant-analysis, semgrep-rule-creator, static-analysis, or manual review with graph-derived candidate locations."4allowed-tools:5 - Bash6 - Read7 - Grep8 - Glob9 - Write10---111213# Trailmark Variant Neighborhood1415Expand one seed issue into graph-derived variant candidates. This skill16generates review targets, not confirmed findings.1718## When to Use1920- A finding is confirmed or plausible and variants may exist21- The vulnerable pattern depends on call context22- The issue involves a shared sink, source, validator, interface, override,23 trait, hook, handler, adapter, or critical type24- The next step is to seed `variant-analysis`, `semgrep-rule-creator`,25 `static-analysis`, or manual review2627## When NOT to Use2829- No seed issue exists. Use discovery or triage first.30- The pattern is purely syntactic and already obvious. Use31 `semgrep-rule-creator` directly.32- The question is exploit-chain composition across multiple findings. Use a33 composition workflow.34- The goal is remediation verification. Use a remediation-review workflow.35- The seed cannot be bound to a graph node.3637## Rationalizations to Reject3839| Rationalization | Why It Is Wrong | Required Action |40|---|---|---|41| "Nearby code means variant" | Proximity is only a candidate reason | Rank it as a review target |42| "Only exact same names matter" | Variants often share sinks or preconditions, not names | Expand across callers, callees, interfaces, and types |43| "Every candidate is a finding" | This skill outputs candidates for review | Avoid vulnerability claims |44| "Unreachable candidates can be ignored completely" | They may become reachable after refactors | Rank lower or list as deferred |45| "Graph candidates replace semantic pattern work" | Graph structure finds locations, not root-cause semantics | Hand off to variant-analysis, Semgrep, CodeQL, or manual review |4647## Workflow4849```50Variant Neighborhood Progress:51- [ ] Step 1: Normalize and bind the seed52- [ ] Step 2: Expand graph neighborhoods53- [ ] Step 3: Rank candidates54- [ ] Step 4: Extract variant pattern guidance55- [ ] Step 5: Emit handoff packet56```5758### Step 1: Normalize And Bind The Seed5960Accept finding text, file/line, function name, or output from61`trailmark-finding-triage`. Bind the seed to a Trailmark node and record the62root cause in plain language.6364If the seed has no concrete graph binding, stop before inventing variants.6566### Step 2: Expand Neighborhoods6768Use the dimensions in69[references/neighborhood-patterns.md](references/neighborhood-patterns.md):7071- shared callers72- shared callees and sinks73- entrypoint path neighbors74- interface, override, trait, and implementation siblings75- file or module cluster neighbors76- taint or privilege-boundary peers77- type and state-reference neighbors7879Bound expansion to avoid candidate floods.8081### Step 3: Rank Candidates8283Rank with [references/ranking.md](references/ranking.md). Prioritize84entrypoint-reachable, tainted, boundary-adjacent, high-blast-radius, shared85sink, same-interface, and close-distance candidates. Penalize test, mock,86generated, vendor, unreachable, and trusted-internal-only candidates.8788### Step 4: Extract Pattern Guidance8990Summarize what should be searched for syntactically and what requires semantic91review. Identify whether follow-up belongs in:9293- `variant-analysis`94- `semgrep-rule-creator`95- `static-analysis` with CodeQL or SARIF-producing tools96- manual review9798### Step 5: Emit Handoff Packet99100Use [references/output-format.md](references/output-format.md). Include101ranked candidates, inclusion reasons, exclusions, limitations, and the102variant-analysis handoff.103104## Stop Conditions105106- No graph binding exists107- Candidate count is too high and the root cause is underspecified108- Trailmark cannot analyze the target language109- The seed is only in test, generated, or vendor code and the user did not say110 that code is in scope