@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.
Files changed (150) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa/agents/confluence-prd-intake.md +1 -1
  5. package/plugins/lisa/agents/github-agent.md +4 -5
  6. package/plugins/lisa/agents/github-build-intake.md +1 -1
  7. package/plugins/lisa/agents/github-prd-intake.md +1 -1
  8. package/plugins/lisa/agents/linear-prd-intake.md +1 -1
  9. package/plugins/lisa/agents/notion-prd-intake.md +1 -1
  10. package/plugins/lisa/commands/intake.md +1 -1
  11. package/plugins/lisa/commands/project-ideation.md +3 -3
  12. package/plugins/lisa/commands/repair-intake.md +6 -0
  13. package/plugins/lisa/commands/research.md +3 -3
  14. package/plugins/lisa/commands/setup-automations.md +6 -0
  15. package/plugins/lisa/commands/tear-down-automations.md +6 -0
  16. package/plugins/lisa/commands/verify-prd.md +2 -2
  17. package/plugins/lisa/rules/config-resolution.md +63 -4
  18. package/plugins/lisa/rules/intent-routing.md +4 -3
  19. package/plugins/lisa/rules/leaf-only-lifecycle.md +1 -1
  20. package/plugins/lisa/rules/prd-lifecycle-rollup.md +10 -2
  21. package/plugins/lisa/rules/repo-scope-split.md +18 -1
  22. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +24 -14
  23. package/plugins/lisa/skills/confluence-prd-intake/agents/openai.yaml +2 -2
  24. package/plugins/lisa/skills/confluence-write-prd/SKILL.md +103 -0
  25. package/plugins/lisa/skills/confluence-write-prd/agents/openai.yaml +4 -0
  26. package/plugins/lisa/skills/github-build-intake/SKILL.md +32 -21
  27. package/plugins/lisa/skills/github-evidence/SKILL.md +3 -26
  28. package/plugins/lisa/skills/github-evidence/agents/openai.yaml +2 -2
  29. package/plugins/lisa/skills/github-journey/SKILL.md +2 -2
  30. package/plugins/lisa/skills/github-prd-intake/SKILL.md +25 -11
  31. package/plugins/lisa/skills/github-prd-intake/agents/openai.yaml +2 -2
  32. package/plugins/lisa/skills/github-sync/SKILL.md +5 -5
  33. package/plugins/lisa/skills/github-write-issue/SKILL.md +15 -6
  34. package/plugins/lisa/skills/github-write-prd/SKILL.md +100 -0
  35. package/plugins/lisa/skills/github-write-prd/agents/openai.yaml +4 -0
  36. package/plugins/lisa/skills/implement/SKILL.md +13 -6
  37. package/plugins/lisa/skills/intake/SKILL.md +13 -12
  38. package/plugins/lisa/skills/intake/agents/openai.yaml +2 -2
  39. package/plugins/lisa/skills/jira-build-intake/SKILL.md +24 -11
  40. package/plugins/lisa/skills/jira-write-ticket/SKILL.md +8 -0
  41. package/plugins/lisa/skills/linear-build-intake/SKILL.md +22 -9
  42. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +23 -13
  43. package/plugins/lisa/skills/linear-prd-intake/agents/openai.yaml +2 -2
  44. package/plugins/lisa/skills/linear-write-issue/SKILL.md +10 -2
  45. package/plugins/lisa/skills/linear-write-prd/SKILL.md +90 -0
  46. package/plugins/lisa/skills/linear-write-prd/agents/openai.yaml +4 -0
  47. package/plugins/lisa/skills/notion-access/SKILL.md +2 -0
  48. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +22 -12
  49. package/plugins/lisa/skills/notion-prd-intake/agents/openai.yaml +2 -2
  50. package/plugins/lisa/skills/notion-write-prd/SKILL.md +107 -0
  51. package/plugins/lisa/skills/notion-write-prd/agents/openai.yaml +4 -0
  52. package/plugins/lisa/skills/prd-source-write/SKILL.md +80 -0
  53. package/plugins/lisa/skills/prd-source-write/agents/openai.yaml +4 -0
  54. package/plugins/lisa/skills/project-ideation/SKILL.md +183 -80
  55. package/plugins/lisa/skills/repair-intake/SKILL.md +403 -0
  56. package/plugins/lisa/skills/repair-intake/agents/openai.yaml +4 -0
  57. package/plugins/lisa/skills/research/SKILL.md +19 -3
  58. package/plugins/lisa/skills/research/agents/openai.yaml +2 -2
  59. package/plugins/lisa/skills/setup-automations/SKILL.md +78 -0
  60. package/plugins/lisa/skills/setup-automations/agents/openai.yaml +4 -0
  61. package/plugins/lisa/skills/setup-github/SKILL.md +0 -1
  62. package/plugins/lisa/skills/tear-down-automations/SKILL.md +34 -0
  63. package/plugins/lisa/skills/tear-down-automations/agents/openai.yaml +4 -0
  64. package/plugins/lisa/skills/tracker-build-intake/SKILL.md +6 -2
  65. package/plugins/lisa/skills/tracker-build-intake/agents/openai.yaml +2 -2
  66. package/plugins/lisa/skills/tracker-evidence/SKILL.md +2 -2
  67. package/plugins/lisa/skills/tracker-sync/SKILL.md +1 -1
  68. package/plugins/lisa/skills/verify-prd/SKILL.md +41 -38
  69. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  73. package/plugins/lisa-expo/commands/exploratory-qa.md +3 -3
  74. package/plugins/lisa-expo/skills/exploratory-qa/SKILL.md +48 -18
  75. package/plugins/lisa-expo/skills/exploratory-qa/agents/openai.yaml +2 -2
  76. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  78. package/plugins/lisa-harper-fabric/commands/exploratory-qa.md +3 -3
  79. package/plugins/lisa-harper-fabric/skills/exploratory-qa/SKILL.md +48 -18
  80. package/plugins/lisa-harper-fabric/skills/exploratory-qa/agents/openai.yaml +2 -2
  81. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  83. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  85. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  87. package/plugins/lisa-rails/commands/exploratory-qa.md +3 -3
  88. package/plugins/lisa-rails/skills/exploratory-qa/SKILL.md +48 -18
  89. package/plugins/lisa-rails/skills/exploratory-qa/agents/openai.yaml +2 -2
  90. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  92. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  93. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  94. package/plugins/lisa-wiki/skills/lisa-wiki-ingest/SKILL.md +30 -1
  95. package/plugins/src/base/agents/confluence-prd-intake.md +1 -1
  96. package/plugins/src/base/agents/github-agent.md +4 -5
  97. package/plugins/src/base/agents/github-build-intake.md +1 -1
  98. package/plugins/src/base/agents/github-prd-intake.md +1 -1
  99. package/plugins/src/base/agents/linear-prd-intake.md +1 -1
  100. package/plugins/src/base/agents/notion-prd-intake.md +1 -1
  101. package/plugins/src/base/commands/intake.md +1 -1
  102. package/plugins/src/base/commands/project-ideation.md +3 -3
  103. package/plugins/src/base/commands/repair-intake.md +6 -0
  104. package/plugins/src/base/commands/research.md +3 -3
  105. package/plugins/src/base/commands/setup-automations.md +6 -0
  106. package/plugins/src/base/commands/tear-down-automations.md +6 -0
  107. package/plugins/src/base/commands/verify-prd.md +2 -2
  108. package/plugins/src/base/rules/config-resolution.md +63 -4
  109. package/plugins/src/base/rules/intent-routing.md +4 -3
  110. package/plugins/src/base/rules/leaf-only-lifecycle.md +1 -1
  111. package/plugins/src/base/rules/prd-lifecycle-rollup.md +10 -2
  112. package/plugins/src/base/rules/repo-scope-split.md +18 -1
  113. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +24 -14
  114. package/plugins/src/base/skills/confluence-write-prd/SKILL.md +103 -0
  115. package/plugins/src/base/skills/github-build-intake/SKILL.md +32 -21
  116. package/plugins/src/base/skills/github-evidence/SKILL.md +3 -26
  117. package/plugins/src/base/skills/github-journey/SKILL.md +2 -2
  118. package/plugins/src/base/skills/github-prd-intake/SKILL.md +25 -11
  119. package/plugins/src/base/skills/github-sync/SKILL.md +5 -5
  120. package/plugins/src/base/skills/github-write-issue/SKILL.md +15 -6
  121. package/plugins/src/base/skills/github-write-prd/SKILL.md +100 -0
  122. package/plugins/src/base/skills/implement/SKILL.md +13 -6
  123. package/plugins/src/base/skills/intake/SKILL.md +13 -12
  124. package/plugins/src/base/skills/jira-build-intake/SKILL.md +24 -11
  125. package/plugins/src/base/skills/jira-write-ticket/SKILL.md +8 -0
  126. package/plugins/src/base/skills/linear-build-intake/SKILL.md +22 -9
  127. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +23 -13
  128. package/plugins/src/base/skills/linear-write-issue/SKILL.md +10 -2
  129. package/plugins/src/base/skills/linear-write-prd/SKILL.md +90 -0
  130. package/plugins/src/base/skills/notion-access/SKILL.md +2 -0
  131. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +22 -12
  132. package/plugins/src/base/skills/notion-write-prd/SKILL.md +107 -0
  133. package/plugins/src/base/skills/prd-source-write/SKILL.md +80 -0
  134. package/plugins/src/base/skills/project-ideation/SKILL.md +183 -80
  135. package/plugins/src/base/skills/repair-intake/SKILL.md +403 -0
  136. package/plugins/src/base/skills/research/SKILL.md +19 -3
  137. package/plugins/src/base/skills/setup-automations/SKILL.md +78 -0
  138. package/plugins/src/base/skills/setup-github/SKILL.md +0 -1
  139. package/plugins/src/base/skills/tear-down-automations/SKILL.md +34 -0
  140. package/plugins/src/base/skills/tracker-build-intake/SKILL.md +6 -2
  141. package/plugins/src/base/skills/tracker-evidence/SKILL.md +2 -2
  142. package/plugins/src/base/skills/tracker-sync/SKILL.md +1 -1
  143. package/plugins/src/base/skills/verify-prd/SKILL.md +41 -38
  144. package/plugins/src/expo/commands/exploratory-qa.md +3 -3
  145. package/plugins/src/expo/skills/exploratory-qa/SKILL.md +48 -18
  146. package/plugins/src/harper-fabric/commands/exploratory-qa.md +3 -3
  147. package/plugins/src/harper-fabric/skills/exploratory-qa/SKILL.md +48 -18
  148. package/plugins/src/rails/commands/exploratory-qa.md +3 -3
  149. package/plugins/src/rails/skills/exploratory-qa/SKILL.md +48 -18
  150. package/plugins/src/wiki/skills/lisa-wiki-ingest/SKILL.md +30 -1
@@ -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: transitions the PRD shipped → blocked (reusing the existing blocked roleno new failure state), posts a product-readable failure report naming which requirements/ACs failed with observed-vs-expected evidence, and creates linked fix issues (via tracker-write) back-linked to the PRD and the failure report, each carrying the captured evidence and acceptance criteria. Re-runs are idempotent: evidence/failure-report comments are regenerated in place via a stable sentinel marker (never appended), fix issues 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)."
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 transition + failure report + fix issues** — when spec conformance is `PARTIAL`/`DIVERGES`, or any applicable empirical check fails (or a required surface is unavailable), transition the PRD from the resolved `shipped` role to the resolved `blocked` role (reusing the existing `blocked` role — **no new failure state**, vendor-neutral via `config-resolution`), post a product-readable failure report on the PRD, and create linked fix issues via `tracker-write` for each missing/incorrect/divergent behavior.
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 issues 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.
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 → blocked` + failure report + fix issues); it does **not** leave the PRD at `shipped`. Re-running the skill against the same PRD produces no duplicate evidence comments, no duplicate fix issues, 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.
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 → blocked` path.
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: transition `shipped blocked`, post a failure report, and create fix issues
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. It is the `shipped → blocked` FAIL hop the `prd-lifecycle-rollup` rule defines (cite it by slug; this skill is its FAIL-path implementation, not a second source of truth). It **reuses the existing `blocked` role** — it does **not** introduce a `prd-verification-failed` / `prd-verifying` state, per the "No extra failure states" rule in `prd-lifecycle-rollup`.
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 `blocked` and `shipped` roles
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 | `blocked` role | Default `blocked` |
232
+ | Vendor | `shipped` role | `ticketed` role | Default `ticketed` |
231
233
  |---|---|---|---|
232
- | **GitHub** | `github.labels.prd.shipped` | `github.labels.prd.blocked` | `prd-blocked` (label) |
233
- | **Linear** | `linear.labels.prd.shipped` | `linear.labels.prd.blocked` | `prd-blocked` (project/issue label) |
234
- | **Notion** | `notion.values.shipped` | `notion.values.blocked` | `Blocked` (status value) |
235
- | **Confluence** | `confluence.parents.shipped` | `confluence.parents.blocked` | the `Blocked` parent page id |
236
- | **JIRA** | the configured shipped status | the configured blocked status | per `config-resolution` |
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
- BLOCKED=$(read_role blocked prd-blocked)
250
+ TICKETED=$(read_role ticketed prd-ticketed)
249
251
  ```
250
252
 
251
- ### 7.2 — Transition the PRD `shipped → blocked`
253
+ ### 7.2 — Re-open the PRD `shipped → ticketed`
252
254
 
253
- **Idempotency guard (no-op if already blocked).** Before transitioning, read the PRD's current lifecycle role. If the PRD **already carries `$BLOCKED`** (the common re-run-after-a-previous-failure case — same unsatisfiable requirement still missing), the transition is a **no-op** — do not re-add the label/status, do not re-remove `$SHIPPED` (already gone). Record it as `already blocked (no-op)` and proceed to 7.3, where the existing failure report is **updated in place** (not stacked) and 7.4, where existing fix issues 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).
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 → blocked` FAIL hop from `prd-lifecycle-rollup` (cite it by slug):
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 `blocked` label. For GitHub:
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 "$BLOCKED"
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 `$BLOCKED`, nor two copies of `$BLOCKED`. For Linear, set the project/issue label equivalently.
262
- - **Notion** — set the PRD page's `notion.statusProperty` (default `Status`) to the resolved `blocked` value (default `Blocked`). A status property holds exactly one value, so re-setting the same value is inherently a no-op.
263
- - **Confluence** — move the PRD page's `parentId` to `confluence.parents.blocked` (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.
264
- - **JIRA** — transition the PRD issue to the configured `blocked` status. An issue holds exactly one status; if already `blocked`, skip the transition.
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 `blocked` signals "verification failed; human attention required," not "done." The PRD stays open so product can see it failed acceptance.
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 → blocked — FAIL` and the cause (`CONFORMANCE_FAILED` or `EMPIRICAL_FAILED`).
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 issue** via `tracker-write` (the vendor-neutral writer) — never by hand-rolling `gh issue create`, so each issue passes the same quality gates (`tracker-validate`) every Lisa ticket does: three-audience description, **Gherkin acceptance criteria**, labels, and explicit relationship discovery. Group findings that share one root cause into one fix issue; do not fan out one issue per matrix cell when several rows are the same defect.
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 issue's spec to `tracker-write` (which dispatches to `github-write-issue` / `jira-write-ticket` / `linear-write-issue` per config). Collect the created **and referenced** refs/URLs and fold them into the failure report's **Fix issues** list (7.3 item 7).
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 → blocked (role: <resolved blocked role>) failure report: <link> fix issues: <refs> # on CONFORMANCE_FAILED | EMPIRICAL_FAILED (re-run: failure report regenerated in place; fix issues deduped by marker; transition no-op if already blocked)
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 transitioned `shipped → blocked` (reusing the `blocked` role), a product-readable failure report was posted, and linked fix issues were created (Phase 7).
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 transitioned `shipped → blocked` (reusing the `blocked` role), a product-readable failure report was posted, and linked fix issues were created (Phase 7).
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 → blocked`.** 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 → blocked` (when conformance is `PARTIAL`/`DIVERGES` or any applicable empirical check fails). The FAIL hop **reuses the existing `blocked` role it introduces no new failure state.** The guard-blocked and no-children paths run no verification and leave the PRD at `shipped` untouched.
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
- - **`blocked` is reused, not invented, and is non-terminal.** The FAIL hop sets the existing `blocked` PRD role (`config-resolution`) the same role intake uses for failed validation so the lifecycle stays small (`prd-lifecycle-rollup` "No extra failure states"). `blocked` means "verification failed; human attention required"; the FAIL hop never closes or archives the PRD.
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 | blocked` PRD-level verification hops all come from the `prd-lifecycle-rollup` rule; the `verified`/`shipped`/`blocked` role vocabulary comes from `config-resolution`. This skill is a consumer of those contracts, not a second source of truth.
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` / `blocked` hops.
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 | blocked` PRD-level verification hops, the "no extra failure states" rule (the FAIL hop reuses `blocked`), 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 → blocked` FAIL hop, and the Phase 8 idempotency guards (marker-based comment regeneration, marker-based fix-issue dedupe, no-op-already-at-target-role transition) — citing the rule by slug rather than restating its taxonomy.
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 `blocked` role maps (`prd-blocked` label for GitHub/Linear, `Blocked` status for Notion, `confluence.parents.blocked` parent page) Phase 7.1 resolves, and the env-keyed `done` map the terminal predicate resolves against.
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 produce a QA gaps report."
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] [report-path]"
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 produce an actionable coverage-gaps report. $ARGUMENTS
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 or project with Playwright/e2e tests, find human-noticeable bugs, identify gaps in automated test coverage, test responsive breakpoints, observe slow or unclear load states, exercise mutable workflows with cleanup, or produce a QA gaps report.
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, then translate those observations into actionable Playwright coverage gaps.
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 requested report path.
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, record that as a product/test gap. Use documented API cleanup only if appropriate for the project and account.
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
- ## Report Structure
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
- Write the report to the user's requested path. If none is specified, use a clear local name such as `PLAYWRIGHT_GAPS.md` or `EXPLORATORY_QA_REPORT.md`.
121
+ ## Output
89
122
 
90
- Include:
123
+ No report file. Emit a concise in-session summary:
91
124
 
92
- - Scope: target URL/env, browser/tool, account type, build/version if visible, date.
93
- - Existing Playwright coverage: strengths, thin areas, skipped tests, viewport/browser matrix, mutation coverage.
94
- - Exploratory findings: steps, observed behavior, impact, why existing tests miss it, recommended test.
95
- - Breakpoint findings: exact viewports tested and boundary behavior.
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 examples over vague recommendations.
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
- - Preserve unrelated repo changes and keep report edits scoped.
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,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 produce a QA gaps report."
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] [report-path]"
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 produce an actionable coverage-gaps report. $ARGUMENTS
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 or project with Playwright/e2e tests, find human-noticeable bugs, identify gaps in automated test coverage, test responsive breakpoints, observe slow or unclear load states, exercise mutable workflows with cleanup, or produce a QA gaps report.
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, then translate those observations into actionable Playwright coverage gaps.
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 requested report path.
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, record that as a product/test gap. Use documented API cleanup only if appropriate for the project and account.
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
- ## Report Structure
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
- Write the report to the user's requested path. If none is specified, use a clear local name such as `PLAYWRIGHT_GAPS.md` or `EXPLORATORY_QA_REPORT.md`.
121
+ ## Output
89
122
 
90
- Include:
123
+ No report file. Emit a concise in-session summary:
91
124
 
92
- - Scope: target URL/env, browser/tool, account type, build/version if visible, date.
93
- - Existing Playwright coverage: strengths, thin areas, skipped tests, viewport/browser matrix, mutation coverage.
94
- - Exploratory findings: steps, observed behavior, impact, why existing tests miss it, recommended test.
95
- - Breakpoint findings: exact viewports tested and boundary behavior.
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 examples over vague recommendations.
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
- - Preserve unrelated repo changes and keep report edits scoped.
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,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 produce a QA gaps report."
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] [report-path]"
4
+ argument-hint: "[target-url | env] [ready=true|false]"
5
5
  ---
6
6
 
7
- Use the /lisa-rails:exploratory-qa skill to run a human-style exploratory QA pass informed by the existing Playwright suite, then produce an actionable coverage-gaps report. $ARGUMENTS
7
+ Use the /lisa-rails: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