@codyswann/lisa 2.21.1 → 2.23.1

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 (152) hide show
  1. package/package.json +3 -2
  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 +11 -9
  5. package/plugins/lisa/agents/github-agent.md +18 -10
  6. package/plugins/lisa/agents/github-build-intake.md +10 -8
  7. package/plugins/lisa/agents/github-prd-intake.md +11 -9
  8. package/plugins/lisa/agents/jira-agent.md +12 -8
  9. package/plugins/lisa/agents/jira-build-intake.md +9 -7
  10. package/plugins/lisa/agents/learnings-synthesizer.md +1 -1
  11. package/plugins/lisa/agents/linear-agent.md +15 -9
  12. package/plugins/lisa/agents/linear-build-intake.md +13 -11
  13. package/plugins/lisa/agents/linear-prd-intake.md +11 -9
  14. package/plugins/lisa/agents/notion-prd-intake.md +11 -9
  15. package/plugins/lisa/agents/pr-mining-specialist.md +1 -1
  16. package/plugins/lisa/agents/tracker-mining-specialist.md +1 -1
  17. package/plugins/lisa/commands/setup/atlassian.md +7 -0
  18. package/plugins/lisa/commands/setup/confluence.md +7 -0
  19. package/plugins/lisa/commands/setup/jira.md +7 -0
  20. package/plugins/lisa/commands/setup/notion.md +7 -0
  21. package/plugins/lisa/hooks/enforce-team-first.sh +14 -6
  22. package/plugins/lisa/rules/base-rules.md +3 -3
  23. package/plugins/lisa/rules/config-resolution.md +242 -24
  24. package/plugins/lisa/rules/intent-routing.md +4 -4
  25. package/plugins/lisa/rules/repo-scope-split.md +41 -0
  26. package/plugins/lisa/rules/verification.md +13 -0
  27. package/plugins/lisa/skills/atlassian-access/SKILL.md +260 -0
  28. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +167 -82
  29. package/plugins/lisa/skills/confluence-to-tracker/SKILL.md +39 -26
  30. package/plugins/lisa/skills/debrief/SKILL.md +4 -5
  31. package/plugins/lisa/skills/github-add-journey/SKILL.md +1 -0
  32. package/plugins/lisa/skills/github-build-intake/SKILL.md +104 -40
  33. package/plugins/lisa/skills/github-evidence/SKILL.md +22 -5
  34. package/plugins/lisa/skills/github-prd-intake/SKILL.md +87 -51
  35. package/plugins/lisa/skills/github-to-tracker/SKILL.md +2 -2
  36. package/plugins/lisa/skills/github-validate-issue/SKILL.md +11 -1
  37. package/plugins/lisa/skills/implement/SKILL.md +5 -6
  38. package/plugins/lisa/skills/intake/SKILL.md +5 -6
  39. package/plugins/lisa/skills/jira-add-journey/SKILL.md +1 -0
  40. package/plugins/lisa/skills/jira-build-intake/SKILL.md +110 -45
  41. package/plugins/lisa/skills/jira-create/SKILL.md +5 -3
  42. package/plugins/lisa/skills/jira-evidence/SKILL.md +19 -2
  43. package/plugins/lisa/skills/jira-journey/SKILL.md +3 -1
  44. package/plugins/lisa/skills/jira-read-ticket/SKILL.md +10 -8
  45. package/plugins/lisa/skills/jira-sync/SKILL.md +11 -5
  46. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +22 -10
  47. package/plugins/lisa/skills/jira-verify/SKILL.md +5 -3
  48. package/plugins/lisa/skills/jira-write-ticket/SKILL.md +16 -14
  49. package/plugins/lisa/skills/linear-add-journey/SKILL.md +1 -0
  50. package/plugins/lisa/skills/linear-build-intake/SKILL.md +90 -32
  51. package/plugins/lisa/skills/linear-evidence/SKILL.md +22 -5
  52. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +92 -57
  53. package/plugins/lisa/skills/linear-validate-issue/SKILL.md +10 -0
  54. package/plugins/lisa/skills/monitor/SKILL.md +4 -5
  55. package/plugins/lisa/skills/notion-access/SKILL.md +193 -0
  56. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +105 -46
  57. package/plugins/lisa/skills/notion-to-tracker/SKILL.md +7 -5
  58. package/plugins/lisa/skills/plan/SKILL.md +4 -5
  59. package/plugins/lisa/skills/research/SKILL.md +4 -5
  60. package/plugins/lisa/skills/setup-atlassian/SKILL.md +316 -0
  61. package/plugins/lisa/skills/setup-confluence/SKILL.md +245 -0
  62. package/plugins/lisa/skills/setup-jira/SKILL.md +198 -0
  63. package/plugins/lisa/skills/setup-notion/SKILL.md +283 -0
  64. package/plugins/lisa/skills/task-decomposition/SKILL.md +2 -0
  65. package/plugins/lisa/skills/ticket-triage/SKILL.md +4 -1
  66. package/plugins/lisa/skills/tracker-evidence/SKILL.md +1 -0
  67. package/plugins/lisa/skills/verification-lifecycle/SKILL.md +2 -0
  68. package/plugins/lisa/skills/verify/SKILL.md +4 -5
  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/skills/ops-browser-uat/SKILL.md +1 -1
  74. package/plugins/lisa-expo/skills/ops-check-logs/SKILL.md +1 -1
  75. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  77. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  79. package/plugins/lisa-nestjs/skills/nestjs-graphql/references/project-patterns.md +48 -0
  80. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  82. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  84. package/plugins/src/base/agents/confluence-prd-intake.md +11 -9
  85. package/plugins/src/base/agents/github-agent.md +18 -10
  86. package/plugins/src/base/agents/github-build-intake.md +10 -8
  87. package/plugins/src/base/agents/github-prd-intake.md +11 -9
  88. package/plugins/src/base/agents/jira-agent.md +12 -8
  89. package/plugins/src/base/agents/jira-build-intake.md +9 -7
  90. package/plugins/src/base/agents/learnings-synthesizer.md +1 -1
  91. package/plugins/src/base/agents/linear-agent.md +15 -9
  92. package/plugins/src/base/agents/linear-build-intake.md +13 -11
  93. package/plugins/src/base/agents/linear-prd-intake.md +11 -9
  94. package/plugins/src/base/agents/notion-prd-intake.md +11 -9
  95. package/plugins/src/base/agents/pr-mining-specialist.md +1 -1
  96. package/plugins/src/base/agents/tracker-mining-specialist.md +1 -1
  97. package/plugins/src/base/commands/setup/atlassian.md +7 -0
  98. package/plugins/src/base/commands/setup/confluence.md +7 -0
  99. package/plugins/src/base/commands/setup/jira.md +7 -0
  100. package/plugins/src/base/commands/setup/notion.md +7 -0
  101. package/plugins/src/base/hooks/enforce-team-first.sh +14 -6
  102. package/plugins/src/base/rules/base-rules.md +3 -3
  103. package/plugins/src/base/rules/config-resolution.md +242 -24
  104. package/plugins/src/base/rules/intent-routing.md +4 -4
  105. package/plugins/src/base/rules/repo-scope-split.md +41 -0
  106. package/plugins/src/base/rules/verification.md +13 -0
  107. package/plugins/src/base/skills/atlassian-access/SKILL.md +260 -0
  108. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +167 -82
  109. package/plugins/src/base/skills/confluence-to-tracker/SKILL.md +39 -26
  110. package/plugins/src/base/skills/debrief/SKILL.md +4 -5
  111. package/plugins/src/base/skills/github-add-journey/SKILL.md +1 -0
  112. package/plugins/src/base/skills/github-build-intake/SKILL.md +104 -40
  113. package/plugins/src/base/skills/github-evidence/SKILL.md +22 -5
  114. package/plugins/src/base/skills/github-prd-intake/SKILL.md +87 -51
  115. package/plugins/src/base/skills/github-to-tracker/SKILL.md +2 -2
  116. package/plugins/src/base/skills/github-validate-issue/SKILL.md +11 -1
  117. package/plugins/src/base/skills/implement/SKILL.md +5 -6
  118. package/plugins/src/base/skills/intake/SKILL.md +5 -6
  119. package/plugins/src/base/skills/jira-add-journey/SKILL.md +1 -0
  120. package/plugins/src/base/skills/jira-build-intake/SKILL.md +110 -45
  121. package/plugins/src/base/skills/jira-create/SKILL.md +5 -3
  122. package/plugins/src/base/skills/jira-evidence/SKILL.md +19 -2
  123. package/plugins/src/base/skills/jira-journey/SKILL.md +3 -1
  124. package/plugins/src/base/skills/jira-read-ticket/SKILL.md +10 -8
  125. package/plugins/src/base/skills/jira-sync/SKILL.md +11 -5
  126. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +22 -10
  127. package/plugins/src/base/skills/jira-verify/SKILL.md +5 -3
  128. package/plugins/src/base/skills/jira-write-ticket/SKILL.md +16 -14
  129. package/plugins/src/base/skills/linear-add-journey/SKILL.md +1 -0
  130. package/plugins/src/base/skills/linear-build-intake/SKILL.md +90 -32
  131. package/plugins/src/base/skills/linear-evidence/SKILL.md +22 -5
  132. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +92 -57
  133. package/plugins/src/base/skills/linear-validate-issue/SKILL.md +10 -0
  134. package/plugins/src/base/skills/monitor/SKILL.md +4 -5
  135. package/plugins/src/base/skills/notion-access/SKILL.md +193 -0
  136. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +105 -46
  137. package/plugins/src/base/skills/notion-to-tracker/SKILL.md +7 -5
  138. package/plugins/src/base/skills/plan/SKILL.md +4 -5
  139. package/plugins/src/base/skills/research/SKILL.md +4 -5
  140. package/plugins/src/base/skills/setup-atlassian/SKILL.md +316 -0
  141. package/plugins/src/base/skills/setup-confluence/SKILL.md +245 -0
  142. package/plugins/src/base/skills/setup-jira/SKILL.md +198 -0
  143. package/plugins/src/base/skills/setup-notion/SKILL.md +283 -0
  144. package/plugins/src/base/skills/task-decomposition/SKILL.md +2 -0
  145. package/plugins/src/base/skills/ticket-triage/SKILL.md +4 -1
  146. package/plugins/src/base/skills/tracker-evidence/SKILL.md +1 -0
  147. package/plugins/src/base/skills/verification-lifecycle/SKILL.md +2 -0
  148. package/plugins/src/base/skills/verify/SKILL.md +4 -5
  149. package/plugins/src/expo/skills/ops-browser-uat/SKILL.md +1 -1
  150. package/plugins/src/expo/skills/ops-check-logs/SKILL.md +1 -1
  151. package/plugins/src/nestjs/skills/nestjs-graphql/references/project-patterns.md +48 -0
  152. package/scripts/check-plugins-sync.sh +45 -0
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: github-prd-intake
3
- description: "Scans a GitHub repository for issues labeled `prd-ready` and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written (to whatever destination tracker is configured — JIRA, GitHub Issues itself, or Linear) and the label flipped to `prd-ticketed`; PRDs that fail get clarifying-question comments and the label flipped to `prd-blocked`. The GitHub counterpart of lisa:notion-prd-intake / lisa:confluence-prd-intake / lisa:linear-prd-intake. Composes existing skills (github-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough)."
3
+ description: "Scans a GitHub repository for issues carrying the configured `ready` PRD label and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written (to whatever destination tracker is configured — JIRA, GitHub Issues itself, or Linear) and the label flipped to the configured `ticketed` label; PRDs that fail get clarifying-question comments and the label flipped to the configured `blocked` label. The GitHub counterpart of lisa:notion-prd-intake / lisa:confluence-prd-intake / lisa:linear-prd-intake. Composes existing skills (github-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough)."
4
4
  allowed-tools: ["Skill", "Bash"]
5
5
  ---
6
6
 
@@ -8,56 +8,81 @@ allowed-tools: ["Skill", "Bash"]
8
8
 
9
9
  `$ARGUMENTS` is one of:
10
10
 
11
- - A GitHub `org/repo` token (e.g., `acme/product-prds`) — scans the repo for issues labeled `prd-ready`.
11
+ - A GitHub `org/repo` token (e.g., `acme/product-prds`) — scans the repo for issues carrying the configured `ready` PRD label.
12
12
  - A full GitHub repo URL (e.g., `https://github.com/acme/product-prds`).
13
13
  - The literal token `github` — falls back to `.lisa.config.json` (`github.org` / `github.repo`).
14
14
 
15
- Run one intake cycle against that repo. Each issue with the `prd-ready` label is claimed, validated, and routed to either `prd-blocked` (with clarifying comments) or `prd-ticketed` (with destination tickets created).
15
+ Run one intake cycle against that repo. Each issue with the `ready` label is claimed, validated, and routed to either the `blocked` label (with clarifying comments) or the `ticketed` label (with destination tickets created).
16
+
17
+ ## Workflow resolution
18
+
19
+ PRD label names are read from `.lisa.config.json` `github.labels.prd.*`, falling back to defaults documented in the `config-resolution` rule. Bash pattern:
20
+
21
+ ```bash
22
+ # Read role with default fallback. Local overrides global per-key.
23
+ read_role() {
24
+ local role="$1" default="$2"
25
+ local local_v global_v
26
+ local_v=$(jq -r ".github.labels.prd.${role} // empty" .lisa.config.local.json 2>/dev/null)
27
+ global_v=$(jq -r ".github.labels.prd.${role} // empty" .lisa.config.json 2>/dev/null)
28
+ echo "${local_v:-${global_v:-$default}}"
29
+ }
30
+
31
+ READY=$(read_role ready "prd-ready")
32
+ IN_REVIEW=$(read_role in_review "prd-in-review")
33
+ BLOCKED=$(read_role blocked "prd-blocked")
34
+ TICKETED=$(read_role ticketed "prd-ticketed")
35
+ SHIPPED=$(read_role shipped "prd-shipped")
36
+ ```
37
+
38
+ In prose below, the role names refer to the resolved labels: e.g. "the `ready` label" means whatever `github.labels.prd.ready` resolves to (default: `prd-ready`).
16
39
 
17
40
  This skill is the GitHub counterpart of `lisa:notion-prd-intake`, `lisa:confluence-prd-intake`, and `lisa:linear-prd-intake`. Phases, gates, comment templates, and rules are identical — the only differences are (1) the lifecycle is encoded as **issue labels** (mirroring Linear's project labels and Confluence's page labels), (2) the fetch / update tools are the `gh` CLI, and (3) clarifying-question comments land directly on the source PRD issue (because GitHub Issues *do* have native comments — no sentinel issue required, unlike Linear). Keep all four skills behaviorally aligned: when changing intake logic, change them together.
18
41
 
19
42
  ## Confirmation policy
20
43
 
21
- Do NOT ask the caller whether to proceed. Once invoked with a repo, run the cycle to completion — claim, validate, branch to `prd-blocked` or `prd-ticketed`, write the summary. The caller has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background batch.
44
+ Do NOT ask the caller whether to proceed. Once invoked with a repo, run the cycle to completion — claim, validate, branch to `$BLOCKED` or `$TICKETED`, write the summary. The caller has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background batch.
22
45
 
23
46
  Specifically forbidden:
24
47
 
25
48
  - Previewing projected scope and asking whether to continue.
26
49
  - Offering A/B/C-style choices like "proceed / skip / dry-run only" — the documented behavior IS the default.
27
- - Pausing because a PRD looks large, has many open questions, or is likely to end in `prd-blocked`. `prd-blocked` is a valid terminal state of this lifecycle, not a failure mode.
50
+ - Pausing because a PRD looks large, has many open questions, or is likely to end in `$BLOCKED`. The `blocked` label is a valid terminal state of this lifecycle, not a failure mode.
28
51
  - Pausing because the dry-run validation looks expensive.
29
52
 
30
53
  The only legitimate reasons to stop early:
31
54
 
32
55
  - Missing repo argument or required configuration. Surface and exit.
33
- - Repo unreachable, or the labelling convention not yet adopted (no issue carries any of `prd-ready` / `prd-in-review` / `prd-blocked` / `prd-ticketed`). Surface and exit.
34
- - Empty `prd-ready` set. Exit cleanly with `"No GitHub issues labeled prd-ready in <org>/<repo>. Nothing to do."`
56
+ - Repo unreachable, or the labelling convention not yet adopted (no issue carries any of `$READY` / `$IN_REVIEW` / `$BLOCKED` / `$TICKETED`). Surface and exit.
57
+ - Empty ready set. Exit cleanly with `"No GitHub issues labeled $READY in <org>/<repo>. Nothing to do."`
35
58
 
36
59
  ## Lifecycle assumed
37
60
 
38
61
  The PRD lifecycle is encoded as **issue labels**:
39
62
 
40
63
  ```text
41
- prd-draft → prd-ready → prd-in-reviewprd-blocked | prd-ticketed → prd-shipped
42
- (product) (us) (us) (product)
64
+ draft → ready → in_review → blocked | ticketed → shipped
65
+ (product) (us) (us) (product)
43
66
  ```
44
67
 
68
+ (Defaults: `prd-draft` / `prd-ready` / `prd-in-review` / `prd-blocked` / `prd-ticketed` / `prd-shipped`.)
69
+
45
70
  Exactly one of these labels is expected on a PRD issue at any time.
46
71
 
47
72
  This skill ONLY transitions:
48
73
 
49
- - `prd-ready` → `prd-in-review` (claim)
50
- - `prd-in-review` → `prd-blocked` (gate failures or coverage gaps)
51
- - `prd-in-review` → `prd-ticketed` (success)
52
- - `prd-ticketed` → `prd-blocked` (post-write coverage gaps from Phase 3e)
74
+ - `$READY` → `$IN_REVIEW` (claim)
75
+ - `$IN_REVIEW` → `$BLOCKED` (gate failures or coverage gaps)
76
+ - `$IN_REVIEW` → `$TICKETED` (success)
77
+ - `$TICKETED` → `$BLOCKED` (post-write coverage gaps from Phase 3e)
53
78
 
54
- It never adds, removes, or touches `prd-draft` or `prd-shipped`. Those labels are owned by product.
79
+ It never adds, removes, or touches the `draft` or `shipped` labels. Those labels are owned by product.
55
80
 
56
81
  A "transition" means: remove the old lifecycle label and add the new one (`gh issue edit <num> --remove-label <old> --add-label <new>`). The skill MUST verify exactly one lifecycle label is present after the update.
57
82
 
58
- If the repo has not yet adopted `prd-*` labels, this skill cannot run. See "Adoption" at the bottom.
83
+ If the repo has not yet adopted these labels, this skill cannot run. See "Adoption" at the bottom.
59
84
 
60
- **Label namespace separation:** the PRD lifecycle uses the `prd-*` namespace. The build-queue lifecycle (used by `lisa:github-build-intake`) uses the `status:*` namespace. The two never overlap. When the destination tracker is also GitHub Issues (self-host case), the same repo can host both — but a single issue is either a PRD (carrying a `prd-*` label) or a build ticket (carrying a `status:*` label), never both.
85
+ **Label namespace separation:** the PRD lifecycle uses the configured PRD labels (defaults `prd-*`). The build-queue lifecycle (used by `lisa:github-build-intake`) uses the configured build labels (defaults `status:*`). The two never overlap. When the destination tracker is also GitHub Issues (self-host case), the same repo can host both — but a single issue is either a PRD (carrying a PRD lifecycle label) or a build ticket (carrying a build label), never both.
61
86
 
62
87
  ## Phases
63
88
 
@@ -69,40 +94,42 @@ If the repo has not yet adopted `prd-*` labels, this skill cannot run. See "Adop
69
94
  - Literal `github` → resolve from `.lisa.config.json`; error if not set.
70
95
  2. Confirm `gh auth status` succeeds.
71
96
  3. Confirm the repo is reachable: `gh repo view <org>/<repo> --json name`.
72
- 4. Verify the `prd-*` label set exists:
97
+ 4. Verify the PRD label set exists:
73
98
  ```bash
74
- gh label list --repo <org>/<repo> --json name --jq '[.[] | select(startswith("prd-"))] | sort'
99
+ gh label list --repo <org>/<repo> --json name --jq '.[] | .name' \
100
+ | grep -xE "$READY|$IN_REVIEW|$BLOCKED|$TICKETED|$SHIPPED"
75
101
  ```
76
- If none of `prd-ready` / `prd-in-review` / `prd-blocked` / `prd-ticketed` are present, surface a label-convention error and exit (see "Adoption").
102
+ If none of the configured PRD labels are present, surface a label-convention error and exit (see "Adoption").
77
103
 
78
- ### Phase 2 — Find Ready PRDs
104
+ ### Phase 2 — Find ready PRDs
79
105
 
80
106
  ```bash
81
- gh issue list --repo <org>/<repo> --label prd-ready --state open --limit 100 \
107
+ gh issue list --repo <org>/<repo> --label "$READY" --state open --limit 100 \
82
108
  --json number,title,body,labels,author,milestone,createdAt,updatedAt,url
83
109
  ```
84
110
 
85
- For each candidate, confirm exactly one lifecycle label is present (the `--label` filter selects `prd-ready` matches, but a PRD could have ended up with two labels by hand — that's a misconfiguration, not a normal queue entry).
111
+ For each candidate, confirm exactly one lifecycle label is present (the `--label` filter selects `$READY` matches, but a PRD could have ended up with two labels by hand — that's a misconfiguration, not a normal queue entry).
86
112
 
87
113
  If empty, run a secondary check:
88
114
 
89
115
  ```bash
90
- gh issue list --repo <org>/<repo> --state open --limit 100 --json number,labels --jq '[.[] | .labels[] | select(.name | startswith("prd-")) | .name] | unique'
116
+ gh issue list --repo <org>/<repo> --state open --limit 100 --json number,labels \
117
+ --jq "[.[] | .labels[] | select(.name == \"$READY\" or .name == \"$IN_REVIEW\" or .name == \"$BLOCKED\" or .name == \"$TICKETED\") | .name] | unique"
91
118
  ```
92
119
 
93
- If no `prd-*` labels appear on any open issue → convention not adopted; surface error and exit. If `prd-*` labels exist but none are `prd-ready` → genuinely empty queue, exit cleanly with the idle message.
120
+ If no PRD lifecycle labels appear on any open issue → convention not adopted; surface error and exit. If lifecycle labels exist but none are `$READY` → genuinely empty queue, exit cleanly with the idle message.
94
121
 
95
- ### Phase 3 — Process each Ready PRD
122
+ ### Phase 3 — Process each ready PRD
96
123
 
97
124
  Process serially to keep label transitions auditable.
98
125
 
99
126
  #### 3a. Claim
100
127
 
101
128
  ```bash
102
- gh issue edit <num> --repo <org>/<repo> --remove-label prd-ready --add-label prd-in-review
129
+ gh issue edit <num> --repo <org>/<repo> --remove-label "$READY" --add-label "$IN_REVIEW"
103
130
  ```
104
131
 
105
- This is the idempotency lock — a re-entrant cycle's `--label prd-ready` filter won't see this issue again.
132
+ This is the idempotency lock — a re-entrant cycle's `--label $READY` filter won't see this issue again.
106
133
 
107
134
  If the relabel fails (permission, race), log and skip. Do not proceed to validation on a PRD you didn't successfully claim.
108
135
 
@@ -128,8 +155,8 @@ This call indirectly invokes `lisa:tracker-source-artifacts` (artifact extractio
128
155
  ```bash
129
156
  gh issue comment <prd-num> --repo <org>/<repo> --body-file /tmp/ticketed-comment.md
130
157
  ```
131
- Lead with: `"Ticketed by Claude. Created N tickets in <destination> — see below. Add the prd-shipped label after the work is delivered."` The destination is named (JIRA / GitHub Issues) so product knows where to look.
132
- 4. Transition labels: `gh issue edit <prd-num> --remove-label prd-in-review --add-label prd-ticketed`.
158
+ Lead with: `"Ticketed by Claude. Created N tickets in <destination> — see below. Add the $SHIPPED label after the work is delivered."` The destination is named (JIRA / GitHub Issues) so product knows where to look.
159
+ 4. Transition labels: `gh issue edit <prd-num> --remove-label "$IN_REVIEW" --add-label "$TICKETED"`.
133
160
  5. **Run Phase 3e (coverage audit)** before considering this PRD done.
134
161
 
135
162
  **If `FAIL`**:
@@ -160,7 +187,7 @@ Each comment template MUST contain these parts in this order, no exceptions:
160
187
 
161
188
  **Recommendation:** <validator's `recommendation` field, verbatim — must contain 1–3 concrete options, never a generic "please clarify">
162
189
 
163
- **Action:** Update this section in the PRD, then replace the `prd-blocked` label with `prd-ready` on the issue and Claude will re-run intake.
190
+ **Action:** Update this section in the PRD, then replace the `$BLOCKED` label with `$READY` on the issue and Claude will re-run intake.
164
191
  ```
165
192
 
166
193
  If multiple failures share an anchor, render each as its own `**What's unclear:** ... **Recommendation:** ...` block within the same comment, separated by `---`. Keep the single `[Category badge]` heading at the top.
@@ -191,13 +218,13 @@ For unanchored failures (`prd_anchor: null`), post one rollup comment prefixed w
191
218
 
192
219
  ##### 3c.5 Label transition
193
220
 
194
- After all comments are posted, transition: `gh issue edit <num> --remove-label prd-in-review --add-label prd-blocked`. Do NOT write any tickets.
221
+ After all comments are posted, transition: `gh issue edit <num> --remove-label "$IN_REVIEW" --add-label "$BLOCKED"`. Do NOT write any tickets.
195
222
 
196
223
  #### 3d. Continue
197
224
 
198
- Move to the next Ready PRD. One PRD failing does not affect others.
225
+ Move to the next ready PRD. One PRD failing does not affect others.
199
226
 
200
- #### 3e. Coverage audit (mandatory after prd-ticketed)
227
+ #### 3e. Coverage audit (mandatory after $TICKETED)
201
228
 
202
229
  Per-ticket gates prove each ticket is well-formed; they do NOT prove the *set* of tickets covers the *whole* PRD. Invoke `lisa:prd-ticket-coverage` to catch silent drops.
203
230
 
@@ -206,10 +233,10 @@ Per-ticket gates prove each ticket is well-formed; they do NOT prove the *set* o
206
233
 
207
234
  | Verdict | Action |
208
235
  |---------|--------|
209
- | `COMPLETE` | Done. Leave label as `prd-ticketed`. Move to next PRD. |
210
- | `COMPLETE_WITH_SCOPE_CREEP` | Post an advisory comment on the PRD issue naming the scope-creep tickets. Leave label as `prd-ticketed`. |
211
- | `GAPS_FOUND` | The created ticket set is incomplete. (a) For each gap, post a comment using the same product-facing template as Phase 3c.2 — anchored when `prd_anchor` is non-null. (b) Post one summary comment listing the tickets that *were* successfully created. (c) Transition labels from `prd-ticketed` back to `prd-blocked`. |
212
- | `NO_TICKETS_FOUND` | Should not happen if step 2 succeeded. Log as Error; leave label as `prd-ticketed` with a flag comment. |
236
+ | `COMPLETE` | Done. Leave label as `$TICKETED`. Move to next PRD. |
237
+ | `COMPLETE_WITH_SCOPE_CREEP` | Post an advisory comment on the PRD issue naming the scope-creep tickets. Leave label as `$TICKETED`. |
238
+ | `GAPS_FOUND` | The created ticket set is incomplete. (a) For each gap, post a comment using the same product-facing template as Phase 3c.2 — anchored when `prd_anchor` is non-null. (b) Post one summary comment listing the tickets that *were* successfully created. (c) Transition labels from `$TICKETED` back to `$BLOCKED`. |
239
+ | `NO_TICKETS_FOUND` | Should not happen if step 2 succeeded. Log as Error; leave label as `$TICKETED` with a flag comment. |
213
240
 
214
241
  3. The created tickets remain in the destination tracker regardless of the verdict. The audit only tells us whether *more* are needed.
215
242
 
@@ -223,9 +250,9 @@ Cycle started: <ISO timestamp>
223
250
  Cycle completed: <ISO timestamp>
224
251
 
225
252
  PRDs processed: <n>
226
- - prd-ticketed: <n>
253
+ - $TICKETED: <n>
227
254
  - <issue-ref> "<title>" → <epic-ref> + <story-count> stories + <subtask-count> sub-tasks (coverage: COMPLETE | COMPLETE_WITH_SCOPE_CREEP)
228
- - prd-blocked: <n>
255
+ - $BLOCKED: <n>
229
256
  - <issue-ref> "<title>" → <gate-failure-count> gate failures (pre-write) OR <gap-count> coverage gaps (post-write)
230
257
  - Errors (claim failed, etc): <n>
231
258
  - <issue-ref> "<title>" — <reason>
@@ -240,40 +267,48 @@ Print to the agent's output. Do not write this summary to GitHub.
240
267
 
241
268
  When the configured destination tracker is GitHub Issues AND the PRD repo is the same as the destination repo, both reads and writes hit the same place. Disambiguation rules:
242
269
 
243
- - A PRD issue carries a `prd-*` label. Built tickets carry a `type:*` + `status:*` label set, but never a `prd-*` label.
270
+ - A PRD issue carries a PRD lifecycle label (configured under `github.labels.prd.*`). Built tickets carry a `type:*` + build-status label set (configured under `github.labels.build.*`), but never a PRD lifecycle label.
244
271
  - The "Ticketed by Claude" comment on the PRD links to the destination ticket numbers (which live in the same repo, so the links are simple `#<n>` refs).
245
272
  - `lisa:prd-ticket-coverage` filters out the source PRD itself when listing destination tickets — the PRD is never a ticket of its own work.
246
273
 
247
274
  ## Idempotency & safety
248
275
 
249
- - **Single-cycle scope**: this skill processes the `prd-ready` set as it exists at the start of Phase 2. New `prd-ready` issues added mid-cycle are picked up next run.
250
- - **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:github-to-tracker` (which delegates to `lisa:tracker-write`), only ever changes labels among `prd-in-review`, `prd-blocked`, `prd-ticketed`, only ever comments on the source PRD issue. It never edits PRD bodies, never touches `prd-draft` or `prd-shipped`, never closes or deletes PRD issues.
251
- - **Claim-first ordering**: the label flip to `prd-in-review` happens BEFORE validation runs.
252
- - **Failure isolation**: an exception processing one PRD must not stop the cycle. Catch, record under "Errors" in the summary, continue. The PRD that errored is left labeled `prd-in-review` — humans investigate from there.
276
+ - **Single-cycle scope**: this skill processes the ready set as it exists at the start of Phase 2. New ready issues added mid-cycle are picked up next run.
277
+ - **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:github-to-tracker` (which delegates to `lisa:tracker-write`), only ever changes labels among `$IN_REVIEW`, `$BLOCKED`, `$TICKETED`, only ever comments on the source PRD issue. It never edits PRD bodies, never touches `draft` or `shipped` labels, never closes or deletes PRD issues.
278
+ - **Claim-first ordering**: the label flip to `$IN_REVIEW` happens BEFORE validation runs.
279
+ - **Failure isolation**: an exception processing one PRD must not stop the cycle. Catch, record under "Errors" in the summary, continue. The PRD that errored is left labeled `$IN_REVIEW` — humans investigate from there.
253
280
  - **Single-label invariant**: after every transition, verify exactly one lifecycle label is present.
254
281
 
255
282
  ## Configuration
256
283
 
257
284
  Same configuration as `lisa:github-to-tracker`. See that skill for the full table. Key items:
258
285
 
259
- - **From `.lisa.config.json`**: `github.org` and `github.repo` (required for the source repo, and also for the destination repo when `tracker = "github"` — self-host case).
286
+ - **From `.lisa.config.json`**: `github.org` and `github.repo` (required for the source repo, and also for the destination repo when `tracker = "github"` — self-host case), plus `github.labels.prd.*` for the lifecycle label vocabulary (all optional; defaults documented above).
260
287
  - **From environment variables**: `E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL` (operational E2E test config).
261
288
 
262
289
  Destination tracker config (jira / github / linear) is consumed by `lisa:tracker-write` internally — this skill does NOT read it. If any required value is missing, surface and exit — never invent values.
263
290
 
291
+ | Field | Default | Purpose |
292
+ |-------|---------|---------|
293
+ | `.lisa.config.json` `github.labels.prd.ready` | `prd-ready` | Label signalling "PRD ready for ticketing" |
294
+ | `.lisa.config.json` `github.labels.prd.in_review` | `prd-in-review` | Label set on claim |
295
+ | `.lisa.config.json` `github.labels.prd.blocked` | `prd-blocked` | Label set on validation failure |
296
+ | `.lisa.config.json` `github.labels.prd.ticketed` | `prd-ticketed` | Label set on success |
297
+ | `.lisa.config.json` `github.labels.prd.shipped` | `prd-shipped` | Label product sets after delivery |
298
+
264
299
  ## Rules
265
300
 
266
301
  - Never write to the destination tracker outside of `lisa:github-to-tracker` → `lisa:tracker-write`.
267
- - Never add or remove a label this skill doesn't own (`prd-in-review`, `prd-blocked`, `prd-ticketed`). Product owns `prd-draft`, `prd-ready`, `prd-shipped`.
302
+ - Never add or remove a label this skill doesn't own (`$IN_REVIEW`, `$BLOCKED`, `$TICKETED`). Product owns the `draft`, `ready`, and `shipped` PRD labels.
268
303
  - Never edit a PRD's body. Communication with product happens only via comments.
269
304
  - Never post a single dump of all gate failures on one comment. One comment per `prd_anchor` group, plus one rollup for unanchored failures.
270
305
  - Never include a gate ID, internal skill name, or engineering shorthand in a comment body.
271
306
  - Never run more than one intake cycle concurrently against the same repo.
272
- - If `lisa:github-to-tracker` returns errors, treat them as gate failures: comment + `prd-blocked`. Don't silently fail.
307
+ - If `lisa:github-to-tracker` returns errors, treat them as gate failures: comment + `$BLOCKED`. Don't silently fail.
273
308
 
274
309
  ## Adoption (one-time per repo)
275
310
 
276
- Before this skill can run, the repo must adopt the `prd-*` issue-label convention:
311
+ Before this skill can run, the repo must adopt the PRD lifecycle issue-label convention. Using the defaults:
277
312
 
278
313
  1. Create the labels:
279
314
  ```bash
@@ -284,8 +319,9 @@ Before this skill can run, the repo must adopt the `prd-*` issue-label conventio
284
319
  gh label create prd-ticketed --color 0E8A16 --description "Tickets created — see comments" --repo <org>/<repo>
285
320
  gh label create prd-shipped --color 1D76DB --description "Work delivered (product owns)" --repo <org>/<repo>
286
321
  ```
287
- 2. Apply `prd-ready` to issues that are ready for ticketing.
288
- 3. Reserve `prd-in-review`, `prd-blocked`, `prd-ticketed` for this skill humans should not set them manually except to recover from an error.
289
- 4. Keep the `prd-*` namespace strictly separate from the build-queue `status:*` namespace owned by `lisa:github-build-intake`.
322
+ If your project overrides any `github.labels.prd.*` role name in config, substitute the actual label names you configured.
323
+ 2. Apply the `$READY` label to issues that are ready for ticketing.
324
+ 3. Reserve `$IN_REVIEW`, `$BLOCKED`, `$TICKETED` for this skill humans should not set them manually except to recover from an error.
325
+ 4. Keep the PRD label namespace strictly separate from the build-queue label namespace owned by `lisa:github-build-intake`.
290
326
 
291
327
  If the repo hasn't adopted these labels, the first run exits with a label-convention error (not the idle empty-set message) — this distinguishes setup from a genuinely empty queue.
@@ -20,7 +20,7 @@ This skill is the GitHub counterpart of `lisa:notion-to-tracker` / `lisa:conflue
20
20
 
21
21
  ## What "PRD" means in GitHub Issues
22
22
 
23
- GitHub Issues has no native "PRD" entity. This skill treats a single GitHub Issue (carrying the `prd-ready` label) as the PRD container:
23
+ GitHub Issues has no native "PRD" entity. This skill treats a single GitHub Issue (carrying the configured `ready` PRD label — `github.labels.prd.ready`, default `prd-ready`) as the PRD container:
24
24
 
25
25
  - **Issue body** (markdown) is the PRD body — equivalent to a Notion page body, a Confluence page body, or a Linear project description.
26
26
  - **Sub-issues** (native GitHub sub-issues, traversable via `gh api graphql`) act as the candidate set for Epics or User Stories — the same role child Epic pages play in a Notion/Confluence PRD.
@@ -92,7 +92,7 @@ A GitHub issue ref. The PRD is expected to have:
92
92
  - An issue body containing context, problems, and (optionally) a list of user stories.
93
93
  - One or more sub-issues that act as candidate Epics or user stories (optional — single-issue PRDs are valid).
94
94
  - Issue comments capturing engineering notes and product decisions.
95
- - The `prd-ready` label (if invoked from `lisa:github-prd-intake`; for ad-hoc / direct invocation the label is informational, not gating).
95
+ - The configured `ready` PRD label (`github.labels.prd.ready`, default `prd-ready` if invoked from `lisa:github-prd-intake`; for ad-hoc / direct invocation the label is informational, not gating).
96
96
 
97
97
  URL parsing — accept either:
98
98
 
@@ -88,6 +88,7 @@ Each gate is tagged with a fixed `category` and a `product_relevant` boolean. Ca
88
88
  | S11 Validation Journey | `acceptance-criteria` | true |
89
89
  | S12 Source Precedence | `design-ux` | true |
90
90
  | S13 Relationship Search | `dependency` | true |
91
+ | S14 Evidence manifest binding (leaf work units) | `acceptance-criteria` | true |
91
92
  | F1 Issue type label exists in repo | `structural` | false |
92
93
  | F2 Parent sub-issue exists and is the right type | `structural` | false |
93
94
  | F3 Linked issues exist | `structural` | false |
@@ -189,6 +190,14 @@ The issue must EITHER have at least one entry in `links`, OR the body must conta
189
190
 
190
191
  An issue with zero links and no documented search: FAIL.
191
192
 
193
+ #### S14 — Evidence manifest binding (leaf work units)
194
+
195
+ When `issue_type ∈ {Bug, Task, Sub-task, Improvement}` AND `runtime_behavior_change = true`, the `## Validation Journey` must declare at least one `[EVIDENCE: name]` marker. Each marker name must be kebab-case and unique within the issue. These markers are the work unit's **evidence manifest** — the exact, enumerated set of artifacts that must be captured and attached before the issue may be closed (see the "Per-Work-Unit Evidence Contract" section of the `verification` rule, the Definition of Done in `verification-lifecycle`, and the evidence-manifest gate in `tracker-evidence`).
196
+
197
+ FAIL when the Validation Journey is present but declares zero `[EVIDENCE: name]` markers, or when any marker name is empty, duplicated, or not kebab-case. A behavior-changing work unit SHOULD declare both a success marker and an error/edge marker; a journey with only one marker passes but the remediation should recommend adding the error/edge case.
198
+
199
+ This gate depends on S11. It is `N/A` for Epic / Story / Spike (coordination containers, not work units) and for leaf units with `runtime_behavior_change = false` (doc-only / config-only / type-only). If S11 fails because the Validation Journey is absent, S14 also FAILs (there is no manifest to bind) with remediation pointing back to `lisa:github-add-journey`.
200
+
192
201
  ### Feasibility Gates (require GitHub lookups; skip in `--spec-only`)
193
202
 
194
203
  #### F1 — Issue type label exists in repo
@@ -248,6 +257,7 @@ Output is a single fenced text block. Callers parse it; do not add free-form pro
248
257
  - [PASS|FAIL|N/A] S11 Validation Journey — <one-line reason>
249
258
  - [PASS|FAIL|N/A] S12 Source Precedence — <one-line reason>
250
259
  - [PASS|FAIL|N/A] S13 Relationship Search — <one-line reason>
260
+ - [PASS|FAIL|N/A] S14 Evidence manifest binding — <one-line reason>
251
261
 
252
262
  ### Feasibility Gates (omit this section when --spec-only)
253
263
  - [PASS|FAIL|N/A] F1 Issue type label exists in repo — <one-line reason>
@@ -273,7 +283,7 @@ The verdict is `PASS` if every applicable gate is `PASS`. Any `FAIL` makes the v
273
283
 
274
284
  Same shape and meaning as `lisa:jira-validate-ticket` so downstream PRD-intake skills (Notion, Confluence, Linear, GitHub) can format comments uniformly:
275
285
 
276
- - **gate**: the gate ID (`S1`–`S13`, `F1`–`F4`).
286
+ - **gate**: the gate ID (`S1`–`S14`, `F1`–`F4`).
277
287
  - **category**: the gate's fixed category from the table.
278
288
  - **product_relevant**: matches the gate's table entry. `false` means the failure is an internal data-quality problem the caller should fix without bothering product.
279
289
  - **what**: plain-language, product-readable.
@@ -7,16 +7,15 @@ description: This skill should be used for any non-trivial request — features,
7
7
 
8
8
  ## Orchestration: agent team
9
9
 
10
- Implement is **always** a team flow. Bug, Build, Improve, and Investigate-Only all compose multiple specialists (Reproduce → debug → fix → review → verify). Single-agent mode is not an option here, regardless of how "simple" the ticket looks.
10
+ Implement is a **team-first** flow. Bug, Build, Improve, and Investigate-Only all compose multiple specialists (Reproduce → debug → fix → review → verify). Single-agent mode is not permitted based on task complexity the only exception is when no team creation tool is available in the current runtime (see no-team fallback in the paragraph below).
11
11
 
12
- If you are NOT already operating inside an agent team (no prior `TeamCreate` in this session, not spawned via `Agent` with `team_name`), the very first thing you do is create the team. Two tool calls only, in this exact order:
12
+ If you are NOT already operating inside an agent team (no prior successful team-creation tool call in this session, not spawned into a team context), the very first thing you do is establish team orchestration.
13
13
 
14
- 1. `ToolSearch` with `query: "select:TeamCreate"` `TeamCreate` is a deferred tool whose schema must be loaded before it can be invoked. A cold call returns `InputValidationError` and tempts a fallback to direct `Agent` calls, which bypasses the team.
15
- 2. `TeamCreate` — actually create the team. Every team must include the Explore agent.
14
+ Use `TeamCreate` if available. In Claude, if `TeamCreate` has not been loaded yet, first use `ToolSearch` with `query: "select:TeamCreate"` to load its schema. If `TeamCreate` is not available, use the current runtime's tool-discovery mechanism (for Codex, `tool_search`) to discover available multi-agent/team tools, then call the appropriate team creation tool. If no team creation tool is available, explicitly state that team orchestration is unavailable in this runtime, continue as the lead agent, and preserve the workflow's review, verification, and task-tracking obligations locally. Every team must include the Explore agent.
16
15
 
17
- Until `TeamCreate` returns successfully, do NOT call any of: `Agent`, `TaskCreate`, `Skill` (including `lisa:tracker-read`, `lisa:jira-read-ticket`, `lisa:github-read-issue`), MCP tools (Atlassian / Linear / GitHub / Notion), `Read`, `Write`, `Edit`, `Bash`, `Grep`, `Glob`. Reading the ticket, exploring the code, fetching context — every one of those is a task for the team you are about to create, not for the lead session before the team exists. Doing them inline is the exact bypass path that produces a 1-agent ad-hoc fix instead of a real team flow.
16
+ Until the team is established or the no-team fallback has been declared, do NOT call any of: `Agent`, `TaskCreate`, `Skill` (including `lisa:tracker-read`, `lisa:jira-read-ticket`, `lisa:github-read-issue`), MCP tools (Atlassian / Linear / GitHub / Notion), `Read`, `Write`, `Edit`, `Bash`, `Grep`, `Glob`. Reading the ticket, exploring the code, fetching context — every one of those is a task for the team you are about to create, not for the lead session before orchestration exists. Doing them inline is the exact bypass path that produces a 1-agent ad-hoc fix instead of a real team flow.
18
17
 
19
- If you ARE already inside an agent team (e.g., a teammate invoked this skill via the Skill tool, or `lisa:intake` is running this skill per Ready ticket), do NOT call `TeamCreate`the harness rejects double-creates. Continue within the existing team. The team lead created the team; teammates inherit it.
18
+ If you ARE already inside an agent team (e.g., a teammate invoked this skill via the Skill tool, or `lisa:intake` is running this skill per Ready ticket), do NOT create a second team many harnesses reject double-creates. Continue within the existing team. The team lead created the team; teammates inherit it.
20
19
 
21
20
  ## Resolve the input (first task assigned to the team)
22
21
 
@@ -27,16 +27,15 @@ The only legitimate reasons to stop early:
27
27
 
28
28
  ## Orchestration: agent team
29
29
 
30
- If you are NOT already operating inside an agent team (no prior `TeamCreate` in this session, not spawned via `Agent` with `team_name`), the very first thing you do is create the team. Two tool calls only, in this exact order:
30
+ If you are NOT already operating inside an agent team (no prior successful team-creation tool call in this session, not spawned into a team context), the very first thing you do is establish team orchestration.
31
31
 
32
- 1. `ToolSearch` with `query: "select:TeamCreate"` `TeamCreate` is a deferred tool whose schema must be loaded before it can be invoked. A cold call returns `InputValidationError` and tempts a fallback to direct `Agent` calls, which bypasses the team.
33
- 2. `TeamCreate` — actually create the team.
32
+ Use `TeamCreate` if available. In Claude, if `TeamCreate` has not been loaded yet, first use `ToolSearch` with `query: "select:TeamCreate"` to load its schema. If `TeamCreate` is not available, use the current runtime's tool-discovery mechanism (for Codex, `tool_search`) to discover available multi-agent/team tools, then call the appropriate team creation tool. If no team creation tool is available, explicitly state that team orchestration is unavailable in this runtime, continue as the lead agent, and preserve the workflow's review, verification, and task-tracking obligations locally.
34
33
 
35
- Until `TeamCreate` returns successfully, do NOT call any of: `Agent`, `TaskCreate`, `Skill`, MCP tools (Atlassian / Linear / GitHub / Notion), `Read`, `Write`, `Edit`, `Bash`, `Grep`, `Glob`. Scanning the queue, claiming items, dispatching per-item flows — all of those are tasks for the team you are about to create, not for the lead session before the team exists.
34
+ Until the team is established or the no-team fallback has been declared, do NOT call any of: `Agent`, `TaskCreate`, `Skill`, MCP tools (Atlassian / Linear / GitHub / Notion), `Read`, `Write`, `Edit`, `Bash`, `Grep`, `Glob`. Scanning the queue, claiming items, dispatching per-item flows — all of those are tasks for the team you are about to create, not for the lead session before orchestration exists.
36
35
 
37
- If you ARE already inside an agent team (e.g., a teammate invoked this skill via the Skill tool), do NOT call `TeamCreate`the harness rejects double-creates. Continue within the existing team. The team lead created the team; teammates inherit it.
36
+ If you ARE already inside an agent team (e.g., a teammate invoked this skill via the Skill tool), do NOT create a second team many harnesses reject double-creates. Continue within the existing team. The team lead created the team; teammates inherit it.
38
37
 
39
- The cycle's outer team is created by Intake. Each item it processes (a PRD via `lisa:plan`, a ticket via `lisa:implement`) executes within the same team — those skills' orchestration preambles detect the existing team and skip TeamCreate. One team per cron cycle, processes everything currently Ready.
38
+ The cycle's outer team is created by Intake. Each item it processes (a PRD via `lisa:plan`, a ticket via `lisa:implement`) executes within the same team — those skills' orchestration preambles detect the existing team and skip creating a second team. One team per cron cycle, processes everything currently Ready.
40
39
 
41
40
  ## Source dispatch
42
41
 
@@ -95,6 +95,7 @@ h3. Assertions
95
95
  4. **Evidence names in kebab-case** — `api-response`, `schema-check`, `rate-limit-hit`
96
96
  5. **Assertions are measurable** — "Returns 200 with `{status: ok}`" not "API works correctly"
97
97
  6. **Cover happy path and error path** — At minimum, one success and one failure evidence marker
98
+ 7. **On a leaf work unit, the markers are binding** — For a Bug / Task / Sub-task / Improvement, every `[EVIDENCE: name]` here is the ticket's evidence manifest: validation gate S14 requires at least one, and the ticket cannot be closed until each named artifact is captured and attached (see the "Per-Work-Unit Evidence Contract" in the `verification` rule). Name only evidence you intend to capture — and name all of it.
98
99
 
99
100
  ### Step 6: Present to User for Approval
100
101