@codyswann/lisa 2.231.0 → 2.233.0

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 (138) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa/.codex-plugin/skills/lisa-debrief-apply/SKILL.md +9 -2
  5. package/plugins/lisa/.codex-plugin/skills/lisa-qa-checklist/SKILL.md +70 -0
  6. package/plugins/lisa/.codex-plugin/skills/lisa-qa-checklist/agents/openai.yaml +4 -0
  7. package/plugins/lisa/.codex-plugin/skills/lisa-qa-clear/SKILL.md +74 -0
  8. package/plugins/lisa/.codex-plugin/skills/lisa-qa-clear/agents/openai.yaml +4 -0
  9. package/plugins/lisa/.codex-plugin/skills/lisa-qa-fail/SKILL.md +92 -0
  10. package/plugins/lisa/.codex-plugin/skills/lisa-qa-fail/agents/openai.yaml +4 -0
  11. package/plugins/lisa/.codex-plugin/skills/lisa-qa-queue/SKILL.md +69 -0
  12. package/plugins/lisa/.codex-plugin/skills/lisa-qa-queue/agents/openai.yaml +4 -0
  13. package/plugins/lisa/.codex-plugin/skills/lisa-rework-triage/SKILL.md +155 -0
  14. package/plugins/lisa/.codex-plugin/skills/lisa-rework-triage/agents/openai.yaml +4 -0
  15. package/plugins/lisa/.codex-plugin/skills/lisa-ticket-triage/SKILL.md +20 -0
  16. package/plugins/lisa/agents/learner.md +8 -1
  17. package/plugins/lisa/agents/learnings-synthesizer.md +4 -1
  18. package/plugins/lisa/commands/qa-checklist.md +6 -0
  19. package/plugins/lisa/commands/qa-clear.md +6 -0
  20. package/plugins/lisa/commands/qa-fail.md +6 -0
  21. package/plugins/lisa/commands/qa-queue.md +6 -0
  22. package/plugins/lisa/commands/rework-triage.md +6 -0
  23. package/plugins/lisa/skills/lisa-debrief-apply/SKILL.md +9 -2
  24. package/plugins/lisa/skills/lisa-qa-checklist/SKILL.md +70 -0
  25. package/plugins/lisa/skills/lisa-qa-checklist/agents/openai.yaml +4 -0
  26. package/plugins/lisa/skills/lisa-qa-clear/SKILL.md +74 -0
  27. package/plugins/lisa/skills/lisa-qa-clear/agents/openai.yaml +4 -0
  28. package/plugins/lisa/skills/lisa-qa-fail/SKILL.md +92 -0
  29. package/plugins/lisa/skills/lisa-qa-fail/agents/openai.yaml +4 -0
  30. package/plugins/lisa/skills/lisa-qa-queue/SKILL.md +69 -0
  31. package/plugins/lisa/skills/lisa-qa-queue/agents/openai.yaml +4 -0
  32. package/plugins/lisa/skills/lisa-rework-triage/SKILL.md +155 -0
  33. package/plugins/lisa/skills/lisa-rework-triage/agents/openai.yaml +4 -0
  34. package/plugins/lisa/skills/lisa-ticket-triage/SKILL.md +21 -1
  35. package/plugins/lisa-agy/agents/learner.md +8 -1
  36. package/plugins/lisa-agy/agents/learnings-synthesizer.md +4 -1
  37. package/plugins/lisa-agy/commands/lisa/qa-checklist.md +6 -0
  38. package/plugins/lisa-agy/commands/lisa/qa-clear.md +6 -0
  39. package/plugins/lisa-agy/commands/lisa/qa-fail.md +6 -0
  40. package/plugins/lisa-agy/commands/lisa/qa-queue.md +6 -0
  41. package/plugins/lisa-agy/commands/lisa/rework-triage.md +6 -0
  42. package/plugins/lisa-agy/plugin.json +1 -1
  43. package/plugins/lisa-agy/skills/lisa-debrief-apply/SKILL.md +9 -2
  44. package/plugins/lisa-agy/skills/lisa-qa-checklist/SKILL.md +70 -0
  45. package/plugins/lisa-agy/skills/lisa-qa-clear/SKILL.md +74 -0
  46. package/plugins/lisa-agy/skills/lisa-qa-fail/SKILL.md +92 -0
  47. package/plugins/lisa-agy/skills/lisa-qa-queue/SKILL.md +69 -0
  48. package/plugins/lisa-agy/skills/lisa-rework-triage/SKILL.md +155 -0
  49. package/plugins/lisa-agy/skills/lisa-ticket-triage/SKILL.md +21 -1
  50. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  52. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  53. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-copilot/agents/learner.agent.md +8 -1
  57. package/plugins/lisa-copilot/agents/learnings-synthesizer.agent.md +4 -1
  58. package/plugins/lisa-copilot/commands/lisa/qa-checklist.md +6 -0
  59. package/plugins/lisa-copilot/commands/lisa/qa-clear.md +6 -0
  60. package/plugins/lisa-copilot/commands/lisa/qa-fail.md +6 -0
  61. package/plugins/lisa-copilot/commands/lisa/qa-queue.md +6 -0
  62. package/plugins/lisa-copilot/commands/lisa/rework-triage.md +6 -0
  63. package/plugins/lisa-copilot/skills/lisa-debrief-apply/SKILL.md +9 -2
  64. package/plugins/lisa-copilot/skills/lisa-qa-checklist/SKILL.md +70 -0
  65. package/plugins/lisa-copilot/skills/lisa-qa-clear/SKILL.md +74 -0
  66. package/plugins/lisa-copilot/skills/lisa-qa-fail/SKILL.md +92 -0
  67. package/plugins/lisa-copilot/skills/lisa-qa-queue/SKILL.md +69 -0
  68. package/plugins/lisa-copilot/skills/lisa-rework-triage/SKILL.md +155 -0
  69. package/plugins/lisa-copilot/skills/lisa-ticket-triage/SKILL.md +21 -1
  70. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-cursor/agents/learner.md +8 -1
  72. package/plugins/lisa-cursor/agents/learnings-synthesizer.md +4 -1
  73. package/plugins/lisa-cursor/commands/lisa/qa-checklist.md +6 -0
  74. package/plugins/lisa-cursor/commands/lisa/qa-clear.md +6 -0
  75. package/plugins/lisa-cursor/commands/lisa/qa-fail.md +6 -0
  76. package/plugins/lisa-cursor/commands/lisa/qa-queue.md +6 -0
  77. package/plugins/lisa-cursor/commands/lisa/rework-triage.md +6 -0
  78. package/plugins/lisa-cursor/skills/lisa-debrief-apply/SKILL.md +9 -2
  79. package/plugins/lisa-cursor/skills/lisa-qa-checklist/SKILL.md +70 -0
  80. package/plugins/lisa-cursor/skills/lisa-qa-clear/SKILL.md +74 -0
  81. package/plugins/lisa-cursor/skills/lisa-qa-fail/SKILL.md +92 -0
  82. package/plugins/lisa-cursor/skills/lisa-qa-queue/SKILL.md +69 -0
  83. package/plugins/lisa-cursor/skills/lisa-rework-triage/SKILL.md +155 -0
  84. package/plugins/lisa-cursor/skills/lisa-ticket-triage/SKILL.md +21 -1
  85. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  87. package/plugins/lisa-expo-agy/plugin.json +1 -1
  88. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  92. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  93. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  94. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  97. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  98. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  99. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  101. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  102. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  103. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  104. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  105. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  106. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  107. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  108. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  109. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  110. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  111. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  112. package/plugins/lisa-rails-agy/plugin.json +1 -1
  113. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  114. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  115. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  116. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  117. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  118. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  119. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  120. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  121. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  122. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  123. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  124. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  125. package/plugins/src/base/agents/learner.md +8 -1
  126. package/plugins/src/base/agents/learnings-synthesizer.md +4 -1
  127. package/plugins/src/base/commands/qa-checklist.md +6 -0
  128. package/plugins/src/base/commands/qa-clear.md +6 -0
  129. package/plugins/src/base/commands/qa-fail.md +6 -0
  130. package/plugins/src/base/commands/qa-queue.md +6 -0
  131. package/plugins/src/base/commands/rework-triage.md +6 -0
  132. package/plugins/src/base/skills/lisa-debrief-apply/SKILL.md +9 -2
  133. package/plugins/src/base/skills/lisa-qa-checklist/SKILL.md +70 -0
  134. package/plugins/src/base/skills/lisa-qa-clear/SKILL.md +74 -0
  135. package/plugins/src/base/skills/lisa-qa-fail/SKILL.md +92 -0
  136. package/plugins/src/base/skills/lisa-qa-queue/SKILL.md +69 -0
  137. package/plugins/src/base/skills/lisa-rework-triage/SKILL.md +155 -0
  138. package/plugins/src/base/skills/lisa-ticket-triage/SKILL.md +21 -1
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: lisa-ticket-triage
3
- description: "Analytical triage gate for tickets in the configured destination tracker (JIRA, GitHub Issues, or Linear). Detects requirement ambiguities, identifies edge cases from codebase analysis, and plans verification methodology. Posts findings to the ticket and produces a verdict (DUPLICATE_ALREADY_FIXED/BLOCKED/PASSED_WITH_FINDINGS/PASSED) that gates whether implementation can proceed. Vendor-neutral: the caller (jira-agent or github-agent) is responsible for fetching the ticket via lisa-tracker-read, running the pre-flight gate via lisa-tracker-verify, and posting findings via the matching vendor comment tool."
3
+ description: "Analytical triage gate for tickets in the configured destination tracker (JIRA, GitHub Issues, or Linear). Detects requirement ambiguities, identifies edge cases from codebase analysis, plans verification methodology, and — via lisa-rework-triage in Phase 2.5 — detects rework bounced back from QA/staging and classifies why the previous agent attempt failed. Posts findings to the ticket and produces a verdict (DUPLICATE_ALREADY_FIXED/BLOCKED/PASSED_WITH_FINDINGS/PASSED) that gates whether implementation can proceed. Vendor-neutral: the caller (jira-agent or github-agent) is responsible for fetching the ticket via lisa-tracker-read, running the pre-flight gate via lisa-tracker-verify, and posting findings via the matching vendor comment tool."
4
4
  allowed-tools: ["Read", "Glob", "Grep", "Bash"]
5
5
  ---
6
6
 
@@ -67,6 +67,23 @@ Note which phases other repos have already covered and what findings they posted
67
67
  - Do NOT duplicate findings already posted by another repo
68
68
  - DO add supplementary findings specific to THIS repo's codebase
69
69
 
70
+ ## Phase 2.5 -- Rework Detection & Failure Classification
71
+
72
+ Invoke `lisa-rework-triage` with the context bundle. It detects whether this ticket is
73
+ **rework** — previously implemented work bounced back from QA/staging — and, when it is,
74
+ classifies why the previous agent attempt failed (decomposition infidelity, PRD defect,
75
+ missing tool access, implementation defect, environment/data, verification gap), posts the
76
+ `[lisa-rework-triage]` comment, and routes the cause to its hardening destination (upstream
77
+ Lisa issue, provisioning ticket, or PRD defect flag). See that skill for the taxonomy,
78
+ evidence requirements, and routing table.
79
+
80
+ - `NOT_REWORK` → proceed to Phase 3; nothing to carry forward.
81
+ - `REWORK_CLASSIFIED` / `ALREADY_TRIAGED` → carry the classification into the output
82
+ structure (see below) and proceed to Phase 3 — a classified rework still gets fixed;
83
+ hardening runs alongside the fix, never in front of it. Exception: a `missing-tool-access`
84
+ cause whose gap is **still present** must be raised as a Phase 3 ambiguity ("prior attempt
85
+ lacked <tool>; it is still unavailable"), which blocks per the normal rules.
86
+
70
87
  ## Phase 3 -- Ambiguity Detection
71
88
 
72
89
  Examine the ticket summary, description, and acceptance criteria. Look for:
@@ -175,6 +192,9 @@ Structure all output with clear section headers so the caller can parse and post
175
192
  ### Verification Methodology
176
193
  [Phase 5 table, or "No acceptance criteria to verify."]
177
194
 
195
+ ### Rework Classification
196
+ [Phase 2.5 verdict block from lisa-rework-triage, or "Not rework (first attempt)."]
197
+
178
198
  ## Verdict: [NOT_RELEVANT | DUPLICATE_ALREADY_FIXED | BLOCKED | PASSED_WITH_FINDINGS | PASSED]
179
199
  ```
180
200
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.231.0",
3
+ "version": "2.233.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -21,19 +21,26 @@ Invoke `skill-evaluator` (via Agent tool with `subagent_type: "skill-evaluator"`
21
21
 
22
22
  - **CREATE SKILL** -- broad, reusable, complex, stable, not redundant. Invoke `/skill-creator`.
23
23
  - **ADD TO RULES** -- simple rule to append to `.claude/rules/PROJECT_RULES.md`.
24
+ - **UPSTREAM** -- the learning is a harness defect, not project knowledge: a Lisa skill, gate,
25
+ agent, or hook mis-behaved or should have caught something and didn't. Project rules can't
26
+ fix the harness; file it upstream so every host project gets the fix.
24
27
  - **OMIT** -- too narrow, already documented, or temporary. Discard.
25
28
 
26
29
  ### Step 3: Act on Decisions
27
30
 
28
31
  - CREATE SKILL: invoke `/skill-creator` via the Skill tool
29
32
  - ADD TO RULES: use Edit to append to `.claude/rules/PROJECT_RULES.md`
33
+ - UPSTREAM: file an upstream Lisa issue per the "Filing upstream" procedure in
34
+ `lisa-rework-triage` (dedupe search first, three-audience description, evidence chain,
35
+ `self-hardening` label; repo from `.lisa.config.json` `hardening.upstreamRepo`, default
36
+ `CodySwannGT/lisa`)
30
37
  - OMIT: no action
31
38
 
32
39
  ### Step 4: Output Summary
33
40
 
34
41
  | Learning | Decision | Action Taken |
35
42
  |----------|----------|-------------|
36
- | [learning text] | CREATE SKILL / ADD TO RULES / OMIT | [what was done] |
43
+ | [learning text] | CREATE SKILL / ADD TO RULES / UPSTREAM / OMIT | [what was done] |
37
44
 
38
45
  ## Rules
39
46
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: learnings-synthesizer
3
- description: "Learnings synthesizer for the Debrief flow. Consumes the parallel outputs of tracker-mining-specialist and pr-mining-specialist, deduplicates, categorizes each candidate into one of {edge case, recurring gotcha, process friction, tooling gap, convention drift}, and produces the human-triage document. Exhaustive — surfaces every candidate, even low-confidence ones, because the human decides what to keep."
3
+ description: "Learnings synthesizer for the Debrief flow. Consumes the parallel outputs of tracker-mining-specialist and pr-mining-specialist, deduplicates, categorizes each candidate into one of {edge case, recurring gotcha, process friction, tooling gap, convention drift, decomposition infidelity, prd defect, missing tool access}, and produces the human-triage document. Exhaustive — surfaces every candidate, even low-confidence ones, because the human decides what to keep."
4
4
  skills: []
5
5
  ---
6
6
 
@@ -38,6 +38,9 @@ Map every finding to exactly one category. When a finding could fit two, pick th
38
38
  | **Process friction** | A step in the lifecycle that consistently slowed the work — long status stalls, repeated reopen cycles, force-pushes after approval, missing journey replays, ambiguous AC that required mid-PR clarification. | `PROJECT_RULES.md` guideline, or a tooling-gap ticket if the friction is automatable |
39
39
  | **Tooling gap** | Something that should have been automated, an agent that should have caught the issue but didn't, a missing skill, a hook that didn't fire. | A new ticket via `lisa-tracker-write` |
40
40
  | **Convention drift** | An unwritten rule revealed by review comments — "we don't do X here", "always use the Y helper", "this folder uses pattern Z". The convention is real but undocumented. | `CLAUDE.md` or `PROJECT_RULES.md` |
41
+ | **Decomposition infidelity** | A ticket misrepresented the PRD requirement it claimed to implement — the agent built what the ticket said, but the ticket distorted the spec, and every gate passed it. A harness defect, not a project one. (`lisa-rework-triage` classifies these at claim time; debrief catches the ones that slipped through a whole initiative.) | Upstream Lisa issue (`hardening.upstreamRepo`, default `CodySwannGT/lisa`) |
42
+ | **PRD defect** | The ticket faithfully captured the PRD, but the PRD itself was wrong, ambiguous, or missing the failing case. A spec problem, not an agent problem. | Comment on the source PRD via `lisa-prd-backlink` lineage; flag for product review — never silently edit the spec |
43
+ | **Missing tool access** | An agent lacked a tool, credential, environment, or permission the work required, and the failure traces to that gap rather than to the code. | Provisioning ticket via `lisa-tracker-write` (`type:tooling`) |
41
44
 
42
45
  A finding that does not fit any category is itself a signal — surface it under a sixth ad-hoc category `Uncategorized` with a note explaining why no category fit. Better to surface than to drop.
43
46
 
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "Serve the current manual regression checklist: curated journeys minus live automated E2E coverage, in plain language."
3
+ argument-hint: ""
4
+ ---
5
+
6
+ Use the /lisa-qa-checklist skill to serve the manual regression checklist. $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "Bulk-move QA-queue tickets scoped entirely to non-user-facing repos to the configured certified status, with an auditable moved-list report."
3
+ argument-hint: ""
4
+ ---
5
+
6
+ Use the /lisa-qa-clear skill to clear non-human-verifiable tickets from the QA queue. $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "File a QA failure: find the right ticket (never a duplicate), write the structured failure report, diagnose the expectation gap, label qa-fail, and return the ticket to build-ready."
3
+ argument-hint: "[ticket-key] <what you saw, in your own words>"
4
+ ---
5
+
6
+ Use the /lisa-qa-fail skill to file this QA failure. $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "Serve the next ticket awaiting QA verdict as a plain-language acceptance brief; record pass (→ certified) or fail (→ structured report via lisa-qa-fail)."
3
+ argument-hint: "[pass | fail <description> | next]"
4
+ ---
5
+
6
+ Use the /lisa-qa-queue skill to serve the QA acceptance queue. $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "Detect whether a ticket is rework bounced back from QA/staging, classify why the previous agent attempt failed, and route the cause to its hardening destination (upstream Lisa issue, provisioning ticket, or PRD defect flag)."
3
+ argument-hint: "<ticket-key-or-url>"
4
+ ---
5
+
6
+ Use the /lisa-rework-triage skill to detect and classify rework on the given ticket. $ARGUMENTS
@@ -29,8 +29,11 @@ For every row marked **Accept**:
29
29
  | Edge case | Edge Case Brainstorm checklist in `intent-routing.md` | Append the new pattern + question to the matching group (Navigation, Data, Failure, Input, Auth, or a new group if none fit). Use the row's `Summary` and `Evidence` link as a citation comment. |
30
30
  | Recurring gotcha | Memory file (`project_*.md`) | Write a new memory entry with `type: project`, structured as: rule, **Why:**, **How to apply:**. Add an index line to `MEMORY.md`. |
31
31
  | Process friction | Configured project rules file | Append a one-line guideline to the `.lisa.config.json` `projectRulesFile` destination (default `PROJECT_RULES.md`) under an appropriate heading (or create one). |
32
- | Tooling gap | Configured tracker | Create a new ticket via `lisa-tracker-write` with `issue_type: Task`, summary derived from the row's `Summary`, description citing the evidence and the originating debrief doc. Label appropriately (`type:tooling`, `lifecycle-improvement`, etc.). |
32
+ | Tooling gap | Configured tracker — or upstream Lisa when harness-level | **Split by level.** Project-level (a missing project script, hook, or automation) → create a ticket via `lisa-tracker-write` with `issue_type: Task`, summary derived from the row's `Summary`, description citing the evidence and the originating debrief doc, labeled `type:tooling` / `lifecycle-improvement`. Harness-level (a Lisa skill/gate/agent that should have caught the issue but didn't) → file an upstream Lisa issue exactly per the "Filing upstream" procedure in `lisa-rework-triage` (dedupe search first, three-audience description, evidence chain, `self-hardening` label; repo from `.lisa.config.json` `hardening.upstreamRepo`, default `CodySwannGT/lisa`). |
33
33
  | Convention drift | `CLAUDE.md` for project-wide agent operating instructions; otherwise the configured project rules file for codebase conventions | Append the convention as a one-paragraph note under the relevant section. If no relevant section exists, create one. |
34
+ | Decomposition infidelity | Upstream Lisa repo | File an upstream Lisa issue per the "Filing upstream" procedure in `lisa-rework-triage`, citing the PRD text vs. the distorted ticket AC and naming the gate that passed it. |
35
+ | PRD defect | Source PRD | Comment on the PRD via the `lisa-prd-backlink` lineage quoting the defective requirement and the failure it missed; flag for product review. Never silently edit the spec. |
36
+ | Missing tool access | Configured tracker | Create a provisioning ticket via `lisa-tracker-write` (`issue_type: Task`, `type:tooling`) describing the missing tool/credential/environment and which flow needs it. |
34
37
 
35
38
  For every row marked **Reject** or **Defer**: no action. Defer is a no-op for `apply` but worth surfacing in the run summary — the human may want to revisit at the next debrief.
36
39
 
@@ -51,8 +54,12 @@ Applied <n> learnings:
51
54
  <n> edge cases → intent-routing.md
52
55
  <n> gotchas → memory
53
56
  <n> friction → PROJECT_RULES.md
54
- <n> tooling gaps → <tracker> (<key1>, <key2>, ...)
57
+ <n> tooling gaps (project) → <tracker> (<key1>, <key2>, ...)
58
+ <n> tooling gaps (harness) → upstream Lisa (<issue-url1>, ...)
55
59
  <n> convention drift → CLAUDE.md
60
+ <n> decomposition infidelity → upstream Lisa (<issue-url1>, ...)
61
+ <n> PRD defects → PRD comments (<prd-link1>, ...)
62
+ <n> missing tool access → <tracker> (<key1>, ...)
56
63
  Skipped:
57
64
  <n> rejected, <n> deferred, <n> already-applied
58
65
  Failed:
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: lisa-qa-checklist
3
+ description: "Serve the current manual regression checklist to a human QA tester. Reads the project's curated journey list, cross-references it against what the automated suites (Playwright web E2E, Maestro native E2E) actually cover by scanning the spec files, and serves only the journeys that still need human eyes — each as plain-language steps. Keeps a single source of truth so testers never work from a stale personal copy, and shrinks automatically as automated coverage grows."
4
+ allowed-tools: ["Bash", "Read", "Glob", "Grep", "Write", "Edit"]
5
+ ---
6
+
7
+ # QA Checklist: $ARGUMENTS
8
+
9
+ The manual regression sweep exists to catch what automation does not. Its checklist must
10
+ therefore be computed, not remembered: curated journeys minus automated coverage, at the
11
+ moment the tester asks.
12
+
13
+ ## Sources
14
+
15
+ 1. **Curated journey list** — `qa.checklistFile` in `.lisa.config.json`, default
16
+ `.lisa/qa-checklist.md`. Format: one `## Journey: <name>` section per user journey,
17
+ with plain-language steps and an optional `automation:` line naming the covering spec
18
+ file(s) once one exists. If the file does not exist, offer to bootstrap it: derive
19
+ candidate journeys from the app's route map and the existing E2E suites' describe
20
+ blocks, write the draft, and ask the operator to curate it once. Never invent
21
+ journeys silently.
22
+ 2. **Automated coverage** — scan the repo's E2E suites (Playwright specs, Maestro flows;
23
+ locate via the project's e2e/test directories). An `automation:` line must name BOTH
24
+ the spec file and the specific test within it (the Playwright `describe`/`test` title
25
+ or Maestro flow name): `automation: <spec-path> :: <test-or-flow-name>`. A journey
26
+ counts as covered only when that spec file exists, the named test/flow is present in
27
+ it, and it is not skipped (`test.skip`, commented-out flow, or excluded from CI). A
28
+ file-only line, a named test that no longer matches, or any ambiguous mapping is
29
+ treated as **uncovered** — a live filename proves nothing about what the spec
30
+ exercises. A deleted, renamed, or skipped test silently un-covers its journey — the
31
+ very regression this check exists to catch; call it out loudly.
32
+
33
+ ## Serving the sweep
34
+
35
+ Present two lists, human-first:
36
+
37
+ ```text
38
+ ## Manual sweep — <n> journeys need your eyes
39
+ 1. <Journey name> — <plain-language steps>
40
+ Why manual: <no automation | automation skipped/stale: <spec>>
41
+ ...
42
+
43
+ ## Covered by automation — <n> journeys (skim, don't re-test)
44
+ - <Journey name> — <spec file> (<playwright|maestro>)
45
+ ```
46
+
47
+ Rules for the served text: steps an intern can follow, no spec-file jargon in the manual
48
+ section beyond the "why manual" line, and stable journey ordering (file order) so testers
49
+ can resume mid-sweep.
50
+
51
+ ## Maintaining the list
52
+
53
+ - Tester or operator adds/edits journeys in plain language → edit the checklist file
54
+ (this skill may apply the edit on request; it is a repo file, so changes ride normal
55
+ review).
56
+ - When a journey gains automation (e.g. `lisa-codify-verification` lands a spec), add its
57
+ `automation: <spec-path> :: <test-or-flow-name>` line — on request this skill locates
58
+ the covering spec and test, confirms the named test actually drives the journey's
59
+ steps, and writes the line itself.
60
+ - Never maintain per-tester copies; the file is the single source of truth and the
61
+ computed view is always derived fresh.
62
+
63
+ ## Rules
64
+
65
+ - Coverage claims must point at an existing, non-skipped spec — "there's a test somewhere"
66
+ does not count.
67
+ - Serving is read-only by default; file edits happen only on explicit request.
68
+ - If the automated-coverage scan finds specs exercising a journey that is missing from
69
+ the curated list entirely, surface it as a suggested addition — the human curates, the
70
+ skill proposes.
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: lisa-qa-clear
3
+ description: "Bulk-clear tickets a human QA tester cannot verify. Finds tickets in the configured QA queue status that are scoped entirely to non-user-facing repos (API/backend services, infrastructure) — where QA has only end-user access and nothing observable to test — and transitions them to the configured certified status, reporting the moved list for the record. Runnable from any coding agent as a single instruction like 'move all backend- and infrastructure-only tickets from the QA queue to certified'."
4
+ allowed-tools: ["Skill", "Bash", "Read", "Glob", "Grep"]
5
+ ---
6
+
7
+ # QA Clear: $ARGUMENTS
8
+
9
+ Human QA can only judge what a user can see. Tickets whose entire scope is a
10
+ non-user-facing repo were already verified by the automated lifecycle before reaching the
11
+ QA queue; holding them for a human who cannot observe them is pure queue noise. Clear
12
+ them in one auditable batch.
13
+
14
+ ## Config resolution
15
+
16
+ Read `.lisa.config.json`:
17
+
18
+ - **QA queue status** — `jira.workflow.qa.queue`, falling back to
19
+ `jira.workflow.done.staging`.
20
+ - **Certified status** — `jira.workflow.qa.certified`. Required; if missing, stop and
21
+ instruct the operator — never guess a terminal status.
22
+ - **Tracker dispatch** — `tracker` decides the surface as everywhere; on GitHub or
23
+ Linear the status names above map to the equivalent labels/states.
24
+ - **Non-user-facing repos** — `qa.nonUserFacingRepos` (array of repo names, e.g.
25
+ `["api", "infrastructure"]`). If the key is missing, derive a proposal from
26
+ the project registry (repos with no UI framework signals — no expo/react/native/web
27
+ app surface) and **present it for operator confirmation before moving anything**; never
28
+ bulk-transition on an unconfirmed inference. Recommend persisting the confirmed list to
29
+ the config.
30
+
31
+ ## Procedure
32
+
33
+ 1. Query all tickets in the QA queue status.
34
+ 2. Classify each by repo scope, in order:
35
+ - `repo:<name>` label or matching component → that repo.
36
+ - Unlabeled → determine the repo from the ticket content (description, AC, technical
37
+ approach) exactly as build-intake's repo-scope gate does, and stamp the
38
+ `repo:<name>` label while you're there so the next sweep is cheap.
39
+ - Undeterminable → leave in place; flag for the operator.
40
+ 3. Partition:
41
+ - **Every** touched repo is non-user-facing → eligible to clear.
42
+ - Any user-facing repo in scope (including mixed-scope) → stays in the queue for the
43
+ human pass via `lisa-qa-queue`.
44
+ 4. For each eligible ticket, in this order — the pairing must be failure-safe:
45
+ 1. Post the audit comment first:
46
+ `[lisa-qa-clear] Certified without human QA: scope is <repo(s)>, not observable
47
+ with end-user access. Verified by the automated lifecycle pre-promotion.`
48
+ 2. Then transition to the certified status.
49
+ 3. Verify both halves landed before counting the ticket as moved. A comment without
50
+ the transition, or a transition without the comment, is a **partial** — report it
51
+ as such, never as completed.
52
+ 5. Report the batch:
53
+
54
+ ```text
55
+ ## QA Clear — <date>
56
+ Moved to <certified>: <n> (<KEY-1>, <KEY-2>, …) — repo per ticket
57
+ Left in queue (user-facing): <n>
58
+ Left in queue (undeterminable repo — needs operator): <keys or none>
59
+ ```
60
+
61
+ The operator (or tester) reviews the moved list; anything that "sounds user-facing" can
62
+ be pulled back with a single instruction — the transition is reversible and the comment
63
+ marks exactly what was auto-cleared.
64
+
65
+ ## Rules
66
+
67
+ - Never clear a mixed-scope ticket — partial human-verifiability means human QA.
68
+ - Never bulk-move on an inferred repo list without explicit operator confirmation.
69
+ - Every cleared ticket carries the audit comment; a transition without the comment is a
70
+ bug in this procedure.
71
+ - Idempotent by repair, not by skip: a ticket is complete only when it has BOTH the
72
+ `[lisa-qa-clear]` comment AND the certified status. Re-runs finish partials — comment
73
+ present but not certified → transition it; certified but no comment → post the
74
+ comment. Only fully-complete tickets are skipped silently.
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: lisa-qa-fail
3
+ description: "QA failure front door. Takes a human tester's plain-language failure description, finds the right ticket (the served ticket, or the original via duplicate-discovery when the report arrives untied), writes the structured failure report (repro / expected vs. actual / which acceptance criterion failed), diagnoses the EXPECTATION GAP — why the implementing agent's done-evidence said done when QA says it isn't — applies the qa-fail label that makes lisa-rework-triage detection deterministic, and transitions the ticket back to the build-ready status. QA never words a ticket again; agents never guess what QA meant."
4
+ allowed-tools: ["Skill", "Bash", "Read", "Glob", "Grep"]
5
+ ---
6
+
7
+ # QA Fail: $ARGUMENTS
8
+
9
+ Convert a human failure observation into the exact artifact the fixing agent needs. Two
10
+ inputs arrive together or the report cannot be filed: a **target ticket** and the
11
+ **tester's verbatim description** (what they did, what they expected, what happened,
12
+ plus any screenshots).
13
+
14
+ ## Phase 1 — Resolve the target ticket
15
+
16
+ - **Tied report** (invoked from `lisa-qa-queue` with a key): use it.
17
+ - **Untied report** ("I found something broken: …"): run duplicate-discovery BEFORE any
18
+ write, reusing the mandatory relationship-discovery searches defined by the configured
19
+ tracker's write skill (dispatched through `lisa-tracker-write`): search open and
20
+ recently-closed tickets in the affected area, and the current QA-queue set. If an existing ticket
21
+ covers it, that ticket is the target — update it, never file a twin. Only when the
22
+ search documents no match, create a new Bug via `lisa-tracker-write` (which enforces
23
+ the full quality gates) and treat it as the target. Report which path was taken.
24
+
25
+ ## Phase 2 — Structured failure report
26
+
27
+ Fetch the bundle via `lisa-tracker-read`. Post one comment:
28
+
29
+ ```text
30
+ [lisa-qa-fail] QA failure — <one-line summary>
31
+ Reported by: <tester> on <date>, against <environment>
32
+ Steps to reproduce: <numbered, from the tester's words>
33
+ Expected: <what the ticket/AC promised, quoted or paraphrased faithfully>
34
+ Actual: <what the tester observed, verbatim where possible>
35
+ Failed acceptance criterion: <AC number/text from the ticket — or "not covered by any AC" (see gap)>
36
+ Attachments: <screenshots if provided>
37
+ ```
38
+
39
+ Preserve the tester's language in `Actual` — their words are the evidence; your job is
40
+ structure, not rewording.
41
+
42
+ ## Phase 3 — Expectation-gap diagnosis
43
+
44
+ Answer explicitly: **why did the implementing agent believe this was done?** Locate the
45
+ prior cycle's done-evidence — the build-evidence comment (`lisa-tracker-evidence` output),
46
+ the merged PR's verification section, and any codified regression test — and compare it
47
+ against the failure. Classify the gap (exactly one):
48
+
49
+ | Gap | Meaning |
50
+ |-----|---------|
51
+ | `ac-mismatch` | The evidence verified a different reading of the AC than QA's — the criterion is ambiguous or the ticket distorted it. |
52
+ | `verification-weakness` | The evidence never actually exercised the failing path (asserted adjacent behavior, mocked the surface, or skipped the step). |
53
+ | `environment-difference` | Verified where it works (e.g. dev) but fails on the QA environment — config, data, or deployment drift. |
54
+ | `data-difference` | Behavior depends on data present in one environment and absent in the other. |
55
+ | `regression-since-merge` | The evidence was genuinely valid when produced; later merges broke it. |
56
+ | `not-covered-by-ac` | QA's expectation is real but no AC promises it — a spec gap, not an implementation failure. |
57
+
58
+ Append to the same comment:
59
+
60
+ ```text
61
+ Expectation gap: <classification>
62
+ Why the agent thought it was done: <2-3 lines citing the specific evidence artifact>
63
+ ```
64
+
65
+ If no done-evidence exists at all, say so — `Expectation gap: no-evidence-found` is
66
+ itself a serious finding (the verification lifecycle was skipped) and must be surfaced,
67
+ not smoothed over.
68
+
69
+ For `not-covered-by-ac`, do NOT transition the ticket — the spec question goes to the
70
+ human product gate. Flag it in the response and stop after posting.
71
+
72
+ ## Phase 4 — Label and transition
73
+
74
+ 1. Apply the `qa-fail` label — this is the deterministic rework signal `lisa-rework-triage`
75
+ keys on at next claim, and the gap classification above becomes its primary evidence.
76
+ 2. Transition the ticket to the build-ready status (`jira.workflow.ready`, or the
77
+ configured tracker's equivalent ready label/state when `tracker` is GitHub or
78
+ Linear). The rework loop takes it from here: intake claims it, `lisa-ticket-triage` Phase 2.5 runs
79
+ `lisa-rework-triage`, and the fix proceeds with full context.
80
+ 3. Confirm to the tester in one plain sentence: what was recorded, and that the fix is
81
+ queued — no further action needed from them.
82
+
83
+ ## Rules
84
+
85
+ - Never file a new ticket without the documented duplicate search (Phase 1).
86
+ - Never paraphrase away the tester's observation; structure around it.
87
+ - One `[lisa-qa-fail]` comment per failure event — if the same tester reports the same
88
+ failure again before a fix ships, add a short "seen again <date>" line to the existing
89
+ comment instead of a new block.
90
+ - The expectation gap must cite a specific evidence artifact or say `no-evidence-found` —
91
+ a gap classification without a citation is a guess, and guesses are worse than
92
+ `no-evidence-found`.
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: lisa-qa-queue
3
+ description: "QA acceptance queue for human testers. Serves the next ticket awaiting QA verdict from the configured QA queue status as a plain-language acceptance brief — what the ticket promises, how to exercise it on the QA environment, in words a non-technical tester can follow. On 'pass', transitions the ticket to the configured certified status. On 'fail', delegates to lisa-qa-fail for the structured failure report, expectation-gap diagnosis, and return to the build-ready status. The conversational front door for human QA acceptance on any coding agent: testers say 'what's the next item?' / 'pass' / 'fail — here's what I saw'."
4
+ allowed-tools: ["Skill", "Bash", "Read", "Glob", "Grep"]
5
+ ---
6
+
7
+ # QA Queue: $ARGUMENTS
8
+
9
+ Serve one ticket at a time to a human QA tester and record their verdict. The tester is
10
+ assumed **non-technical**: everything you present must be readable by an intern on their
11
+ first day — no stack traces, no jargon, no internal identifiers without explanation.
12
+
13
+ ## Config resolution
14
+
15
+ Read `.lisa.config.json`:
16
+
17
+ - **QA queue status** — `jira.workflow.qa.queue`, falling back to `jira.workflow.done.staging`
18
+ (whatever status the project uses for "deployed to the environment QA tests against").
19
+ If neither exists, stop and report the missing config.
20
+ - **Certified status** — `jira.workflow.qa.certified` (the project's "passed QA, ships
21
+ with the next release" status). Required for the pass path; if missing, stop and
22
+ instruct the operator to add it — never guess a terminal status.
23
+ - **Build-ready status** — `jira.workflow.ready` (fail path, via `lisa-qa-fail`).
24
+ - **Tracker dispatch** — as everywhere: `tracker` decides JIRA / GitHub / Linear surfaces;
25
+ status names above map to labels/states on non-JIRA trackers.
26
+
27
+ ## Serving the next item
28
+
29
+ 1. Query the QA queue: tickets in the queue status, oldest first, excluding tickets
30
+ already carrying an unresolved `[lisa-qa-fail]` verdict from this sweep. Skip tickets
31
+ whose repo is listed in `qa.nonUserFacingRepos` — those belong to `lisa-qa-clear`,
32
+ not a human tester; note any encountered so the operator knows to run the clear.
33
+ 2. Fetch the full context bundle via `lisa-tracker-read` (never serve from a bare summary).
34
+ 3. Present ONE ticket as an **acceptance brief**:
35
+ - **What changed, in user terms** — one or two sentences, translated from the ticket's
36
+ stakeholder section.
37
+ - **How to try it** — concrete steps on the QA environment (the `exploration` /
38
+ Validation Journey config supplies the URL and test credentials): where to go, what
39
+ to click or type, which account to use.
40
+ - **What success looks like** — each acceptance criterion rewritten as an observable
41
+ check ("you should see …"), numbered so the tester can cite one on failure.
42
+ - **Worth poking at** — up to three edge probes drawn from the ticket's edge-case
43
+ triage findings, phrased as actions ("try it with an empty search box").
44
+ 4. End with: "Say **pass**, or describe what you saw if it failed."
45
+
46
+ ## Recording the verdict
47
+
48
+ - **Pass** — transition the ticket to the certified status via the tracker access layer,
49
+ post a brief `[lisa-qa-queue] QA pass` comment naming who verified and when, and offer
50
+ the next item.
51
+ - **Fail** — invoke `lisa-qa-fail` with the ticket key and the tester's own words
52
+ (verbatim — do not paraphrase away detail; attach any screenshots they provided). That
53
+ skill owns the failure report, the expectation-gap diagnosis, the `qa-fail` label, and
54
+ the transition back to build-ready. When it completes, confirm to the tester in one
55
+ plain sentence what was recorded and offer the next item.
56
+ - **Unclear / can't test** — if the tester cannot exercise the ticket (missing access,
57
+ feature flag off, no test data), do NOT guess a verdict. Post a
58
+ `[lisa-qa-queue] QA blocked: <reason>` comment, leave the status untouched, flag it in
59
+ the session summary for the operator, and serve the next item.
60
+
61
+ ## Rules
62
+
63
+ - One ticket at a time — never dump the queue on the tester.
64
+ - The tester's verbatim description is evidence; preserve it exactly in whatever is posted.
65
+ - Never transition to certified without an explicit "pass" from the tester.
66
+ - All tracker writes go through the access layer / `lisa-qa-fail` — this skill never
67
+ hand-crafts tracker mutations beyond the pass transition and its comment.
68
+ - Session summary on request ("how did we do?"): counts of passed / failed / blocked /
69
+ remaining in queue.
@@ -0,0 +1,155 @@
1
+ ---
2
+ name: lisa-rework-triage
3
+ description: "Rework detection and agent-failure classification. When a claimed ticket turns out to be rework — previously implemented work bounced back from QA/staging — this skill detects it, classifies WHY the previous agent attempt failed (decomposition infidelity, PRD defect, missing tool access, implementation defect, environment/data, verification gap), posts a structured triage comment, and routes each cause to its hardening destination — including upstream Lisa issues so the harness itself gets fixed and the same mistake structurally cannot repeat. Vendor-neutral: consumes the lisa-tracker-read context bundle; invoked automatically by lisa-ticket-triage Phase 2.5 and runnable standalone."
4
+ allowed-tools: ["Skill", "Bash", "Read", "Glob", "Grep"]
5
+ ---
6
+
7
+ # Rework Triage: $ARGUMENTS
8
+
9
+ Classify why a previous agent attempt at this ticket failed, and convert that cause into a
10
+ structural improvement. This is the self-hardening arm of the lifecycle: every classified
11
+ failure either hardens the harness (an upstream Lisa issue), the project (a provisioning or
12
+ environment ticket), or the spec (a PRD defect flag). A rework cycle that fixes the bug but
13
+ never asks *why the agent got it wrong* guarantees the mistake recurs.
14
+
15
+ The caller MUST have run `lisa-tracker-read` first and provided the context bundle (all
16
+ comments chronological, linked PRs with review state, issue links, parent epic). Do not
17
+ classify from a bare summary — evidence-free classification is worse than none.
18
+
19
+ ## Phase 1 — Rework detection
20
+
21
+ A ticket is **rework** when it was previously implemented by this lifecycle and has returned
22
+ to a build-ready state. Evaluate these signals in order; the first confirmed signal suffices.
23
+ If none confirm, output `## Verdict: NOT_REWORK` and stop — this skill takes no action on
24
+ first-attempt work.
25
+
26
+ 1. **Status history shows a post-implementation regression transition.** The ticket's
27
+ changelog contains a transition from a post-build state (the configured `claimed`,
28
+ any configured `done.*` environment state, or a review state) back to the configured
29
+ `ready` state.
30
+ - JIRA: fetch the changelog via the `lisa-atlassian-access` REST substrate —
31
+ `GET /rest/api/3/issue/<KEY>/changelog` — and scan `items[].field == "status"` entries.
32
+ - GitHub: `gh issue view <n> --json timelineItems` (or the timeline API) — scan for the
33
+ `$DONE`/environment label being removed and `$READY` re-added after a linked PR merged.
34
+ - Linear: the Issue history relation — scan state changes from a completed/started state
35
+ back to the ready-labeled state.
36
+ 2. **Merged linked PR + build-ready again.** The bundle shows at least one linked PR that is
37
+ `MERGED`, while the ticket currently carries the build-ready role. First-attempt tickets
38
+ never have merged PRs.
39
+ 3. **Prior lifecycle claim marker.** The comments contain a prior implementation-cycle
40
+ marker for THIS ticket: a `[claude-build-intake]` claim comment, or a build-evidence
41
+ comment posted by `lisa-tracker-evidence` (`[lisa-evidence]` / the vendor evidence
42
+ header). Only markers proving a prior *implementation* attempt qualify —
43
+ `[lisa-rework-triage]` comments and other unrelated `[lisa-*]` annotations never do.
44
+ 4. **Explicit rework marker.** A `rework`, `qa-fail`, or `regression` label applied by QA or
45
+ the verify lifecycle.
46
+
47
+ Record which signal fired — it is part of the evidence trail.
48
+
49
+ ## Phase 2 — Failure-cause classification
50
+
51
+ Classify the failed attempt into **exactly one primary cause**. Every classification must
52
+ cite concrete evidence from the bundle, the codebase, or the PRD lineage — a cause without
53
+ evidence is `UNCLASSIFIED`, which is itself a surfaced outcome, never a silent default.
54
+
55
+ | Cause | Definition | Required evidence |
56
+ |-------|------------|-------------------|
57
+ | `decomposition-infidelity` | The ticket misrepresents the PRD requirement it implements — the agent built what the ticket said, but the ticket distorted the spec. | Resolve the ticket's requirement id(s) from the source PRD's `## Tickets` section (written by `lisa-prd-backlink` — each entry carries `requirements: ["R#"]` and the register maps R# to verbatim PRD text). Quote the PRD text vs. the ticket's AC and name the divergence. |
58
+ | `prd-defect` | The ticket faithfully captured the PRD, but the PRD itself was wrong, ambiguous, or missing the failing case. | Quote the PRD requirement and the QA failure it does not cover or contradicts. |
59
+ | `missing-tool-access` | The agent lacked a tool, credential, environment, or permission the work required, and worked around it blindly. | The prior cycle's comments/PR show the gap (skipped verification step, "could not access", missing env credentials, absent MCP tool) — cite the marker. |
60
+ | `implementation-defect` | Spec and ticket were right; the agent's code was wrong. | The failing behavior contradicts an AC the ticket states correctly; cite the AC and the failure report. |
61
+ | `environment-data` | The failure is caused by environment or data state (drift, missing fixtures, shared-state collision), not by the code under test. | The failure reproduces only in the affected environment, or the report references data absent from the environment's seed/fixtures. |
62
+ | `verification-gap` | The code was wrong AND the verification lifecycle should have caught it — the codified regression test was missing, too weak, or asserted the wrong thing. | Name the verification/codify-verification artifact from the prior cycle that failed to catch this class of failure. Frequently a **secondary** cause alongside `implementation-defect`; record both, primary first. |
63
+
64
+ Classification sources, in priority order: the QA failure report (comments), the prior
65
+ cycle's evidence comment and PR review thread, the PRD requirement register via
66
+ `lisa-prd-backlink` lineage, and the codebase itself (Glob/Grep the failing surface).
67
+
68
+ ## Phase 3 — Post the triage comment
69
+
70
+ Post one structured comment on the ticket via the vendor comment surface (`lisa-atlassian-access
71
+ operation: comment`, `gh issue comment`, or the Linear comment mutation):
72
+
73
+ ```text
74
+ [lisa-rework-triage] Rework detected (signal: <signal>)
75
+ Fingerprint: <ticket-key>|<last merged PR number, or none>|<primary cause>
76
+ Primary cause: <cause>
77
+ Secondary cause: <cause or none>
78
+ Evidence: <2-4 lines citing the specific PRD text / AC / comment / PR review / environment fact>
79
+ Hardening action: <what Phase 4 filed, with link — or "none required (implementation-defect)">
80
+ ```
81
+
82
+ **Idempotency:** the fingerprint is the literal `Fingerprint:` line —
83
+ `<ticket-key>|<last merged PR number>|<primary cause>`, with `none` as the PR component
84
+ when detection fired on a claim marker or label and no merged PR exists. Before posting,
85
+ scan existing comments for a `[lisa-rework-triage]` block whose `Fingerprint:` line
86
+ matches — if present, skip posting and report `already-triaged`. One triage per bounce,
87
+ never one per cycle re-entry.
88
+
89
+ ## Phase 4 — Route the cause to its hardening destination
90
+
91
+ Each cause has exactly one destination. File through the proper write path — never raw
92
+ ticket creation — so every hardening artifact passes the same quality gates as any other
93
+ Lisa work item.
94
+
95
+ | Primary cause | Destination | Action |
96
+ |---------------|-------------|--------|
97
+ | `decomposition-infidelity` | **Upstream Lisa issue** | The decomposition pipeline produced an unfaithful ticket and every gate passed it — that is a harness defect. File per "Filing upstream" below, citing the PRD text, the distorted ticket AC, and which gate should have caught it. |
98
+ | `verification-gap` | **Upstream Lisa issue** | The verification lifecycle passed work it should have failed. File per "Filing upstream", citing the missed failure class and the weak/missing codified test. |
99
+ | `missing-tool-access` | Project tracker | Create a provisioning ticket via `lisa-tracker-write` (`issue_type: Task`, labeled `type:tooling`) describing the missing tool/credential/environment and which flow needs it. Link it `blocks` the rework ticket. |
100
+ | `environment-data` | Project tracker | Create an environment-hardening ticket via `lisa-tracker-write` citing the drift/fixture/shared-state evidence. Link `relates to` the rework ticket. |
101
+ | `prd-defect` | Source PRD | Comment on the PRD (via the `lisa-prd-backlink` lineage) quoting the defective requirement and the QA failure; flag for product review. Do NOT silently edit the PRD — spec changes are a human gate. |
102
+ | `implementation-defect` (no secondary) | None | Normal fix path; the classification comment is the record. Pass the pattern to the `learner` phase — repeated implementation defects of the same shape escalate to `verification-gap`. |
103
+
104
+ **Secondary causes route too.** A recorded secondary cause triggers its own row's
105
+ destination in addition to the primary's: `implementation-defect` with a
106
+ `verification-gap` secondary files the upstream Lisa issue per the `verification-gap`
107
+ row — the code being wrong does not excuse the verification lifecycle for passing it.
108
+ Deduplicate against the primary's filing (one upstream issue per failure class, not one
109
+ per cause slot).
110
+ | `UNCLASSIFIED` | Surface to human | Include in the triage comment and the caller's summary; a human decides. Never guess a cause to avoid this outcome. |
111
+
112
+ ### Filing upstream
113
+
114
+ Upstream issues target the Lisa repository itself so the harness gets fixed for every
115
+ project at once. Resolve the repo from `.lisa.config.json` `hardening.upstreamRepo`;
116
+ default `CodySwannGT/lisa`.
117
+
118
+ 1. **Dedupe first.** `gh issue list -R <upstream> --state open --search "<fingerprint terms>"`
119
+ — if an open issue already covers this failure class, comment the new occurrence on it
120
+ (evidence compounds; duplicates dilute) and link it instead of filing.
121
+ 2. **File with the same bar as any ticket:** a three-audience description (what failed for
122
+ the operator, what the harness did wrong, what to change), the verbatim evidence chain
123
+ (PRD text → ticket AC → QA failure → gate that passed it), and a `self-hardening` label:
124
+ `gh issue create -R <upstream> --title "<gate/skill>: <failure class>" --label self-hardening`.
125
+ 3. **Close the loop.** Reference the upstream issue URL in the triage comment. The upstream
126
+ repo's own build intake implements it; the next kernel release ships the hardening to
127
+ every host project.
128
+
129
+ ## Verdict
130
+
131
+ ```text
132
+ ## Verdict: [NOT_REWORK | REWORK_CLASSIFIED | ALREADY_TRIAGED]
133
+
134
+ **Signal:** [status-history | merged-pr | claim-marker | label | n/a]
135
+ **Primary cause:** [cause | n/a]
136
+ **Secondary cause:** [cause | none]
137
+ **Hardening filed:** [upstream <url> | tracker <key> | prd-comment | none | pending-human]
138
+ ```
139
+
140
+ The caller (ticket-triage Phase 2.5, or a standalone invocation) incorporates this into its
141
+ own findings. `REWORK_CLASSIFIED` never blocks the fix — the rework ticket proceeds to
142
+ implementation regardless; hardening runs alongside, not in front of, shipping the fix. The
143
+ one exception: `missing-tool-access` with the gap still present should surface as a Phase 3
144
+ ambiguity in the calling triage ("prior attempt lacked <tool>; it is still unavailable"),
145
+ which blocks per the normal triage rules.
146
+
147
+ ## Rules
148
+
149
+ - Never classify without evidence; `UNCLASSIFIED` beats a guess.
150
+ - One primary cause. Record a secondary only when the evidence genuinely supports both.
151
+ - Fire only on confirmed rework — first-attempt tickets exit at Phase 1 with `NOT_REWORK`.
152
+ - All ticket/issue writes go through `lisa-tracker-write` or `gh` as specified — never
153
+ bypass the quality gates this loop exists to strengthen.
154
+ - Noise discipline: one triage comment per bounce (fingerprinted), no upstream issue without
155
+ the dedupe search, and upstream issues describe failure *classes*, not single incidents.