Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/CodySwannGT/lisa --skill lisa-root-cause-analysis명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
This skill should be used for any non-trivial request — features, bugs, stories, epics, spikes, or multi-step tasks. It accepts a ticket URL (Jira, Linear, GitHub), a file path containing a spec, or a plain-text prompt. It assembles an agent team, breaks the work into structured tasks, and manages the full lifecycle from research through implementation, code review, deploy, and empirical verification.
any non-trivial request —…
This skill should be used for any non-trivial request — features, bugs, stories, epics, spikes, or multi-step tasks. It accepts a ticket URL (Jira, Linear, GitHub), a file path containing a spec, or a plain-text prompt. It assembles an agent team, breaks the work into structured tasks, and manages the full lifecycle from research through implementation, code review, deploy, and empirical verification.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | lisa-root-cause-analysis |
| description | Prove what causes a defect… |
Produce a proof, not an explanation. Every link in the chain rests on something observed — a log line, a stack frame, an exit code, a bisect verdict.
The characteristic failure of this work is a fluent wrong answer: a plausible story assembled from reading code and delivered with confidence. Reading is how a hypothesis is formed. Running something is how it is confirmed. Do not report a cause you have not executed against.
A candidate that no observation has killed is still standing, not confirmed. Elimination narrows the field; it does not establish a cause. Closing requires a positive confirmation: an execution whose output is what the cause predicts and would not be what it produces if the cause were something else.
That leaves three honest verdicts, and the output has to be able to say each:
Only confirmed justifies a fix. An inconclusive verdict can still be useful — it narrows the next attempt — but it must be labelled.
Before gathering evidence, list the candidate causes — two or three is normal — and beside each, the observation that would kill it. Then go looking for the killing observations rather than for support.
A candidate you cannot state a disproof for is not a hypothesis; it is a hunch, and it will survive any amount of evidence. Keep the list updated as you work, and ship the eliminated candidates in the output: they are how a reader knows you looked.
| What you know | Reach for |
|---|---|
| It used to work, and a good commit can be named | git bisect — preconditions below |
| A stack trace or error location | Work backward from the throw; read the frames that carry the value, skip the plumbing |
| Only that the result is wrong, no location | Instrument first. Reading code to localize an unlocalized defect is the slowest move available |
| Intermittent | Loop it. Log timestamps and identity either side of async boundaries; look for overlap, staleness, out-of-order completion |
| Works locally, fails deployed | Diff the environments — version, config, data, permissions, network — before touching code |
| Wrong shape, missing field, unexpected null | Log the actual value at each transformation, not the type you expect |
| Possibly a dependency | Pin the exact installed version; read its changelog and issues before blaming local code |
The highest-leverage move available for a regression, and consistently underused: it answers which change in log₂(n) steps instead of log₂(n) hours of reading. It needs three things and wastes time without them.
reproduce-bug usually is one.git bisect start <bad> <good>
git bisect run <cmd> # <cmd> must install/build if the checkout needs it
Read the blamed commit before believing it. Bisect names the change that surfaced the defect, which is not always the change that introduced it.
Look for existing tooling before reaching for a raw CLI: package.json scripts, scripts/*log*, scripts/*tail*, AWS CLI wrappers, log-group names in .env. Project tooling already encodes the credentials, regions, and group names you would otherwise guess at.
Where no wrapper exists:
aws logs describe-log-groups --query 'logGroups[].logGroupName' --output text
aws logs tail "/aws/lambda/<name>" --follow --since 30m
If remote logs are unreachable, name the log group and the time window needed rather than proceeding without them.
Add the fewest statements that decide between live hypotheses, and make each carry values rather than announce arrival. Guard the access — instrumentation that throws while reading its own subject tells you nothing about the defect.
// Useless: proves a line ran.
console.log("here", data);
// Useful: decides a hypothesis, and survives the shape it is investigating.
console.log("[DEBUG:issue-123] processOrder entry", {
orderId: order?.id,
status: order?.status,
itemCount: order?.items?.length ?? null,
});
Highest-yield placements: function entry (called at all, with what), either side of a branch (which way, on what value), either side of an await (timing, staleness), around transformations (where the shape changes), and inside catch blocks (what is being swallowed).
The [DEBUG:<issue>] prefix exists so cleanup is mechanical rather than remembered. Once the verdict is recorded, remove every one — keeping only logging that belongs in the product permanently — and verify across every source root the project has, not just one:
git grep -n "\[DEBUG:"
Declare a budget before starting: a number of instrumentation rounds, or a wall-clock box. Two signatures mean stop now rather than push on.
Stopping is a legitimate outcome and not a silent one. Record the verdict as unresolved / blocked and escalate a decision-ready report: the symptom, the hypotheses tried and how each was killed, the evidence collected, and the single thing that would unblock the work — an access grant, a log group, a reproduction on the real path. A blocked investigation reported clearly is worth more than a confident guess, and costs the next agent far less.
Cause and Fix are required only for a confirmed verdict. For inconclusive or unresolved, record what is known and name the unblocker instead — an unresolved investigation must be representable without inventing a cause to fill the field.
## Root Cause Analysis
**Verdict:** confirmed | inconclusive | unresolved
### Hypotheses
| Candidate | Would be killed by | Status |
|---|---|---|
| ... | the observation that would disprove it | eliminated / standing / confirmed |
### Evidence trail
| Step | Location | Observed | Proves |
|---|---|---|---|
| 1 | file:line | log output, value, exit code | what this establishes |
### Cause — confirmed verdicts only
**Proximate:** file:line — the line that directly produces the symptom.
**Root:** file:line — why that line behaves that way.
**Confirmation:** the command run and its output, and why that output would differ
if the cause were something else. Not an argument.
### Fix — confirmed verdicts only
What changes and why, with file:line references. Anything that must not change.
### Unblocker — inconclusive or unresolved verdicts
The single thing that would let the next attempt proceed, and who can grant it.