Install any skill in seconds. Free to start, no credit card required.
Get Started Free →elianiva/to-callgraph
Trace a code path end-to-end and render it as an annotated ASCII callgraph with a concurrency/serialization analysis.
Passed 2 of 8 test cases with the skill, and 3 of 8 without it.
1 fixed5 passed either way14 still failing6 broke
Tokens, turns and time describe resource use, not a dollar price.
A test case the skill fixed. Same model, same prompt, with and without the skill.
When building a trace for `src/services/billing.ts` handling `calculateInvoice()`, how do you verify that edge connections between exported symbols and downstream handlers are complete and not missing callers? Explain the verification step for callers.
| Checked | Without skill | With skill |
|---|---|---|
| Caller verification requires running grep for all callers of exported symbols. | Missed | Passed |
The instructions your model reads when the skill loads.
Trace a flow through the codebase end-to-end and hand back a callgraph: an ASCII diagram of every hop, annotated with where work runs concurrently and where it waits. When the user asks about a path — a feature, a flow, a worry like "can we parallelize this?" — the answer starts with the trace.
Pin the entry (the event/message/command that starts the flow) and the exit (what completes it — a rendered frame, a blob URL, a persisted row). Find every path that carries the feature's name: a feature often has two (a CPU preview path and a GPU path, a fast path and a full path), and each gets traced.
Completion criterion: you can state, in one sentence, what enters and what exits each path.
Each hop is one box of the callgraph: event → message → update → command → service → worker/GPU → message → update → model → view. Read the file that handles each hop before drawing the edge — a hop you haven't read is an edge you can't draw.
fffind/grep for the feature's names, read what surfaces, then read the project's ADRs/docs for the decisions that shaped the path.grep for every caller of the exported symbols it crosses — missed callers are bugs.Completion criterion: every edge names a file you actually read; every exported symbol you cite has had its callers grepped.
ASCII, top-down, one line per hop, file path on the edge, in the house style:
<entry>
└─ <dispatch> → <message>
└─ <command.execute> (forked — concurrent)
├─ <service> ✓ memoized / parallel
└─ <worker> ⚠ serializes here — one thread, N requests
Mark every async boundary (postMessage/Deferred, Effect.runFork, GPU submission). Mark every hop that already runs concurrently (✓) and every hop where work queues up (⚠). If a hop spans multiple files, say so.
Completion criterion: a reader can point at any box, ask "where's the code?", and get a file:line.
For every ⚠, name the concrete cost and the fix shape: a pool (N workers/threads instead of 1), a cache (memoize a value recomputed per iteration), a move (off the main thread), a coalesce (dedupe identical requests). Also hunt wasted work: the same op repeated per item that could run once (a downscale per LUT instead of per photo). Every bottleneck gets a named fix direction — a complaint without a fix shape is an unfinished seam.
test cases passed, vs 3 / 8 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.