@codyswann/lisa 2.61.0 → 2.62.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/agents/confluence-prd-intake.md +1 -1
- package/plugins/lisa/agents/github-agent.md +4 -5
- package/plugins/lisa/agents/github-build-intake.md +1 -1
- package/plugins/lisa/agents/github-prd-intake.md +1 -1
- package/plugins/lisa/agents/linear-prd-intake.md +1 -1
- package/plugins/lisa/agents/notion-prd-intake.md +1 -1
- package/plugins/lisa/commands/intake.md +1 -1
- package/plugins/lisa/commands/project-ideation.md +3 -3
- package/plugins/lisa/commands/repair-intake.md +6 -0
- package/plugins/lisa/commands/research.md +3 -3
- package/plugins/lisa/commands/setup-automations.md +6 -0
- package/plugins/lisa/commands/tear-down-automations.md +6 -0
- package/plugins/lisa/commands/verify-prd.md +2 -2
- package/plugins/lisa/rules/config-resolution.md +63 -4
- package/plugins/lisa/rules/intent-routing.md +4 -3
- package/plugins/lisa/rules/leaf-only-lifecycle.md +1 -1
- package/plugins/lisa/rules/prd-lifecycle-rollup.md +10 -2
- package/plugins/lisa/rules/repo-scope-split.md +18 -1
- package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +24 -14
- package/plugins/lisa/skills/confluence-prd-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/confluence-write-prd/SKILL.md +103 -0
- package/plugins/lisa/skills/confluence-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/github-build-intake/SKILL.md +32 -21
- package/plugins/lisa/skills/github-evidence/SKILL.md +3 -26
- package/plugins/lisa/skills/github-evidence/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/github-journey/SKILL.md +2 -2
- package/plugins/lisa/skills/github-prd-intake/SKILL.md +25 -11
- package/plugins/lisa/skills/github-prd-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/github-sync/SKILL.md +5 -5
- package/plugins/lisa/skills/github-write-issue/SKILL.md +15 -6
- package/plugins/lisa/skills/github-write-prd/SKILL.md +100 -0
- package/plugins/lisa/skills/github-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/implement/SKILL.md +13 -6
- package/plugins/lisa/skills/intake/SKILL.md +13 -12
- package/plugins/lisa/skills/intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/jira-build-intake/SKILL.md +24 -11
- package/plugins/lisa/skills/jira-write-ticket/SKILL.md +8 -0
- package/plugins/lisa/skills/linear-build-intake/SKILL.md +22 -9
- package/plugins/lisa/skills/linear-prd-intake/SKILL.md +23 -13
- package/plugins/lisa/skills/linear-prd-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/linear-write-issue/SKILL.md +10 -2
- package/plugins/lisa/skills/linear-write-prd/SKILL.md +90 -0
- package/plugins/lisa/skills/linear-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/notion-access/SKILL.md +2 -0
- package/plugins/lisa/skills/notion-prd-intake/SKILL.md +22 -12
- package/plugins/lisa/skills/notion-prd-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/notion-write-prd/SKILL.md +107 -0
- package/plugins/lisa/skills/notion-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/prd-source-write/SKILL.md +80 -0
- package/plugins/lisa/skills/prd-source-write/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/project-ideation/SKILL.md +183 -80
- package/plugins/lisa/skills/repair-intake/SKILL.md +403 -0
- package/plugins/lisa/skills/repair-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/research/SKILL.md +19 -3
- package/plugins/lisa/skills/research/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/setup-automations/SKILL.md +78 -0
- package/plugins/lisa/skills/setup-automations/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/setup-github/SKILL.md +0 -1
- package/plugins/lisa/skills/tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa/skills/tear-down-automations/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/tracker-build-intake/SKILL.md +6 -2
- package/plugins/lisa/skills/tracker-build-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/tracker-evidence/SKILL.md +2 -2
- package/plugins/lisa/skills/tracker-sync/SKILL.md +1 -1
- package/plugins/lisa/skills/verify-prd/SKILL.md +41 -38
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -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/commands/exploratory-qa.md +3 -3
- package/plugins/lisa-expo/skills/exploratory-qa/SKILL.md +48 -18
- package/plugins/lisa-expo/skills/exploratory-qa/agents/openai.yaml +2 -2
- 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/commands/exploratory-qa.md +3 -3
- package/plugins/lisa-harper-fabric/skills/exploratory-qa/SKILL.md +48 -18
- package/plugins/lisa-harper-fabric/skills/exploratory-qa/agents/openai.yaml +2 -2
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-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-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/commands/exploratory-qa.md +3 -3
- package/plugins/lisa-rails/skills/exploratory-qa/SKILL.md +48 -18
- package/plugins/lisa-rails/skills/exploratory-qa/agents/openai.yaml +2 -2
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-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/skills/lisa-wiki-ingest/SKILL.md +30 -1
- package/plugins/src/base/agents/confluence-prd-intake.md +1 -1
- package/plugins/src/base/agents/github-agent.md +4 -5
- package/plugins/src/base/agents/github-build-intake.md +1 -1
- package/plugins/src/base/agents/github-prd-intake.md +1 -1
- package/plugins/src/base/agents/linear-prd-intake.md +1 -1
- package/plugins/src/base/agents/notion-prd-intake.md +1 -1
- package/plugins/src/base/commands/intake.md +1 -1
- package/plugins/src/base/commands/project-ideation.md +3 -3
- package/plugins/src/base/commands/repair-intake.md +6 -0
- package/plugins/src/base/commands/research.md +3 -3
- package/plugins/src/base/commands/setup-automations.md +6 -0
- package/plugins/src/base/commands/tear-down-automations.md +6 -0
- package/plugins/src/base/commands/verify-prd.md +2 -2
- package/plugins/src/base/rules/config-resolution.md +63 -4
- package/plugins/src/base/rules/intent-routing.md +4 -3
- package/plugins/src/base/rules/leaf-only-lifecycle.md +1 -1
- package/plugins/src/base/rules/prd-lifecycle-rollup.md +10 -2
- package/plugins/src/base/rules/repo-scope-split.md +18 -1
- package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +24 -14
- package/plugins/src/base/skills/confluence-write-prd/SKILL.md +103 -0
- package/plugins/src/base/skills/github-build-intake/SKILL.md +32 -21
- package/plugins/src/base/skills/github-evidence/SKILL.md +3 -26
- package/plugins/src/base/skills/github-journey/SKILL.md +2 -2
- package/plugins/src/base/skills/github-prd-intake/SKILL.md +25 -11
- package/plugins/src/base/skills/github-sync/SKILL.md +5 -5
- package/plugins/src/base/skills/github-write-issue/SKILL.md +15 -6
- package/plugins/src/base/skills/github-write-prd/SKILL.md +100 -0
- package/plugins/src/base/skills/implement/SKILL.md +13 -6
- package/plugins/src/base/skills/intake/SKILL.md +13 -12
- package/plugins/src/base/skills/jira-build-intake/SKILL.md +24 -11
- package/plugins/src/base/skills/jira-write-ticket/SKILL.md +8 -0
- package/plugins/src/base/skills/linear-build-intake/SKILL.md +22 -9
- package/plugins/src/base/skills/linear-prd-intake/SKILL.md +23 -13
- package/plugins/src/base/skills/linear-write-issue/SKILL.md +10 -2
- package/plugins/src/base/skills/linear-write-prd/SKILL.md +90 -0
- package/plugins/src/base/skills/notion-access/SKILL.md +2 -0
- package/plugins/src/base/skills/notion-prd-intake/SKILL.md +22 -12
- package/plugins/src/base/skills/notion-write-prd/SKILL.md +107 -0
- package/plugins/src/base/skills/prd-source-write/SKILL.md +80 -0
- package/plugins/src/base/skills/project-ideation/SKILL.md +183 -80
- package/plugins/src/base/skills/repair-intake/SKILL.md +403 -0
- package/plugins/src/base/skills/research/SKILL.md +19 -3
- package/plugins/src/base/skills/setup-automations/SKILL.md +78 -0
- package/plugins/src/base/skills/setup-github/SKILL.md +0 -1
- package/plugins/src/base/skills/tear-down-automations/SKILL.md +34 -0
- package/plugins/src/base/skills/tracker-build-intake/SKILL.md +6 -2
- package/plugins/src/base/skills/tracker-evidence/SKILL.md +2 -2
- package/plugins/src/base/skills/tracker-sync/SKILL.md +1 -1
- package/plugins/src/base/skills/verify-prd/SKILL.md +41 -38
- package/plugins/src/expo/commands/exploratory-qa.md +3 -3
- package/plugins/src/expo/skills/exploratory-qa/SKILL.md +48 -18
- package/plugins/src/harper-fabric/commands/exploratory-qa.md +3 -3
- package/plugins/src/harper-fabric/skills/exploratory-qa/SKILL.md +48 -18
- package/plugins/src/rails/commands/exploratory-qa.md +3 -3
- package/plugins/src/rails/skills/exploratory-qa/SKILL.md +48 -18
- package/plugins/src/wiki/skills/lisa-wiki-ingest/SKILL.md +30 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tracker-evidence
|
|
3
|
-
description: "Vendor-neutral wrapper for posting verification evidence. Reads `tracker` from .lisa.config.json (default: jira) and dispatches to lisa:jira-evidence, lisa:github-evidence, or lisa:linear-evidence. Uploads evidence to the GitHub `pr-assets` release, updates the PR description, posts a comment on the originating ticket/issue, and
|
|
3
|
+
description: "Vendor-neutral wrapper for posting verification evidence. Reads `tracker` from .lisa.config.json (default: jira) and dispatches to lisa:jira-evidence, lisa:github-evidence, or lisa:linear-evidence. Uploads evidence to the GitHub `pr-assets` release, updates the PR description, posts a comment on the originating ticket/issue, and leaves workflow transitions to the tracker-specific lifecycle owner."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "Read"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -45,6 +45,6 @@ The checklist is tracker-agnostic — the same shape works on JIRA, GitHub Issue
|
|
|
45
45
|
- **Feature/UX completion:** state plainly which acceptance criteria each screenshot covers, and call out any deferred or out-of-scope surface explicitly so QA/PM doesn't have to infer.
|
|
46
46
|
6. **"What would help me confirm" (bug) / "How to QA" (feature) section.** Concrete actionable retest steps with the exact selection criteria (e.g., "pick a record whose Status column shows `—`, not `Processing` or `Pending Review`").
|
|
47
47
|
7. **Explicit invitation to be corrected.** End with a line like *"If any of the steps I listed are different from what you expected / actually did, please tell me explicitly which step I got wrong."* Non-optional — small differences (which record, which device, exact tap order, expected behavior) change everything, and naming the door open short-circuits ticket bounce-loops.
|
|
48
|
-
8. **Workflow transition** is the vendor skill's job, not yours — it'll move the ticket per the configured tracker (JIRA: Reassign to reporter for bug repro / move to Awaiting QA for feature; GitHub:
|
|
48
|
+
8. **Workflow transition** is the vendor skill's job, not yours — it'll move the ticket per the configured tracker (JIRA: Reassign to reporter for bug repro / move to Awaiting QA for feature; GitHub: direct `claimed` → configured `done` after a successful build; Linear: equivalent state). You don't transition manually.
|
|
49
49
|
|
|
50
50
|
**Why this format:** It (a) gives the reporter a frame-by-frame they can compare against, (b) avoids the JIRA image-collapse failure mode while still working everywhere else, (c) names the most plausible discrepancies up front so the loop short-circuits, (d) explicitly opens the door to being corrected so tickets don't bounce on assumed alignment. The same mechanics that resolve a stuck bug ticket also give QA an unambiguous handoff for a freshly-built feature.
|
|
@@ -40,7 +40,7 @@ The state machine (first match wins, evaluated over the **required** leaves only
|
|
|
40
40
|
- **Blocked dominates** — one blocked leaf surfaces blocked on the parent even while others progress.
|
|
41
41
|
- **The parent never carries `ready`** — `ready` is a human "claim this leaf" signal; rollup only moves a parent between non-ready container states.
|
|
42
42
|
- **Rollup is recursive** — an Epic rolls up from its Stories, each of which rolls up from its own leaves. Evaluate bottom-up.
|
|
43
|
-
- **The terminal is the configured env-keyed `done`** — multi-env projects roll up to whichever `done` value matches the env their leaves shipped to (see `config-resolution` "Env-keyed `done`"). **Single-environment collapse (this repo):** `deploy.branches` declares only `production: main`, so `done` is a single value and the lifecycle collapses to `ready → claimed (in-progress) →
|
|
43
|
+
- **The terminal is the configured env-keyed `done`** — multi-env projects roll up to whichever `done` value matches the env their leaves shipped to (see `config-resolution` "Env-keyed `done`"). **Single-environment collapse (this repo):** `deploy.branches` declares only `production: main`, so `done` is a single value and the GitHub build lifecycle collapses to `ready → claimed (in-progress) → done`; the rollup terminal is simply `done` (or the PRD-side `ticketed` for PRD containers), with **no** dev/staging promotion hops and **no** env-keyed multi-entry chain to resolve.
|
|
44
44
|
|
|
45
45
|
**Safe-by-default when not yet supported.** A vendor sync path that has not implemented native rollup MUST be a documented no-op that surfaces the derived state as a suggestion/comment rather than guessing a transition — never an unsafe default. Without `--rollup`, the sync skills behave exactly as before (milestone comment on the work item; no parent derivation).
|
|
46
46
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: verify-prd
|
|
3
|
-
description: "Initiative-level PRD acceptance gate. Given a PRD ref/URL (GitHub Issue, Linear project/issue, Notion page, Confluence page, or JIRA issue), resolves the source vendor, reads the PRD body and its generated top-level child work set via the prd-lifecycle-rollup contract (native hierarchy first, machine-readable generated-work section fallback — never reimplementing child enumeration), and confirms every required generated top-level work item is terminal before any verification runs. If any required top-level child is non-terminal, it reports the incomplete child set and STOPS without verifying or transitioning the PRD. When the guard passes, it runs spec-conformance against the original PRD requirements (via the spec-conformance skill) plus empirical verification appropriate to the shipped surface (via verification-lifecycle). On a CONFORMS verdict with all empirical checks passing it runs the PASS path: transitions the PRD shipped → verified and posts verification evidence. On a PARTIAL/DIVERGES conformance verdict or any failing empirical check it runs the FAIL path:
|
|
3
|
+
description: "Initiative-level PRD acceptance gate. Given a PRD ref/URL (GitHub Issue, Linear project/issue, Notion page, Confluence page, or JIRA issue), resolves the source vendor, reads the PRD body and its generated top-level child work set via the prd-lifecycle-rollup contract (native hierarchy first, machine-readable generated-work section fallback — never reimplementing child enumeration), and confirms every required generated top-level work item is terminal before any verification runs. If any required top-level child is non-terminal, it reports the incomplete child set and STOPS without verifying or transitioning the PRD. When the guard passes, it runs spec-conformance against the original PRD requirements (via the spec-conformance skill) plus empirical verification appropriate to the shipped surface (via verification-lifecycle). On a CONFORMS verdict with all empirical checks passing it runs the PASS path: transitions the PRD shipped → verified and posts verification evidence. On a PARTIAL/DIVERGES conformance verdict or any failing empirical check it runs the self-healing FAIL path: it re-opens the PRD shipped → ticketed (NEVER blocked), creates build-ready fix tickets (via tracker-write with build_ready: true) for each missing/incorrect/divergent behavior — registered as the PRD's generated work — and posts a product-readable failure report (with a verification-round count) naming which requirements/ACs failed with observed-vs-expected evidence. The fix tickets auto-build, rollup re-ships the PRD once they are terminal, and a later intake cycle re-verifies — the loop closes itself and never auto-halts. Re-runs are idempotent: evidence/failure-report comments are regenerated in place via a stable sentinel marker (never appended, round incremented), fix tickets are deduped by a stable PRD-ref + requirement marker (referenced/updated, never duplicated), and the lifecycle transition is a no-op when the PRD already carries the target role (exactly one lifecycle label/status remains) — per the prd-lifecycle-rollup idempotency dedupe key (match by stable ref, never by title)."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "Read", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__linear-server__get_project", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__list_documents", "mcp__linear-server__get_document"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -26,10 +26,10 @@ This skill covers the **read/guard front-half**, **both verdict branches** (PASS
|
|
|
26
26
|
4. **Spec conformance** — when the guard passes, invoke the `spec-conformance` skill with the PRD as the spec source to build a section-by-section coverage matrix against the shipped product (never reimplementing the matrix).
|
|
27
27
|
5. **Empirical verification** — invoke `verification-lifecycle` to run empirical checks appropriate to the PRD's surface (browser/computer-use, API, CLI, DB, screenshots, logs), honoring the `verification` rule. Quality gates (test/typecheck/lint) are **not** verification.
|
|
28
28
|
6. **PASS transition + evidence** — when spec conformance is `CONFORMS` **and** every applicable empirical check passes, transition the PRD lifecycle from the resolved `shipped` role to the resolved `verified` role (vendor-neutral via `config-resolution`) and post verification evidence (the coverage matrix + empirical proof artifacts) back on the PRD.
|
|
29
|
-
7. **FAIL
|
|
30
|
-
8. **Idempotency** — every write in Phases 6 and 7 is safe to re-run: evidence/failure-report comments carry a stable sentinel marker and are **regenerated in place** (never appended), fix
|
|
29
|
+
7. **FAIL — re-open as `ticketed` + build-ready fix tickets (self-healing, never `blocked`)** — when spec conformance is `PARTIAL`/`DIVERGES`, or any applicable empirical check fails (or a required surface is unavailable), move the PRD from the resolved `shipped` role back to the resolved `ticketed` role, create **build-ready fix tickets** via `tracker-write` (`build_ready: true`) for each missing/incorrect/divergent behavior — **added to the PRD's generated top-level work** — and post a product-readable failure report (with the verification-round count). PRD verification **never** moves the PRD to `blocked`. The fix tickets auto-build, rollup (`*-prd-intake` Phase 3f) re-ships the PRD once they are terminal, and a later intake cycle (Phase 3g) re-verifies — the loop closes itself.
|
|
30
|
+
8. **Idempotency** — every write in Phases 6 and 7 is safe to re-run: evidence/failure-report comments carry a stable sentinel marker and are **regenerated in place** (never appended), fix tickets are deduped by a stable PRD-ref + requirement marker (**referenced/updated, never duplicated**), and the lifecycle transition is a **no-op when the PRD already carries the target role** (exactly one lifecycle label/status remains). See **Phase 8 — Idempotency** for the per-write guards.
|
|
31
31
|
|
|
32
|
-
When verification passes, this skill runs the **PASS** branch of Phase 6 (`shipped → verified`). When it does not pass — spec conformance not `CONFORMS`, or any empirical check failing — this skill runs the **FAIL** branch of Phase 7 (`shipped →
|
|
32
|
+
When verification passes, this skill runs the **PASS** branch of Phase 6 (`shipped → verified`). When it does not pass — spec conformance not `CONFORMS`, or any empirical check failing — this skill runs the **FAIL** branch of Phase 7 (`shipped → ticketed` + build-ready fix tickets + failure report); it does **not** leave the PRD at `shipped` and **never** uses `blocked` (PRD verification is self-healing — the fix tickets auto-build and the PRD re-ships and re-verifies). Re-running the skill against the same PRD produces no duplicate evidence comments, no duplicate fix tickets, and no duplicate lifecycle labels/statuses — the **Phase 8** guards make each Phase 6/7 write idempotent, exactly as `prd-backlink` regenerates its `## Tickets` section in place and `github-prd-intake` no-ops a rollup on an already-shipped PRD.
|
|
33
33
|
|
|
34
34
|
## Phase 1 — Resolve the PRD ref and detect the source vendor
|
|
35
35
|
|
|
@@ -146,7 +146,7 @@ Reach this phase **only** when **both** are true:
|
|
|
146
146
|
- Phase 4 spec conformance returned **`CONFORMS`**, and
|
|
147
147
|
- Phase 5 every applicable empirical check **passed** (and was codified where required).
|
|
148
148
|
|
|
149
|
-
If either is false, do not enter this phase — record the verdict and route to **Phase 7 — FAIL**, which owns the `shipped →
|
|
149
|
+
If either is false, do not enter this phase — record the verdict and route to **Phase 7 — FAIL**, which owns the `shipped → ticketed` (re-open + build-ready fix tickets) path.
|
|
150
150
|
|
|
151
151
|
### 6.1 — Resolve the `verified` and `shipped` roles
|
|
152
152
|
|
|
@@ -212,28 +212,30 @@ The marked comment is the single canonical evidence comment for the PRD — a re
|
|
|
212
212
|
|
|
213
213
|
Then emit the PASS output block (below).
|
|
214
214
|
|
|
215
|
-
## Phase 7 — FAIL:
|
|
215
|
+
## Phase 7 — FAIL: re-open as `ticketed`, create build-ready fix tickets, post a failure report (never `blocked`)
|
|
216
216
|
|
|
217
217
|
Reach this phase when verification did **not** pass — i.e. **either** is true:
|
|
218
218
|
|
|
219
219
|
- Phase 4 spec conformance returned **`PARTIAL`** or **`DIVERGES`** (`CONFORMANCE_FAILED` cause), or
|
|
220
220
|
- Phase 5 had **any** applicable empirical check fail or a required surface unavailable (`EMPIRICAL_FAILED` cause).
|
|
221
221
|
|
|
222
|
-
This is the FAIL counterpart of the Phase 6 PASS hop
|
|
222
|
+
PRD verification failure is **self-healing, not a dead end**. Instead of parking the PRD in `blocked` for a human, this phase: (1) moves the PRD back to `ticketed` (work in flight again), (2) creates **build-ready fix tickets** for the gaps so the build queue picks them up with no human promotion, and (3) posts a failure report. The fix tickets are added to the PRD's generated top-level work, so the existing machinery closes the loop on its own: the fix tickets build → reach terminal → the `*-prd-intake` rollup (Phase 3f) re-ships the PRD `ticketed → shipped` → the next intake cycle (Phase 3g) re-dispatches `/lisa:verify-prd` → PASS gives `verified`, FAIL runs this phase again with another round of fix tickets. This is the FAIL counterpart of the Phase 6 PASS hop and is the `shipped → ticketed` FAIL hop the `prd-lifecycle-rollup` rule's "Closing the loop" section defines (cite it by slug; this skill is its FAIL-path implementation, not a second source of truth).
|
|
223
|
+
|
|
224
|
+
**PRD verification never moves the PRD to `blocked`.** `blocked` is the *intake* (ready-stage validation) failure state, not the verification failure state — there is no `prd-verifying` / `prd-verification-failed` state either; the lifecycle stays small. The loop never auto-halts; the failure report carries a **verification-round count** so a human can spot a PRD stuck across repeated rounds, but the skill keeps creating fix tickets and re-verifying.
|
|
223
225
|
|
|
224
226
|
Carry forward the verdict cause and the concrete **findings** that produced it: from `CONFORMANCE_FAILED`, the matrix's missed/divergent/scope-crept requirements; from `EMPIRICAL_FAILED`, each failing check (the requirement/AC it exercised, the tool/command, observed vs expected, and any captured artifacts). These findings drive both the failure report (7.3) and the fix issues (7.4).
|
|
225
227
|
|
|
226
|
-
### 7.1 — Resolve the `
|
|
228
|
+
### 7.1 — Resolve the `shipped` and `ticketed` roles
|
|
227
229
|
|
|
228
230
|
Resolve the PRD-lifecycle roles from `.lisa.config.json` (then `.lisa.config.local.json` override) per the `config-resolution` rule — the same role-resolution Phase 6.1 and the `*-prd-intake` skills use. **Cite `config-resolution` for the role vocabulary; do not hardcode label strings except as the documented defaults.** Resolution per vendor:
|
|
229
231
|
|
|
230
|
-
| Vendor | `shipped` role | `
|
|
232
|
+
| Vendor | `shipped` role | `ticketed` role | Default `ticketed` |
|
|
231
233
|
|---|---|---|---|
|
|
232
|
-
| **GitHub** | `github.labels.prd.shipped` | `github.labels.prd.
|
|
233
|
-
| **Linear** | `linear.labels.prd.shipped` | `linear.labels.prd.
|
|
234
|
-
| **Notion** | `notion.values.shipped` | `notion.values.
|
|
235
|
-
| **Confluence** | `confluence.parents.shipped` | `confluence.parents.
|
|
236
|
-
| **JIRA** | the configured shipped status | the configured
|
|
234
|
+
| **GitHub** | `github.labels.prd.shipped` | `github.labels.prd.ticketed` | `prd-ticketed` (label) |
|
|
235
|
+
| **Linear** | `linear.labels.prd.shipped` | `linear.labels.prd.ticketed` | `prd-ticketed` (project/issue label) |
|
|
236
|
+
| **Notion** | `notion.values.shipped` | `notion.values.ticketed` | `Ticketed` (status value) |
|
|
237
|
+
| **Confluence** | `confluence.parents.shipped` | `confluence.parents.ticketed` | the `Ticketed` parent page id |
|
|
238
|
+
| **JIRA** | the configured shipped status | the configured ticketed status | per `config-resolution` |
|
|
237
239
|
|
|
238
240
|
For GitHub, resolve with the same helper Phase 6.1 / `github-prd-intake` use:
|
|
239
241
|
|
|
@@ -245,25 +247,25 @@ read_role() { # role default → resolved value (local override wins)
|
|
|
245
247
|
echo "${local_v:-${global_v:-$default}}"
|
|
246
248
|
}
|
|
247
249
|
SHIPPED=$(read_role shipped prd-shipped)
|
|
248
|
-
|
|
250
|
+
TICKETED=$(read_role ticketed prd-ticketed)
|
|
249
251
|
```
|
|
250
252
|
|
|
251
|
-
### 7.2 —
|
|
253
|
+
### 7.2 — Re-open the PRD `shipped → ticketed`
|
|
252
254
|
|
|
253
|
-
**Idempotency guard (no-op if already
|
|
255
|
+
**Idempotency guard (no-op if already ticketed).** Before transitioning, read the PRD's current lifecycle role. If the PRD **already carries `$TICKETED`** (the common re-run case — a prior failed round already re-opened it and its fix tickets are still in flight), the transition is a **no-op** — do not re-add the label/status, do not re-remove `$SHIPPED` (already gone). Record it as `already ticketed (no-op)` and proceed to 7.3, where the existing failure report is **updated in place** (not stacked, round count incremented) and 7.4, where existing fix tickets are **referenced** rather than re-created. This mirrors `github-prd-intake` Phase 3f.1's "no-op if already shipped" guard and the `prd-lifecycle-rollup` "rollup is keyed by the PRD's current state" rule (cite both by slug).
|
|
254
256
|
|
|
255
|
-
Otherwise apply the vendor-appropriate transition. This is the `shipped →
|
|
257
|
+
Otherwise apply the vendor-appropriate transition. This is the `shipped → ticketed` FAIL hop from the `prd-lifecycle-rollup` rule's "Closing the loop" section (cite it by slug) — a deliberate backward hop that puts the PRD back into "work in flight" so its new fix tickets are the in-flight work the rollup waits on:
|
|
256
258
|
|
|
257
|
-
- **GitHub / Linear** — remove the `shipped` label and add the `
|
|
259
|
+
- **GitHub / Linear** — remove the `shipped` label and add the `ticketed` label. For GitHub:
|
|
258
260
|
```bash
|
|
259
|
-
gh issue edit <prd-num> --repo <org>/<repo> --remove-label "$SHIPPED" --add-label "$
|
|
261
|
+
gh issue edit <prd-num> --repo <org>/<repo> --remove-label "$SHIPPED" --add-label "$TICKETED"
|
|
260
262
|
```
|
|
261
|
-
Verify exactly **one** PRD-lifecycle label remains afterward (the single-label invariant `github-prd-intake` enforces) — a re-run must never leave both `$SHIPPED` and `$
|
|
262
|
-
- **Notion** — set the PRD page's `notion.statusProperty` (default `Status`) to the resolved `
|
|
263
|
-
- **Confluence** — move the PRD page's `parentId` to `confluence.parents.
|
|
264
|
-
- **JIRA** — transition the PRD issue to the configured `
|
|
263
|
+
Verify exactly **one** PRD-lifecycle label remains afterward (the single-label invariant `github-prd-intake` enforces) — a re-run must never leave both `$SHIPPED` and `$TICKETED`, nor two copies of `$TICKETED`. For Linear, set the project/issue label equivalently.
|
|
264
|
+
- **Notion** — set the PRD page's `notion.statusProperty` (default `Status`) to the resolved `ticketed` value (default `Ticketed`). A status property holds exactly one value, so re-setting the same value is inherently a no-op.
|
|
265
|
+
- **Confluence** — move the PRD page's `parentId` to `confluence.parents.ticketed` (the parent-page-based lifecycle; Atlassian scoped tokens cannot write labels — see `config-resolution`). A page has exactly one parent, so re-parenting to the same parent is a no-op.
|
|
266
|
+
- **JIRA** — transition the PRD issue to the configured `ticketed` status. An issue holds exactly one status; if already `ticketed`, skip the transition.
|
|
265
267
|
|
|
266
|
-
Do **not** close or archive the PRD here
|
|
268
|
+
Do **not** close or archive the PRD here, and **never** move it to `blocked` — `ticketed` signals "verification found gaps; fix work is in flight," and the PRD re-ships and re-verifies automatically once that work lands.
|
|
267
269
|
|
|
268
270
|
### 7.3 — Post a product-readable failure report on the PRD
|
|
269
271
|
|
|
@@ -273,7 +275,7 @@ Post a **failure report** comment back on the PRD, via the same vendor surface P
|
|
|
273
275
|
|
|
274
276
|
1. **Sentinel marker** — the literal `<!-- lisa:verify-prd-failure-report -->` as the first line, so the next run finds and regenerates this exact comment.
|
|
275
277
|
2. **AI disclosure** — lead with "PRD-level verification by Claude (AI agent, not a human)."
|
|
276
|
-
3. **Verdict line** — `shipped →
|
|
278
|
+
3. **Verdict line + round** — `shipped → ticketed — FAIL (re-opened for fixes)`, the cause (`CONFORMANCE_FAILED` or `EMPIRICAL_FAILED`), and `Round: N` — the count of failed verification rounds for this PRD. Read the prior in-place failure report's round and increment (start at 1). The loop **never auto-halts** on a high count, but surfacing it lets a human notice a PRD stuck across repeated fix-and-re-verify rounds.
|
|
277
279
|
4. **What failed, in plain language** — for each finding, name the **specific PRD requirement / acceptance criterion** that was not met, then **what was expected vs what was observed** (the empirical evidence: what was checked, what the shipped product did instead). One bullet per finding so product can follow each independently.
|
|
278
280
|
5. **Spec-conformance coverage matrix** — for a `CONFORMANCE_FAILED` cause, the section-by-section matrix from Phase 4 verbatim with the `PARTIAL`/`DIVERGES` verdict, so the missed/divergent/scope-crept rows are visible.
|
|
279
281
|
6. **Proof artifacts** — any captured empirical artifacts (screenshots uploaded via `gh release upload pr-assets <files> --clobber` and referenced as plain URLs per the `tracker-evidence` UI Evidence Checklist, request/response captures, query outputs, log excerpts).
|
|
@@ -281,7 +283,7 @@ Post a **failure report** comment back on the PRD, via the same vendor surface P
|
|
|
281
283
|
|
|
282
284
|
### 7.4 — Create linked fix issues for the missing/incorrect behavior
|
|
283
285
|
|
|
284
|
-
For **each** failed/missing/incorrect/divergent finding, create a **fix
|
|
286
|
+
For **each** failed/missing/incorrect/divergent finding, create a **build-ready fix ticket** via `tracker-write` with **`build_ready: true`** (the vendor-neutral writer) — never by hand-rolling `gh issue create`, so each ticket passes the same quality gates (`tracker-validate`) every Lisa ticket does: three-audience description, **Gherkin acceptance criteria**, labels, and explicit relationship discovery. `build_ready: true` makes the build queue (`lisa:intake` build side / `*-build-intake`) auto-claim it with **no human promotion** — that is what makes the loop self-healing. Group findings that share one root cause into one fix ticket; do not fan out one ticket per matrix cell when several rows are the same defect.
|
|
285
287
|
|
|
286
288
|
**Idempotent — dedupe fix issues by a stable marker; reference/update, never duplicate.** This is the "re-run after a previous failure with the same missing behavior" scenario: the prior run already opened a fix issue for that requirement, so the re-run must **find and reuse it**, not create a second one. Apply the `prd-lifecycle-rollup` idempotency dedupe key discipline (**match by a stable ref, never by title**):
|
|
287
289
|
|
|
@@ -297,8 +299,9 @@ Each fix issue (whether freshly created or referenced/updated) MUST:
|
|
|
297
299
|
3. **Carry the captured evidence** — the observed-vs-expected from the failure report (what was checked, what was expected, what the shipped product did), so an implementer can reproduce without re-deriving it.
|
|
298
300
|
4. **Back-link to the PRD and the failure report** — link to the PRD (so the fix rolls back up to the initiative) and to the failure-report comment from 7.3 (so the full context is one click away). On GitHub, reference the PRD issue number and the failure-report comment URL in the body and, where supported, as a sub-issue/`Relates to` link; on Linear, set the relation; on JIRA, add the issue link and remote link.
|
|
299
301
|
5. **Have acceptance criteria** — Gherkin ACs describing the corrected behavior (what "fixed" looks like), enforced by `tracker-write` → the vendor `*-validate-issue` gate.
|
|
302
|
+
6. **Be build-ready and counted as PRD work** — created via `tracker-write` with `build_ready: true`, and **registered in the PRD's generated top-level work**: refresh the PRD's `## Tickets` / generated-work section via `lisa:prd-backlink` and, where the host supports it, link it as a native sub-issue/child of the PRD. This is what closes the loop — the `*-prd-intake` rollup (Phase 3f) holds the PRD in `ticketed` until every fix ticket is terminal, and a re-verify's Phase 2/3 then counts them as required children.
|
|
300
303
|
|
|
301
|
-
Pass each new fix
|
|
304
|
+
Pass each new fix ticket's spec to `tracker-write` with `build_ready: true` (which dispatches to `github-write-issue` / `jira-write-ticket` / `linear-write-issue` per config — each honors `build_ready`). Collect the created **and referenced** refs/URLs, register them as PRD generated work (item 6), and fold them into the failure report's **Fix tickets** list (7.3 item 7).
|
|
302
305
|
|
|
303
306
|
> **Why not reopen children?** The generated top-level children are already terminal (that is the Phase 3 precondition for verification). A failed PRD-level acceptance is a **new** defect discovered against the shipped initiative, so it gets **new** fix issues linked to the PRD — not a reopen of closed build tickets, which would corrupt their build lifecycle (`leaf-only-lifecycle`).
|
|
304
307
|
|
|
@@ -326,7 +329,7 @@ Emit a single fenced text block so callers can parse it.
|
|
|
326
329
|
## verify-prd: <PRD title>
|
|
327
330
|
|
|
328
331
|
PRD: <ref/URL> (vendor: <github|linear|notion|confluence|jira>)
|
|
329
|
-
PRD lifecycle state: <shipped | verified>
|
|
332
|
+
PRD lifecycle state: <shipped | verified | ticketed>
|
|
330
333
|
Generated top-level children read: <n> (source: native | documented | both)
|
|
331
334
|
|
|
332
335
|
### Terminal-child guard
|
|
@@ -345,20 +348,20 @@ Surface: <browser | api | cli | db | logs | ...> (PRD-dependent)
|
|
|
345
348
|
|
|
346
349
|
### Lifecycle transition (PASS or FAIL)
|
|
347
350
|
shipped → verified (role: <resolved verified role>) evidence posted: <link> # on VERIFIED_PASS (re-run: evidence comment regenerated in place; transition no-op if already verified)
|
|
348
|
-
shipped →
|
|
351
|
+
shipped → ticketed (re-opened for fixes; round: N) fix tickets (ready): <refs> failure report: <link> # on CONFORMANCE_FAILED | EMPIRICAL_FAILED (re-run: failure report regenerated in place + round incremented; fix tickets deduped by marker; transition no-op if already ticketed; never blocked)
|
|
349
352
|
|
|
350
353
|
### Verdict: VERIFIED_PASS | CONFORMANCE_FAILED | EMPIRICAL_FAILED | GUARD_BLOCKED | NO_CHILDREN
|
|
351
354
|
```
|
|
352
355
|
|
|
353
356
|
- `GUARD_BLOCKED` — one or more required top-level children are non-terminal; verification did not run; the PRD was left at `shipped`.
|
|
354
357
|
- `NO_CHILDREN` — no generated top-level children found; cannot verify; the PRD was left untouched.
|
|
355
|
-
- `CONFORMANCE_FAILED` — guard passed but spec conformance returned `PARTIAL`/`DIVERGES`; empirical verification was skipped; the FAIL path ran — the PRD was
|
|
356
|
-
- `EMPIRICAL_FAILED` — guard passed and conformance `CONFORMS`, but an applicable empirical check failed or a required surface was unavailable; the FAIL path ran — the PRD was
|
|
358
|
+
- `CONFORMANCE_FAILED` — guard passed but spec conformance returned `PARTIAL`/`DIVERGES`; empirical verification was skipped; the FAIL path ran — the PRD was re-opened `shipped → ticketed`, **build-ready** fix tickets were created and registered as PRD generated work, and a product-readable failure report (with the round count) was posted (Phase 7). The PRD re-ships and re-verifies once the fix tickets are terminal; it is **never** moved to `blocked`.
|
|
359
|
+
- `EMPIRICAL_FAILED` — guard passed and conformance `CONFORMS`, but an applicable empirical check failed or a required surface was unavailable; the FAIL path ran — the PRD was re-opened `shipped → ticketed`, **build-ready** fix tickets were created and registered as PRD generated work, and a product-readable failure report (with the round count) was posted (Phase 7). The PRD re-ships and re-verifies once the fix tickets are terminal; it is **never** moved to `blocked`.
|
|
357
360
|
- `VERIFIED_PASS` — guard passed, conformance `CONFORMS`, every applicable empirical check passed and was codified; the PRD was transitioned `shipped → verified` and verification evidence was posted (Phase 6).
|
|
358
361
|
|
|
359
362
|
## Rules
|
|
360
363
|
|
|
361
|
-
- **The lifecycle writes are the PASS hop `shipped → verified` and the FAIL hop `shipped →
|
|
364
|
+
- **The lifecycle writes are the PASS hop `shipped → verified` and the FAIL hop `shipped → ticketed`.** The front-half (resolve → read child set → guard) is read-only and never transitions the PRD. After the guard passes and verification runs, this skill writes exactly one of two transitions: the Phase 6 PASS hop `shipped → verified` (when spec conformance is `CONFORMS` and every applicable empirical check passes), or the Phase 7 FAIL hop `shipped → ticketed` (when conformance is `PARTIAL`/`DIVERGES` or any applicable empirical check fails). The FAIL hop **never uses `blocked`** — it re-opens the PRD to `ticketed` with build-ready fix tickets (the self-healing loop), introducing no new failure state. The guard-blocked and no-children paths run no verification and leave the PRD at `shipped` untouched.
|
|
362
365
|
- **Every write is idempotent (Phase 8).** Re-running the skill against the same PRD produces no duplicate evidence/failure-report comments, no duplicate fix issues, and no duplicate lifecycle labels/statuses. Evidence and failure-report comments are regenerated in place via a stable sentinel marker (`<!-- lisa:verify-prd-evidence -->` / `<!-- lisa:verify-prd-failure-report -->`); fix issues are deduped by a stable PRD-ref + requirement marker (`<!-- lisa:verify-prd-fix prd=… req=… -->`) and referenced/updated rather than re-created; the lifecycle transition is a no-op when the PRD already carries the target role, leaving exactly one lifecycle label/status. The dedupe key is the `prd-lifecycle-rollup` idempotency dedupe key — **match by stable ref, never by title** — and the no-op-already-at-target-role guard mirrors `github-prd-intake` Phase 3f.1.
|
|
363
366
|
- **The FAIL path opens fix issues via `tracker-write`, never by hand.** Each fix issue is created through the vendor-neutral writer so it passes the same `tracker-validate` quality gate (three-audience description, Gherkin ACs, labels, relationships) every Lisa ticket does. Fix issues are **new** defects against the shipped initiative, back-linked to the PRD and the failure report — never reopens of the already-terminal generated children (`leaf-only-lifecycle`).
|
|
364
367
|
- **Never reimplement child enumeration.** Consume the recorded PRD→child relationship (`prd-lifecycle-rollup` native linking + machine-readable generated-work section). The two-source read here mirrors `github-prd-intake` Phase 3f.2 — same sources, same dedupe-by-child-ref, same top-level-only boundary.
|
|
@@ -366,9 +369,9 @@ shipped → blocked (role: <resolved blocked role>) failure report: <link>
|
|
|
366
369
|
- **Quality gates are not verification.** Tests, typecheck, and lint are prerequisites enforced by hooks/CI. Phase 5 requires running the actual shipped system and observing results on a surface chosen from what the PRD delivered — never substituting a green test suite for empirical proof (`verification` rule).
|
|
367
370
|
- **The verification surface is PRD-dependent.** Classify the empirical surface (browser/API/CLI/DB/logs/…) from what the PRD shipped; do not assume a fixed surface. A single-environment project with no deployed app verifies on its CLI/dry-run surface per the PRD's Empirical Verification Plan.
|
|
368
371
|
- **`verified` is product-owned and terminal.** This skill is the only automated writer of the `verified` role; intake/rollup never set it. The PASS hop does not close or archive the PRD (closure is governed by `prd.rollup.closeOnShipped` at the `shipped` hop).
|
|
369
|
-
-
|
|
372
|
+
- **Verification failure never uses `blocked`; it re-opens to `ticketed`.** The FAIL hop sets the existing `ticketed` PRD role (`config-resolution`) and creates build-ready fix tickets registered as the PRD's generated work, so the lifecycle stays small (`prd-lifecycle-rollup` "No extra failure states") and self-heals — the fix tickets auto-build, rollup re-ships the PRD, and a later cycle re-verifies. `blocked` remains the *intake* (ready-stage validation) failure role, not the verification one; the FAIL hop never closes or archives the PRD.
|
|
370
373
|
- **Top-level only.** Exclude leaf Sub-tasks and Stories nested under a generated Epic. The PRD owns its top-level work; those top-level units own their descendants (`prd-lifecycle-rollup` generated-top-level-work contract).
|
|
371
|
-
- **Cite, don't restate.** The generated-top-level-work boundary, the per-vendor terminal predicate, the env-keyed `done` resolution, the dedupe-by-child-ref idempotency key, and the `shipped → verified |
|
|
374
|
+
- **Cite, don't restate.** The generated-top-level-work boundary, the per-vendor terminal predicate, the env-keyed `done` resolution, the dedupe-by-child-ref idempotency key, and the `shipped → verified | ticketed` PRD-level verification hops all come from the `prd-lifecycle-rollup` rule; the `verified`/`shipped`/`blocked`/`ticketed` role vocabulary comes from `config-resolution`. This skill is a consumer of those contracts, not a second source of truth.
|
|
372
375
|
|
|
373
376
|
## Related skills
|
|
374
377
|
|
|
@@ -379,11 +382,11 @@ shipped → blocked (role: <resolved blocked role>) failure report: <link>
|
|
|
379
382
|
- `tracker-evidence` — the vendor-neutral evidence poster whose UI Evidence Checklist and `pr-assets` upload mechanics Phase 6.3 (PASS evidence) and Phase 7.3 (FAIL failure report) follow when commenting on the PRD.
|
|
380
383
|
- `tracker-write` — the vendor-neutral ticket writer Phase 7.4 invokes to create each linked fix issue (dispatching to `github-write-issue` / `jira-write-ticket` / `linear-write-issue` per config), so every fix issue clears the `tracker-validate` quality gate (Gherkin ACs, three-audience description, labels, relationships). This skill never hand-rolls issue creation.
|
|
381
384
|
- `prd-backlink` — the regenerate-in-place-via-marker idempotency pattern Phase 6.3 / 7.3 / 8 follow: it regenerates its `## Tickets` section from the current child set on every run (never appending) and dedupes by child-ref. The evidence/failure-report sentinel comments here apply the same discipline to PRD comments.
|
|
382
|
-
- `github-prd-intake` — the no-op-if-already-at-target-role guard Phase 6.2 / 7.2 / 8 mirror: its Phase 3f.1 rollup is a no-op on a PRD already carrying `$SHIPPED`, and it enforces the single-label invariant after every transition. This skill applies the same guard to the `verified` / `
|
|
385
|
+
- `github-prd-intake` — the no-op-if-already-at-target-role guard Phase 6.2 / 7.2 / 8 mirror: its Phase 3f.1 rollup is a no-op on a PRD already carrying `$SHIPPED`, and it enforces the single-label invariant after every transition. This skill applies the same guard to the `verified` / `ticketed` hops.
|
|
383
386
|
|
|
384
387
|
## Related rules
|
|
385
388
|
|
|
386
|
-
- `prd-lifecycle-rollup` — the vendor-neutral source of truth for PRD→generated-top-level-work ownership, the per-vendor terminal predicate, the `shipped` rollup, the `shipped → verified
|
|
389
|
+
- `prd-lifecycle-rollup` — the vendor-neutral source of truth for PRD→generated-top-level-work ownership, the per-vendor terminal predicate, the `shipped` rollup, the `shipped → verified` (pass) / `shipped → ticketed` (fail) PRD-level verification hops, the "no extra failure states" rule (the FAIL hop re-opens to `ticketed` and never uses `blocked`), the "Closing the loop" self-healing dispatch, and the **idempotency dedupe key** ("match by stable ref, never by title"; no-op already-shipped rollup). This skill consumes that contract — implementing the `shipped → verified` PASS hop, the `shipped → ticketed` FAIL hop, and the Phase 8 idempotency guards (marker-based comment regeneration, marker-based fix-ticket dedupe, no-op-already-at-target-role transition) — citing the rule by slug rather than restating its taxonomy.
|
|
387
390
|
- `verification` — defines what counts as empirical verification (the Verification Types table) and that quality gates (test/typecheck/lint) are prerequisites, not verification. Phase 5 honors it when classifying and running the surface-appropriate checks.
|
|
388
391
|
- `leaf-only-lifecycle` — governs the build lifecycle of leaf work units and how a generated Epic rolls up from its own children; this skill trusts that bottom-up rollup when reading a top-level child's resolved state.
|
|
389
|
-
- `config-resolution` — the PRD-lifecycle role vocabulary (`shipped`, `verified`, `blocked`), the per-vendor `verified` role maps (`prd-verified` label for GitHub/Linear, `Verified` status for Notion, `confluence.parents.verified` parent page) Phase 6.1 resolves, the per-vendor `
|
|
392
|
+
- `config-resolution` — the PRD-lifecycle role vocabulary (`shipped`, `verified`, `blocked`, `ticketed`), the per-vendor `verified` role maps (`prd-verified` label for GitHub/Linear, `Verified` status for Notion, `confluence.parents.verified` parent page) Phase 6.1 resolves, the per-vendor `ticketed` role maps Phase 7.1 resolves (the FAIL hop re-opens to `ticketed`, not `blocked`; `blocked` remains the intake-stage failure role, not used by verify-prd), and the env-keyed `done` map the terminal predicate resolves against.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Run a Playwright-backed exploratory QA pass: audit the app like a human, find user-noticeable bugs and gaps in automated test coverage, and
|
|
2
|
+
description: "Run a Playwright-backed exploratory QA pass: audit the app like a human, find user-noticeable bugs, usability issues, and gaps in automated test coverage, and file each finding as a tracked work item via lisa:tracker-write. The optional ready flag marks bug/suggestion tickets build-ready (auto-picked-up by lisa:intake) or leaves them in the backlog for human triage (default); missing-test tickets are always build-ready."
|
|
3
3
|
allowed-tools: ["Skill"]
|
|
4
|
-
argument-hint: "[target-url | env] [
|
|
4
|
+
argument-hint: "[target-url | env] [ready=true|false]"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Use the /lisa-expo:exploratory-qa skill to run a human-style exploratory QA pass informed by the existing Playwright suite, then
|
|
7
|
+
Use the /lisa-expo:exploratory-qa skill to run a human-style exploratory QA pass informed by the existing Playwright suite, then file every finding (bugs, usability issues, missing Playwright tests) as a tracked work item via lisa:tracker-write — bug/suggestion tickets build-ready or in triage per the ready flag (default: triage), missing-test tickets always build-ready. $ARGUMENTS
|
|
@@ -1,19 +1,30 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: exploratory-qa
|
|
3
|
-
description: Playwright-backed exploratory QA workflow for web apps. Use when asked to audit an app
|
|
3
|
+
description: Playwright-backed exploratory QA workflow for web apps that FEEDS THE LIFECYCLE. Use when asked to audit an app with Playwright/e2e tests, find human-noticeable bugs and usability issues, identify gaps in automated test coverage, test responsive breakpoints, observe slow or unclear load states, or exercise mutable workflows with cleanup. Instead of writing a report file, it files every finding as a tracked work item via lisa:tracker-write (bugs, usability suggestions, and missing Playwright tests). A `ready` parameter controls whether bug and suggestion tickets are created build-ready (auto-picked-up by lisa:intake) or in the backlog for human triage (default); missing-test tickets are always created build-ready.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Exploratory QA
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Run a human-style exploratory QA pass informed by the existing Playwright suite. The goal is to find issues users notice and machines often miss,
|
|
10
|
+
Run a human-style exploratory QA pass informed by the existing Playwright suite, then **file every finding as a tracked work item** in the project's configured tracker so it enters the Lisa lifecycle. The goal is to find issues users notice and machines often miss — bugs, usability friction, and coverage gaps — and turn each into actionable, automatable work, not a static report.
|
|
11
|
+
|
|
12
|
+
## Parameters
|
|
13
|
+
|
|
14
|
+
- **`target-url | env`** (first positional) — what to audit.
|
|
15
|
+
- **`ready=true|false`** — the build-ready state for the **bug** and **usability/suggestion** tickets this pass creates.
|
|
16
|
+
- `ready=true` → created build-ready, so `lisa:intake` / the build-intake scanner auto-picks them up.
|
|
17
|
+
- `ready=false` (**default**) → created in the backlog (not build-ready) for a human to review and promote into the queue.
|
|
18
|
+
- **Missing Playwright test tickets are ALWAYS created build-ready, regardless of this flag** — adding missing coverage is always safe to queue.
|
|
19
|
+
|
|
20
|
+
`ready` maps directly to the `build_ready` write-control input on `lisa:tracker-write`.
|
|
11
21
|
|
|
12
22
|
## Core Workflow
|
|
13
23
|
|
|
14
24
|
### 1. Establish Scope
|
|
15
25
|
|
|
16
|
-
- Identify the target environment, account type, browser requirement, and
|
|
26
|
+
- Identify the target environment, account type, browser requirement, and the `ready` flag value (default `false`).
|
|
27
|
+
- **Confirm the tracker is configured.** Findings are filed as tickets, so read `tracker` from `.lisa.config.json` (local overrides global). If it is unset, stop and report that the tracker must be configured (via `/lisa:setup:jira` / `:github` / `:linear`) before exploratory QA can file findings — do not silently fall back to a report file.
|
|
17
28
|
- If credentials, tenant, seed data, or mutation boundaries are missing and cannot be discovered safely, ask a concise clarifying question.
|
|
18
29
|
- Treat production-like environments conservatively. Do not mutate production data unless the user explicitly approves it.
|
|
19
30
|
- Prefer a test user, dev/staging environment, or isolated seeded account for mutation testing.
|
|
@@ -57,7 +68,7 @@ Exploratory QA should exercise mutable workflows when the environment is safe.
|
|
|
57
68
|
- Prefer high-value user workflows: create/edit/delete records, lists, boards, tags, notes, comments, scenarios, uploads, messages, settings, invitations, or assignments.
|
|
58
69
|
- Use unique names with a clear prefix such as `qa-`, `pw-`, or `codex-`.
|
|
59
70
|
- Before mutating, identify the cleanup path. After mutating, make a best effort to clean up through the UI, then verify cleanup.
|
|
60
|
-
- If UI cleanup is unavailable,
|
|
71
|
+
- If UI cleanup is unavailable, file that as a product/test gap (a finding — see below). Use documented API cleanup only if appropriate for the project and account.
|
|
61
72
|
- Record all mutations performed, cleanup attempts, and residue left behind.
|
|
62
73
|
- Avoid destructive bulk actions unless the user explicitly asks or the test account is clearly disposable.
|
|
63
74
|
|
|
@@ -83,26 +94,45 @@ Measure perceived latency, not just eventual success.
|
|
|
83
94
|
- Treat long waits without clear progress, error, retry, or cancellation as bugs or test gaps.
|
|
84
95
|
- Do not overfit exact milliseconds unless the project has defined budgets. Use practical labels such as noticeable, slow, or unacceptable and include observed durations when available.
|
|
85
96
|
|
|
86
|
-
##
|
|
97
|
+
## Filing findings as tracked work
|
|
98
|
+
|
|
99
|
+
This skill does **not** write a report file. Every finding becomes a **leaf work item** created via `lisa:tracker-write` (the vendor-neutral writer — it dispatches to the configured tracker and runs the validation gate; never call a vendor `*-write-*` skill directly). Map each finding to a type and a build-ready state:
|
|
100
|
+
|
|
101
|
+
| Finding | `issue_type` | `build_ready` |
|
|
102
|
+
|---------|--------------|---------------|
|
|
103
|
+
| User-visible **bug** | `Bug` | the `ready` flag (default `false`) |
|
|
104
|
+
| **Usability / UX issue** (suggestion) | `Improvement` | the `ready` flag (default `false`) |
|
|
105
|
+
| **Missing Playwright test** (coverage gap) | `Task` | **`true` (always)** |
|
|
106
|
+
|
|
107
|
+
Each finding is a flat leaf (no children), so `build_ready` applies directly. Pass it explicitly on every create — `build_ready: <ready flag>` for bugs and suggestions, `build_ready: true` for missing tests.
|
|
108
|
+
|
|
109
|
+
Each ticket MUST be a complete spec (`lisa:tracker-write` runs the validator and rejects thin tickets):
|
|
110
|
+
|
|
111
|
+
- **Three-audience description** (context / business value, technical approach, stakeholder impact).
|
|
112
|
+
- **For a bug:** exact reproduction steps, observed-vs-expected, the env / account / breakpoint it occurred at, and console/network evidence.
|
|
113
|
+
- **For a usability issue:** the observed friction, who it affects, and the proposed improvement.
|
|
114
|
+
- **For a missing test:** the user behavior the test must assert and the stable selector/flow to use — concrete and automatable.
|
|
115
|
+
- **Gherkin acceptance criteria** describing the fixed (bug / usability) or added (test) behavior.
|
|
116
|
+
|
|
117
|
+
### Idempotency — don't spam duplicates
|
|
118
|
+
|
|
119
|
+
Re-running a QA pass must not refile the same finding. Before creating a ticket, search the tracker for an **open** ticket carrying a stable marker `[lisa-exploratory-qa] <finding-key>` in its body (the `<finding-key>` is a stable slug of surface + symptom, e.g. `settings-modal/horizontal-overflow@tablet`). If one exists, reference/update it instead of creating a duplicate; only create when none exists. **Match by the marker, never by title** (titles get edited). A *closed* prior ticket does not suppress a new one — a recurrence after a fix is a genuine regression.
|
|
87
120
|
|
|
88
|
-
|
|
121
|
+
## Output
|
|
89
122
|
|
|
90
|
-
|
|
123
|
+
No report file. Emit a concise in-session summary:
|
|
91
124
|
|
|
92
|
-
- Scope
|
|
93
|
-
- Existing Playwright coverage
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
- Load-state findings: observed delays, blank/spinner/connecting states, suggested budgets/tests.
|
|
97
|
-
- Mutation findings: data created, behavior observed, cleanup attempt, cleanup result, residue.
|
|
98
|
-
- Missing Playwright tests to add: prioritized, concrete, and automatable.
|
|
99
|
-
- Maintenance notes: selector scoping, fixture cleanup, flaky/stale-state risks.
|
|
125
|
+
- **Scope:** target URL/env, browser/tool, account type, build/version if visible, date.
|
|
126
|
+
- **Existing Playwright coverage:** strengths and thin areas observed during research.
|
|
127
|
+
- **Findings filed**, bucketed by type — bugs, usability suggestions, missing tests — each with its **created or referenced ticket ref** and its **build-ready state** (`ready` vs `triage/backlog`).
|
|
128
|
+
- **Observed but not filed:** anything noticed but intentionally not ticketed, with why.
|
|
100
129
|
|
|
101
130
|
## Quality Bar
|
|
102
131
|
|
|
103
132
|
- Be honest about what was and was not tested.
|
|
104
|
-
- Distinguish user-visible bugs from missing automated coverage.
|
|
105
|
-
- Prefer concrete
|
|
133
|
+
- Distinguish user-visible bugs from missing automated coverage — they map to different issue types (`Bug` vs `Task`).
|
|
134
|
+
- Prefer concrete, reproducible findings. Every ticket must stand alone for an implementer who was not in the session.
|
|
106
135
|
- Do not claim cleanup succeeded unless verified.
|
|
107
136
|
- Do not let broad locators pass against hidden/inactive content.
|
|
108
|
-
-
|
|
137
|
+
- File missing-test tickets build-ready; file bug and usability tickets per the `ready` flag (default: backlog for human triage).
|
|
138
|
+
- Preserve unrelated repo changes.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
display_name: "Exploratory QA"
|
|
2
|
-
short_description: "Playwright-backed exploratory QA workflow for web apps"
|
|
2
|
+
short_description: "Playwright-backed exploratory QA workflow for web apps that FEEDS THE LIFECYCLE"
|
|
3
3
|
default_prompt:
|
|
4
|
-
- "Use $exploratory-qa: Playwright-backed exploratory QA workflow for web apps."
|
|
4
|
+
- "Use $exploratory-qa: Playwright-backed exploratory QA workflow for web apps that FEEDS THE LIFECYCLE."
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Run a Playwright-backed exploratory QA pass: audit the app like a human, find user-noticeable bugs and gaps in automated test coverage, and
|
|
2
|
+
description: "Run a Playwright-backed exploratory QA pass: audit the app like a human, find user-noticeable bugs, usability issues, and gaps in automated test coverage, and file each finding as a tracked work item via lisa:tracker-write. The optional ready flag marks bug/suggestion tickets build-ready (auto-picked-up by lisa:intake) or leaves them in the backlog for human triage (default); missing-test tickets are always build-ready."
|
|
3
3
|
allowed-tools: ["Skill"]
|
|
4
|
-
argument-hint: "[target-url | env] [
|
|
4
|
+
argument-hint: "[target-url | env] [ready=true|false]"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Use the /lisa-harper-fabric:exploratory-qa skill to run a human-style exploratory QA pass informed by the existing Playwright suite, then
|
|
7
|
+
Use the /lisa-harper-fabric:exploratory-qa skill to run a human-style exploratory QA pass informed by the existing Playwright suite, then file every finding (bugs, usability issues, missing Playwright tests) as a tracked work item via lisa:tracker-write — bug/suggestion tickets build-ready or in triage per the ready flag (default: triage), missing-test tickets always build-ready. $ARGUMENTS
|
|
@@ -1,19 +1,30 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: exploratory-qa
|
|
3
|
-
description: Playwright-backed exploratory QA workflow for web apps. Use when asked to audit an app
|
|
3
|
+
description: Playwright-backed exploratory QA workflow for web apps that FEEDS THE LIFECYCLE. Use when asked to audit an app with Playwright/e2e tests, find human-noticeable bugs and usability issues, identify gaps in automated test coverage, test responsive breakpoints, observe slow or unclear load states, or exercise mutable workflows with cleanup. Instead of writing a report file, it files every finding as a tracked work item via lisa:tracker-write (bugs, usability suggestions, and missing Playwright tests). A `ready` parameter controls whether bug and suggestion tickets are created build-ready (auto-picked-up by lisa:intake) or in the backlog for human triage (default); missing-test tickets are always created build-ready.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Exploratory QA
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Run a human-style exploratory QA pass informed by the existing Playwright suite. The goal is to find issues users notice and machines often miss,
|
|
10
|
+
Run a human-style exploratory QA pass informed by the existing Playwright suite, then **file every finding as a tracked work item** in the project's configured tracker so it enters the Lisa lifecycle. The goal is to find issues users notice and machines often miss — bugs, usability friction, and coverage gaps — and turn each into actionable, automatable work, not a static report.
|
|
11
|
+
|
|
12
|
+
## Parameters
|
|
13
|
+
|
|
14
|
+
- **`target-url | env`** (first positional) — what to audit.
|
|
15
|
+
- **`ready=true|false`** — the build-ready state for the **bug** and **usability/suggestion** tickets this pass creates.
|
|
16
|
+
- `ready=true` → created build-ready, so `lisa:intake` / the build-intake scanner auto-picks them up.
|
|
17
|
+
- `ready=false` (**default**) → created in the backlog (not build-ready) for a human to review and promote into the queue.
|
|
18
|
+
- **Missing Playwright test tickets are ALWAYS created build-ready, regardless of this flag** — adding missing coverage is always safe to queue.
|
|
19
|
+
|
|
20
|
+
`ready` maps directly to the `build_ready` write-control input on `lisa:tracker-write`.
|
|
11
21
|
|
|
12
22
|
## Core Workflow
|
|
13
23
|
|
|
14
24
|
### 1. Establish Scope
|
|
15
25
|
|
|
16
|
-
- Identify the target environment, account type, browser requirement, and
|
|
26
|
+
- Identify the target environment, account type, browser requirement, and the `ready` flag value (default `false`).
|
|
27
|
+
- **Confirm the tracker is configured.** Findings are filed as tickets, so read `tracker` from `.lisa.config.json` (local overrides global). If it is unset, stop and report that the tracker must be configured (via `/lisa:setup:jira` / `:github` / `:linear`) before exploratory QA can file findings — do not silently fall back to a report file.
|
|
17
28
|
- If credentials, tenant, seed data, or mutation boundaries are missing and cannot be discovered safely, ask a concise clarifying question.
|
|
18
29
|
- Treat production-like environments conservatively. Do not mutate production data unless the user explicitly approves it.
|
|
19
30
|
- Prefer a test user, dev/staging environment, or isolated seeded account for mutation testing.
|
|
@@ -57,7 +68,7 @@ Exploratory QA should exercise mutable workflows when the environment is safe.
|
|
|
57
68
|
- Prefer high-value user workflows: create/edit/delete records, lists, boards, tags, notes, comments, scenarios, uploads, messages, settings, invitations, or assignments.
|
|
58
69
|
- Use unique names with a clear prefix such as `qa-`, `pw-`, or `codex-`.
|
|
59
70
|
- Before mutating, identify the cleanup path. After mutating, make a best effort to clean up through the UI, then verify cleanup.
|
|
60
|
-
- If UI cleanup is unavailable,
|
|
71
|
+
- If UI cleanup is unavailable, file that as a product/test gap (a finding — see below). Use documented API cleanup only if appropriate for the project and account.
|
|
61
72
|
- Record all mutations performed, cleanup attempts, and residue left behind.
|
|
62
73
|
- Avoid destructive bulk actions unless the user explicitly asks or the test account is clearly disposable.
|
|
63
74
|
|
|
@@ -83,26 +94,45 @@ Measure perceived latency, not just eventual success.
|
|
|
83
94
|
- Treat long waits without clear progress, error, retry, or cancellation as bugs or test gaps.
|
|
84
95
|
- Do not overfit exact milliseconds unless the project has defined budgets. Use practical labels such as noticeable, slow, or unacceptable and include observed durations when available.
|
|
85
96
|
|
|
86
|
-
##
|
|
97
|
+
## Filing findings as tracked work
|
|
98
|
+
|
|
99
|
+
This skill does **not** write a report file. Every finding becomes a **leaf work item** created via `lisa:tracker-write` (the vendor-neutral writer — it dispatches to the configured tracker and runs the validation gate; never call a vendor `*-write-*` skill directly). Map each finding to a type and a build-ready state:
|
|
100
|
+
|
|
101
|
+
| Finding | `issue_type` | `build_ready` |
|
|
102
|
+
|---------|--------------|---------------|
|
|
103
|
+
| User-visible **bug** | `Bug` | the `ready` flag (default `false`) |
|
|
104
|
+
| **Usability / UX issue** (suggestion) | `Improvement` | the `ready` flag (default `false`) |
|
|
105
|
+
| **Missing Playwright test** (coverage gap) | `Task` | **`true` (always)** |
|
|
106
|
+
|
|
107
|
+
Each finding is a flat leaf (no children), so `build_ready` applies directly. Pass it explicitly on every create — `build_ready: <ready flag>` for bugs and suggestions, `build_ready: true` for missing tests.
|
|
108
|
+
|
|
109
|
+
Each ticket MUST be a complete spec (`lisa:tracker-write` runs the validator and rejects thin tickets):
|
|
110
|
+
|
|
111
|
+
- **Three-audience description** (context / business value, technical approach, stakeholder impact).
|
|
112
|
+
- **For a bug:** exact reproduction steps, observed-vs-expected, the env / account / breakpoint it occurred at, and console/network evidence.
|
|
113
|
+
- **For a usability issue:** the observed friction, who it affects, and the proposed improvement.
|
|
114
|
+
- **For a missing test:** the user behavior the test must assert and the stable selector/flow to use — concrete and automatable.
|
|
115
|
+
- **Gherkin acceptance criteria** describing the fixed (bug / usability) or added (test) behavior.
|
|
116
|
+
|
|
117
|
+
### Idempotency — don't spam duplicates
|
|
118
|
+
|
|
119
|
+
Re-running a QA pass must not refile the same finding. Before creating a ticket, search the tracker for an **open** ticket carrying a stable marker `[lisa-exploratory-qa] <finding-key>` in its body (the `<finding-key>` is a stable slug of surface + symptom, e.g. `settings-modal/horizontal-overflow@tablet`). If one exists, reference/update it instead of creating a duplicate; only create when none exists. **Match by the marker, never by title** (titles get edited). A *closed* prior ticket does not suppress a new one — a recurrence after a fix is a genuine regression.
|
|
87
120
|
|
|
88
|
-
|
|
121
|
+
## Output
|
|
89
122
|
|
|
90
|
-
|
|
123
|
+
No report file. Emit a concise in-session summary:
|
|
91
124
|
|
|
92
|
-
- Scope
|
|
93
|
-
- Existing Playwright coverage
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
- Load-state findings: observed delays, blank/spinner/connecting states, suggested budgets/tests.
|
|
97
|
-
- Mutation findings: data created, behavior observed, cleanup attempt, cleanup result, residue.
|
|
98
|
-
- Missing Playwright tests to add: prioritized, concrete, and automatable.
|
|
99
|
-
- Maintenance notes: selector scoping, fixture cleanup, flaky/stale-state risks.
|
|
125
|
+
- **Scope:** target URL/env, browser/tool, account type, build/version if visible, date.
|
|
126
|
+
- **Existing Playwright coverage:** strengths and thin areas observed during research.
|
|
127
|
+
- **Findings filed**, bucketed by type — bugs, usability suggestions, missing tests — each with its **created or referenced ticket ref** and its **build-ready state** (`ready` vs `triage/backlog`).
|
|
128
|
+
- **Observed but not filed:** anything noticed but intentionally not ticketed, with why.
|
|
100
129
|
|
|
101
130
|
## Quality Bar
|
|
102
131
|
|
|
103
132
|
- Be honest about what was and was not tested.
|
|
104
|
-
- Distinguish user-visible bugs from missing automated coverage.
|
|
105
|
-
- Prefer concrete
|
|
133
|
+
- Distinguish user-visible bugs from missing automated coverage — they map to different issue types (`Bug` vs `Task`).
|
|
134
|
+
- Prefer concrete, reproducible findings. Every ticket must stand alone for an implementer who was not in the session.
|
|
106
135
|
- Do not claim cleanup succeeded unless verified.
|
|
107
136
|
- Do not let broad locators pass against hidden/inactive content.
|
|
108
|
-
-
|
|
137
|
+
- File missing-test tickets build-ready; file bug and usability tickets per the `ready` flag (default: backlog for human triage).
|
|
138
|
+
- Preserve unrelated repo changes.
|