@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.
- package/dist/core/upstream-evidence-manifest.js +10 -10
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-bug-triage/SKILL.md +2 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-reproduce-bug/SKILL.md +40 -69
- package/plugins/lisa/.codex-plugin/skills/lisa-reproduce-bug/agents/openai.yaml +2 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-root-cause-analysis/SKILL.md +88 -108
- package/plugins/lisa/.codex-plugin/skills/lisa-root-cause-analysis/agents/openai.yaml +2 -2
- package/plugins/lisa/agents/architecture-specialist.md +10 -29
- package/plugins/lisa/agents/debug-specialist.md +13 -97
- package/plugins/lisa/agents/performance-specialist.md +10 -69
- package/plugins/lisa/agents/product-specialist.md +10 -49
- package/plugins/lisa/agents/quality-specialist.md +10 -43
- package/plugins/lisa/agents/security-specialist.md +23 -48
- package/plugins/lisa/agents/test-specialist.md +10 -33
- package/plugins/lisa/skills/lisa-bug-triage/SKILL.md +2 -2
- package/plugins/lisa/skills/lisa-reproduce-bug/SKILL.md +40 -69
- package/plugins/lisa/skills/lisa-reproduce-bug/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/lisa-root-cause-analysis/SKILL.md +88 -108
- package/plugins/lisa/skills/lisa-root-cause-analysis/agents/openai.yaml +2 -2
- package/plugins/lisa-agy/agents/architecture-specialist.md +10 -29
- package/plugins/lisa-agy/agents/debug-specialist.md +13 -97
- package/plugins/lisa-agy/agents/performance-specialist.md +10 -69
- package/plugins/lisa-agy/agents/product-specialist.md +10 -49
- package/plugins/lisa-agy/agents/quality-specialist.md +10 -43
- package/plugins/lisa-agy/agents/security-specialist.md +23 -48
- package/plugins/lisa-agy/agents/test-specialist.md +10 -33
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-bug-triage/SKILL.md +2 -2
- package/plugins/lisa-agy/skills/lisa-reproduce-bug/SKILL.md +40 -69
- package/plugins/lisa-agy/skills/lisa-root-cause-analysis/SKILL.md +88 -108
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/agents/architecture-specialist.agent.md +10 -29
- package/plugins/lisa-copilot/agents/debug-specialist.agent.md +13 -97
- package/plugins/lisa-copilot/agents/performance-specialist.agent.md +10 -69
- package/plugins/lisa-copilot/agents/product-specialist.agent.md +10 -49
- package/plugins/lisa-copilot/agents/quality-specialist.agent.md +10 -43
- package/plugins/lisa-copilot/agents/security-specialist.agent.md +23 -48
- package/plugins/lisa-copilot/agents/test-specialist.agent.md +10 -33
- package/plugins/lisa-copilot/skills/lisa-bug-triage/SKILL.md +2 -2
- package/plugins/lisa-copilot/skills/lisa-reproduce-bug/SKILL.md +40 -69
- package/plugins/lisa-copilot/skills/lisa-root-cause-analysis/SKILL.md +88 -108
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/agents/architecture-specialist.md +10 -29
- package/plugins/lisa-cursor/agents/debug-specialist.md +13 -97
- package/plugins/lisa-cursor/agents/performance-specialist.md +10 -69
- package/plugins/lisa-cursor/agents/product-specialist.md +10 -49
- package/plugins/lisa-cursor/agents/quality-specialist.md +10 -43
- package/plugins/lisa-cursor/agents/security-specialist.md +23 -48
- package/plugins/lisa-cursor/agents/test-specialist.md +10 -33
- package/plugins/lisa-cursor/skills/lisa-bug-triage/SKILL.md +2 -2
- package/plugins/lisa-cursor/skills/lisa-reproduce-bug/SKILL.md +40 -69
- package/plugins/lisa-cursor/skills/lisa-root-cause-analysis/SKILL.md +88 -108
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/architecture-specialist.md +10 -29
- package/plugins/src/base/agents/debug-specialist.md +13 -97
- package/plugins/src/base/agents/performance-specialist.md +10 -69
- package/plugins/src/base/agents/product-specialist.md +10 -49
- package/plugins/src/base/agents/quality-specialist.md +10 -43
- package/plugins/src/base/agents/security-specialist.md +23 -48
- package/plugins/src/base/agents/test-specialist.md +10 -33
- package/plugins/src/base/skills/lisa-bug-triage/SKILL.md +2 -2
- package/plugins/src/base/skills/lisa-reproduce-bug/SKILL.md +40 -69
- package/plugins/src/base/skills/lisa-root-cause-analysis/SKILL.md +88 -108
|
@@ -187,11 +187,11 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
187
187
|
"phaser/merge/.claude/settings.json": "296b8d5e3c197cd4526a99454aee1dc7f5ce9a25a729a957f392b71be3e8cfb6",
|
|
188
188
|
"phaser/merge/.oxlintrc.json": "4ac4bca00bef4b32810f3759a914ab2b8148e6fad3e329417a497e36df9e810c",
|
|
189
189
|
"phaser/package-lisa/package.lisa.json": "2e01b1ec402f6804a54402e22d02d63f1aa96d3f698e171885b0fff6eb25b271",
|
|
190
|
-
"plugins/src/base/agents/architecture-specialist.md": "
|
|
190
|
+
"plugins/src/base/agents/architecture-specialist.md": "076feb3a09ef056628bc33242f93278ce6b00f55878984a18a9337d326b5e1d4",
|
|
191
191
|
"plugins/src/base/agents/bug-fixer.md": "e01e5d3678e464385105c9abf90e4b70ae262fd856f1e86b2ebe443dae9e17b1",
|
|
192
192
|
"plugins/src/base/agents/builder.md": "75900b28a384539bba8c54f3c7b2a6ed83786e502093822ed308d324f0461c01",
|
|
193
193
|
"plugins/src/base/agents/confluence-prd-intake.md": "735df81802464abe79fa0f3878ad66dc13a8bf8a8420da28f31392c6e1e3693c",
|
|
194
|
-
"plugins/src/base/agents/debug-specialist.md": "
|
|
194
|
+
"plugins/src/base/agents/debug-specialist.md": "88266c25e03a3dbc110b6da8b6a5f7e47a5c3ba7d3b74b9c5a6fe613768df362",
|
|
195
195
|
"plugins/src/base/agents/git-history-analyzer.md": "8c2b6ae31cec858647675b24425b8148d3f33f3145f5d423336c87bdd9266f78",
|
|
196
196
|
"plugins/src/base/agents/github-agent.md": "05454419d3ea18dbbf45e45e0ca5782a6925c97816c6705eead9fcf597d776bc",
|
|
197
197
|
"plugins/src/base/agents/github-build-intake.md": "5d948d04d39f864bae354c18f56735282e3f37127356e4942f57a10e99c09456",
|
|
@@ -205,14 +205,14 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
205
205
|
"plugins/src/base/agents/linear-build-intake.md": "280c0ba1ba359572f28759bd40870a08052b6495342971ae152614c8147ad036",
|
|
206
206
|
"plugins/src/base/agents/linear-prd-intake.md": "28c4ee9f2ebbb4f089dd54bb4633063b48ea8099327a0bf2923825d83c3fe07c",
|
|
207
207
|
"plugins/src/base/agents/notion-prd-intake.md": "53df0fba395b10b17bafe1a82c8c2706e4ec029d2aee8f3a2e7d5afe38d9be98",
|
|
208
|
-
"plugins/src/base/agents/performance-specialist.md": "
|
|
208
|
+
"plugins/src/base/agents/performance-specialist.md": "39c088eaf9347410988a82310e3a151034cbac28a756b1c7b28bb4c1c32a6a5d",
|
|
209
209
|
"plugins/src/base/agents/pr-mining-specialist.md": "2bf5b933b43ddfbcc9c67f9b98bd68bc6c99ab0c47dca96dcd9e340960df8e55",
|
|
210
|
-
"plugins/src/base/agents/product-specialist.md": "
|
|
211
|
-
"plugins/src/base/agents/quality-specialist.md": "
|
|
212
|
-
"plugins/src/base/agents/security-specialist.md": "
|
|
210
|
+
"plugins/src/base/agents/product-specialist.md": "c04cb5abdb077040bfc1a22c142841712473500bd6537853e40c94de25abf94c",
|
|
211
|
+
"plugins/src/base/agents/quality-specialist.md": "e923aec97457390c6c9c529137a81563a6f452a7d6791ab56b97e40b6e85f039",
|
|
212
|
+
"plugins/src/base/agents/security-specialist.md": "0952dee7bf1c04f978b0f8125a91425bf639e9b645de1a4b05ad945b9041bea7",
|
|
213
213
|
"plugins/src/base/agents/skill-evaluator.md": "83af6324ed0ee0cd5c4132429e137649c3fd616ef6fa5d4bd95579438d401894",
|
|
214
214
|
"plugins/src/base/agents/spec-conformance-specialist.md": "f589e4d543a617d3c421aa28d6583e1b25e0b18fc83412e6d544a389bdac225c",
|
|
215
|
-
"plugins/src/base/agents/test-specialist.md": "
|
|
215
|
+
"plugins/src/base/agents/test-specialist.md": "8f439c725863df84532504a57f64b9e4918acaa242de8c01cb6692553495dbd2",
|
|
216
216
|
"plugins/src/base/agents/tracker-mining-specialist.md": "fef49c3ca8622c83a54d34b3f960471e0f2ad50e6889f691585b0f208180f6bd",
|
|
217
217
|
"plugins/src/base/agents/verification-specialist.md": "32d8a660ba486279fdbb6d0c6665bee36a9703e0cb05e1ab0629b82bc26ebd04",
|
|
218
218
|
"plugins/src/base/commands/agent-ready.md": "b1bc19c90330b9885b44f733e83cc6b44afa9b5e9fd2e9aba99995480e0829e1",
|
|
@@ -398,7 +398,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
398
398
|
"plugins/src/base/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs": "538e5a3d91482b9e2a055e133b7c1fcf809be51d4ae72a10776aaeeb8df4832a",
|
|
399
399
|
"plugins/src/base/skills/lisa-attribute-failure/SKILL.md": "5d737b9fda916f02aaf13b208316cd54995d83aa06d27ba5daa19b6ebed6b4d9",
|
|
400
400
|
"plugins/src/base/skills/lisa-automation-status/SKILL.md": "a283afab506d8e52970c6df566b4504a2ed015493cee4de6debe5b62a09782eb",
|
|
401
|
-
"plugins/src/base/skills/lisa-bug-triage/SKILL.md": "
|
|
401
|
+
"plugins/src/base/skills/lisa-bug-triage/SKILL.md": "bd5bae508a8f344d8b5cb46cfddcb178ff8368ca77936f9e2c63058e05f61af4",
|
|
402
402
|
"plugins/src/base/skills/lisa-codebase-research/SKILL.md": "77dbc2d7e86e5027df486294de315bb539a2ece84bd4b38e47ccc108f8c2875e",
|
|
403
403
|
"plugins/src/base/skills/lisa-codify-verification/SKILL.md": "45cf7e74697fcc0b8769b31c674dbf0b18e19eb1ceab6a77f608b568512def15",
|
|
404
404
|
"plugins/src/base/skills/lisa-confluence-prd-intake/SKILL.md": "a6a099abeb32940d44da7e9a6a62c3519f64efa85294c4b996789fa4fba97461",
|
|
@@ -514,12 +514,12 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
514
514
|
"plugins/src/base/skills/lisa-quality-review/SKILL.md": "17ba45f4c4b7877c0b0c9a3c1cc1cb9e18c642ead74ff7263698d8034d3241da",
|
|
515
515
|
"plugins/src/base/skills/lisa-queue-status/SKILL.md": "87c6d34d0511d4afd812d1af3fee80fa3b7aa47db8449760b12f2699fedc1d78",
|
|
516
516
|
"plugins/src/base/skills/lisa-repair-intake/SKILL.md": "4f85ac1381631e9f250d9cf3239baba633ae0df9ba1959f8835ed662592e2d77",
|
|
517
|
-
"plugins/src/base/skills/lisa-reproduce-bug/SKILL.md": "
|
|
517
|
+
"plugins/src/base/skills/lisa-reproduce-bug/SKILL.md": "4d460993fac6021219ca23eee29b1b9afa7c37479dddc662b2fcfaca510edd68",
|
|
518
518
|
"plugins/src/base/skills/lisa-research/SKILL.md": "19de7c5910b117c4b3b1bb7ae42cf9c8b6ff2a376b2e21961526bc7ebde18e85",
|
|
519
519
|
"plugins/src/base/skills/lisa-review-implementation/SKILL.md": "42134253cca50e384f36eaa085c0a1e6b8772e9f3e912a8d1231f1cd69199858",
|
|
520
520
|
"plugins/src/base/skills/lisa-review-local/SKILL.md": "66defe83565ab3633a13e69ce394de64f17f2c2bddbf046bc12c8bbd0ca57f5c",
|
|
521
521
|
"plugins/src/base/skills/lisa-rework-triage/SKILL.md": "3389740fc0f162be0b684625424e716a0a3e4c99c8cdb4317ec82dcfcf7b57c7",
|
|
522
|
-
"plugins/src/base/skills/lisa-root-cause-analysis/SKILL.md": "
|
|
522
|
+
"plugins/src/base/skills/lisa-root-cause-analysis/SKILL.md": "3fa14217ca36b238ebb8203d18f10eaaf98a3647f949cdada6cb9f56ddf9ed50",
|
|
523
523
|
"plugins/src/base/skills/lisa-security-review/SKILL.md": "5a980eaf5efc4fcce66e75521ec5b1eda143a5b0d36e7157234a705dac94e3f5",
|
|
524
524
|
"plugins/src/base/skills/lisa-security-zap-scan/SKILL.md": "a5189442dbf970cc49fd089ab03c386c8a205b856e09501f6ad1966321e7e4b5",
|
|
525
525
|
"plugins/src/base/skills/lisa-sentry-access/SKILL.md": "ecaf49b42bbf399781a3ebd0b1595e5a8ac44422537832e0442b2f184da0c83c",
|
package/package.json
CHANGED
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
"brace-expansion": ">=5.0.8"
|
|
116
116
|
},
|
|
117
117
|
"name": "@codyswann/lisa",
|
|
118
|
-
"version": "2.309.
|
|
118
|
+
"version": "2.309.4",
|
|
119
119
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
120
120
|
"main": "dist/index.js",
|
|
121
121
|
"exports": {
|
|
@@ -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,
|
|
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
|
|
3
|
+
description: "How to reproduce a bug reliably…"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Reproduce Bug
|
|
7
7
|
|
|
8
|
-
|
|
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
|
-
##
|
|
10
|
+
## The reproduction must exercise the real path
|
|
11
11
|
|
|
12
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
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,4 +1,4 @@
|
|
|
1
1
|
display_name: "Reproduce Bug"
|
|
2
|
-
short_description: "How to
|
|
2
|
+
short_description: "How to reproduce a bug reliably…"
|
|
3
3
|
default_prompt:
|
|
4
|
-
- "Use $lisa-reproduce-bug: How to
|
|
4
|
+
- "Use $lisa-reproduce-bug: How to reproduce a bug reliably…."
|
|
@@ -1,155 +1,135 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: lisa-root-cause-analysis
|
|
3
|
-
description: "
|
|
3
|
+
description: "Prove what causes a defect…"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Root Cause Analysis
|
|
7
7
|
|
|
8
|
-
|
|
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
|
-
|
|
10
|
+
## Confirm by executing, not by reasoning
|
|
11
11
|
|
|
12
|
-
|
|
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
|
-
|
|
14
|
+
## Surviving a disproof is not proof
|
|
15
15
|
|
|
16
|
-
|
|
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
|
-
|
|
18
|
+
That leaves three honest verdicts, and the output has to be able to say each:
|
|
21
19
|
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
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
|
-
|
|
41
|
-
aws logs tail "/aws/lambda/function-name" --follow --since 10m
|
|
42
|
-
```
|
|
26
|
+
## Write the hypotheses down first
|
|
43
27
|
|
|
44
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
32
|
+
## Pick the technique from the symptom
|
|
52
33
|
|
|
53
|
-
|
|
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
|
-
###
|
|
44
|
+
### git bisect
|
|
56
45
|
|
|
57
|
-
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
63
|
+
Where no wrapper exists:
|
|
88
64
|
|
|
89
|
-
|
|
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
|
-
|
|
70
|
+
If remote logs are unreachable, name the log group and the time window needed rather than proceeding without them.
|
|
92
71
|
|
|
93
|
-
|
|
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
|
-
|
|
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
|
-
```
|
|
101
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
123
|
-
grep -rn "\[DEBUG:" src/ --include="*.ts" --include="*.tsx" --include="*.js"
|
|
93
|
+
git grep -n "\[DEBUG:"
|
|
124
94
|
```
|
|
125
95
|
|
|
126
|
-
##
|
|
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
|
-
|
|
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
|
-
###
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
114
|
+
### Hypotheses
|
|
115
|
+
| Candidate | Would be killed by | Status |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| ... | the observation that would disprove it | eliminated / standing / confirmed |
|
|
141
118
|
|
|
142
|
-
###
|
|
143
|
-
|
|
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
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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,4 +1,4 @@
|
|
|
1
1
|
display_name: "Root Cause Analysis"
|
|
2
|
-
short_description: "
|
|
2
|
+
short_description: "Prove what causes a defect…"
|
|
3
3
|
default_prompt:
|
|
4
|
-
- "Use $lisa-root-cause-analysis:
|
|
4
|
+
- "Use $lisa-root-cause-analysis: Prove what causes a defect…."
|
|
@@ -9,39 +9,20 @@ skills:
|
|
|
9
9
|
|
|
10
10
|
# Architecture Specialist Agent
|
|
11
11
|
|
|
12
|
-
You
|
|
12
|
+
You work out how this change should be built before anyone writes it, and you say what it will disturb.
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
`codebase-research` carries the investigation method, `task-decomposition` the breakdown, `epic-triage` the larger-than-one-change case, and each carries its own output contract. Follow them; nothing is restated here.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
## What you decide
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
- **What already exists.** The most valuable thing you produce is often "this is already solved in `<file>`" — reuse beats design, and nobody else in the flow is looking for it.
|
|
19
|
+
- **What this change touches that nobody mentioned.** Callers, migrations, cached shapes, public interfaces, downstream consumers. Ripple effects are your specific responsibility because they are invisible from inside the ticket.
|
|
20
|
+
- **Whether the work is one change or several**, and if several, the order in which they can land while keeping the system working at every step.
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
- `path/to/file.ts` -- purpose
|
|
22
|
+
## What you must not do
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
- `path/to/file.ts:L42-L68` -- what changes and why
|
|
24
|
+
Do not design past the requirement. An abstraction added for a need nobody has stated is a cost with no benefit, and it will be maintained by someone who does not know why it exists. Do not assert behaviour from a file or function name — open it.
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
- [file A] → [file B] → [file C] (modification order)
|
|
26
|
+
## What you hand on
|
|
29
27
|
|
|
30
|
-
|
|
31
|
-
| Decision | Choice | Rationale |
|
|
32
|
-
|----------|--------|-----------|
|
|
33
|
-
|
|
34
|
-
### Reusable Code
|
|
35
|
-
- `path/to/util.ts:functionName` -- how it applies
|
|
36
|
-
|
|
37
|
-
### Risks
|
|
38
|
-
- [risk description] -- [mitigation]
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Rules
|
|
42
|
-
|
|
43
|
-
- Always read files before recommending changes to them
|
|
44
|
-
- Follow existing patterns in the codebase -- do not introduce new architectural patterns unless explicitly required
|
|
45
|
-
- Include file:line references for all recommendations
|
|
46
|
-
- Flag breaking changes explicitly
|
|
47
|
-
- Keep the modification surface area as small as possible
|
|
28
|
+
Files to create and modify, the dependency order, the design decisions with their reasoning and the alternatives rejected, reusable code found, and the risks worth watching during implementation.
|