← Files pstackARCHIVED FILE
skills/why/SKILL.md
10.4 KB · Oct 5, 2026 · 18:31 UTC
--- name: why description: "Investigate why a codebase, feature, design decision, threshold, workaround, or architectural choice exists by tracing evidence across the sources available to ChatGPT. Use for 'why does X work this way', 'why did we choose Y', design rationale, regressions, postmortems, historical context, and tradeoff questions." --- # Why Investigate why something exists or works the way it does. The goal is to recover the evidence behind a decision, not invent a plausible explanation from the current code. Use this skill for questions like: * "Why was this designed this way?" * "Why do we use X instead of Y?" * "Why does this workaround exist?" * "Why is this limit 500?" * "What caused this regression?" * "What led to this architecture?" * "Was this added for a customer, incident, or technical constraint?" * "What alternatives did we consider?" Use `how` when the question is about what the system does or how it runs. Use `why` when the question is about intent, history, constraints, or tradeoffs. ## Evidence before explanation Do not infer historical intent from the shape of the current code unless no better evidence exists. Look for direct evidence first. Useful sources include: * Git history * commits * pull requests * review comments * GitHub issues * Linear or another issue tracker * design documents * RFCs * ADRs * project notes * team chat * incident reports * error tracking * observability data * product analytics * code comments and tests when they record a constraint Use whatever sources ChatGPT can access in the current conversation. If the user names a repository, ticket, PR, document, incident, or other source that is accessible, inspect it before answering. Do not ask the user to paste information that is already available through a connected source. ## Start with the target Pin down what decision you are investigating. The target may be: * a function * a class * a configuration value * a feature * an API * an architectural pattern * a guard or workaround * a database field * a retry policy * a timeout * a threshold * a deleted or legacy path * a change in behavior Find the concrete code or artifact first when one exists. Record the important names that can lead you into the history: * file paths * symbols * configuration keys * commit hashes * PR numbers * issue IDs * feature names * error messages * customer or project names already present in the source These are search terms, not conclusions. ## Follow the evidence trail Start with the source closest to the implementation. For code, this usually means: 1. Find the relevant file and symbol. 2. Find commits that changed it. 3. Find the PRs connected to those commits. 4. Read the PR description and discussion. 5. Follow linked issues, tickets, documents, and incidents. 6. Search other connected sources using the concrete names you found. A useful clue should lead to the next source. For example: ```text code -> commit -> PR -> Linear ticket -> design document -> incident ``` Do not search every source using only the broad feature name when a commit, ticket ID, error string, or exact symbol gives you a better query. ## Search the sources that matter Use available connected sources when they can contain part of the answer. ### Source control Look for: * commit messages * PR descriptions * review comments * linked issues * reverted changes * earlier implementations * tests added with the change * comments that name a constraint Source control is often the strongest evidence because it sits close to the change that shipped. ### Issue trackers Look for: * the original problem statement * acceptance criteria * customer requests * scope changes * parent initiatives * bug reports * linked incidents * implementation discussion Tickets often explain the product or business reason better than the code does. ### Long-form documents Look for: * RFCs * ADRs * design docs * PRDs * postmortems * meeting notes * architecture documents These are especially useful for alternatives considered and rejected. ### Team chat When available, look for: * the feature name * PR links * ticket IDs * error messages * discussion near the date of the change * incident channels * conversations involving the authors or reviewers Chat often contains decisions that never made it into the formal record. ### Error and observability data Use these when the target looks like a response to runtime behavior. Examples include: * retries * timeouts * circuit breakers * null guards * rate limits * memory limits * backoff * defensive checks * feature flags Look for errors, incidents, metric changes, or release correlations that line up with the code change. ### Product data Use product analytics when a threshold, rollout, experiment, or user behavior may have shaped the decision. Look for evidence such as: * usage distributions * experiment results * feature adoption * traffic levels * data volumes * rollout dates Do not invent a data-driven rationale just because a number looks deliberate. ## Treat missing evidence as missing evidence A search that finds nothing is useful. Say which source you checked and that it did not contain evidence for the decision. Do not turn an empty search into: "therefore the decision was probably made informally." That is still an inference. The correct answer may be: "We can see when this changed and what it does, but I could not find a recorded reason for choosing this design." That is better than a convincing story with no source behind it. ## Separate fact from inference Keep three levels clear. ### Direct evidence The source explicitly states the reason. Examples: * a PR says the old implementation caused duplicate charges * a ticket says a customer requires a 15 minute grace period * a postmortem says retries caused duplicate writes State these confidently and cite the source. ### Strong inference Several pieces of evidence point to the same conclusion, but nobody states it directly. Say: * "This appears to have been..." * "The evidence suggests..." * "The most likely reason is..." Then explain the evidence. ### Unknown The record does not support an answer. Say so. Do not promote an inference to fact because it sounds sensible. ## Check chronology Dates matter. Build the smallest useful timeline when several sources are involved. For example: ```text 12 May production errors increase 14 May ticket created 16 May PR opened 18 May fix merged 19 May errors stop ``` Chronology can support a conclusion, but correlation alone does not prove intent. A change merging after an incident does not automatically mean the incident caused it. Look for the link in a PR, ticket, comment, or document. ## Look for alternatives When the question asks why X instead of Y, find evidence that Y was actually considered. Do not manufacture rejected alternatives from your own architecture knowledge. Distinguish: * an alternative the team explicitly considered * an alternative that existed in an earlier implementation * an alternative you think would have been possible Only the first two are historical evidence. You may discuss the third as your own analysis, but label it separately. ## Surface contradictions History is messy. A ticket may say one thing while the merged PR does another. A design document may describe an approach that was abandoned during implementation. A comment may claim a workaround is temporary even though it became permanent. When sources disagree, show the disagreement. Do not silently choose the cleaner story. Prefer the source closest to the final decision when judging what actually shipped, but preserve earlier sources when they explain how the decision changed. ## Handle current code carefully The current implementation can tell you: * what exists now * what behavior survived * what assumptions are encoded * what constraints tests enforce It cannot reliably tell you why those choices were originally made. Do not write: "The code uses a queue because the team wanted loose coupling." unless a source says that. The safe version is: "The current design uses a queue between X and Y. I found no source that records why that choice was made." ## For regressions and incidents When investigating a regression, answer a slightly different question. Find: * the last known good behavior * the change that altered it * what that change was trying to achieve * the failure it introduced * when the failure became visible * whether earlier fixes were attempted * whether any fix was reverted * what remains unresolved Keep cause and motivation separate. A PR may have had a valid goal and still introduced the regression. ## For thresholds and constants When investigating a number such as a timeout, limit, grace period, or batch size, search for the number itself as well as the symbol that contains it. Look in: * git history * PR discussion * tickets * documents * incidents * dashboards * analytics If you cannot find where the number came from, say that the value is unexplained. Do not reverse-engineer a neat justification from the number. ## Answer structure Lead with the best-supported answer. For a small question, a few paragraphs may be enough. For a larger investigation, use this shape when it helps. ### What we know State the reason supported by direct evidence. ### Evidence Walk through the important sources in chronological or causal order. Do not dump every search result. ### What changed Explain how the decision evolved when the record shows more than one design. ### Confidence Say whether the conclusion is: * directly documented * strongly supported * plausible but unproven * unknown Explain the gap when confidence is limited. ### Open questions Include only unresolved questions that materially affect the conclusion. ## Citations Cite the source behind claims about intent. Prefer specific references such as: * PR number * issue or ticket ID * commit * document * chat thread * incident * error-tracker issue When ChatGPT can provide a native citation, use it. A reader should be able to trace the important claims back to evidence. ## Writing Apply the `unslop` skill to the final answer. Use plain language. Do not turn the investigation into detective-roleplay. Do not pad weak evidence with confident prose. Do not narrate every search you performed. Give the user the reason, the evidence, the uncertainty, and any contradiction that matters. Reply with the investigation itself, not a report about the workflow.
SHA-256: 4ce746e5eb07110df846053cf044d7901faf1b7e029dca81dc2d654d289950ac