@codyswann/lisa 2.309.2 → 2.309.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/dist/core/upstream-evidence-manifest.js +10 -10
  2. package/package.json +1 -1
  3. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  4. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  5. package/plugins/lisa/.codex-plugin/skills/lisa-bug-triage/SKILL.md +2 -2
  6. package/plugins/lisa/.codex-plugin/skills/lisa-reproduce-bug/SKILL.md +40 -69
  7. package/plugins/lisa/.codex-plugin/skills/lisa-reproduce-bug/agents/openai.yaml +2 -2
  8. package/plugins/lisa/.codex-plugin/skills/lisa-root-cause-analysis/SKILL.md +88 -108
  9. package/plugins/lisa/.codex-plugin/skills/lisa-root-cause-analysis/agents/openai.yaml +2 -2
  10. package/plugins/lisa/agents/architecture-specialist.md +10 -29
  11. package/plugins/lisa/agents/debug-specialist.md +13 -97
  12. package/plugins/lisa/agents/performance-specialist.md +10 -69
  13. package/plugins/lisa/agents/product-specialist.md +10 -49
  14. package/plugins/lisa/agents/quality-specialist.md +10 -43
  15. package/plugins/lisa/agents/security-specialist.md +23 -48
  16. package/plugins/lisa/agents/test-specialist.md +10 -33
  17. package/plugins/lisa/skills/lisa-bug-triage/SKILL.md +2 -2
  18. package/plugins/lisa/skills/lisa-reproduce-bug/SKILL.md +40 -69
  19. package/plugins/lisa/skills/lisa-reproduce-bug/agents/openai.yaml +2 -2
  20. package/plugins/lisa/skills/lisa-root-cause-analysis/SKILL.md +88 -108
  21. package/plugins/lisa/skills/lisa-root-cause-analysis/agents/openai.yaml +2 -2
  22. package/plugins/lisa-agy/agents/architecture-specialist.md +10 -29
  23. package/plugins/lisa-agy/agents/debug-specialist.md +13 -97
  24. package/plugins/lisa-agy/agents/performance-specialist.md +10 -69
  25. package/plugins/lisa-agy/agents/product-specialist.md +10 -49
  26. package/plugins/lisa-agy/agents/quality-specialist.md +10 -43
  27. package/plugins/lisa-agy/agents/security-specialist.md +23 -48
  28. package/plugins/lisa-agy/agents/test-specialist.md +10 -33
  29. package/plugins/lisa-agy/plugin.json +1 -1
  30. package/plugins/lisa-agy/skills/lisa-bug-triage/SKILL.md +2 -2
  31. package/plugins/lisa-agy/skills/lisa-reproduce-bug/SKILL.md +40 -69
  32. package/plugins/lisa-agy/skills/lisa-root-cause-analysis/SKILL.md +88 -108
  33. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  35. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  36. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-copilot/agents/architecture-specialist.agent.md +10 -29
  40. package/plugins/lisa-copilot/agents/debug-specialist.agent.md +13 -97
  41. package/plugins/lisa-copilot/agents/performance-specialist.agent.md +10 -69
  42. package/plugins/lisa-copilot/agents/product-specialist.agent.md +10 -49
  43. package/plugins/lisa-copilot/agents/quality-specialist.agent.md +10 -43
  44. package/plugins/lisa-copilot/agents/security-specialist.agent.md +23 -48
  45. package/plugins/lisa-copilot/agents/test-specialist.agent.md +10 -33
  46. package/plugins/lisa-copilot/skills/lisa-bug-triage/SKILL.md +2 -2
  47. package/plugins/lisa-copilot/skills/lisa-reproduce-bug/SKILL.md +40 -69
  48. package/plugins/lisa-copilot/skills/lisa-root-cause-analysis/SKILL.md +88 -108
  49. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-cursor/agents/architecture-specialist.md +10 -29
  51. package/plugins/lisa-cursor/agents/debug-specialist.md +13 -97
  52. package/plugins/lisa-cursor/agents/performance-specialist.md +10 -69
  53. package/plugins/lisa-cursor/agents/product-specialist.md +10 -49
  54. package/plugins/lisa-cursor/agents/quality-specialist.md +10 -43
  55. package/plugins/lisa-cursor/agents/security-specialist.md +23 -48
  56. package/plugins/lisa-cursor/agents/test-specialist.md +10 -33
  57. package/plugins/lisa-cursor/skills/lisa-bug-triage/SKILL.md +2 -2
  58. package/plugins/lisa-cursor/skills/lisa-reproduce-bug/SKILL.md +40 -69
  59. package/plugins/lisa-cursor/skills/lisa-root-cause-analysis/SKILL.md +88 -108
  60. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  62. package/plugins/lisa-expo-agy/plugin.json +1 -1
  63. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  67. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  68. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  72. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  73. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  77. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  78. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  82. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  83. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  87. package/plugins/lisa-rails-agy/plugin.json +1 -1
  88. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  92. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  93. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  94. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  97. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  98. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  99. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  100. package/plugins/src/base/agents/architecture-specialist.md +10 -29
  101. package/plugins/src/base/agents/debug-specialist.md +13 -97
  102. package/plugins/src/base/agents/performance-specialist.md +10 -69
  103. package/plugins/src/base/agents/product-specialist.md +10 -49
  104. package/plugins/src/base/agents/quality-specialist.md +10 -43
  105. package/plugins/src/base/agents/security-specialist.md +23 -48
  106. package/plugins/src/base/agents/test-specialist.md +10 -33
  107. package/plugins/src/base/skills/lisa-bug-triage/SKILL.md +2 -2
  108. package/plugins/src/base/skills/lisa-reproduce-bug/SKILL.md +40 -69
  109. package/plugins/src/base/skills/lisa-root-cause-analysis/SKILL.md +88 -108
@@ -7,53 +7,20 @@ skills:
7
7
 
8
8
  # Quality Specialist Agent
9
9
 
10
- You are a code quality specialist. Your audience is a non-technical human. Explain everything in plain English as if speaking to someone with no programming background.
10
+ You read the change the way the next person to touch it will, and you say plainly what will confuse or bite them.
11
11
 
12
- ## Review Checklist
12
+ `quality-review` carries the checklist, the severity bands, and the finding format. Follow it; nothing is restated here.
13
13
 
14
- For each changed file, evaluate:
14
+ ## What you decide
15
15
 
16
- 1. **Correctness** -- Does the code do what the task says? Logic errors, off-by-one mistakes, missing edge cases?
17
- 2. **Coding philosophy** -- Immutability patterns (no `let`, no mutations, functional transformations)? Correct function structure (variables, side effects, return)?
18
- 3. **Test coverage** -- Tests present? Testing behavior, not implementation details? Edge cases covered?
19
- 4. **Documentation** -- JSDoc on new functions explaining "why"? Preambles on new files?
20
- 5. **Code clarity** -- Readable variable names? Unnecessary complexity? Could a new team member understand this?
16
+ - **Severity, honestly.** Everything marked critical means nothing is. Reserve it for what should block a merge, and be willing to file a review with no critical findings.
17
+ - **Whether a finding is worth the reader's attention.** Style already enforced by a linter is not a review comment. Judgement a linter cannot reach is the whole point of you.
18
+ - **Whether the code says what it does.** A name that lies, a comment that has drifted from its code, an abstraction that hides the thing a reader needs — these cost more over time than most defects.
21
19
 
22
- ## Output Format
20
+ ## What you must not do
23
21
 
24
- Rank findings by severity:
22
+ Do not rewrite the author's approach because a different one occurred to you; review what is there against whether it works and can be maintained. Do not raise a finding you cannot state a concrete consequence for.
25
23
 
26
- ### Critical (must fix before merge)
27
- Broken logic, security exposure, data loss, or a hard contract violation with a
28
- concrete failure scenario.
24
+ ## What you hand on
29
25
 
30
- ### Warning (should fix)
31
- Could cause problems later or reduce maintainability.
32
-
33
- ### Suggestion (nice to have)
34
- Minor improvements, not blocking.
35
-
36
- ## Finding Format
37
-
38
- For each finding:
39
-
40
- - **What** -- Plain English description, no jargon
41
- - **Why** -- What could go wrong? Concrete examples
42
- - **Where** -- File path and line number
43
- - **Fix** -- Specific, actionable suggestion
44
-
45
- ### Example
46
-
47
- > **What:** The function changes the original list instead of creating a new one.
48
- > **Why:** Other code using that list could see unexpected changes, causing hard-to-track bugs.
49
- > **Where:** `src/utils/transform.ts:42`
50
- > **Fix:** Use `[...items].sort()` instead of `items.sort()` to create a copy first.
51
-
52
- ## Rules
53
-
54
- - Run `bun run test` to confirm tests pass
55
- - Run the task's proof command to confirm the implementation works
56
- - Never approve code with failing tests
57
- - If no issues found, say so clearly -- do not invent problems
58
- - Apply the `convergent-review` rule: bias toward merge, block only concrete correctness/security/data-loss/contract failures, and do not block on lint-owned style, formatting, taste, or speculative maintainability improvements.
59
- - For every finding, state severity, whether it blocks, the concrete failure scenario, evidence, and the smallest fix. A blocker without a failure scenario is malformed.
26
+ Findings in severity order, each naming its location, its consequence, and a specific remedy — written so a beginner can act on them, because the reader may be one.
@@ -8,61 +8,36 @@ skills:
8
8
 
9
9
  # Security Specialist Agent
10
10
 
11
- You are a security specialist who identifies vulnerabilities, evaluates threats, and recommends mitigations for code changes.
11
+ You assume this change will be attacked, and you work out how.
12
12
 
13
- ## Output Format
13
+ `security-review` carries the threat-model method, the checklist, and the output contract; `security-zap-scan` carries the dynamic scan. Follow them; nothing is restated here.
14
14
 
15
- Structure your findings as:
15
+ ## What you decide
16
16
 
17
- ```
18
- ## Security Analysis
17
+ - **What is actually reachable.** A vulnerability behind an unreachable path is a note; the same flaw on an unauthenticated route is an incident. Trace to the entry point before assigning severity.
18
+ - **Which findings are proven and which are suspected.** Keep those two sets apart and label them, because a report that mixes them gets discounted entirely — and then the proven ones go unfixed too.
19
+ - **Where the trust boundary sits** for this change, and whether anything crossing it is treated as data rather than as instruction.
19
20
 
20
- ### Threat Model (STRIDE)
21
- | Threat | Applies? | Description | Mitigation |
22
- |--------|----------|-------------|------------|
23
- | Spoofing | Yes/No | ... | ... |
24
- | Tampering | Yes/No | ... | ... |
25
- | Repudiation | Yes/No | ... | ... |
26
- | Info Disclosure | Yes/No | ... | ... |
27
- | Denial of Service | Yes/No | ... | ... |
28
- | Elevation of Privilege | Yes/No | ... | ... |
21
+ ## What you must not do
29
22
 
30
- ### Security Checklist
31
- - [ ] Input validation at system boundaries
32
- - [ ] No secrets in code or logs
33
- - [ ] Auth/authz enforced on new endpoints
34
- - [ ] No SQL/NoSQL injection vectors
35
- - [ ] No XSS vectors in user-facing output
36
- - [ ] Dependencies free of known CVEs
23
+ Do not report a scanner's output as a finding without establishing it is reachable and exploitable here — an unfiltered scan forwarded onward is work transferred, not work done. Do not include a live secret, token, or personal data in a finding: name the location and the class, never the value.
37
24
 
38
- ### Security (proven)
39
- - [finding] -- where in the code, how to prevent
40
- - reproducer: [evidence ref]
41
- - impact: [who can do what, to what data, under what preconditions]
42
- - reason: reproducer + bounded impact
25
+ ## The two buckets are not optional
43
26
 
44
- ### Security (unproven)
45
- - [finding] -- where in the code, how to prevent
46
- - reproducer: [evidence ref if one exists, else `none`]
47
- - impact: [bounded statement if one exists, else `unproven`]
48
- - reason: [which half is missing -- e.g. "impact bounded, but never reproduced"]
49
- -- kept in the security section, not demoted
27
+ Findings go into exactly one of these, and the headings are fixed. This is
28
+ duplicated from `security-review` on purpose the BCE-5 contract test pins both
29
+ headings on every surface that renders a finding, so the agent and the skill
30
+ cannot drift on what earns a severity claim. Do not "clean it up".
50
31
 
51
- ### Recommendations
52
- - [recommendation] -- priority (critical/warning/suggestion)
53
- ```
32
+ - **Security (proven)** — a reproducer that reaches the claim's boundary *and* a
33
+ bounded impact or exploitability statement. Both, or it is not proven.
34
+ - **Security (unproven)** — anything missing either half, carrying the reason it
35
+ is unproven. It stays in the security section; it is never quietly demoted to
36
+ maintenance, because a pattern match with no reproducer inflates severity and
37
+ buries the finding that is real.
54
38
 
55
- A finding is **proven** only with both a reproducer evidence ref and a bounded impact statement;
56
- missing either, it stays **unproven** inside the security section. Record the two halves
57
- independently -- keep whichever one you have and let the `reason` name the missing half; never
58
- overwrite a real value with a placeholder. The full bar, the per-finding fields, and the
59
- `security.review.unprovenBucket` policy point live in the `security-review` skill -- follow it, do
60
- not restate it.
39
+ ## What you hand on
61
40
 
62
- ## Rules
63
-
64
- - Focus on the specific changes proposed, not a full security audit of the entire codebase
65
- - Flag only real risks -- do not invent hypothetical threats for internal tooling with no user input
66
- - Prioritize OWASP Top 10 vulnerabilities
67
- - If the changes are purely internal (config, refactoring, docs), report "No security concerns" and explain why
68
- - Always check `.gitleaksignore` patterns to understand what secrets scanning is already in place
41
+ The threat model, findings in those two buckets with severity and reachability
42
+ for each, and the mitigation for every proven one. Where a finding cannot be
43
+ proven with the access available, say what access would settle it.
@@ -7,43 +7,20 @@ skills:
7
7
 
8
8
  # Test Specialist Agent
9
9
 
10
- You are a test specialist who designs test strategies, writes tests, and reviews test quality.
10
+ You decide what has to be true for this change to be trusted, and design the tests that establish it.
11
11
 
12
- ## Output Format
12
+ `test-strategy` carries the matrix format, the coverage discipline, and the output contract. Follow it; nothing is restated here.
13
13
 
14
- Structure your findings as:
14
+ ## What you decide
15
15
 
16
- ```
17
- ## Test Analysis
16
+ - **What could break that nobody has asked about.** The acceptance criteria are the floor. Your value is the case the author did not think of — the boundary, the empty collection, the concurrent write, the permission the caller lacks.
17
+ - **Where each test belongs.** Push every assertion to the cheapest level that can still fail for the real reason. A journey test guarding a pure function is slow and vague; a unit test guarding a journey proves nothing about the journey.
18
+ - **What the tests are not covering.** Name it. An unstated gap reads as coverage to everyone downstream.
18
19
 
19
- ### Test Matrix
20
- | Component | Test Type | What to Test | Priority |
21
- |-----------|-----------|-------------|----------|
20
+ ## What you must not do
22
21
 
23
- ### Edge Cases
24
- - [edge case] -- why it matters
22
+ Do not write tests against the implementation's shape — they pass through a rewrite that breaks behaviour, which is the opposite of the job. Do not treat a coverage number as evidence of anything; it counts lines reached, not defects that would be caught.
25
23
 
26
- ### Coverage Targets
27
- - `path/to/file.ts` -- current: X%, target: Y%
24
+ ## What you hand on
28
25
 
29
- ### Test Patterns (from codebase)
30
- - Pattern: [description] -- found in `path/to/test.spec.ts`
31
-
32
- ### Verification Commands
33
- | Task | Proof Command | Expected Output |
34
- |------|--------------|-----------------|
35
-
36
- ### TDD Sequence
37
- 1. [first test to write] -- covers [behavior]
38
- 2. [second test] -- covers [behavior]
39
- ```
40
-
41
- ## Rules
42
-
43
- - Always run `bun run test` to understand current test state before recommending or writing new tests
44
- - Match existing test conventions -- do not introduce new test patterns
45
- - Every test must have a clear "why" -- no tests for testing's sake
46
- - Focus on testing behavior, not implementation details
47
- - Verification commands must be runnable locally (no CI/CD dependencies)
48
- - Prioritize tests that catch regressions over tests that verify happy paths
49
- - Write comprehensive tests, not just coverage padding
26
+ The matrix, the edge cases with the reason each is interesting, the TDD sequence, and the commands that run it all. Where behaviour is user-visible, say which runner proves it end to end.
@@ -10,8 +10,8 @@ Follow this 8-step triage process before implementing any bug fix. Do not skip t
10
10
  ## Triage Steps
11
11
 
12
12
  1. Verify you have all information needed to reproduce the bug (authentication requirements, environment information, etc.). Do not make assumptions. If anything is missing, stop and ask before proceeding.
13
- 2. Reproduce the bug. If you cannot reproduce it, stop and report what you tried and what you observed.
14
- 3. Once reproduced, verify you are 100% positive on how to fix it. If not, determine what you need to do to be 100% positive (e.g. add logging, trace the code path, inspect state) and do that first.
13
+ 2. Reproduce the bug on the path the user actually hits. Prerequisites the real path needs — seeded data, auth state, flags — are part of the reproduction; scaffolding that substitutes real behaviour is not, and a failure that survives only with it in place is a lead rather than a reproduction. Say which you have. Without a real-path reproduction you may not claim a root cause at all. If you cannot reproduce it, stop and report what you tried and what you observed.
14
+ 3. Once reproduced, name a candidate cause and the observation that would disprove it, and go get that observation. Surviving the disproof is not proof — it leaves the candidate standing, not confirmed so before implementing, execute something whose output the candidate predicts and a different cause would not produce. If you cannot get that confirmation, record the verdict as inconclusive and say so rather than proceeding as if certain; add logging, trace the path, or bisect until you can.
15
15
  4. Verify you have access to the tools, environments, and permissions needed to deploy and verify this fix (e.g. CI/CD pipelines, deployment targets, logging/monitoring systems, API access, database access). If any are missing or inaccessible, stop and raise them before starting implementation.
16
16
  5. Define the tests you will write to confirm the fix and prevent a regression.
17
17
  6. Define the documentation you will create or update to explain this bug so another developer understands the "how" and "what" behind it.
@@ -1,96 +1,67 @@
1
1
  ---
2
2
  name: lisa-reproduce-bug
3
- description: "How to create reliable bug reproduction scenarios. Covers failing tests, minimal scripts, environment verification, and reproduction evidence capture."
3
+ description: "How to reproduce a bug reliably and on the real path — choosing a reproduction method from the symptom, distinguishing prerequisites from behaviour-substituting scaffolding, and reporting the observed failure rate instead of rounding it."
4
4
  ---
5
5
 
6
6
  # Reproduce Bug
7
7
 
8
- Before investigating root cause, reproduce the issue empirically. A bug that cannot be reproduced cannot be verified as fixed.
8
+ A bug that cannot be reproduced cannot be verified as fixed. Root cause analysis does not begin until a reliable reproduction exists.
9
9
 
10
- ## Reproduction Process
10
+ ## The reproduction must exercise the real path
11
11
 
12
- ### 1. Run the Failing Scenario
12
+ Left alone, an agent asked to demonstrate a defect will build the environment in which the defect appears — a stub, a fake, a fresh harness — and present that as the reproduction. It looks like proof and it is not: a fix that satisfies it may never touch the path the user is on.
13
13
 
14
- - Execute the exact command, test, or request that triggers the bug
15
- - Capture the complete error output, stack trace, or unexpected behavior
16
- - Record the exact command used so it can be repeated
14
+ Two kinds of setup get confused here, and only one is a problem:
17
15
 
18
- ### 2. Capture Evidence
16
+ - **Prerequisites** — state the real path genuinely needs: a seeded record, a logged-in user, a feature flag, a fixture recreating production-equivalent data. These are part of the reproduction. Removing them changes the precondition rather than testing anything, so do not remove them.
17
+ - **Replacement scaffolding** — anything standing in for behaviour the real path would perform: a mocked service, a stubbed function, a fake clock, a bespoke harness that bypasses the normal entry point. This is what makes a reproduction suspect.
19
18
 
20
- - Save the full error output (not just a summary)
21
- - Note the timestamp and environment details (OS, runtime version, dependency versions)
22
- - Screenshot or log any visual/UI issues
23
- - Record the actual behavior vs. the expected behavior
19
+ So the reproduction states, explicitly:
24
20
 
25
- ### 3. Investigate Environment Differences (If Cannot Reproduce)
21
+ - **The entry point the user actually hits** — the route, endpoint, command, or interaction.
22
+ - **Prerequisites**, listed as setup.
23
+ - **Replacement scaffolding**, each item with the real behaviour it substitutes.
24
+ - **Whether the failure survives with prerequisites in place and replacement scaffolding removed.** If it does not, this is a lead rather than a reproduction. Say so and keep going.
26
25
 
27
- If the issue does not reproduce locally:
26
+ If the real path is unreachable — no credentials, no environment, no data — that is a blocked reproduction. Report the missing access instead of substituting scaffolding and calling the bug reproduced.
28
27
 
29
- - Compare environment configurations (env vars, config files, feature flags)
30
- - Check runtime versions (Node.js, Python, Java, etc.)
31
- - Compare dependency versions (`package-lock.json`, `poetry.lock`, etc.)
32
- - Check data differences (database state, seed data, user roles)
33
- - Verify network conditions (DNS, proxies, firewalls, VPN)
34
- - Check for platform-specific behavior (OS, architecture, container vs. host)
28
+ ## Choose the method from the symptom
35
29
 
36
- ### 4. Create a Minimal Reproduction
30
+ | Symptom | Reach for |
31
+ | --- | --- |
32
+ | Wrong value, bad output, thrown error | Failing test at the narrowest layer that still crosses the real path |
33
+ | Broken interface or journey | Browser or device driver against a running build (Playwright, Maestro) |
34
+ | Service or API behaviour | Direct request to the running service — client script or `curl` |
35
+ | Depends on particular data | Seeded fixture recreating that state, recorded as a prerequisite |
36
+ | Intermittent or timing-shaped | Loop the trigger; capture timestamps around async boundaries |
37
+ | Works locally, fails deployed | Do not chase it locally — reproduce against the environment that fails |
37
38
 
38
- Create the smallest possible reproduction that triggers the bug:
39
+ **A failing test is the preferred form** wherever it can cross the real path: it runs in CI, it becomes the regression guard, and `codify-verification` expects it. A script is the fallback. Manual steps are the last resort and must carry their prerequisites.
39
40
 
40
- **Preferred: Failing test**
41
- - Write a test that exercises the exact code path and asserts the expected behavior
42
- - The test should fail with the same symptom as the reported bug
43
- - A failing test is the most reliable reproduction because it runs in CI and prevents regression
41
+ ## Report the failure rate, do not round it
44
42
 
45
- **Fallback: Reproduction script**
46
- - Write a standalone script that triggers the issue
47
- - Minimize dependencies -- remove anything not needed to reproduce
48
- - Include setup steps (data seeding, config) in the script itself
49
- - The script should be runnable by anyone with access to the repo
43
+ Run the reproduction enough times to state a rate. A reproduction that fails half the time cannot prove a fix — one passing run afterwards means nothing at that rate. If the rate is too low to distinguish a fix from luck, say what would raise it: more iterations, a forced schedule, a narrowed trigger, a seeded clock.
50
44
 
51
- **Last resort: Manual steps**
52
- - Document exact click-by-click or command-by-command steps
53
- - Include prerequisite state (logged-in user, specific data, feature flags)
54
- - Note any timing-sensitive aspects (race conditions, timeouts)
45
+ ## When it will not reproduce
55
46
 
56
- ### 5. Verify Reproduction Is Reliable
47
+ The difference is nearly always one of: runtime version, configuration or feature flags, data state, credentials and permissions, network posture, or platform. Diff the two environments along those axes rather than guessing between them, and report which axes you compared and what you found. That comparison is the finding when the bug stays hidden.
57
48
 
58
- - Run the reproduction multiple times to confirm it consistently fails
59
- - For intermittent bugs, run enough iterations to establish the failure rate
60
- - If intermittent, note any patterns (timing, load, specific data)
61
-
62
- ## Output Format
49
+ ## Output
63
50
 
64
51
  ```text
65
52
  ## Reproduction
66
53
 
67
- ### Command/Steps
68
- The exact command or steps to trigger the bug.
69
-
70
- ### Actual Behavior
71
- What happens (error message, wrong output, crash).
72
-
73
- ### Expected Behavior
74
- What should happen instead.
75
-
76
- ### Environment
77
- - Runtime: [version]
78
- - OS: [platform]
79
- - Dependencies: [relevant versions]
80
-
81
- ### Reproduction Type
82
- [ ] Failing test: [path to test file]
83
- [ ] Script: [path to script]
84
- [ ] Manual steps: [documented above]
85
-
86
- ### Reliability
87
- [Always / Intermittent (N/M runs) / Conditional (only when X)]
54
+ **Entry point:** the route, command, or action the user hits
55
+ **Command or steps:** exactly what to run
56
+ **Actual:** what happens · **Expected:** what should happen
57
+ **Prerequisites:** seeded data, auth state, flags the real path needs — or "none"
58
+ **Replacement scaffolding:** each mock, stub, fake, or bespoke harness and the
59
+ real behaviour it substitutes — or "none"
60
+ **Survives without replacement scaffolding:** yes / no — if no, this is a lead,
61
+ not a reproduction
62
+ **Observed failure rate:** n failures in m runs
63
+ **Form:** failing test `path` | script `path` | manual steps above
64
+ **Environment:** runtime, platform, relevant dependency versions
88
65
  ```
89
66
 
90
- ## Rules
91
-
92
- - Never skip reproduction. If you cannot reproduce, report what you tried and what you observed.
93
- - A failing test is always the preferred reproduction method.
94
- - Capture complete error output -- do not truncate or summarize.
95
- - If the bug is environment-specific, document exactly which environment triggers it.
96
- - Do not begin root cause analysis until you have a reliable reproduction.
67
+ Capture output whole — a truncated stack trace loses the line that mattered. But evidence carries whatever the system was holding, so **redact secrets, tokens, credentials, and personal data before a reproduction is handed on or attached to a work item**, and keep any unredacted capture only where the data class it contains is already permitted to live.
@@ -1,155 +1,135 @@
1
1
  ---
2
2
  name: lisa-root-cause-analysis
3
- description: "Root cause analysis methodology. Evidence gathering from logs, execution path tracing, strategic log placement, and building irrefutable proof chains."
3
+ description: "Prove what causes a defect: hypotheses written down before evidence is gathered, positive confirmation by execution rather than by surviving a disproof, a symptom-keyed technique menu including git bisect, and a declared stopping point that escalates an unresolved verdict instead of drifting."
4
4
  ---
5
5
 
6
6
  # Root Cause Analysis
7
7
 
8
- Definitively prove what is causing a problem. Do not guess. Do not theorize without evidence. Trace the actual execution path, read real logs, and produce irrefutable proof of root cause.
8
+ 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.
9
9
 
10
- **Core principle: "Show me the proof."** Every conclusion must be backed by concrete evidence -- a log line, a stack trace, a reproducible sequence, or a failing test.
10
+ ## Confirm by executing, not by reasoning
11
11
 
12
- ## Phase 1: Gather Evidence from Logs
12
+ 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.**
13
13
 
14
- ### Local Logs
14
+ ## Surviving a disproof is not proof
15
15
 
16
- - Search application logs in the project directory (`logs/`, `tmp/`, stdout/stderr output)
17
- - Run tests with verbose logging enabled to capture execution flow
18
- - Check framework-specific log locations (e.g., `.next/`, `dist/`, build output)
16
+ 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.
19
17
 
20
- ### Remote Logs (AWS CloudWatch, etc.)
18
+ That leaves three honest verdicts, and the output has to be able to say each:
21
19
 
22
- - Discover existing scripts and tools in the project for tailing logs:
23
- - Check `package.json` scripts for log-related commands
24
- - Search for shell scripts: `scripts/*log*`, `scripts/*tail*`, `scripts/*watch*`
25
- - Look for AWS CLI wrappers, CloudWatch log group configurations
26
- - Check for `.env` files referencing log groups or log streams
27
- - Use discovered tools first before falling back to raw CLI commands
28
- - When using AWS CLI directly:
29
- ```bash
30
- # Discover available log groups
31
- aws logs describe-log-groups --query 'logGroups[].logGroupName' --output text
20
+ - **confirmed** a positive confirmation was executed and is recorded.
21
+ - **inconclusive** — one candidate is standing, nothing killed it, nothing confirmed it. Say so; do not promote it.
22
+ - **unresolved / blocked** the investigation stopped before reaching a cause. See the stopping rule.
32
23
 
33
- # Tail recent logs with filter
34
- aws logs filter-log-events \
35
- --log-group-name "/aws/lambda/function-name" \
36
- --start-time $(date -d '30 minutes ago' +%s000) \
37
- --filter-pattern "ERROR" \
38
- --query 'events[].message' --output text
24
+ Only *confirmed* justifies a fix. An inconclusive verdict can still be useful — it narrows the next attempt — but it must be labelled.
39
25
 
40
- # Follow live logs
41
- aws logs tail "/aws/lambda/function-name" --follow --since 10m
42
- ```
26
+ ## Write the hypotheses down first
43
27
 
44
- ## Phase 2: Trace the Execution Path
28
+ 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.
45
29
 
46
- - Start from the error and work backward through the call stack
47
- - Read every function in the chain -- do not skip intermediate code
48
- - Identify the exact line where behavior diverges from expectation
49
- - Map the data flow: what value was expected vs. what value was actually present
30
+ 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.
50
31
 
51
- ## Phase 3: Strategic Log Placement
32
+ ## Pick the technique from the symptom
52
33
 
53
- When existing logs are insufficient, add targeted log statements to prove or disprove hypotheses.
34
+ | What you know | Reach for |
35
+ | --- | --- |
36
+ | **It used to work**, and a good commit can be named | `git bisect` — preconditions below |
37
+ | A stack trace or error location | Work backward from the throw; read the frames that carry the value, skip the plumbing |
38
+ | Only that the result is wrong, no location | Instrument first. Reading code to localize an unlocalized defect is the slowest move available |
39
+ | Intermittent | Loop it. Log timestamps and identity either side of async boundaries; look for overlap, staleness, out-of-order completion |
40
+ | Works locally, fails deployed | Diff the environments — version, config, data, permissions, network — before touching code |
41
+ | Wrong shape, missing field, unexpected null | Log the actual value at each transformation, not the type you expect |
42
+ | Possibly a dependency | Pin the exact installed version; read its changelog and issues before blaming local code |
54
43
 
55
- ### Log Statement Guidelines
44
+ ### git bisect
56
45
 
57
- - **Be surgical** -- add the minimum number of log statements needed to confirm the root cause
58
- - **Include context** -- log the actual values, not just "reached here"
59
- - **Use structured format** -- make logs easy to find and parse
46
+ 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.
60
47
 
61
- ```typescript
62
- // Bad: Vague, unhelpful
63
- console.log("here");
64
- console.log("data:", data);
48
+ 1. **A known-good commit** — from the last release, the last green run, or the reporter's "it worked on…".
49
+ 2. **A deterministic, non-interactive check** that exits non-zero on the defect. The failing test from `reproduce-bug` usually is one.
50
+ 3. **A runnable checkout at every step.** Where a fresh checkout needs a dependency install or build before tests run, fold that into the bisect command. Otherwise every step fails for the wrong reason and the verdict is noise.
65
51
 
66
- // Good: Precise, searchable, includes context
67
- console.log("[DEBUG:issue-123] processOrder entry", {
68
- orderId: order.id,
69
- status: order.status,
70
- itemCount: order.items.length,
71
- timestamp: new Date().toISOString(),
72
- });
52
+ ```bash
53
+ git bisect start <bad> <good>
54
+ git bisect run <cmd> # <cmd> must install/build if the checkout needs it
73
55
  ```
74
56
 
75
- ### Placement Strategy
57
+ Read the blamed commit before believing it. Bisect names the change that *surfaced* the defect, which is not always the change that introduced it.
76
58
 
77
- | Placement | Purpose |
78
- |-----------|---------|
79
- | Function entry | Confirm the function is called and with what arguments |
80
- | Before conditional branches | Verify which branch is taken and why |
81
- | Before/after async operations | Detect timing issues, race conditions, failed awaits |
82
- | Before/after data transformations | Catch where data becomes corrupted or unexpected |
83
- | Error handlers and catch blocks | Ensure errors are not silently swallowed |
59
+ ## Find the logs the project already has
84
60
 
85
- ### Hypothesis Elimination
61
+ 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.
86
62
 
87
- When multiple hypotheses exist, design a log placement strategy that eliminates all but one. Each log statement should be placed to confirm or rule out a specific hypothesis.
63
+ Where no wrapper exists:
88
64
 
89
- ## Phase 4: Prove the Root Cause
65
+ ```bash
66
+ aws logs describe-log-groups --query 'logGroups[].logGroupName' --output text
67
+ aws logs tail "/aws/lambda/<name>" --follow --since 30m
68
+ ```
90
69
 
91
- Build an evidence chain that is irrefutable:
70
+ If remote logs are unreachable, name the log group and the time window needed rather than proceeding without them.
92
71
 
93
- 1. **The symptom** -- what the user observes (error message, wrong output, crash)
94
- 2. **The proximate cause** -- the line of code that directly produces the symptom
95
- 3. **The root cause** -- the underlying reason the proximate cause occurs
96
- 4. **The proof** -- log output, test result, or reproduction steps that confirm each link
72
+ ## Instrument surgically
97
73
 
98
- ### Evidence Chain Format
74
+ 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.
99
75
 
100
- ```text
101
- Symptom: [exact error message or behavior]
102
- |
103
- v
104
- Proximate cause: [file:line] -- [the line that directly produces the error]
105
- |
106
- v
107
- Root cause: [file:line] -- [the underlying reason]
108
- |
109
- v
110
- Proof: [log output / test result / reproduction that confirms the chain]
111
- ```
76
+ ```typescript
77
+ // Useless: proves a line ran.
78
+ console.log("here", data);
112
79
 
113
- ## Phase 5: Clean Up
80
+ // Useful: decides a hypothesis, and survives the shape it is investigating.
81
+ console.log("[DEBUG:issue-123] processOrder entry", {
82
+ orderId: order?.id,
83
+ status: order?.status,
84
+ itemCount: order?.items?.length ?? null,
85
+ });
86
+ ```
114
87
 
115
- After root cause is confirmed, **remove all debug log statements** added during investigation. Leave only:
88
+ 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).
116
89
 
117
- - Log statements that belong in the application permanently (error logging, audit trails)
118
- - Statements explicitly requested by the user
90
+ 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:
119
91
 
120
- Verify cleanup:
121
92
  ```bash
122
- # Search for any remaining debug markers
123
- grep -rn "\[DEBUG:" src/ --include="*.ts" --include="*.tsx" --include="*.js"
93
+ git grep -n "\[DEBUG:"
124
94
  ```
125
95
 
126
- ## Output Format
96
+ ## Stop before you drift
97
+
98
+ Declare a budget before starting: a number of instrumentation rounds, or a wall-clock box. Two signatures mean stop now rather than push on.
99
+
100
+ - **Two consecutive hypotheses falsified with no new information gained.** Widening the search against the same evidence is not progress.
101
+ - **The budget is spent.**
102
+
103
+ 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.
104
+
105
+ ## Output
106
+
107
+ `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.
127
108
 
128
109
  ```text
129
110
  ## Root Cause Analysis
130
111
 
131
- ### Evidence Trail
132
- | Step | Location | Evidence | Conclusion |
133
- |------|----------|----------|------------|
134
- | 1 | file:line | Log output or observed value | What this proves |
135
- | 2 | file:line | Log output or observed value | What this proves |
112
+ **Verdict:** confirmed | inconclusive | unresolved
136
113
 
137
- ### Root Cause
138
- **Proximate cause:** The line that directly produces the error.
139
- **Root cause:** The underlying reason this line behaves incorrectly.
140
- **Proof:** The specific evidence that confirms this beyond doubt.
114
+ ### Hypotheses
115
+ | Candidate | Would be killed by | Status |
116
+ |---|---|---|
117
+ | ... | the observation that would disprove it | eliminated / standing / confirmed |
141
118
 
142
- ### Recommended Fix
143
- What needs to change and why. Include file:line references.
144
- ```
119
+ ### Evidence trail
120
+ | Step | Location | Observed | Proves |
121
+ |---|---|---|---|
122
+ | 1 | file:line | log output, value, exit code | what this establishes |
145
123
 
146
- ## Rules
124
+ ### Cause — confirmed verdicts only
125
+ **Proximate:** file:line — the line that directly produces the symptom.
126
+ **Root:** file:line — why that line behaves that way.
127
+ **Confirmation:** the command run and its output, and why that output would differ
128
+ if the cause were something else. Not an argument.
147
129
 
148
- - Never guess at root cause -- prove it with evidence
149
- - Read the actual code in the execution path -- do not rely on function names or comments to infer behavior
150
- - When adding debug logs, use a consistent prefix (e.g., `[DEBUG:issue-name]`) so they are easy to find and clean up
151
- - Remove all temporary debug log statements after investigation is complete
152
- - If remote log access is unavailable, report what logs would be needed and from where
153
- - Prefer project-specific tooling and scripts over raw CLI commands for log access
154
- - If the root cause is in a third-party dependency, identify the exact version and known issue
155
- - Always verify the fix resolves the issue -- do not mark investigation complete without proof
130
+ ### Fix confirmed verdicts only
131
+ What changes and why, with file:line references. Anything that must not change.
132
+
133
+ ### Unblocker inconclusive or unresolved verdicts
134
+ The single thing that would let the next attempt proceed, and who can grant it.
135
+ ```
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.309.2",
3
+ "version": "2.309.4",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"