--- name: explain-flow description: > Explain how code flows with concrete input/output examples, ASCII diagrams, and before/after tables. Works on PRs, functions, modules, or any code path. Triggers: /explain-flow, "explain this PR", "explain this function", "explain this module", "how does this flow", "walk me through", "explain the change in" --- # /explain-flow — Explain Code with Concrete Examples Produce a clear explanation of how data flows through a PR, function, or module. The goal is to build the reader's mental model first, then confirm it with code — not to narrate the diff line by line. ## Step 1 — Gather the source material - **PR**: `gh pr view` and `gh pr diff`. Read all changed files. - **Function**: Read the function and its callers/callees one level in each direction. - **Module/package**: Read the public API surface and key internal wiring. For PRs and refactors, understand what the code did *before* the change and what it does *after* before writing anything. ## Step 2 — Write the explanation Work through these sections in order. Each one builds on the last. ### Background Orient the reader before touching the code. Assume no prior knowledge of the surrounding system. Cover: - What the surrounding system does (one short paragraph) - What was missing, broken, or constrained that prompted this change - Any architectural rules or design decisions that shaped the approach ### Intuition Explain the 2–4 core ideas in the change *before* showing any real code. Use toy examples and analogies. For each concept: - Name it - Make it concrete with a minimal before/after or a simple example - State why it matters This section should make the Code section feel like confirmation rather than discovery. Don't front-load implementation detail here — that belongs in the next section. ### Code walkthrough One-paragraph summary of what the change does and why, then a step-by-step trace through the key code path using realistic example data. Show actual values at each step: ``` Input: GET /api/items?filter=active 1. Parse filters → { status: "active" } 2. Check permissions → { orgIDs: ["org-1"], tenantIDs: ["t-1"] } 3. Query DB → SELECT ... WHERE status='active' AND org_id IN ('org-1') 4. Return → [{ id: "item-1", status: "active" }] ``` When a transformation spans multiple steps, show the data in both old and new form at *each* step — not just the endpoints. The reader should see the value mutating stage by stage. When there are meaningful branches, add a decision matrix: ``` | Input condition | Path taken | Result | |----------------------|----------------|-----------------| | flag ON + authorized | new + old path | union of both | | flag OFF | old path only | legacy behavior | | neither authorized | early return | empty response | ``` ### Other changes (PRs only) Briefly list mechanical or supporting changes — test updates, config, helpers — that don't affect the core flow. ## Guidelines - Use realistic field names and values from the actual code, not generic placeholders. - Keep examples short but complete: enough to see the transformation, not every field. - Prefer ASCII flow notation over prose for multi-step pipelines. - Pick the 2-3 most important code paths; don't trace every branch. - For modules, lead with the happy path, then note error/edge cases.