/gitnexus-pdg-query
Use when querying or extending GitNexus's PDG control/data-dependence surface (the `pdg_query` MCP tool, CDG/REACHING_DEF edges), or reasoning about \"what controls X\" / \"where does Y flow\" / guard clauses. Examples: \"what guards this statement?\", \"trace this variable
$ npx -y skills add abhigyanpatwari/GitNexus --skill gitnexus-pdg-query --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/gitnexus-pdg-query
Context preview
The summary Claude sees to decide when to auto-load this skill.
Use when querying or extending GitNexus's PDG control/data-dependence surface (the `pdg_query` MCP tool, CDG/REACHING_DEF edges), or reasoning about \"what controls X\" / \"where does Y flow\" / guard clauses. Examples: \"what guards this statement?\", \"trace this variable
SKILL.md
gitnexus-pdg-query.SKILL.mdname: gitnexus-pdg-query
description: "Use when querying or extending GitNexus's PDG control/data-dependence surface (the `pdg_query` MCP tool, CDG/REACHING_DEF edges), or reasoning about \"what controls X\" / \"where does Y flow\" / guard clauses. Examples: \"what guards this statement?\", \"trace this variable within the function\", \"why is the pdg_query result empty?\", \"add a CDG query\"."
PDG query surface with GitNexus
Expert knowledge for the `pdg_query` MCP tool and the control/data-dependence edges it reads — the opt-in `--pdg` program-dependence layers. Read this before touching `gitnexus/src/mcp/local/local-backend.ts` (`_pdgQueryImpl`) or the `pdg_query` tool def, or when explaining a `pdg_query` result.
When to Use
- "Under what condition does this statement run?" (guarding predicates).
- "Where does this variable flow inside the function?" (def→use).
- Guard-clause discovery (early-return guards — subsumes the #559 heuristic).
- Extending or reviewing `pdg_query` / the CDG / REACHING_DEF read path.
- Debugging an empty or surprising `pdg_query` result.
The layered substrate (build order)
`pdg_query` runs **on** the same graph taint runs on. Each layer is opt-in behind `--pdg`; a default `analyze` run records none of them (byte-identical).
L1 CFG per-function basic blocks + control-flow edges (M1 #2081)
L2 REACHING_DEF GEN/KILL def→use data dependence (pure solver) (M2 #2082)
L5 CDG Ferrante control dependence (post-dominators) (M5 #2085)
All three are `BasicBlock → BasicBlock` edges in the single `CodeRelation` table (keyed by the `type` property). There is **no** `Function → BasicBlock` edge.
The two modes
- `pdg_query({ mode: 'controls', target })` — CDG. For the anchored function,
each edge: controlling predicate block → dependent block + branch sense in `reason` (`'T'` = predicate's true/taken arm, `'F'` = false/fall-through). An edge into an early-return/throw block is flagged `guard: true`.
- `pdg_query({ mode: 'flows', target, variable? })` — REACHING_DEF def→use
edges; `variable` filters to one binding.
`target` is **required** — a file path or a symbol/function name (resolved like `context()`). There is no anchorless mode (see below).
The corrected guard-clause Cypher
The RFC #567 §2 form (`[:CDG {label:'F'}]`) does **not** run as written. Edges are values of the single `CodeRelation` table's `type` property, and the branch sense is in `reason`, NOT a `label` column:
MATCH (pred:BasicBlock)-[r:CodeRelation {type: 'CDG'}]->(dep:BasicBlock)
WHERE dep.text STARTS WITH 'return' OR dep.text STARTS WITH 'throw'
RETURN pred.startLine, r.reason AS branch, dep.startLine, dep.text`r.reason` is the sense the predicate took to reach the early exit. For `if (!ok) return;` the return rides the predicate's **true** arm (`'T'`) and the protected body rides the **false** arm (`'F'`) — polarity depends on the guard, so don't hard-code one sense.
Gotchas (the load-bearing ones)
- **Always anchored + LIMIT-bounded.** LadybugDB has no rel-property index, so
an unanchored `[:CDG*]`/`[:REACHING_DEF*]` path scan is unbounded. `pdg_query` requires `target` and bounds the page; raw `cypher` callers must anchor on a file id-prefix or symbol span themselves.
- **BasicBlock↔symbol join is reconstructed.** No `Function→BasicBlock` edge:
the block is matched by its id-prefix (`BasicBlock:<file>:<fnStartLine>:…`) plus `startLine` within the symbol's span. BasicBlock `startLine` is **1-based** while the symbol node's `startLine`/`endLine` are **0-based**, so **both** bounds are shifted `+1` (`[symStart+1, symEnd+1]`): the upper `+1` keeps a guard/def/use on the function's **final line**, the lower `+1` excludes an adjacent function's block on the line directly **above**. Same-line / nested functions anchor coarsely.
- **No PDG layer ⇒ a note, not an error.** If the repo wasn't indexed with
`--pdg` the tool returns `{ results: [], note: "no PDG layer …" }` (cheap meta probe on `RepoMeta.pdg.maxCdgEdgesPerFunction` / `maxReachingDefEdgesPerFunction`).
- **CDG labels are binary in M5/M6.** Every `switch`-case arm is `'T'`; per-case
conditions are not yet distinguished.
- **Intra-procedural only.** Cross-function flow is taint's domain (`explain`).
Mirror, don't fork
`_pdgQueryImpl` is the front half of `_explainImpl` (WAL wrapper, meta no-layer probe, limit validation, `resolveSymbolCandidates` anchoring) with CDG/ REACHING_DEF instead of TAINTED — and none of taint's path-codec / interproc `TAINT_PATH` machinery. Reuse those shared helpers; do not re-implement them.
Read more
name: gitnexus-pdg-query description: "Use when querying or extending GitNexus's PDG control/data-dependence surface (the `pdg_query` MCP tool, CDG/REACHING_DEF edges), or reasoning about \"what controls X\" / \"where does Y flow\" / guard clauses. Examples: \"what guards this statement?\", \"trace this variable within the function\", \"why is the pdg_query result empty?\", \"add a CDG query\"."
PDG query surface with GitNexus
Expert knowledge for the `pdg_query` MCP tool and the control/data-dependence edges it reads — the opt-in `--pdg` program-dependence layers. Read this before touching `gitnexus/src/mcp/local/local-backend.ts` (`_pdgQueryImpl`) or the `pdg_query` tool def, or when explaining a `pdg_query` result.
When to Use
- "Under what condition does this statement run?" (guarding predicates).
- "Where does this variable flow inside the function?" (def→use).
- Guard-clause discovery (early-return guards — subsumes the #559 heuristic).
- Extending or reviewing `pdg_query` / the CDG / REACHING_DEF read path.
- Debugging an empty or surprising `pdg_query` result.
The layered substrate (build order)
`pdg_query` runs **on** the same graph taint runs on. Each layer is opt-in behind `--pdg`; a default `analyze` run records none of them (byte-identical).
L1 CFG per-function basic blocks + control-flow edges (M1 #2081) L2 REACHING_DEF GEN/KILL def→use data dependence (pure solver) (M2 #2082) L5 CDG Ferrante control dependence (post-dominators) (M5 #2085)
All three are `BasicBlock → BasicBlock` edges in the single `CodeRelation` table (keyed by the `type` property). There is **no** `Function → BasicBlock` edge.
The two modes
- `pdg_query({ mode: 'controls', target })` — CDG. For the anchored function,
each edge: controlling predicate block → dependent block + branch sense in `reason` (`'T'` = predicate's true/taken arm, `'F'` = false/fall-through). An edge into an early-return/throw block is flagged `guard: true`.
- `pdg_query({ mode: 'flows', target, variable? })` — REACHING_DEF def→use
edges; `variable` filters to one binding.
`target` is **required** — a file path or a symbol/function name (resolved like `context()`). There is no anchorless mode (see below).
The corrected guard-clause Cypher
The RFC #567 §2 form (`[:CDG {label:'F'}]`) does **not** run as written. Edges are values of the single `CodeRelation` table's `type` property, and the branch sense is in `reason`, NOT a `label` column:
MATCH (pred:BasicBlock)-[r:CodeRelation {type: 'CDG'}]->(dep:BasicBlock)
WHERE dep.text STARTS WITH 'return' OR dep.text STARTS WITH 'throw'
RETURN pred.startLine, r.reason AS branch, dep.startLine, dep.text`r.reason` is the sense the predicate took to reach the early exit. For `if (!ok) return;` the return rides the predicate's **true** arm (`'T'`) and the protected body rides the **false** arm (`'F'`) — polarity depends on the guard, so don't hard-code one sense.
Gotchas (the load-bearing ones)
- **Always anchored + LIMIT-bounded.** LadybugDB has no rel-property index, so
an unanchored `[:CDG*]`/`[:REACHING_DEF*]` path scan is unbounded. `pdg_query` requires `target` and bounds the page; raw `cypher` callers must anchor on a file id-prefix or symbol span themselves.
- **BasicBlock↔symbol join is reconstructed.** No `Function→BasicBlock` edge:
the block is matched by its id-prefix (`BasicBlock:<file>:<fnStartLine>:…`) plus `startLine` within the symbol's span. BasicBlock `startLine` is **1-based** while the symbol node's `startLine`/`endLine` are **0-based**, so **both** bounds are shifted `+1` (`[symStart+1, symEnd+1]`): the upper `+1` keeps a guard/def/use on the function's **final line**, the lower `+1` excludes an adjacent function's block on the line directly **above**. Same-line / nested functions anchor coarsely.
- **No PDG layer ⇒ a note, not an error.** If the repo wasn't indexed with
`--pdg` the tool returns `{ results: [], note: "no PDG layer …" }` (cheap meta probe on `RepoMeta.pdg.maxCdgEdgesPerFunction` / `maxReachingDefEdgesPerFunction`).
- **CDG labels are binary in M5/M6.** Every `switch`-case arm is `'T'`; per-case
conditions are not yet distinguished.
- **Intra-procedural only.** Cross-function flow is taint's domain (`explain`).
Mirror, don't fork
`_pdgQueryImpl` is the front half of `_explainImpl` (WAL wrapper, meta no-layer probe, limit validation, `resolveSymbolCandidates` anchoring) with CDG/ REACHING_DEF instead of TAINTED — and none of taint's path-codec / interproc `TAINT_PATH` machinery. Reuse those shared helpers; do not re-implement them.
⚠️ Important Notice: GitNexus has NO official cryptocurrency, token, or coin. Any token/coin using the GitNexus name on Pump.fun or any other platform is not affiliated with, endorsed by, or created by this project or its maintainers.
Other skills on gitnexus.
- /gitnexus-cli
Use when the user needs to run GitNexus CLI commands like analyze/index a repo, check status, clean the index, generate a wiki, or list indexed repos. Examples: \"Index this repo\", \"Reanalyze the codebase\", \"Generate a wiki\"
Open skill - /gitnexus-debugging
Use when the user is debugging a bug, tracing an error, or asking why something fails. Examples: \"Why is X failing?\", \"Where does this error come from?\", \"Trace this bug\"
Open skill - /gitnexus-exploring
Use when the user asks how code works, wants to understand architecture, trace execution flows, or explore unfamiliar parts of the codebase. Examples: \"How does X work?\", \"What calls this function?\", \"Show me the auth flow\"
Open skill - /gitnexus-guide
Use when the user asks about GitNexus itself — available tools, how to query the knowledge graph, MCP resources, graph schema, or workflow reference. Examples: \"What GitNexus tools are available?\", \"How do I use GitNexus?\"
Open skill - /gitnexus-impact-analysis
Use when the user wants to know what will break if they change something, or needs safety analysis before editing code. Examples: \"Is it safe to change X?\", \"What depends on this?\", \"What will break?\"
Open skill - /gitnexus-lfg
Use when the user wants the GitNexus engineering pipeline run end-to-end on a task: gitnexus-plan (plan depth chosen up front), a blocking gate to execute with gitnexus-work or stop, finishing with a gitnexus-review of the result. Examples: \"/gitnexus-lfg Add retry support to
Open skill

