@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
package/package.json CHANGED
@@ -82,7 +82,7 @@
82
82
  "lodash": ">=4.18.1"
83
83
  },
84
84
  "name": "@codyswann/lisa",
85
- "version": "2.61.0",
85
+ "version": "2.62.0",
86
86
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
87
87
  "main": "dist/index.js",
88
88
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.61.0",
3
+ "version": "2.62.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.61.0",
3
+ "version": "2.62.0",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -53,7 +53,7 @@ After a successful cycle, if any PRDs ended in the `blocked` label, mention to t
53
53
 
54
54
  When reporting `blocked` outcomes, distinguish the cause: **pre-write gate failure** (per-ticket validator caught a problem before any tickets were created) vs **post-write coverage gap** (tickets were created and remain in the destination tracker, but the PRD has uncovered requirements that the next intake cycle will address). Both result in the `blocked` label, but the implication for product is different — coverage gaps mean some tickets are already real and product should not re-author the PRD from scratch.
55
55
 
56
- If all PRDs ended in the `ticketed` label with coverage `COMPLETE`, mention that the next step is for product to monitor the created tickets and apply the configured `shipped` label after delivery, then run `/lisa:verify-prd` to empirically verify the shipped product against the PRD and move it to `verified` (or back to `blocked` with linked fix issues on failure). If any are `COMPLETE_WITH_SCOPE_CREEP`, point that out so product can review the flagged tickets.
56
+ If all PRDs ended in the `ticketed` label with coverage `COMPLETE`, mention that the next step is for product to monitor the created tickets and apply the configured `shipped` label after delivery, then run `/lisa:verify-prd` to empirically verify the shipped product against the PRD and move it to `verified` (or, on failure, re-open it to `ticketed` with build-ready fix tickets that auto-build and re-verify — never `blocked`). If any are `COMPLETE_WITH_SCOPE_CREEP`, point that out so product can review the flagged tickets.
57
57
 
58
58
  ## Rules
59
59
 
@@ -49,7 +49,7 @@ Use the `github-verify` skill to check the issue against organizational standard
49
49
 
50
50
  **Gating behavior — this is the one place auto-relabeling is allowed:**
51
51
 
52
- Resolve build labels from `.lisa.config.json` `github.labels.build.*` (defaults: `status:ready` / `status:in-progress` / `status:code-review` / env-keyed `status:on-*`); resolve the `blocked` label from the same section (`github.labels.build.blocked`, default `status:blocked`).
52
+ Resolve build labels from `.lisa.config.json` `github.labels.build.*` (defaults: `status:ready` / `status:in-progress` / env-keyed `status:on-*`); resolve the `blocked` label from the same section (`github.labels.build.blocked`, default `status:blocked`).
53
53
 
54
54
  If `github-verify` returns `FAIL` on any of the above, do NOT continue:
55
55
 
@@ -126,7 +126,6 @@ Use the `github-evidence` skill to:
126
126
  - Upload verification evidence to the GitHub `pr-assets` release (in the implementation repo)
127
127
  - Update the PR description's `## Evidence` section
128
128
  - Post a comment on the originating issue with the evidence summary
129
- - Relabel the issue from the `claimed` label to the `review` label (configured via `github.labels.build.{claimed,review}`)
130
129
 
131
130
  ### 8. Suggest Status Transition
132
131
 
@@ -135,14 +134,14 @@ Based on the milestone, suggest (but don't auto-relabel beyond the explicit Step
135
134
  | Milestone | Suggested role | Default label |
136
135
  |-----------|----------------|---------------|
137
136
  | Plan created | `claimed` | `status:in-progress` |
138
- | PR ready | `review` (Step 7 sets this) | `status:code-review` |
139
- | PR merged | `done` (env-aware) | env-keyed variant per `github.labels.build.done` |
137
+ | PR ready | `done` (env-aware; build-intake sets this after success) | env-keyed variant per `github.labels.build.done` |
138
+ | PR merged | no additional build-label transition | already at configured `done` |
140
139
 
141
140
  Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`). When suggesting the PR-merged transition, the env is implied by the PR's base branch via `deploy.branches` — surface the resolved label name; do not auto-transition.
142
141
 
143
142
  ## Rules
144
143
 
145
- - Never auto-relabel build labels, with two explicit exceptions: (a) when `github-verify` returns FAIL for the pre-flight gate (Step 2), relabel to the configured `blocked` label and reassign to the original author; (b) when `github-evidence` runs at completion (Step 7), relabel to the configured `review` label. Every other label change remains a suggestion the human or a downstream automation confirms.
144
+ - Never auto-relabel build labels, with one explicit exception: when `github-verify` returns FAIL for the pre-flight gate (Step 2), relabel to the configured `blocked` label and reassign to the original author. The build-intake owner transitions a successful issue from `claimed` directly to the configured `done` label after PR evidence is posted.
146
145
  - Always read the full issue graph via `github-read-issue` before determining intent — don't rely on the `type:` label alone.
147
146
  - Never create or materially edit an issue by calling `gh issue create` / `gh issue edit` directly — always delegate to `github-write-issue` (or, from a vendor-neutral caller, `tracker-write`) so relationships, Gherkin criteria, and metadata gates are enforced.
148
147
  - If sign-in credentials are in the issue body, extract and pass them to the flow. If the issue touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
@@ -17,7 +17,7 @@ skills:
17
17
 
18
18
  You are a GitHub build-intake agent. Your single job is to run one cycle against a GitHub repo — find issues carrying the configured `ready` build label, dispatch each through the build flow, relabel successful builds to the configured (env-aware) `done` label — then report what happened.
19
19
 
20
- Build-label role names (`ready`, `claimed`, `review`, `done`) are resolved from `.lisa.config.json` `github.labels.build.*` by the `github-build-intake` skill. The defaults match the legacy hardcoded names (`status:ready`, `status:in-progress`, `status:code-review`, env-keyed `{ dev: status:on-dev, staging: status:on-stg, production: status:done }`).
20
+ Build-label role names (`ready`, `claimed`, `done`) are resolved from `.lisa.config.json` `github.labels.build.*` by the `github-build-intake` skill. The defaults are `status:ready`, `status:in-progress`, and env-keyed `{ dev: status:on-dev, staging: status:on-stg, production: status:done }`.
21
21
 
22
22
  ## Confirmation policy
23
23
 
@@ -53,7 +53,7 @@ After a successful cycle, if any PRDs ended in the `blocked` label, mention to t
53
53
 
54
54
  When reporting `blocked` outcomes, distinguish the cause: **pre-write gate failure** (per-ticket validator caught a problem before any tickets were created) vs **post-write coverage gap** (tickets were created and remain in the destination tracker, but the PRD has uncovered requirements that the next intake cycle will address). Both result in the `blocked` label, but the implication for product is different — coverage gaps mean some tickets are already real and product should not re-author the PRD from scratch.
55
55
 
56
- If all PRDs ended in the `ticketed` label with coverage `COMPLETE`, mention that the next step is for product to monitor the created tickets and apply the configured `shipped` label after delivery, then run `/lisa:verify-prd` to empirically verify the shipped product against the PRD and move it to `verified` (or back to `blocked` with linked fix issues on failure). If any are `COMPLETE_WITH_SCOPE_CREEP`, point that out so product can review the flagged tickets.
56
+ If all PRDs ended in the `ticketed` label with coverage `COMPLETE`, mention that the next step is for product to monitor the created tickets and apply the configured `shipped` label after delivery, then run `/lisa:verify-prd` to empirically verify the shipped product against the PRD and move it to `verified` (or, on failure, re-open it to `ticketed` with build-ready fix tickets that auto-build and re-verify — never `blocked`). If any are `COMPLETE_WITH_SCOPE_CREEP`, point that out so product can review the flagged tickets.
57
57
 
58
58
  ## Rules
59
59
 
@@ -53,7 +53,7 @@ After a successful cycle, if any PRDs ended in the `blocked` label, mention to t
53
53
 
54
54
  When reporting `blocked` outcomes, distinguish the cause: **pre-write gate failure** (per-ticket validator caught a problem before any tickets were created) vs **post-write coverage gap** (tickets were created and remain in the destination tracker, but the PRD has uncovered requirements that the next intake cycle will address). Both result in the `blocked` label, but the implication for product is different — coverage gaps mean some tickets are already real and product should not re-author the PRD from scratch.
55
55
 
56
- If all PRDs ended in the `ticketed` label with coverage `COMPLETE`, mention that the next step is for product to monitor the created tickets and apply the configured `shipped` label after delivery, then run `/lisa:verify-prd` to empirically verify the shipped product against the PRD and move it to `verified` (or back to `blocked` with linked fix issues on failure). If any are `COMPLETE_WITH_SCOPE_CREEP`, point that out so product can review the flagged tickets.
56
+ If all PRDs ended in the `ticketed` label with coverage `COMPLETE`, mention that the next step is for product to monitor the created tickets and apply the configured `shipped` label after delivery, then run `/lisa:verify-prd` to empirically verify the shipped product against the PRD and move it to `verified` (or, on failure, re-open it to `ticketed` with build-ready fix tickets that auto-build and re-verify — never `blocked`). If any are `COMPLETE_WITH_SCOPE_CREEP`, point that out so product can review the flagged tickets.
57
57
 
58
58
  ## Rules
59
59
 
@@ -51,7 +51,7 @@ After a successful cycle, if any PRDs ended in the `blocked` status, mention to
51
51
 
52
52
  When reporting `blocked` outcomes, distinguish the cause: **pre-write gate failure** (per-ticket validator caught a problem before any tickets were created) vs **post-write coverage gap** (tickets were created and remain in the destination tracker, but the PRD has uncovered requirements that the next intake cycle will address). Both result in the `blocked` status, but the implication for product is different — coverage gaps mean some tickets are already real and product should not re-author the PRD from scratch.
53
53
 
54
- If all PRDs ended in the `ticketed` status with coverage `COMPLETE`, mention that the next step is for product to monitor the created tickets and flip the PRDs to the configured `shipped` status after delivery, then run `/lisa:verify-prd` to empirically verify the shipped product against the PRD and move it to `verified` (or back to `blocked` with linked fix issues on failure). If any are `COMPLETE_WITH_SCOPE_CREEP`, point that out so product can review the flagged tickets.
54
+ If all PRDs ended in the `ticketed` status with coverage `COMPLETE`, mention that the next step is for product to monitor the created tickets and flip the PRDs to the configured `shipped` status after delivery, then run `/lisa:verify-prd` to empirically verify the shipped product against the PRD and move it to `verified` (or, on failure, re-open it to `ticketed` with build-ready fix tickets that auto-build and re-verify — never `blocked`). If any are `COMPLETE_WITH_SCOPE_CREEP`, point that out so product can review the flagged tickets.
55
55
 
56
56
  ## Rules
57
57
 
@@ -3,4 +3,4 @@ description: "Vendor-agnostic batch scanner for Ready queues. Notion PRD databas
3
3
  argument-hint: "<Notion-PRD-database-URL | Confluence-space-URL | Confluence-parent-page-URL | Linear-workspace-URL | Linear-team-URL | GitHub-repo-URL | org/repo | JIRA-project-key | JQL-filter>"
4
4
  ---
5
5
 
6
- Use the /lisa:intake skill to scan the queue for Ready items and dispatch each one through the appropriate single-item lifecycle skill. $ARGUMENTS
6
+ Use the /lisa:intake skill to scan the queue for Ready items and dispatch one eligible Ready item per invocation through the appropriate single-item lifecycle skill — and, on the PRD side, close the loop by dispatching /lisa:verify-prd for one shipped PRD per cycle (shipped → verified on pass, or re-opened to ticketed with build-ready fix tickets that auto-build and re-verify on fail — never blocked). $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
- description: "Generate practical, verifiable product or workflow ideas for the current host project. Inspects code, docs, data sources, and current surfaces (and optionally an external public product), then returns a prioritized report separating build-ready ideas from discovery spikes and rejected ones. Every build-ready idea must have an obtainable data/source path and an empirical verification plan."
3
- argument-hint: "[target project path or external product to compare against]"
2
+ description: "Generate persona-grounded, verifiable product ideas for the host project, then create PRDs for the selected build-ready ideas via lisa:research. First derives the personas the project actually serves (from its docs, code, data model, and releases never invented), ideates per persona, and gates each idea on an obtainable data/source path and an empirical verification plan. Creates one PRD by default (top-ranked idea); max_prds widens the batch. prd_ready=true creates them prd-ready for auto-pickup by lisa:intake; default is draft for human review."
3
+ argument-hint: "[target path | external product] [prd_ready=true|false] [max_prds=<n>|all]"
4
4
  ---
5
5
 
6
- Use the /lisa:project-ideation skill to generate a decision-ready idea report for the host project. $ARGUMENTS
6
+ Use the /lisa:project-ideation skill to derive evidence-grounded personas, ideate per persona, gate the ideas, and create PRDs for the selected build-ready ideas via lisa:research — in draft state by default, or prd-ready when prd_ready=true; one PRD by default, more with max_prds. $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "Repair counterpart to /lisa:intake. Vendor-agnostic batch scanner that finds stuck work — items left in `blocked` or stalled in an in-progress role (build `claimed`, PRD `in_review`) — across the same queues /lisa:intake serves (Notion / Confluence / Linear / GitHub PRDs; JIRA / GitHub / Linear build issues), and attempts to repair the first materially actionable one per cycle: resumes stalled in-progress work in place, re-validates blocked PRDs, and re-dispatches blocked build items whose blockers have cleared. One actionable repair per invocation; cron-safe. Designed as a /schedule target alongside /lisa:intake."
3
+ argument-hint: "<Notion-PRD-database-URL | Confluence-space-URL | Confluence-parent-page-URL | Linear-workspace-URL | Linear-team-URL | GitHub-repo-URL | org/repo | JIRA-project-key | JQL-filter> [intake_mode=prd|build|both] [stale_after=24h] [max_candidates=100] [force=true]"
4
+ ---
5
+
6
+ Use the /lisa:repair-intake skill to scan the queue for stuck items (blocked, or stalled in an in-progress role) and repair the first materially actionable one. $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
- description: "Research a problem space and produce a PRD. Investigates the codebase, defines user flows, assesses technical feasibility, and outputs a specification ready for the Plan flow."
3
- argument-hint: "<problem-statement-or-feature-idea>"
2
+ description: "Research a problem space and create a PRD in the configured PRD source. Investigates the codebase, defines user flows, assesses technical feasibility, synthesizes the spec, then creates it in the source (Notion / Confluence / GitHub / Linear) via lisa:prd-source-write — no loose document. prd_ready=true creates it prd-ready for auto-pickup by lisa:intake; default is draft for the Plan flow / human review."
3
+ argument-hint: "<problem-statement-or-feature-idea> [prd_ready=true|false]"
4
4
  ---
5
5
 
6
- Use the /lisa:research skill to research the problem and produce a PRD. $ARGUMENTS
6
+ Use the /lisa:research skill to research the problem and create a PRD in the configured source — in draft state by default, or prd-ready when prd_ready=true. $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "Set up the recurring Lisa automations on the local workstation using the runtime's native scheduler (Codex automations / Claude /schedule): intake-repair (60 min), intake PRD (60 min), intake tickets (10 min), exploratory-bugs (daily), exploratory-prds (daily). A declarative spec — it states what to schedule and how often; the runtime's native automation mechanism does the creating. auto-start-prds / auto-start-tickets control whether ideated PRDs / filed bug tickets are created auto-pickup-ready (default: left for human review)."
3
+ argument-hint: "[auto-start-prds=true|false] [auto-start-tickets=true|false]"
4
+ ---
5
+
6
+ Use the /lisa:setup-automations skill to create the five recurring Lisa automations via this runtime's native scheduler (Codex automations / Claude /schedule), passing the auto-start-prds / auto-start-tickets flags through to the exploratory automations. $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "Remove the recurring Lisa automations /setup-automations created for this project (the lisa-auto-<project>-* set) using the runtime's native scheduler (Codex automations / Claude /schedule). A declarative spec — it states which automations to remove; the runtime's native mechanism does the removing. Removes only this project's Lisa automations, never others."
3
+ argument-hint: ""
4
+ ---
5
+
6
+ Use the /lisa:tear-down-automations skill to remove this project's lisa-auto-<project>-* automations via this runtime's native scheduler (Codex automations / Claude /schedule), leaving other projects' and non-Lisa automations untouched. $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
- description: "Initiative-level PRD acceptance gate. Reads a shipped PRD and its generated child work, confirms all generated top-level work is terminal, then runs spec-conformance against the PRD plus empirical verification of the shipped surface and, on a CONFORMS verdict with all checks passing, transitions the PRD shipped → verified with evidence (the shipped → blocked FAIL path is sibling work)."
2
+ description: "Initiative-level PRD acceptance gate. Reads a shipped PRD and its generated child work, confirms all generated top-level work is terminal, then runs spec-conformance against the PRD plus empirical verification of the shipped surface. On a CONFORMS verdict with all checks passing it transitions the PRD shipped → verified with evidence; on a conformance miss (PARTIAL/DIVERGES) or any failing empirical check it re-opens the PRD shipped → ticketed (never blocked), creates build-ready fix tickets for the gaps, and posts a failure report — the fix tickets auto-build, the PRD re-ships, and it re-verifies (a self-healing loop). Idempotent across re-runs."
3
3
  argument-hint: "<prd>"
4
4
  ---
5
5
 
6
- Use the /lisa:verify-prd skill to read the PRD, confirm its generated top-level work is terminal, run spec-conformance against the PRD and empirical verification of the shipped surface, and on a passing result transition the PRD shipped → verified with evidence. $ARGUMENTS
6
+ Use the /lisa:verify-prd skill to read the PRD, confirm its generated top-level work is terminal, run spec-conformance against the PRD and empirical verification of the shipped surface, then transition the PRD shipped → verified with evidence on a pass, or on a fail — re-open it shipped → ticketed (never blocked) and create build-ready fix tickets that auto-build and trigger a re-verify. $ARGUMENTS
@@ -68,7 +68,6 @@ fi
68
68
  "build": {
69
69
  "ready": "status:ready",
70
70
  "claimed": "status:in-progress",
71
- "review": "status:code-review",
72
71
  "blocked": "status:blocked",
73
72
  "done": { "dev": "status:on-dev", "staging": "status:on-stg", "production": "status:done" }
74
73
  },
@@ -121,6 +120,13 @@ fi
121
120
  "staging": "staging",
122
121
  "production": "main"
123
122
  }
123
+ },
124
+
125
+ "intake": {
126
+ "repair": {
127
+ "staleAfterHours": 24,
128
+ "maxCandidates": 100
129
+ }
124
130
  }
125
131
  }
126
132
  ```
@@ -194,11 +200,11 @@ Every lifecycle skill operates on a fixed set of **roles** (`ready`, `claimed`,
194
200
  |---|---|---|---|
195
201
  | `ready` | Human signal "this is buildable; agent may claim" | `Ready` (status) | `status:ready` (label) |
196
202
  | `claimed` | Agent has picked the item up | `In Progress` (status) | `status:in-progress` (label) |
197
- | `review` | Build complete, in code review | `Code Review` (status) | `status:code-review` (label) |
203
+ | `review` | Optional post-build review hold, when a tracker/project still uses one | `Code Review` (status) | Linear default: `status:code-review`; GitHub has no default review label |
198
204
  | `blocked` | Agent stopped on triage ambiguities or external blocker | `Blocked` (status) | `status:blocked` (label) |
199
205
  | `done` | Terminal state for this work, **env-keyed** | map of env → status | map of env → label |
200
206
 
201
- `review` is required for label-driven systems (GitHub, Linear) because that's how the agent signals "PR opened, awaiting human review." For JIRA, `review` is optional projects that keep the ticket in `claimed` until terminal can omit it and lifecycle skills will skip the intermediate transition.
207
+ `review` is optional. GitHub build intake skips it by default and moves successful builds directly from `claimed` to the configured `done` label. Linear and JIRA projects that still use a post-build review hold can configure `review`; projects that keep the ticket in `claimed` until terminal can omit it and lifecycle skills will skip the intermediate transition.
202
208
 
203
209
  `blocked` is what every vendor agent flips to when triage finds unresolved ambiguities or the build path is blocked by something the agent can't resolve. Different from `claimed` because it explicitly signals "human attention required."
204
210
 
@@ -227,6 +233,22 @@ The `rollup` object lives in each PRD-source vendor section (`github.labels.prd.
227
233
 
228
234
  Like every other vocabulary key, `prd.rollup` is **optional** — a missing block inherits `closeOnShipped: false`. The `shipped` transition itself is unconditional on the all-terminal condition; only the close/archive step is gated by this flag.
229
235
 
236
+ ### Repair intake config (`intake.repair`)
237
+
238
+ `lisa:repair-intake` (the recovery counterpart to `lisa:intake`) reads two optional tuning keys
239
+ from the top-level `intake.repair` block. Both are **optional** — a missing block inherits the
240
+ documented defaults, so existing projects need no config change.
241
+
242
+ | Key | Required | Default | Notes |
243
+ |-----|----------|---------|-------|
244
+ | `intake.repair.staleAfterHours` | no | `24` | How long an in-progress item (build `claimed`, PRD `in_review`) may show no observable activity before repair-intake treats it as stalled and resumes it. `blocked` items are judged on blocker/answer state, not this threshold. Overridable per-run via `stale_after=<dur>` in `$ARGUMENTS` (which always wins). The same value is the default backoff window for loop-prevention notes. |
245
+ | `intake.repair.maxCandidates` | no | `100` | Upper bound on how many stuck items repair-intake enumerates while searching for the first actionable one. Bounds scan cost. Overridable per-run via `max_candidates=<n>`. |
246
+
247
+ Resolution order matches every other key: `$ARGUMENTS` override → `.lisa.config.local.json` →
248
+ `.lisa.config.json` → built-in default. The role SEMANTICS repair-intake operates on (which
249
+ roles count as "stuck", what each repair does) are fixed like every other lifecycle transition;
250
+ only these thresholds are tunable.
251
+
230
252
  ### Env-keyed `done`
231
253
 
232
254
  The `done` role is special: the terminal status/label depends on which environment a PR was merged into. A hotfix to staging ends at `On Stg`; a production hotfix ends at `Done`. So `done` is a **map** keyed by env name (`dev`, `staging`, `production`).
@@ -239,6 +261,16 @@ Skills that transition to `done` MUST resolve the env first:
239
261
 
240
262
  If a project's terminal state is the same regardless of env, set `done` to a string instead of a map (lifecycle skills accept either shape).
241
263
 
264
+ ### Env → base branch (forward: the build base and PR base)
265
+
266
+ `deploy.branches` is also read in the **forward** direction by the build flow (`lisa:implement`): the environment a work item targets determines the branch the work is built on and the branch the PR opens against.
267
+
268
+ 1. **Resolve the work item's target environment** — its `## Target Backend Environment` field. If the item names no environment, use the **remote default branch** (`gh repo view --json defaultBranchRef`, or `origin/HEAD`).
269
+ 2. **Map env → base branch** via `deploy.branches` (e.g. `staging → staging`, `production → main`). Absent env or missing branch → stop and report; never guess.
270
+ 3. **Before any code is written**, `lisa:implement` fetches and **rebases the working branch onto `origin/<base>`, resolving conflicts**, so implementation builds on the latest target-environment code. **The PR then opens against that same base branch** (`target_branch=<base>` to `lisa:git-submit-pr`).
271
+
272
+ This is the exact inverse of the env-keyed `done` "Branch inference" above: `done` derives the env *from* the PR base branch (reverse); the build flow derives the base branch *from* the env (forward). Both use the one `deploy.branches` map, so the branch a PR targets and the `done` status it earns always agree.
273
+
242
274
  The true terminal `done` value is also the only value that triggers provider-native closure / resolution per `leaf-only-lifecycle`:
243
275
 
244
276
  - If `done` is a string, that value is terminal.
@@ -328,7 +360,7 @@ Initiatives (Linear's cross-Project rollup) are NOT used — they're intended fo
328
360
  When `github-to-tracker` is invoked AND `tracker = "github"`, both reads and writes hit the same GitHub repo. Label namespaces are kept separate so the two flows don't collide:
329
361
 
330
362
  - PRD-source labels: `prd-draft`, `prd-ready`, `prd-in-review`, `prd-blocked`, `prd-ticketed`, `prd-shipped`, `prd-verified` — owned by `github-prd-intake`, `verify-prd`, and the human PM.
331
- - Build-queue labels: `status:ready`, `status:in-progress`, `status:code-review`, `status:on-dev`, `status:done` — owned by `github-build-intake` and `github-agent`.
363
+ - Build-queue labels: `status:ready`, `status:in-progress`, `status:on-dev`, `status:done` — owned by `github-build-intake` and `github-agent`.
332
364
  - Sentinel issue label: `prd-intake-feedback` — owned by `github-prd-intake`.
333
365
 
334
366
  Never overload one label across both lifecycles.
@@ -438,6 +470,33 @@ GitHub and Linear PRD lifecycles use labels (`prd-ready` / `prd-in-review` / etc
438
470
 
439
471
  **Why curl is still needed**: acli's Confluence surface only covers `space` and `page view`. v1 page-write endpoints accept scoped tokens but return 410 Gone (deprecated); v2 endpoints require granular OAuth scopes acli doesn't request. API tokens via Basic auth bypass this with full user scope, so curl is the headless-friendly path for ops neither acli nor MCP can do.
440
472
 
473
+ ## Repo scoping (multi-repo trackers)
474
+
475
+ A ticketing system can oversee **multiple repos** — e.g. one JIRA project (or Linear team) for `frontend`, `backend`, and `infrastructure`. When build-intake runs inside one repo, it must claim only the tickets that belong to **that** repo and skip the rest. Two pieces make this work; the claim-time enforcement lives in the `repo-scope-split` rule.
476
+
477
+ ### The `repo:<name>` label (the repo marker)
478
+
479
+ A work item's target repo is recorded as a **label** `repo:<name>`, where `<name>` is the repo's short name (e.g. `repo:frontend`). The convention is uniform across trackers (JIRA / GitHub / Linear), consistent with the other namespaced labels (`status:`, `type:`, `component:`). On JIRA a **component** equal to the repo name is accepted as an alias (matches the legacy `component = "frontend"` JQL pattern). A leaf work unit carries **exactly one** `repo:<name>` (leaves are single-repo per `repo-scope-split`); a container (Epic/Story/Spike) may carry several or none.
480
+
481
+ The label is not required to exist up front: build-intake **determines** the target repo from the ticket's content + code surfaces when the label is absent and **stamps** `repo:<name>` so later cycles filter cheaply (see `repo-scope-split` "claim-time repo scoping").
482
+
483
+ ### Current-repo resolution (which repo am I?)
484
+
485
+ Resolve the name of the repo intake is running in, highest priority first:
486
+
487
+ 1. `.lisa.config.local.json` then `.lisa.config.json` `repo` (an explicit override, e.g. `"repo": "frontend"`).
488
+ 2. `.lisa.config.json` `github.repo` when set (the repo's own identity).
489
+ 3. The git remote basename: `basename -s .git "$(git remote get-url origin)"` (e.g. `git@github.com:acme/frontend.git` → `frontend`).
490
+
491
+ ```bash
492
+ read_g() { local lv gv; lv=$(jq -r "$1 // empty" .lisa.config.local.json 2>/dev/null); gv=$(jq -r "$1 // empty" .lisa.config.json 2>/dev/null); echo "${lv:-${gv}}"; }
493
+ CURRENT_REPO=$(read_g '.repo')
494
+ [ -z "$CURRENT_REPO" ] && CURRENT_REPO=$(read_g '.github.repo')
495
+ [ -z "$CURRENT_REPO" ] && CURRENT_REPO=$(basename -s .git "$(git remote get-url origin 2>/dev/null)" 2>/dev/null)
496
+ ```
497
+
498
+ If the current repo cannot be resolved by any tier, build-intake stops with a clear error rather than claiming tickets it cannot scope. The match is by repo short name (`repo:<CURRENT_REPO>`), case-insensitive.
499
+
441
500
  ## Invariants
442
501
 
443
502
  - Project tracker selection is **persistent** within a project — always read from config, never infer from the shape of `$ARGUMENTS`. If a developer wants a different destination for one run, they edit `.lisa.config.local.json`.
@@ -67,11 +67,12 @@ Sequence:
67
67
  2. `product-specialist` -- define user goals, user flows (Gherkin), acceptance criteria, error states, UX concerns, and out-of-scope items
68
68
  3. **Edge Case Brainstorm sub-flow** -- run the PRD candidate through the edge-case checklist; fold accepted cases into acceptance criteria, out-of-scope, or open questions
69
69
  4. `architecture-specialist` -- assess technical feasibility, identify constraints, map existing system boundaries
70
- 5. Synthesize findings into a PRD document containing: problem statement, user stories, acceptance criteria, technical constraints, open questions, and proposed scope
70
+ 5. Synthesize findings into a PRD containing: problem statement, user stories, acceptance criteria, technical constraints, open questions, and proposed scope
71
71
  6. **Plan Phase Tooling** -- review all available skills and agents (project-defined, plugin-provided, and built-in) and determine which ones the Plan phase will need. For each recommended skill or agent, state why it is needed. If no skills or agents beyond the defaults are identified, explicitly justify why the standard set is sufficient. Include this as a "Recommended Tooling for Plan Phase" section in the PRD.
72
- 7. `learner` -- capture discoveries for future sessions
72
+ 7. **Create the PRD in the configured source** -- invoke `lisa:prd-source-write` with the synthesized PRD (`title`, `body`, `initial_role` resolved from the caller's `prd_ready` flag — `draft` by default, `ready` when `prd_ready=true`, plus any `dedupe_key`/`marker`/`source_ref` the caller passed). The PRD **lives in the source** (Notion page / Confluence page / GitHub issue / Linear project per `.lisa.config.json` `source`); there is no separate document artifact. A `source` must be configured — if it is not, stop and report it. `prd-source-write` dedupes by marker, so re-running against the same idea references the existing PRD instead of creating a duplicate.
73
+ 8. `learner` -- capture discoveries for future sessions
73
74
 
74
- Output: A PRD document that includes a "Recommended Tooling for Plan Phase" section listing the skills and agents the Plan phase should use. If there is not enough context to produce a complete PRD, stop and report what is missing rather than producing an incomplete one.
75
+ Output: A PRD created in the configured source, carrying a "Recommended Tooling for Plan Phase" section, in the `draft` role by default (or `ready` when `prd_ready=true`, so `lisa:intake` auto-claims it). If there is not enough context to produce a complete PRD, stop and report what is missing rather than creating an incomplete one. If no `source` is configured, stop and report it rather than emitting a loose document.
75
76
 
76
77
  ### Plan
77
78
 
@@ -81,7 +81,7 @@ Notes:
81
81
 
82
82
  The terminal rollup state is whatever the project configures for `done` — which is **env-keyed** (`config-resolution` "Env-keyed `done`"): a `done` map keyed by environment (`dev`, `staging`, `production`), resolved from the merged PR's base branch. This rule does **not** hardcode a `dev → staging → prod` promotion chain as required — that is a project-specific deploy topology. A downstream project with dev/staging/prod environments rolls a parent up to whichever terminal `done` value matches the environment its leaves shipped to. The rule stays generic and multi-env capable.
83
83
 
84
- **Single-environment collapse (this repo).** Lisa's own deploy has only `main`/`production` (no dev/staging), so `done` is a single value, not a map, and the build lifecycle collapses to one chain: `ready → claimed (in-progress) → review (code-review) → done`. The rollup terminal state is simply `done`. This is the *collapsed* case of the generic rule, not a different rule — projects with more environments keep the env-keyed map.
84
+ **Single-environment collapse (this repo).** Lisa's own deploy has only `main`/`production` (no dev/staging), so `done` is a single value, not a map. For GitHub, the build lifecycle collapses to one chain: `ready → claimed (in-progress) → done`. The rollup terminal state is simply `done`. This is the *collapsed* case of the generic rule, not a different rule — projects with more environments keep the env-keyed map.
85
85
 
86
86
  ## Terminal native closure
87
87
 
@@ -108,9 +108,17 @@ The PRD never advances to `shipped` on its own authority — it is **derived** f
108
108
  **`/lisa:verify` (one work item) vs `/lisa:verify-prd` (the whole initiative).** These are deliberately separate scopes:
109
109
 
110
110
  - **`/lisa:verify`** empirically verifies a **single work item** (a ticket / story / sub-task) in its target environment as part of that item's Build/Fix/Improve flow. It is what drives a build ticket to its `done` state; it operates at the *leaf/build* level (see `leaf-only-lifecycle`). It does **not** read the PRD or judge initiative-level acceptance, and it is **not** replaced by PRD verification.
111
- - **`/lisa:verify-prd`** is the **initiative-level acceptance gate**. It runs *after* the PRD is `shipped` (all generated top-level work terminal), reads the PRD and its generated child set, confirms the children are terminal, then runs spec-conformance against the original PRD requirements plus empirical verification of the shipped surface. On pass it transitions the PRD `shipped → verified` and posts evidence; on fail it transitions the PRD `shipped → blocked`, posts a product-readable failure report, and creates linked fix issues for the missing or incorrect behavior. Re-runs are idempotent (no duplicate evidence, fix issues, or lifecycle transitions).
111
+ - **`/lisa:verify-prd`** is the **initiative-level acceptance gate**. It runs *after* the PRD is `shipped` (all generated top-level work terminal), reads the PRD and its generated child set, confirms the children are terminal, then runs spec-conformance against the original PRD requirements plus empirical verification of the shipped surface. On pass it transitions the PRD `shipped → verified` and posts evidence; on fail it **re-opens the PRD `shipped → ticketed`** (never `blocked`), creates **build-ready fix tickets** for the missing or incorrect behavior (registered as the PRD's generated work) and posts a product-readable failure report — the fix tickets auto-build, rollup re-ships the PRD once they are terminal, and a later cycle re-verifies (self-healing; see "Closing the loop" below). Re-runs are idempotent (no duplicate evidence, fix tickets, or lifecycle transitions).
112
112
 
113
- **No extra failure states.** A failed PRD verification reuses the existing `blocked` role (`shipped → blocked`) rather than introducing a `prd-verifying` or `prd-verification-failed` state — the lifecycle stays intentionally small. `verified` is terminal and product-owned (like `draft` and `shipped`); a PRD is never moved to `verified` solely because its tickets are closed, and a PRD is never closed/archived before verification has passed. The vendor maps for the `verified` role (`prd-verified` label for GitHub/Linear, `Verified` status for Notion, the verified parent page for Confluence) live in the `config-resolution` rule.
113
+ **No extra failure states, and verification never uses `blocked`.** A failed PRD verification does **not** move the PRD to `blocked`; it re-opens the PRD `shipped → ticketed` and creates build-ready fix tickets (see "Closing the loop"), forming a self-healing loop rather than parking the PRD for a human. It introduces no `prd-verifying` or `prd-verification-failed` state — the lifecycle stays intentionally small, and `blocked` remains the *intake* (ready-stage validation) failure state, not the verification one. `verified` is terminal and product-owned (like `draft` and `shipped`); a PRD is never moved to `verified` solely because its tickets are closed, and a PRD is never closed/archived before verification has passed. The vendor maps for the `verified` role (`prd-verified` label for GitHub/Linear, `Verified` status for Notion, the verified parent page for Confluence) live in the `config-resolution` rule.
114
+
115
+ ### Closing the loop: PRD intake dispatches `/lisa:verify-prd` for shipped PRDs
116
+
117
+ `shipped → verified` does not happen on its own — something has to run the acceptance gate. The PRD-intake scanners close that loop: in addition to the `ticketed → shipped` rollup, each PRD-intake cycle **dispatches `/lisa:verify-prd` for a shipped PRD** so a shipped PRD does not sit unverified forever. This is a **dispatch**, not a transition — the intake scanner still never *sets* the verification outcome itself; `/lisa:verify-prd` (which it invokes) performs the `shipped → verified` (pass) or, on fail, the `shipped → ticketed` re-open (it **never** uses `blocked`), with its own guard, evidence, and build-ready fix-ticket creation.
118
+
119
+ **The self-healing FAIL loop.** When verify-prd fails it re-opens the PRD `shipped → ticketed` and creates **build-ready** fix tickets (registered as the PRD's generated work). Because the fix tickets are build-ready they are auto-claimed by the build queue with no human promotion; once they reach terminal, the `ticketed → shipped` rollup (Phase 3f) re-ships the PRD, and the next cycle's verify dispatch (Phase 3g) re-verifies. PASS ends at `verified`; FAIL starts another round. The loop **never auto-halts** (the failure report carries a verification-round count for human visibility) and **never** parks the PRD in `blocked`.
120
+
121
+ Bounded, like the ready claim: `/lisa:verify-prd` is a heavy full flow (spec-conformance + empirical verification + fix-ticket creation), so a scanner verifies **one shipped PRD per cycle** and lets the scheduler drain the rest — the same one-item-per-cycle discipline the `ready` claim uses. After verify-prd runs, the PRD leaves `shipped` (to `verified` on pass, or `ticketed` on fail), so it is not re-picked by the shipped query that cycle; a PRD whose generated work is not actually terminal is guard-stopped by verify-prd and left `shipped` (verify-prd's gate, not the scanner's). A PRD that the project chose to close on ship (`*.rollup.closeOnShipped = true`) is out of the open verification queue — closing on ship is an explicit opt-out of the open loop. This dispatch is **behaviorally identical across all four PRD-intake skills** (the `github` / `linear` / `notion` / `confluence` `*-prd-intake` Phase 3g); only the `shipped`-role query surface differs.
114
122
 
115
123
  ## Idempotency dedupe key
116
124
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Leaf work units are single-repo. A **leaf work unit** is an individually implementable ticket with no child tickets — issue types **Bug, Task, Sub-task, Improvement**. Each must name exactly one repository. **Epic, Story, Spike** are coordination containers and may span repos.
4
4
 
5
- This invariant is enforced at three points: gate **S10** in the `*-validate-*` skills (write time), `task-decomposition` step 1.5 (PRD-decomposition time), and the work-time split procedure below (when an agent picks up an existing ticket to implement it).
5
+ This invariant is enforced at four points: gate **S10** in the `*-validate-*` skills (write time), `task-decomposition` step 1.5 (PRD-decomposition time), **claim-time repo scoping** in the build-intake skills (when intake decides whether to claim a ready ticket for the current repo — see below), and the work-time split procedure below (when an agent picks up an existing ticket to implement it).
6
6
 
7
7
  ## Two splitting strategies, by phase
8
8
 
@@ -32,6 +32,23 @@ Auto-split only when the split is unambiguous. Fall back to the standard BLOCK +
32
32
  - Splitting would strand stakeholder context that only the reporter can re-scope (e.g. the acceptance criteria describe a single indivisible cross-repo behavior with no clean per-repo boundary).
33
33
  - The metadata required to clone (parent, environment, credentials) is itself missing — block on the missing metadata first; do not propagate gaps into the siblings.
34
34
 
35
+ ## Claim-time repo scoping (build-intake)
36
+
37
+ A ticketing system can oversee multiple repos (one JIRA project / Linear team for `frontend`, `backend`, `infrastructure`). When `lisa:*-build-intake` runs inside one repo, it claims only tickets for **that** repo — it never pulls a ready ticket meant for a sibling repo. This is the fourth enforcement point of the single-repo-leaf invariant; it runs in each vendor build-intake's claim gate (Phase 3a), **before** the leaf-only container gate and the claim.
38
+
39
+ Resolve the current repo per the `config-resolution` "Repo scoping" section (config `repo` → `github.repo` → git remote basename; stop with a clear error if unresolvable). Then walk the ready candidates in priority order and apply the **repo-scope decision** to each before claiming:
40
+
41
+ 1. **Read the candidate's repo marker** — the `repo:<name>` label (JIRA: also a component equal to a repo name).
42
+ - **Labeled for another repo** → **skip** cheaply (do not claim, do not re-determine); it stays `ready` for that repo's own intake. Move to the next candidate.
43
+ - **Labeled for the current repo** → proceed to the leaf-only gate + claim (the cheap, common path once labels exist).
44
+ - **Unlabeled** → **determine** the target repo(s) from the ticket (description, acceptance criteria, technical approach) confirmed against the actual code surfaces the change requires — the same detection as step 1 of the work-time split. Then **stamp** the resolved `repo:<name>` label(s) so future cycles filter cheaply, and re-apply this decision with the now-known repo.
45
+ 2. **Multi-repo leaf → split, never claim.** If determination finds the leaf touches more than one repo, run the **work-time split procedure** below to break it into single-repo siblings — each created **build-ready** (`build_ready: true`, so the build queue auto-claims it) and stamped with its own `repo:<name>`. After the split, the current repo's sibling (if any) becomes a normal current-repo candidate; the others are separate single-repo `ready` leaves for their repos. A multi-repo leaf is never claimed as-is.
46
+ 3. **Wrong repo → skip.** A single-repo leaf whose `repo:<name>` ≠ the current repo is left `ready` (and labeled) and skipped; intake moves on until it finds a claimable current-repo leaf, then stops (one item per cycle).
47
+
48
+ **Cost.** Only **unlabeled** candidates need content determination; once stamped, wrong-repo candidates are skipped by label alone. Prefer candidates already labeled `repo:<current>` first (cheap claim), falling through to unlabeled candidates (determine + stamp) only when no pre-labeled current-repo leaf is ready.
49
+
50
+ A container (Epic/Story/Spike) is handled by the leaf-only gate, not here — containers may span repos and are never claimed/built directly.
51
+
35
52
  ## Vendor mechanics
36
53
 
37
54
  The procedure is vendor-neutral; the create + link + edit mechanics differ:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: confluence-prd-intake
3
- description: "Scans a Confluence space (or a parent page) for PRD pages currently parented under the configured `ready` lifecycle page and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written and are re-parented under the `ticketed` lifecycle page; PRDs that fail get clarifying-question comments and are re-parented under the `blocked` lifecycle page. Confluence counterpart of `lisa:notion-prd-intake` — the workflow is identical; only the source-of-truth tools and the state encoding differ (parent-page re-parenting instead of a status property). Composes existing skills (confluence-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough)."
3
+ description: "Scans a Confluence space (or a parent page) for PRD pages currently parented under the configured `ready` lifecycle page and runs the first eligible one through the dry-run validation pipeline. A PRD that passes every gate gets tickets written and is re-parented under the `ticketed` lifecycle page; a PRD that fails gets clarifying-question comments and is re-parented under the `blocked` lifecycle page. Confluence counterpart of `lisa:notion-prd-intake` — the workflow is identical; only the source-of-truth tools and the state encoding differ (parent-page re-parenting instead of a status property). Composes existing skills (confluence-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough)."
4
4
  allowed-tools: ["Skill", "Bash"]
5
5
  ---
6
6
 
@@ -11,10 +11,10 @@ All Atlassian operations in this skill go through `lisa:atlassian-access`. Do no
11
11
  `$ARGUMENTS` is one of:
12
12
 
13
13
  - A Confluence **space** URL or space key — used as the surrounding scope sanity check. Example: `https://mycompany.atlassian.net/wiki/spaces/PRD` or `PRD`.
14
- - A Confluence **parent page** URL or page ID — overrides the configured `confluence.parents.ready` page for this run (useful when an operator wants to drain an alternative lifecycle parent). Example: `https://mycompany.atlassian.net/wiki/spaces/PRD/pages/123456789/PRDs`.
14
+ - A Confluence **parent page** URL or page ID — overrides the configured `confluence.parents.ready` page for this run (useful when an operator wants to target an alternative lifecycle parent). Example: `https://mycompany.atlassian.net/wiki/spaces/PRD/pages/123456789/PRDs`.
15
15
  - Empty — use `confluence.parents.ready` from `.lisa.config.json` as the scope.
16
16
 
17
- Run one intake cycle against the resolved `ready` lifecycle parent. Each direct child of that parent is treated as a PRD currently in the `ready` state. Each PRD is claimed (re-parented to `in_review`), validated, and routed to either the `blocked` parent (with clarifying comments) or the `ticketed` parent (with destination tickets created).
17
+ Run one intake cycle against the resolved `ready` lifecycle parent. Each direct child of that parent is treated as a PRD currently in the `ready` state. The first eligible PRD is claimed (re-parented to `in_review`), validated, routed to either the `blocked` parent (with clarifying comments) or the `ticketed` parent (with destination tickets created), then the cycle exits. Remaining ready PRDs stay queued for later scheduler invocations.
18
18
 
19
19
  ## Why parent pages, not labels
20
20
 
@@ -82,7 +82,7 @@ The **PRD closure rollup phase (3f)** re-parents a `ticketed` PRD to the `shippe
82
82
 
83
83
  ## Confirmation policy
84
84
 
85
- Do NOT ask the caller whether to proceed. Once invoked, run the cycle to completion — claim, validate, branch to the `blocked` or `ticketed` parent, write the summary. The caller (a human or a cron) has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background batch.
85
+ Do NOT ask the caller whether to proceed. Once invoked, run the cycle to completion for the first eligible PRD — claim, validate, branch to the `blocked` or `ticketed` parent, write the summary, and exit. The caller (a human or a cron) has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background queue.
86
86
 
87
87
  Specifically forbidden:
88
88
 
@@ -108,7 +108,7 @@ draft → ready → in_review → blocked | ticketed → shipped → verified
108
108
 
109
109
  (Each role corresponds to a dedicated parent page; the `verified` parent is resolved from `confluence.parents.verified`.)
110
110
 
111
- `verified` is the terminal state after `shipped`: it means the shipped product has been empirically checked against the PRD (set by `/lisa:verify-prd`, not by this intake skill). A failed post-ship verification re-parents back under `blocked` rather than introducing a separate `verifying` / `verification-failed` parent. Like `draft` and `shipped`, `verified` is **product-owned** — this intake skill never re-parents a PRD into or out of the `verified` parent. See the "PRD-level verification vs ticket verification" section of the `prd-lifecycle-rollup` rule.
111
+ `verified` is the terminal state after `shipped`: it means the shipped product has been empirically checked against the PRD (set by `/lisa:verify-prd`, not by this intake skill). A failed post-ship verification does **not** use `blocked`; `/lisa:verify-prd` re-parents the PRD `shipped → ticketed` and creates build-ready fix tickets that auto-build and trigger a re-verify (the self-healing loop), introducing no `verifying` / `verification-failed` parent. Like `draft` and `shipped`, `verified` is **product-owned** — this intake skill never re-parents a PRD into or out of the `verified` parent. See the "PRD-level verification vs ticket verification" section of the `prd-lifecycle-rollup` rule.
112
112
 
113
113
  A PRD's current state is determined entirely by which lifecycle parent it sits under. Re-parenting is the transition.
114
114
 
@@ -151,9 +151,9 @@ If the result set is empty, run a sanity probe across the other lifecycle parent
151
151
  - If every lifecycle parent has zero direct children → the lifecycle scaffolding is provisioned but unused, OR PRDs are still parented under the legacy structure. Surface: `"No PRDs found under any of the configured lifecycle parent pages (ready, in_review, blocked, ticketed). If this is a new project, move PRDs that are ready for ticketing under the configured 'ready' parent page (see Adoption section)."` Exit with an error — this is a setup / migration issue, not a normal idle cycle.
152
152
  - If any non-ready parent has children → the queue is genuinely empty (PRDs exist but are in `in_review`, `blocked`, `ticketed`, or `shipped`). Exit cleanly with `"No PRDs currently parented under the 'ready' lifecycle page. Nothing to do."`
153
153
 
154
- ### Phase 3 — Process each ready PRD
154
+ ### Phase 3 — Process the first eligible ready PRD
155
155
 
156
- For each PRD page (process serially to keep transitions auditable):
156
+ Select the first ready PRD page returned by Phase 2 and process only that page. Later scheduler invocations process the remaining ready PRDs.
157
157
 
158
158
  #### 3a. Claim
159
159
 
@@ -277,9 +277,9 @@ Use these exact badge labels — they are the validator's category values transl
277
277
 
278
278
  After all comments are posted (anchored groups + the optional footer summary), re-parent the PRD to the `blocked` lifecycle parent: `transition_prd "$PRD_ID" blocked`. Do NOT write any destination tickets.
279
279
 
280
- #### 3d. Continue
280
+ #### 3d. Stop
281
281
 
282
- Move to the next ready PRD. One PRD failing does not affect others.
282
+ Stop immediately after the claimed PRD is ticketed, blocked, or recorded as an error.
283
283
 
284
284
  #### 3e. Coverage audit (mandatory after re-parenting to `ticketed`)
285
285
 
@@ -290,7 +290,7 @@ Per-ticket gates prove each ticket is well-formed; they do NOT prove the *set* o
290
290
 
291
291
  | Verdict | Action |
292
292
  |---------|--------|
293
- | `COMPLETE` | Done. Leave PRD under `ticketed` parent. Move to next PRD. |
293
+ | `COMPLETE` | Done. Leave PRD under `ticketed` parent. End the cycle. |
294
294
  | `COMPLETE_WITH_SCOPE_CREEP` | Post an advisory footer comment naming the scope-creep tickets (so product can decide whether to close them as out-of-scope). Leave PRD under `ticketed` parent. |
295
295
  | `GAPS_FOUND` | The created ticket set is incomplete. (a) For each gap, post a comment using the same product-facing template as Phase 3c.3 — inline-anchored when `prd_anchor` is non-null, footer otherwise; category badge from the gap's `category` field; `What's unclear` and `Recommendation` from the audit report's `what` and `recommendation` fields. Apply the same forbidden-language rules from Phase 3c.5. (b) Post one footer summary comment listing the tickets that *were* successfully created (so product knows what to keep vs. what to extend). (c) Re-parent the PRD from `ticketed` back to `blocked`: `transition_prd "$PRD_ID" blocked`. |
296
296
  | `NO_TICKETS_FOUND` | Should not happen if step 2 succeeded. If it does, log it as an Error in the cycle summary and leave the PRD under `ticketed` with a comment flagging the audit failure for human review. |
@@ -352,9 +352,19 @@ The set of **required** children for the all-terminal check is the top-level chi
352
352
 
353
353
  This phase implements exactly one PRD-lifecycle hop — `ticketed → shipped` — and the optional config-gated archive that follows it. All terminal-state semantics, the generated-top-level-work boundary, and the dedupe-by-child-ref idempotency come from the `prd-lifecycle-rollup` rule; this skill is its Confluence implementation, not a second source of truth.
354
354
 
355
+ #### 3g. PRD verification dispatch (close the loop on shipped PRDs)
356
+
357
+ `shipped` and `verified` are distinct facts about a PRD (see the `prd-lifecycle-rollup` rule's "PRD-level verification vs ticket verification" and "Closing the loop" sections). Rollup (3f) only reaches the shipped parent; the `shipped → verified` (pass) / `shipped → ticketed` (fail) hops are owned by `/lisa:verify-prd`. This phase **closes that loop** by dispatching the initiative-level acceptance gate for shipped PRDs. It never performs the verification transition itself — the "never sets the verification outcome" invariant holds: `lisa:verify-prd`, not this skill, sets `verified` (or, on failure, re-opens the PRD to `ticketed`).
358
+
359
+ Re-query the PRDs currently parented under the shipped lifecycle parent via `lisa:atlassian-access` `operation: read-page-descendants id: <confluence.parents.shipped>`. Pick the **first** one and invoke `lisa:verify-prd <page-url>`. Process **one shipped PRD per cycle** — `lisa:verify-prd` is a heavy full flow (spec-conformance + empirical verification + fix-issue creation), so it is bounded exactly like the single-ready-PRD claim in Phase 3; the scheduler drains the rest.
360
+
361
+ **Per-cycle combined bound:** each scheduler cycle dispatches at most one ready PRD (the Phase 3 single-ready-PRD claim) **and** at most one shipped PRD for verification (this Phase 3g dispatch), for a maximum of two PRD operations per cycle. Ready intake runs first (Phase 3), then shipped verify (Phase 3g).
362
+
363
+ `lisa:verify-prd` owns the outcome: on a CONFORMS verdict with all empirical checks passing it transitions the PRD to the verified parent and posts evidence; on a conformance miss or a failing/unavailable check it **re-parents the PRD shipped → ticketed** (never the blocked parent) and creates **build-ready** fix tickets registered as the PRD's generated work, then posts a failure report — the fix tickets auto-build, rollup (3f) re-ships the PRD once they are terminal, and a later cycle re-verifies (the self-healing loop). Either branch moves the PRD out of the shipped parent, so it is not re-picked this cycle; a PRD whose generated work is not actually terminal is guard-stopped by `lisa:verify-prd` (left under shipped) — that is verify-prd's gate, not this skill's. A PRD archived on ship (`confluence.rollup.closeOnShipped = true`) is out of the open verification queue. This phase, like 3f, is **behaviorally identical across all four intake skills** (`github-prd-intake`, `linear-prd-intake`, `notion-prd-intake`, `confluence-prd-intake`) — only the `$SHIPPED` query surface differs; keep them aligned. Record the dispatched PRD + verify-prd's verdict in the summary.
364
+
355
365
  ### Phase 4 — Summary report
356
366
 
357
- After processing every ready PRD, emit a summary:
367
+ After processing the single selected PRD, emit a summary:
358
368
 
359
369
  ```text
360
370
  ## confluence-prd-intake summary
@@ -379,10 +389,10 @@ Print to the agent's output. Do not write this summary to Confluence or the dest
379
389
 
380
390
  ## Idempotency & safety
381
391
 
382
- - **Single-cycle scope**: this skill processes the ready set as it exists at the start of Phase 2. New PRDs moved under the `ready` parent mid-cycle are picked up next run.
392
+ - **One item per cycle**: this skill processes the first eligible ready PRD from Phase 2, then exits. New or remaining PRDs under the `ready` parent are picked up by later scheduler invocations.
383
393
  - **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:confluence-to-tracker` (which delegates to `lisa:tracker-write`), and only ever re-parents PRDs among `in_review`, `blocked`, `ticketed`, and `shipped` (the last via the rollup phase 3f only) via `lisa:atlassian-access` `operation: write-page`. It never edits PRD body content, never re-parents into or out of `draft`, never deletes pages. It re-parents under `shipped` and may archive the PRD page **only** through the config-gated rollup phase (3f).
384
394
  - **Claim-first ordering**: the re-parent to `in_review` happens BEFORE validation runs, so a re-entrant call won't double-process.
385
- - **Failure isolation**: an exception processing one PRD must not stop the cycle. Catch, record under "Errors" in the summary, continue to the next PRD. The PRD that errored is left under whatever parent it currently occupies (usually `in_review` if claim succeeded) — the human investigates from there.
395
+ - **Failure handling**: an exception processing the selected PRD is caught and recorded under "Errors" in the summary, then the cycle exits. The PRD that errored is left under whatever parent it currently occupies (usually `in_review` if claim succeeded) — the human investigates from there.
386
396
  - **Single-parent invariant**: a page has exactly one parent by construction in Confluence — the multi-state ambiguity that label-based systems can hit (two `prd-*` labels simultaneously) cannot occur here. After every transition, re-read the page and confirm `parentId` matches the expected role; if not, surface as an Error and skip.
387
397
  - **Rollup idempotency**: rollup (Phase 3f) is a no-op on a PRD already parented under `$SHIPPED_PARENT` (and already archived when `closeOnShipped` is `true`) — no duplicate re-parent, no duplicate archive, no duplicate comment. The all-terminal condition is a pure function of the children's current states (deduped by child-ref identity), so recomputing it is safe to re-run. Archival NEVER precedes the all-terminal condition.
388
398
 
@@ -425,4 +435,4 @@ Before this skill can run against a project, the project must adopt the lifecycl
425
435
  3. Move each existing PRD page under the appropriate lifecycle parent based on its current state. Product moves PRDs from `draft` → `ready` when they are ready for ticketing (replaces the Notion `Status = Ready` flip).
426
436
  4. Reserve the `in_review`, `blocked`, and `ticketed` parents for this skill — humans should not re-parent PRDs into them manually except to recover from an error.
427
437
 
428
- If the project hasn't adopted these parent pages, the first run exits with a provisioning error (not the idle empty-set message) — this distinguishes a setup issue from a genuinely empty queue so operators know to run `/lisa:setup:confluence` rather than assuming the queue is drained. See Phase 2 for how the skill detects this case.
438
+ If the project hasn't adopted these parent pages, the first run exits with a provisioning error (not the idle empty-set message) — this distinguishes a setup issue from a genuinely empty queue so operators know to run `/lisa:setup:confluence` rather than assuming there is no work. See Phase 2 for how the skill detects this case.
@@ -1,4 +1,4 @@
1
1
  display_name: "Confluence PRD Intake"
2
- short_description: "Scans a Confluence space (or a parent page) for PRD pages currently parented under the configured `ready` lifecycle page and runs each one…"
2
+ short_description: "Scans a Confluence space (or a parent page) for PRD pages currently parented under the configured `ready` lifecycle page and runs the first…"
3
3
  default_prompt:
4
- - "Use $confluence-prd-intake: Scans a Confluence space (or a parent page) for PRD pages currently parented under the configured `ready` lifecycle page and runs each one…."
4
+ - "Use $confluence-prd-intake: Scans a Confluence space (or a parent page) for PRD pages currently parented under the configured `ready` lifecycle page and runs the first…."