@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.
- 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-debrief-apply/SKILL.md +9 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-qa-checklist/SKILL.md +70 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-qa-checklist/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-qa-clear/SKILL.md +74 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-qa-clear/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-qa-fail/SKILL.md +92 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-qa-fail/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-qa-queue/SKILL.md +69 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-qa-queue/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-rework-triage/SKILL.md +155 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-rework-triage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-ticket-triage/SKILL.md +20 -0
- package/plugins/lisa/agents/learner.md +8 -1
- package/plugins/lisa/agents/learnings-synthesizer.md +4 -1
- package/plugins/lisa/commands/qa-checklist.md +6 -0
- package/plugins/lisa/commands/qa-clear.md +6 -0
- package/plugins/lisa/commands/qa-fail.md +6 -0
- package/plugins/lisa/commands/qa-queue.md +6 -0
- package/plugins/lisa/commands/rework-triage.md +6 -0
- package/plugins/lisa/skills/lisa-debrief-apply/SKILL.md +9 -2
- package/plugins/lisa/skills/lisa-qa-checklist/SKILL.md +70 -0
- package/plugins/lisa/skills/lisa-qa-checklist/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/lisa-qa-clear/SKILL.md +74 -0
- package/plugins/lisa/skills/lisa-qa-clear/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/lisa-qa-fail/SKILL.md +92 -0
- package/plugins/lisa/skills/lisa-qa-fail/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/lisa-qa-queue/SKILL.md +69 -0
- package/plugins/lisa/skills/lisa-qa-queue/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/lisa-rework-triage/SKILL.md +155 -0
- package/plugins/lisa/skills/lisa-rework-triage/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/lisa-ticket-triage/SKILL.md +21 -1
- package/plugins/lisa-agy/agents/learner.md +8 -1
- package/plugins/lisa-agy/agents/learnings-synthesizer.md +4 -1
- package/plugins/lisa-agy/commands/lisa/qa-checklist.md +6 -0
- package/plugins/lisa-agy/commands/lisa/qa-clear.md +6 -0
- package/plugins/lisa-agy/commands/lisa/qa-fail.md +6 -0
- package/plugins/lisa-agy/commands/lisa/qa-queue.md +6 -0
- package/plugins/lisa-agy/commands/lisa/rework-triage.md +6 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-debrief-apply/SKILL.md +9 -2
- package/plugins/lisa-agy/skills/lisa-qa-checklist/SKILL.md +70 -0
- package/plugins/lisa-agy/skills/lisa-qa-clear/SKILL.md +74 -0
- package/plugins/lisa-agy/skills/lisa-qa-fail/SKILL.md +92 -0
- package/plugins/lisa-agy/skills/lisa-qa-queue/SKILL.md +69 -0
- package/plugins/lisa-agy/skills/lisa-rework-triage/SKILL.md +155 -0
- package/plugins/lisa-agy/skills/lisa-ticket-triage/SKILL.md +21 -1
- 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/learner.agent.md +8 -1
- package/plugins/lisa-copilot/agents/learnings-synthesizer.agent.md +4 -1
- package/plugins/lisa-copilot/commands/lisa/qa-checklist.md +6 -0
- package/plugins/lisa-copilot/commands/lisa/qa-clear.md +6 -0
- package/plugins/lisa-copilot/commands/lisa/qa-fail.md +6 -0
- package/plugins/lisa-copilot/commands/lisa/qa-queue.md +6 -0
- package/plugins/lisa-copilot/commands/lisa/rework-triage.md +6 -0
- package/plugins/lisa-copilot/skills/lisa-debrief-apply/SKILL.md +9 -2
- package/plugins/lisa-copilot/skills/lisa-qa-checklist/SKILL.md +70 -0
- package/plugins/lisa-copilot/skills/lisa-qa-clear/SKILL.md +74 -0
- package/plugins/lisa-copilot/skills/lisa-qa-fail/SKILL.md +92 -0
- package/plugins/lisa-copilot/skills/lisa-qa-queue/SKILL.md +69 -0
- package/plugins/lisa-copilot/skills/lisa-rework-triage/SKILL.md +155 -0
- package/plugins/lisa-copilot/skills/lisa-ticket-triage/SKILL.md +21 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/agents/learner.md +8 -1
- package/plugins/lisa-cursor/agents/learnings-synthesizer.md +4 -1
- package/plugins/lisa-cursor/commands/lisa/qa-checklist.md +6 -0
- package/plugins/lisa-cursor/commands/lisa/qa-clear.md +6 -0
- package/plugins/lisa-cursor/commands/lisa/qa-fail.md +6 -0
- package/plugins/lisa-cursor/commands/lisa/qa-queue.md +6 -0
- package/plugins/lisa-cursor/commands/lisa/rework-triage.md +6 -0
- package/plugins/lisa-cursor/skills/lisa-debrief-apply/SKILL.md +9 -2
- package/plugins/lisa-cursor/skills/lisa-qa-checklist/SKILL.md +70 -0
- package/plugins/lisa-cursor/skills/lisa-qa-clear/SKILL.md +74 -0
- package/plugins/lisa-cursor/skills/lisa-qa-fail/SKILL.md +92 -0
- package/plugins/lisa-cursor/skills/lisa-qa-queue/SKILL.md +69 -0
- package/plugins/lisa-cursor/skills/lisa-rework-triage/SKILL.md +155 -0
- package/plugins/lisa-cursor/skills/lisa-ticket-triage/SKILL.md +21 -1
- 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/learner.md +8 -1
- package/plugins/src/base/agents/learnings-synthesizer.md +4 -1
- package/plugins/src/base/commands/qa-checklist.md +6 -0
- package/plugins/src/base/commands/qa-clear.md +6 -0
- package/plugins/src/base/commands/qa-fail.md +6 -0
- package/plugins/src/base/commands/qa-queue.md +6 -0
- package/plugins/src/base/commands/rework-triage.md +6 -0
- package/plugins/src/base/skills/lisa-debrief-apply/SKILL.md +9 -2
- package/plugins/src/base/skills/lisa-qa-checklist/SKILL.md +70 -0
- package/plugins/src/base/skills/lisa-qa-clear/SKILL.md +74 -0
- package/plugins/src/base/skills/lisa-qa-fail/SKILL.md +92 -0
- package/plugins/src/base/skills/lisa-qa-queue/SKILL.md +69 -0
- package/plugins/src/base/skills/lisa-rework-triage/SKILL.md +155 -0
- package/plugins/src/base/skills/lisa-ticket-triage/SKILL.md +21 -1
package/package.json
CHANGED
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"form-data": ">=4.0.6"
|
|
103
103
|
},
|
|
104
104
|
"name": "@codyswann/lisa",
|
|
105
|
-
"version": "2.
|
|
105
|
+
"version": "2.233.0",
|
|
106
106
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
107
107
|
"main": "dist/index.js",
|
|
108
108
|
"exports": {
|
|
@@ -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 |
|
|
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…"
|
|
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…"
|
|
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"
|
|
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…"
|
|
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…"
|
|
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.
|
|
@@ -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
|
|
|
@@ -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
|
|