@codyswann/lisa 2.127.0 → 2.128.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 (200) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +5 -1
  3. package/plugins/lisa/.codex-plugin/hooks.json +4 -0
  4. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  5. package/plugins/lisa/commands/parity-code-review.md +6 -0
  6. package/plugins/lisa/commands/parity-code-simplifier.md +6 -0
  7. package/plugins/lisa/commands/parity-coderabbit.md +6 -0
  8. package/plugins/lisa/commands/parity-safety-net-rules.md +6 -0
  9. package/plugins/lisa/commands/parity-sentry-sdk-setup.md +6 -0
  10. package/plugins/lisa/commands/parity-sentry-seer.md +6 -0
  11. package/plugins/lisa/commands/parity-skill-creator.md +6 -0
  12. package/plugins/lisa/hooks/parity-safety-net.sh +102 -0
  13. package/plugins/lisa/rules/eager/base-rules.md +1 -1
  14. package/plugins/lisa/rules/eager/leaf-only-lifecycle.md +4 -4
  15. package/plugins/lisa/rules/eager/repo-scope-split.md +1 -1
  16. package/plugins/lisa/rules/reference/config-resolution.md +1 -1
  17. package/plugins/lisa/rules/reference/leaf-only-lifecycle.md +9 -9
  18. package/plugins/lisa/rules/reference/repo-scope-split.md +2 -2
  19. package/plugins/lisa/skills/github-build-intake/SKILL.md +7 -7
  20. package/plugins/lisa/skills/github-validate-issue/SKILL.md +10 -11
  21. package/plugins/lisa/skills/intake-explain/SKILL.md +3 -3
  22. package/plugins/lisa/skills/jira-build-intake/SKILL.md +7 -7
  23. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +10 -11
  24. package/plugins/lisa/skills/linear-build-intake/SKILL.md +7 -7
  25. package/plugins/lisa/skills/linear-validate-issue/SKILL.md +10 -11
  26. package/plugins/lisa/skills/parity-code-review/SKILL.md +83 -0
  27. package/plugins/lisa/skills/parity-code-review/agents/openai.yaml +4 -0
  28. package/plugins/lisa/skills/parity-code-simplifier/SKILL.md +76 -0
  29. package/plugins/lisa/skills/parity-code-simplifier/agents/openai.yaml +4 -0
  30. package/plugins/lisa/skills/parity-coderabbit/SKILL.md +77 -0
  31. package/plugins/lisa/skills/parity-coderabbit/agents/openai.yaml +4 -0
  32. package/plugins/lisa/skills/parity-safety-net-rules/SKILL.md +144 -0
  33. package/plugins/lisa/skills/parity-safety-net-rules/agents/openai.yaml +4 -0
  34. package/plugins/lisa/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
  35. package/plugins/lisa/skills/parity-sentry-sdk-setup/agents/openai.yaml +4 -0
  36. package/plugins/lisa/skills/parity-sentry-seer/SKILL.md +135 -0
  37. package/plugins/lisa/skills/parity-sentry-seer/agents/openai.yaml +4 -0
  38. package/plugins/lisa/skills/parity-skill-creator/SKILL.md +149 -0
  39. package/plugins/lisa/skills/parity-skill-creator/agents/openai.yaml +4 -0
  40. package/plugins/lisa/skills/repair-intake/SKILL.md +2 -2
  41. package/plugins/lisa/skills/tracker-build-intake/SKILL.md +4 -4
  42. package/plugins/lisa-agy/commands/parity-code-review.md +6 -0
  43. package/plugins/lisa-agy/commands/parity-code-simplifier.md +6 -0
  44. package/plugins/lisa-agy/commands/parity-coderabbit.md +6 -0
  45. package/plugins/lisa-agy/commands/parity-safety-net-rules.md +6 -0
  46. package/plugins/lisa-agy/commands/parity-sentry-sdk-setup.md +6 -0
  47. package/plugins/lisa-agy/commands/parity-sentry-seer.md +6 -0
  48. package/plugins/lisa-agy/commands/parity-skill-creator.md +6 -0
  49. package/plugins/lisa-agy/plugin.json +1 -1
  50. package/plugins/lisa-agy/skills/github-build-intake/SKILL.md +7 -7
  51. package/plugins/lisa-agy/skills/github-validate-issue/SKILL.md +10 -11
  52. package/plugins/lisa-agy/skills/intake-explain/SKILL.md +3 -3
  53. package/plugins/lisa-agy/skills/jira-build-intake/SKILL.md +7 -7
  54. package/plugins/lisa-agy/skills/jira-validate-ticket/SKILL.md +10 -11
  55. package/plugins/lisa-agy/skills/linear-build-intake/SKILL.md +7 -7
  56. package/plugins/lisa-agy/skills/linear-validate-issue/SKILL.md +10 -11
  57. package/plugins/lisa-agy/skills/parity-code-review/SKILL.md +83 -0
  58. package/plugins/lisa-agy/skills/parity-code-simplifier/SKILL.md +76 -0
  59. package/plugins/lisa-agy/skills/parity-coderabbit/SKILL.md +77 -0
  60. package/plugins/lisa-agy/skills/parity-safety-net-rules/SKILL.md +144 -0
  61. package/plugins/lisa-agy/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
  62. package/plugins/lisa-agy/skills/parity-sentry-seer/SKILL.md +135 -0
  63. package/plugins/lisa-agy/skills/parity-skill-creator/SKILL.md +149 -0
  64. package/plugins/lisa-agy/skills/repair-intake/SKILL.md +2 -2
  65. package/plugins/lisa-agy/skills/tracker-build-intake/SKILL.md +4 -4
  66. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  68. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  69. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-copilot/.claude-plugin/plugin.json +5 -1
  72. package/plugins/lisa-copilot/commands/parity-code-review.md +6 -0
  73. package/plugins/lisa-copilot/commands/parity-code-simplifier.md +6 -0
  74. package/plugins/lisa-copilot/commands/parity-coderabbit.md +6 -0
  75. package/plugins/lisa-copilot/commands/parity-safety-net-rules.md +6 -0
  76. package/plugins/lisa-copilot/commands/parity-sentry-sdk-setup.md +6 -0
  77. package/plugins/lisa-copilot/commands/parity-sentry-seer.md +6 -0
  78. package/plugins/lisa-copilot/commands/parity-skill-creator.md +6 -0
  79. package/plugins/lisa-copilot/hooks/parity-safety-net.sh +102 -0
  80. package/plugins/lisa-copilot/rules/eager/base-rules.md +1 -1
  81. package/plugins/lisa-copilot/rules/eager/leaf-only-lifecycle.md +4 -4
  82. package/plugins/lisa-copilot/rules/eager/repo-scope-split.md +1 -1
  83. package/plugins/lisa-copilot/rules/reference/config-resolution.md +1 -1
  84. package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +9 -9
  85. package/plugins/lisa-copilot/rules/reference/repo-scope-split.md +2 -2
  86. package/plugins/lisa-copilot/skills/github-build-intake/SKILL.md +7 -7
  87. package/plugins/lisa-copilot/skills/github-validate-issue/SKILL.md +10 -11
  88. package/plugins/lisa-copilot/skills/intake-explain/SKILL.md +3 -3
  89. package/plugins/lisa-copilot/skills/jira-build-intake/SKILL.md +7 -7
  90. package/plugins/lisa-copilot/skills/jira-validate-ticket/SKILL.md +10 -11
  91. package/plugins/lisa-copilot/skills/linear-build-intake/SKILL.md +7 -7
  92. package/plugins/lisa-copilot/skills/linear-validate-issue/SKILL.md +10 -11
  93. package/plugins/lisa-copilot/skills/parity-code-review/SKILL.md +83 -0
  94. package/plugins/lisa-copilot/skills/parity-code-simplifier/SKILL.md +76 -0
  95. package/plugins/lisa-copilot/skills/parity-coderabbit/SKILL.md +77 -0
  96. package/plugins/lisa-copilot/skills/parity-safety-net-rules/SKILL.md +144 -0
  97. package/plugins/lisa-copilot/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
  98. package/plugins/lisa-copilot/skills/parity-sentry-seer/SKILL.md +135 -0
  99. package/plugins/lisa-copilot/skills/parity-skill-creator/SKILL.md +149 -0
  100. package/plugins/lisa-copilot/skills/repair-intake/SKILL.md +2 -2
  101. package/plugins/lisa-copilot/skills/tracker-build-intake/SKILL.md +4 -4
  102. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  103. package/plugins/lisa-cursor/commands/parity-code-review.md +6 -0
  104. package/plugins/lisa-cursor/commands/parity-code-simplifier.md +6 -0
  105. package/plugins/lisa-cursor/commands/parity-coderabbit.md +6 -0
  106. package/plugins/lisa-cursor/commands/parity-safety-net-rules.md +6 -0
  107. package/plugins/lisa-cursor/commands/parity-sentry-sdk-setup.md +6 -0
  108. package/plugins/lisa-cursor/commands/parity-sentry-seer.md +6 -0
  109. package/plugins/lisa-cursor/commands/parity-skill-creator.md +6 -0
  110. package/plugins/lisa-cursor/hooks/hooks.json +4 -0
  111. package/plugins/lisa-cursor/hooks/parity-safety-net.sh +102 -0
  112. package/plugins/lisa-cursor/rules/base-rules.mdc +1 -1
  113. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +1 -1
  114. package/plugins/lisa-cursor/rules/leaf-only-lifecycle-reference.mdc +9 -9
  115. package/plugins/lisa-cursor/rules/leaf-only-lifecycle.mdc +4 -4
  116. package/plugins/lisa-cursor/rules/repo-scope-split-reference.mdc +2 -2
  117. package/plugins/lisa-cursor/rules/repo-scope-split.mdc +1 -1
  118. package/plugins/lisa-cursor/skills/github-build-intake/SKILL.md +7 -7
  119. package/plugins/lisa-cursor/skills/github-validate-issue/SKILL.md +10 -11
  120. package/plugins/lisa-cursor/skills/intake-explain/SKILL.md +3 -3
  121. package/plugins/lisa-cursor/skills/jira-build-intake/SKILL.md +7 -7
  122. package/plugins/lisa-cursor/skills/jira-validate-ticket/SKILL.md +10 -11
  123. package/plugins/lisa-cursor/skills/linear-build-intake/SKILL.md +7 -7
  124. package/plugins/lisa-cursor/skills/linear-validate-issue/SKILL.md +10 -11
  125. package/plugins/lisa-cursor/skills/parity-code-review/SKILL.md +83 -0
  126. package/plugins/lisa-cursor/skills/parity-code-simplifier/SKILL.md +76 -0
  127. package/plugins/lisa-cursor/skills/parity-coderabbit/SKILL.md +77 -0
  128. package/plugins/lisa-cursor/skills/parity-safety-net-rules/SKILL.md +144 -0
  129. package/plugins/lisa-cursor/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
  130. package/plugins/lisa-cursor/skills/parity-sentry-seer/SKILL.md +135 -0
  131. package/plugins/lisa-cursor/skills/parity-skill-creator/SKILL.md +149 -0
  132. package/plugins/lisa-cursor/skills/repair-intake/SKILL.md +2 -2
  133. package/plugins/lisa-cursor/skills/tracker-build-intake/SKILL.md +4 -4
  134. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  135. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  136. package/plugins/lisa-expo-agy/plugin.json +1 -1
  137. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  138. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  139. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  140. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  141. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  142. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  143. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  144. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  145. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  146. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  147. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  148. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  149. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  150. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  151. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  152. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  153. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  154. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  155. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  156. package/plugins/lisa-rails-agy/plugin.json +1 -1
  157. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  158. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  159. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  160. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  161. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  162. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  163. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  164. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  165. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  166. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  167. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  168. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  169. package/plugins/src/base/.claude-plugin/plugin.json +2 -1
  170. package/plugins/src/base/commands/parity-code-review.md +6 -0
  171. package/plugins/src/base/commands/parity-code-simplifier.md +6 -0
  172. package/plugins/src/base/commands/parity-coderabbit.md +6 -0
  173. package/plugins/src/base/commands/parity-safety-net-rules.md +6 -0
  174. package/plugins/src/base/commands/parity-sentry-sdk-setup.md +6 -0
  175. package/plugins/src/base/commands/parity-sentry-seer.md +6 -0
  176. package/plugins/src/base/commands/parity-skill-creator.md +6 -0
  177. package/plugins/src/base/hooks/parity-safety-net.sh +102 -0
  178. package/plugins/src/base/rules/eager/base-rules.md +1 -1
  179. package/plugins/src/base/rules/eager/leaf-only-lifecycle.md +4 -4
  180. package/plugins/src/base/rules/eager/repo-scope-split.md +1 -1
  181. package/plugins/src/base/rules/reference/config-resolution.md +1 -1
  182. package/plugins/src/base/rules/reference/leaf-only-lifecycle.md +9 -9
  183. package/plugins/src/base/rules/reference/repo-scope-split.md +2 -2
  184. package/plugins/src/base/skills/github-build-intake/SKILL.md +7 -7
  185. package/plugins/src/base/skills/github-validate-issue/SKILL.md +10 -11
  186. package/plugins/src/base/skills/intake-explain/SKILL.md +3 -3
  187. package/plugins/src/base/skills/jira-build-intake/SKILL.md +7 -7
  188. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +10 -11
  189. package/plugins/src/base/skills/linear-build-intake/SKILL.md +7 -7
  190. package/plugins/src/base/skills/linear-validate-issue/SKILL.md +10 -11
  191. package/plugins/src/base/skills/parity-code-review/SKILL.md +83 -0
  192. package/plugins/src/base/skills/parity-code-simplifier/SKILL.md +76 -0
  193. package/plugins/src/base/skills/parity-coderabbit/SKILL.md +77 -0
  194. package/plugins/src/base/skills/parity-safety-net-rules/SKILL.md +144 -0
  195. package/plugins/src/base/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
  196. package/plugins/src/base/skills/parity-sentry-seer/SKILL.md +135 -0
  197. package/plugins/src/base/skills/parity-skill-creator/SKILL.md +149 -0
  198. package/plugins/src/base/skills/repair-intake/SKILL.md +2 -2
  199. package/plugins/src/base/skills/tracker-build-intake/SKILL.md +4 -4
  200. package/scripts/plugin-parity-drift.mjs +9 -1
@@ -0,0 +1,149 @@
1
+ ---
2
+ name: parity-skill-creator
3
+ description: "Author a new Lisa skill end-to-end — scaffold the SKILL.md frontmatter (name/description/allowed-tools), write the pass-through command, follow hyphen naming, place files under plugins/src/base, and rebuild plugins. Lisa-native reimplementation of the upstream skill-creator plugin. NO drift pin: upstream publishes no semver, so it is not drift-trackable."
4
+ allowed-tools: ["Read", "Edit", "Write", "Bash"]
5
+ ---
6
+
7
+ # Skill Creator
8
+
9
+ Author a new, working Lisa skill (and its pass-through command) from a one-line
10
+ description. This is the Lisa-native equivalent of the upstream
11
+ `skill-creator@claude-plugins-official` plugin, reimplemented from scratch
12
+ against Lisa's conventions so the same capability is available to the Codex,
13
+ agy, and Copilot runtimes (Cursor reads `.claude-plugin/` natively).
14
+
15
+ ## Not drift-trackable
16
+
17
+ This skill intentionally carries **no `synced-from` pin**. The upstream
18
+ `skill-creator` plugin publishes **no semver** (its cache version resolves to
19
+ `unknown`), so a `@unknown` pin would be unparseable and meaningless to
20
+ `scripts/plugin-parity-drift.mjs`. **Drift is tracked manually** — re-review the
21
+ upstream plugin by hand whenever the curated plugin set is refreshed. Do **not**
22
+ add a `synced-from` line to skills generated by this skill unless they
23
+ reimplement a semver-versioned upstream plugin.
24
+
25
+ ## When to use
26
+
27
+ - A reusable workflow, checklist, or piece of domain knowledge keeps recurring
28
+ and deserves a named, invokable skill.
29
+ - You are reimplementing an upstream third-party plugin command/skill for
30
+ cross-agent parity (see `analyze-plugin` / `implement-plugin-parity`).
31
+ - The user asks to "create a skill", "add a command", or "scaffold a skill".
32
+
33
+ If the knowledge is narrow or one-off, prefer a rule in `.claude/rules/` instead
34
+ — skills are for broad, repeatable capabilities. When unsure whether content
35
+ warrants a skill, run it past the `skill-evaluator` agent first.
36
+
37
+ ## Where skills live
38
+
39
+ Lisa skills are **build output** for downstream projects. The source of truth is
40
+ `plugins/src/`, never the generated `plugins/lisa*` artifacts:
41
+
42
+ | Source directory | Builds artifact | Use for |
43
+ | --- | --- | --- |
44
+ | `plugins/src/base/` | `plugins/lisa` | Skills that ship to **every** stack |
45
+ | `plugins/src/<stack>/` | `plugins/lisa-<stack>` | Stack-specific (typescript, expo, nestjs, cdk, harper-fabric, rails) |
46
+
47
+ Lisa-repo-only skills (parity tooling, wiki ingestion, `lisa-*` meta-skills) live
48
+ at the **root** `.claude/skills/` and `.claude/commands/`, NOT under
49
+ `plugins/src` — they are not relevant to downstream projects. Decide placement
50
+ first:
51
+
52
+ - Ships to downstream projects → `plugins/src/base/skills/<name>/SKILL.md`
53
+ - Only meaningful inside the Lisa monorepo → `.claude/skills/<name>/SKILL.md`
54
+
55
+ ## Naming
56
+
57
+ - Use **hyphen-separated** names: `git-commit`, `tracker-write`,
58
+ `parity-sentry-seer`. No spaces, no camelCase, no underscores.
59
+ - The directory name, the frontmatter `name`, and the command filename must all
60
+ match exactly.
61
+ - Commands map to colon-separated UI names via directory nesting:
62
+ `commands/git/commit.md` → `/lisa:git:commit`; a flat
63
+ `commands/plan.md` → `/lisa:plan`.
64
+
65
+ ## SKILL.md frontmatter
66
+
67
+ Skills support **only** these frontmatter keys (they do **not** support
68
+ `argument-hint` or `$ARGUMENTS` substitution — those belong on the command):
69
+
70
+ ```yaml
71
+ ---
72
+ name: my-skill # required — matches the directory name
73
+ description: "One or two sentences." # required — when to use + what it does
74
+ allowed-tools: ["Read", "Edit", "Write", "Bash"] # optional — least privilege
75
+ synced-from: <plugin>@<marketplace>@<version> # ONLY for semver upstream reimplementations
76
+ ---
77
+ ```
78
+
79
+ - **`name`** — the hyphen identifier, byte-identical to the directory.
80
+ - **`description`** — write it so the model knows *when* to reach for the skill,
81
+ not just what it does. Lead with the trigger. This is the single most
82
+ important field for discoverability.
83
+ - **`allowed-tools`** — grant the minimum set. A read-only review skill needs no
84
+ `Write`/`Edit`. Omit the key entirely to inherit the caller's tools.
85
+ - **`synced-from`** — add **only** when the skill reimplements an upstream plugin
86
+ that publishes a real semver. Grammar: `name@marketplace@version`
87
+ (e.g. `sentry@claude-plugins-official@1.0.0`). Omit for upstreams with no
88
+ semver (note that in the body instead, as this skill does).
89
+
90
+ ## The command pass-through pattern
91
+
92
+ Every skill should have a thin command that is the user-facing entry point.
93
+ Commands support `description`, `argument-hint`, and `$ARGUMENTS`; they delegate
94
+ straight to the skill:
95
+
96
+ ```markdown
97
+ ---
98
+ description: "Same human-facing summary as the skill, phrased for the picker."
99
+ argument-hint: "<what the user should type after the command>"
100
+ ---
101
+
102
+ Use the /lisa:my-skill skill to <do the thing>. $ARGUMENTS
103
+ ```
104
+
105
+ The command carries the `argument-hint` and forwards `$ARGUMENTS`; the SKILL.md
106
+ carries the actual logic. Keep the two descriptions consistent.
107
+
108
+ ## Scaffolding walkthrough
109
+
110
+ 1. **Decide placement** — downstream (`plugins/src/base`) vs. Lisa-only
111
+ (`.claude`). For base, both a skill and a command directory entry are needed.
112
+ 2. **Pick the name** — hyphenated, unique. Check it does not collide:
113
+ `ls plugins/src/base/skills/` and `ls plugins/src/base/commands/`.
114
+ 3. **Create the skill** at
115
+ `plugins/src/base/skills/<name>/SKILL.md` with the frontmatter above and a
116
+ body that follows house style — see `plugins/src/base/skills/quality-review/SKILL.md`
117
+ for the canonical shape (title, "When to use", numbered checklist/steps,
118
+ explicit "Rules"/"Output" sections). Write real, actionable guidance, not
119
+ TODOs.
120
+ 4. **Create the command** at `plugins/src/base/commands/<name>.md` (or a nested
121
+ `commands/<namespace>/<name>.md` for a colon-namespaced command) using the
122
+ pass-through template.
123
+ 5. **Rebuild the artifacts** so the generated plugins match source:
124
+ ```bash
125
+ bun run build:plugins
126
+ ```
127
+ Then commit **both** `plugins/src/...` and the regenerated `plugins/lisa*`.
128
+ The `🧩 Plugins Sync` CI check (and `bun run check:plugins` locally) fails if
129
+ artifacts drift from source — never hand-edit `plugins/lisa*`.
130
+ 6. **Verify discoverability** — confirm the skill appears in the skill list and
131
+ the command resolves to `/lisa:<name>`.
132
+
133
+ ## Body house style
134
+
135
+ - Open with an `#` H1 title in Title Case.
136
+ - Add a `## When to use` section that names the triggers.
137
+ - Use numbered steps for procedures, checklists for review-style skills.
138
+ - End with an explicit `## Rules` (hard constraints) and/or `## Output` section.
139
+ - Write in plain, imperative English. Prefer concrete examples over abstraction.
140
+ - Reference sibling skills by their hyphen name (e.g. "delegate to `git-commit`").
141
+
142
+ ## Rules
143
+
144
+ - Never edit `plugins/lisa*` directly — edit `plugins/src/` and rebuild.
145
+ - Skill frontmatter must not contain `argument-hint` or `$ARGUMENTS`.
146
+ - The directory name, `name` field, and command filename must match exactly.
147
+ - Add `synced-from` **only** for semver-versioned upstream reimplementations.
148
+ - Do not include `/coding-philosophy` in task `skills` metadata — it auto-loads.
149
+ - One skill, one responsibility. If a skill grows two jobs, split it.
@@ -30,7 +30,7 @@ close-out** roles and moves work *unstuck* or *fully closed*:
30
30
  out) **and** the *intermediate-env* case (all children shipped to an env like `On Stg`, but the
31
31
  parent never advanced — including a parent left stranded in a status it should never carry).
32
32
  - **Stale-`ready` container** — a parent/container (open child work, or a childless
33
- Epic/Story/Spike) wrongly carrying the build-ready role. This is a leaf-only-invariant violation
33
+ **Epic**) wrongly carrying the build-ready role. This is a leaf-only-invariant violation
34
34
  the build-intake claim gate deliberately leaves for a human; repair-intake reconciles it by
35
35
  rolling the parent up from its children (with an audit note), so a container never sits in `ready`
36
36
  indefinitely.
@@ -364,7 +364,7 @@ native-open / active / unresolved:
364
364
 
365
365
  ### Build parent rollup reconciliation (intermediate-env or terminal close-out)
366
366
 
367
- For each parent/container item (Epic, Story, Spike, Project, or any item with child work),
367
+ For each parent/container item (an Epic, a Linear Project, or any item — of any type — with open child work),
368
368
  reconcile its lifecycle state with the roll-up of its children — **including the intermediate-env
369
369
  case**, not only fully-terminal close-out. This is the recovery-side complement to the forward
370
370
  rollup the `*-sync --rollup` skills perform; it catches a parent that was never rolled up (or was
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: tracker-build-intake
3
- description: "Vendor-neutral wrapper for the build-queue scanner. Reads `tracker` from .lisa.config.json (default: jira) and dispatches to lisa:jira-build-intake (JQL/project-key queue), lisa:github-build-intake (GitHub repo queue keyed off the `status:ready` label), or lisa:linear-build-intake (Linear team queue keyed off the `status:ready` label). Every vendor scanner processes at most one eligible item per cycle and enforces the claim-time arm of the `leaf-only-lifecycle` rule — dispatch leaf work units only; move or safe-block a container with open child work (or a childless Epic/Story/Spike) that carries a stale build-ready role according to the vendor's lifecycle semantics. Counterpart to lisa:intake's PRD-side dispatchers."
3
+ description: "Vendor-neutral wrapper for the build-queue scanner. Reads `tracker` from .lisa.config.json (default: jira) and dispatches to lisa:jira-build-intake (JQL/project-key queue), lisa:github-build-intake (GitHub repo queue keyed off the `status:ready` label), or lisa:linear-build-intake (Linear team queue keyed off the `status:ready` label). Every vendor scanner processes at most one eligible item per cycle and enforces the claim-time arm of the `leaf-only-lifecycle` rule — dispatch leaf work units only; move or safe-block a container with open child work (or a childless Epic) that carries a stale build-ready role according to the vendor's lifecycle semantics. Counterpart to lisa:intake's PRD-side dispatchers."
4
4
  allowed-tools: ["Skill", "Bash", "Read"]
5
5
  ---
6
6
 
@@ -26,8 +26,8 @@ The vendor scanners also own the terminal native-closure step from `leaf-only-li
26
26
 
27
27
  This shim is dispatch only — it does not reclassify or re-gate items — but the contract it forwards is part of the build-intake API, so it is documented here once and the three vendor scanners implement it identically. Per the vendor-neutral `leaf-only-lifecycle` rule, **build intake claims only independently implementable leaf work units**:
28
28
 
29
- - A **leaf work unit** (Bug, Task, Sub-task, Improvement with no open child work) is claimed and built.
30
- - A **container** — anything with open child work, or a childless Epic/Story/Spike — that still carries a stale build-ready role is **never dispatched**. The GitHub scanner moves it out of the pickup queue by replacing `status:ready` with `status:in-progress` and posting an idempotent lifecycle-repair comment; other vendor scanners skip or safe-block according to their native lifecycle semantics.
29
+ - A **leaf work unit** (Bug, Task, Sub-task, Improvement, or a childless Story/Spike — anything with no open child work except an Epic) is claimed and built.
30
+ - A **container** — anything with open child work, or a childless Epic — that still carries a stale build-ready role is **never dispatched**. The GitHub scanner moves it out of the pickup queue by replacing `status:ready` with `status:in-progress` and posting an idempotent lifecycle-repair comment; other vendor scanners skip or safe-block according to their native lifecycle semantics.
31
31
 
32
32
  This is the claim-time arm of the rule. Its siblings are the write-time labeling (`lisa:tracker-write` → the vendor `*-write-*` skills apply build-ready to leaves only) and the validate-time S15 gate (`lisa:tracker-validate` → the vendor `*-validate-*` skills FAIL a build-ready container). All three arms cite `leaf-only-lifecycle` so no vendor drifts. Each vendor scanner implements the gate against its own hierarchy:
33
33
 
@@ -59,6 +59,6 @@ Intermediate env states are not native closure. A vendor scanner that resolves `
59
59
 
60
60
  - Single cycle per invocation — the vendor skill processes at most one eligible `Ready` item and exits. Scheduler repetition works the rest of the queue.
61
61
  - The vendor skills run their own pre-flight checks (JIRA workflow transitions for the JIRA path; label namespace adoption for the GitHub and Linear paths) before processing items. Never bypass.
62
- - **Leaf-only dispatch, every vendor.** Per the `leaf-only-lifecycle` rule, each vendor scanner dispatches leaf work units only and moves or safe-blocks a container (open child work, or a childless Epic/Story/Spike) carrying a stale build-ready role according to its lifecycle semantics. This shim does not re-implement the gate — it relies on the vendor scanner's Phase 3a — but the contract is uniform across `jira`, `github`, and `linear` so behavior never drifts by tracker.
62
+ - **Leaf-only dispatch, every vendor.** Per the `leaf-only-lifecycle` rule, each vendor scanner dispatches leaf work units only and moves or safe-blocks a container (open child work, or a childless Epic) carrying a stale build-ready role according to its lifecycle semantics. This shim does not re-implement the gate — it relies on the vendor scanner's Phase 3a — but the contract is uniform across `jira`, `github`, and `linear` so behavior never drifts by tracker.
63
63
  - **Terminal native closure, every capable vendor.** Per the same rule, each vendor scanner finalizes native open/closed state only at the true terminal `done` value. This shim never performs native closure itself, but callers can rely on the dispatched vendor scanner to apply the contract.
64
64
  - Never run two intake cycles concurrently against overlapping queues — the scheduling layer is responsible for serialization.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.127.0",
3
+ "version": "2.128.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.127.0",
3
+ "version": "2.128.0",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.127.0",
3
+ "version": "2.128.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.127.0",
3
+ "version": "2.128.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.127.0",
3
+ "version": "2.128.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.127.0",
3
+ "version": "2.128.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -13,6 +13,10 @@
13
13
  {
14
14
  "type": "command",
15
15
  "command": "${CLAUDE_PLUGIN_ROOT}/hooks/block-no-verify.sh"
16
+ },
17
+ {
18
+ "type": "command",
19
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/parity-safety-net.sh"
16
20
  }
17
21
  ]
18
22
  }
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "Lisa-native code review of the current git diff — correctness bugs, security issues, and obvious defects, reported as severity-ranked findings with file:line references. Vendor-neutral cross-agent equivalent of the upstream code-review command."
3
+ argument-hint: "[optional: path or scope hint]"
4
+ ---
5
+
6
+ Use the /lisa:parity-code-review skill to review the current branch and working-tree diff for correctness bugs, security issues, and obvious defects, and report findings ranked by severity with file:line references. $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "Behavior-preserving simplification of recently-changed code — dedup, reuse, readability, and dead-code removal, quality only (never a bug hunt). Vendor-neutral cross-agent equivalent of the upstream code-simplifier agent."
3
+ argument-hint: "[optional: path or scope hint]"
4
+ ---
5
+
6
+ Use the /lisa:parity-code-simplifier skill to simplify the recently-changed code — removing duplication and dead code, reusing existing utilities, and improving readability — without altering behavior, then verify tests still pass. $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "Thorough PR-style review of the full diff — bugs, security, performance, and maintainability — with concrete fixes and a structured summary. An independent Lisa-native review (does NOT call CodeRabbit's service); vendor-neutral cross-agent equivalent of the upstream coderabbit plugin."
3
+ argument-hint: "[optional: PR number, path, or scope hint]"
4
+ ---
5
+
6
+ Use the /lisa:parity-coderabbit skill to run a thorough PR-style review of the full diff — flagging bugs, security, performance, and maintainability issues with concrete suggested fixes — and produce a structured summary with a verdict. $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "View, set, and verify the custom guard rules enforced by Lisa's safety-net PreToolUse Bash hook — the cross-agent equivalent of the upstream safety-net plugin's set/verify-custom-rules skills."
3
+ argument-hint: "[view | set <regex> | verify]"
4
+ ---
5
+
6
+ Use the /lisa:parity-safety-net-rules skill to view, set, or verify the project-local custom guard rules enforced by Lisa's safety-net Bash hook (`parity-safety-net.sh`). $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "Install and configure the Sentry SDK for a project — detect the framework, add the right @sentry/<framework> package, init the client, wire the DSN via env, enable error + performance monitoring, and set up source maps. One consolidated skill covering react, nextjs, node, nestjs, python, react-native, and more."
3
+ argument-hint: "[framework override, e.g. nextjs | node | python] (auto-detected if omitted)"
4
+ ---
5
+
6
+ Use the /lisa:parity-sentry-sdk-setup skill to detect the framework and install + configure the correct Sentry SDK with error and performance monitoring and source maps. $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "AI debugging — given an error, stack trace, or failing test, analyze it, form ranked hypotheses, locate the root cause in the codebase with file:line evidence, and propose a minimal fix. Lisa-native reimplementation of Sentry's seer workflow."
3
+ argument-hint: "<error message | stack trace | failing test | Sentry issue URL>"
4
+ ---
5
+
6
+ Use the /lisa:parity-sentry-seer skill to root-cause the failure and propose an evidence-backed fix. $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: "Author a new Lisa skill end-to-end — scaffold the SKILL.md frontmatter, write the pass-through command, follow hyphen naming and placement under plugins/src, and rebuild plugins. Lisa-native equivalent of the upstream skill-creator plugin."
3
+ argument-hint: "<skill-name and a one-line description of what it should do>"
4
+ ---
5
+
6
+ Use the /lisa:parity-skill-creator skill to scaffold a new Lisa skill and its pass-through command, following frontmatter, naming, placement, and build conventions. $ARGUMENTS
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env bash
2
+ # PreToolUse hook for Bash: a safety net that blocks destructive shell commands
3
+ # before they run. Lisa-native reimplementation of the upstream
4
+ # `safety-net@cc-marketplace` plugin's PreToolUse Bash-guard (parity work, issue
5
+ # #1059). It does NOT port upstream code — it re-expresses the behavior in Lisa's
6
+ # hook conventions, modeled on block-no-verify.sh.
7
+ #
8
+ # It reads the hook stdin JSON, inspects the proposed Bash command, and EXITS
9
+ # NON-ZERO (2) to BLOCK when a known-destructive pattern matches:
10
+ # - `rm -rf /` (recursive forced delete of a root / home / wildcard path)
11
+ # - force-pushing a protected branch (main/master/production/release)
12
+ # - `git reset --hard` while the working tree is dirty (would discard work)
13
+ # - dropping or truncating a database/schema/table
14
+ # Otherwise it exits 0 and the command proceeds.
15
+ #
16
+ # Operators extend the built-in rules with a project-local rule file — one
17
+ # extended-regex (ERE) per line, blank lines and `#` comments ignored — managed
18
+ # by the parity-safety-net-rules skill. Default location (overridable via
19
+ # SAFETY_NET_RULES_FILE):
20
+ # ${CLAUDE_PROJECT_DIR:-$PWD}/.claude/safety-net-rules.txt
21
+ set -euo pipefail
22
+
23
+ input="$(cat)"
24
+
25
+ tool_name="$(printf '%s' "$input" | jq -r '.tool_name // empty')"
26
+ if [ "$tool_name" != "Bash" ]; then
27
+ exit 0
28
+ fi
29
+
30
+ command_str="$(printf '%s' "$input" | jq -r '.tool_input.command // empty')"
31
+ if [ -z "$command_str" ]; then
32
+ exit 0
33
+ fi
34
+
35
+ # block() prints the reason to stderr (surfaced to the model) and exits 2 so the
36
+ # Bash tool call is denied. $1 = human-readable reason for the block.
37
+ block() {
38
+ cat >&2 <<EOF
39
+ Blocked by safety-net: $1
40
+
41
+ This command matched a destructive-operation guard. If it is genuinely safe and
42
+ intentional, ask the user to confirm, then run it manually outside the agent, or
43
+ narrow the command so it no longer matches the guard.
44
+ EOF
45
+ exit 2
46
+ }
47
+
48
+ # 1. Recursive forced delete (`rm -rf`) of a filesystem root, home, or top-level
49
+ # wildcard. Two gates ANDed: the command must invoke `rm` with BOTH a
50
+ # recursive and a force flag, AND name a catastrophic target. Splitting the
51
+ # flag check from the target check keeps each regex legible and testable.
52
+ if printf '%s' "$command_str" \
53
+ | grep -Eiq '(^|[^[:alnum:]_./-])rm([[:space:]]+-[[:alnum:]-]+)*[[:space:]]+(-[[:alnum:]]*r[[:alnum:]]*f|-[[:alnum:]]*f[[:alnum:]]*r)([[:space:]]|$)' \
54
+ || printf '%s' "$command_str" \
55
+ | grep -Eiq '(^|[^[:alnum:]_./-])rm[[:space:]].*(-r\b.*[[:space:]]-f\b|-f\b.*[[:space:]]-r\b|--recursive\b.*--force\b|--force\b.*--recursive\b)'; then
56
+ if printf '%s' "$command_str" \
57
+ | grep -Eq '([[:space:]]|=)(/|/\*|/\.\*?|~|~/\*?|\$HOME\b|\$\{HOME\}|\*)([[:space:]]|/?\*?$)'; then
58
+ block "recursive forced delete of a root, home, or wildcard path (rm -rf)"
59
+ fi
60
+ fi
61
+
62
+ # 2. Force-pushing a protected branch. `--force-with-lease` is the safe,
63
+ # non-clobbering alternative and is intentionally NOT blocked.
64
+ if printf '%s' "$command_str" | grep -Eiq '(^|[^[:alnum:]_-])git[[:space:]]+push\b'; then
65
+ if printf '%s' "$command_str" | grep -Eiq '(--force([[:space:]]|=|$)|[[:space:]]-f([[:space:]]|$))' \
66
+ && ! printf '%s' "$command_str" | grep -Eiq -- '--force-with-lease'; then
67
+ if printf '%s' "$command_str" | grep -Eiq '(^|[^[:alnum:]_/-])(main|master|production|prod|release)([^[:alnum:]_/-]|$)'; then
68
+ block "force-pushing a protected branch (use --force-with-lease, or push a feature branch)"
69
+ fi
70
+ fi
71
+ fi
72
+
73
+ # 3. `git reset --hard` while the working tree has uncommitted changes — this
74
+ # silently discards them. Only blocks when the tree is actually dirty, so a
75
+ # clean-tree reset (a legitimate workflow) still passes.
76
+ if printf '%s' "$command_str" | grep -Eiq '(^|[^[:alnum:]_-])git[[:space:]]+reset\b.*--hard\b'; then
77
+ if git rev-parse --is-inside-work-tree >/dev/null 2>&1 \
78
+ && [ -n "$(git status --porcelain 2>/dev/null)" ]; then
79
+ block "git reset --hard on a dirty working tree would discard uncommitted changes (stash or commit first)"
80
+ fi
81
+ fi
82
+
83
+ # 4. Dropping or truncating a database / schema / table.
84
+ if printf '%s' "$command_str" \
85
+ | grep -Eiq '\b(drop[[:space:]]+(database|schema|table)|truncate[[:space:]]+(table[[:space:]]+)?[[:alnum:]_."`]+)\b'; then
86
+ block "destructive SQL (DROP/TRUNCATE) detected"
87
+ fi
88
+
89
+ # 5. Project-local custom rules. Each non-comment line is an ERE; a match blocks.
90
+ rules_file="${SAFETY_NET_RULES_FILE:-${CLAUDE_PROJECT_DIR:-$PWD}/.claude/safety-net-rules.txt}"
91
+ if [ -f "$rules_file" ]; then
92
+ while IFS= read -r rule || [ -n "$rule" ]; do
93
+ case "$rule" in
94
+ '' | '#'*) continue ;;
95
+ esac
96
+ if printf '%s' "$command_str" | grep -Eiq -- "$rule"; then
97
+ block "matched a project custom safety rule (${rules_file##*/}): $rule"
98
+ fi
99
+ done <"$rules_file"
100
+ fi
101
+
102
+ exit 0
@@ -43,7 +43,7 @@ Do not begin work if there are blockers, ambiguities, access requirements, or un
43
43
  - Read **all** comments on a ticket, not just the description.
44
44
  - When clarifying, comment via ADF and @mention the Reporter.
45
45
  - Establish issue link relationships (`blocks`, `is blocked by`, `relates to`) — search git history AND Jira before declaring "no related work."
46
- - Single-repo invariant: Bug/Task/Sub-task MUST be single-repo. Epic/Story/Spike MAY span repos. Cross-repo leaves are split per the `repo-scope-split` rule.
46
+ - Single-repo invariant: Bug/Task/Sub-task/Improvement (and any childless Story/Spike — a leaf per `leaf-only-lifecycle`) MUST be single-repo. An Epic, or any Story/Spike that still holds child work, MAY span repos. Cross-repo leaves are split per the `repo-scope-split` rule.
47
47
  - Pre-flight gate: BLOCK + reassign-to-Reporter if a ticket is missing target backend env, sign-in credentials, Gherkin acceptance criteria, epic parent (non-bug/non-epic), or relationship discovery evidence.
48
48
 
49
49
  ## Pace
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Build-ready means a directly implementable leaf work unit.** Containers never carry build-ready.
4
4
 
5
- A leaf is structurally defined: **no child work** AND a leaf-typed item (Bug, Task, Sub-task, Improvement). A container is a parent with children Epic, Story, Spike, or any item that has acquired sub-items.
5
+ A leaf is structurally defined: **no open children** AND not an Epic — the by-design leaf types (Bug, Task, Sub-task, Improvement) plus a childless Story or Spike. A container is an **Epic**, or any item of any type that has acquired open child work.
6
6
 
7
7
  ## Invariant
8
8
 
@@ -12,10 +12,10 @@ A leaf is structurally defined: **no child work** AND a leaf-typed item (Bug, Ta
12
12
 
13
13
  ## Childless-parent exception
14
14
 
15
- A container *type* with no children is structurally a leaf — and may be build-ready iff its type is itself a leaf type:
15
+ A childless item is structurally a leaf — and may be build-ready **unless its type is Epic**:
16
16
 
17
- - **Task or Bug with no children** → leaf → may be build-ready.
18
- - **Epic, Story, or Spike with no children** → still NOT build-ready. These are coordination containers by design; an empty one is incomplete decomposition. Repair: decompose into leaves, or reclassify to a leaf type.
17
+ - **Task, Bug, Story, Spike, or Improvement with no children** → leaf → may be build-ready. A Story ships directly as one increment and a Spike *is* the investigation unit; neither needs sub-items to be implementable, so a childless one must not be stranded.
18
+ - **Epic with no children** → still NOT build-ready. An Epic is a pure rollup container by design its body is a high-level summary, never directly implementable — so a childless build-ready Epic is an incomplete decomposition or a mis-applied role. Repair: decompose into leaves, or reclassify to a leaf type.
19
19
 
20
20
  ## Parent state rollup (priority order, first match wins)
21
21
 
@@ -1,6 +1,6 @@
1
1
  # Repo Scope & Work-Time Splitting (load-bearing)
2
2
 
3
- **Leaf work units are single-repo.** A leaf is an individually implementable ticket with no children — types **Bug, Task, Sub-task, Improvement**. Each names exactly one repo. **Epic, Story, Spike** are coordination containers and may span repos.
3
+ **Leaf work units are single-repo.** A leaf is an individually implementable ticket with no open children — the by-design leaf types **Bug, Task, Sub-task, Improvement**, plus a childless **Story** or **Spike** (structurally a leaf per `leaf-only-lifecycle`). Each names exactly one repo. An **Epic**, and any **Story/Spike that still holds child work**, are coordination containers and may span repos.
4
4
 
5
5
  Enforced at four points: gate **S10** (`*-validate-*`, write time), `task-decomposition` step 1.5 (PRD-decomposition time), claim-time repo scoping (`*-build-intake`), and the work-time split procedure (an existing ticket about to be implemented).
6
6
 
@@ -647,7 +647,7 @@ A ticketing system can oversee **multiple repos** — e.g. one JIRA project (or
647
647
 
648
648
  ### The `repo:<name>` label (the repo marker)
649
649
 
650
- 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.
650
+ 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 (an Epic, or any item with open child work) may carry several or none.
651
651
 
652
652
  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").
653
653
 
@@ -16,16 +16,16 @@ The fix is not vendor-specific. It belongs here, in a cross-vendor rule, and eve
16
16
 
17
17
  ## Container vs. leaf taxonomy
18
18
 
19
- A **leaf work unit** is an individually implementable item with **no child work** issue types **Bug, Task, Sub-task, Improvement**. These are what an agent claims and implements. This is the same definition used by the `repo-scope-split` rule (a leaf work unit is also single-repo).
19
+ A **leaf work unit** is an individually implementable item with **no open child work**. Structurally, that is *any work item with no open children except an Epic*: the by-design leaf types **Bug, Task, Sub-task, Improvement**, plus a **childless Story or Spike** (a Story is a directly shippable increment and a Spike is itself the investigation unit neither needs sub-items to be implementable). These are what an agent claims and implements. A leaf work unit is also single-repo (the `repo-scope-split` rule).
20
20
 
21
21
  A **container** organizes other work and is never directly implemented:
22
22
 
23
23
  | Class | Examples by type | May carry build-ready? |
24
24
  |---|---|---|
25
- | **Leaf work unit** | Bug, Task, Sub-task, Improvement — with no children | **Yes** |
26
- | **Container** | Epic, Story, Spike, or *any* item that has child work | **No** — state rolls up from children |
25
+ | **Leaf work unit** | Bug, Task, Sub-task, Improvement, or a childless Story / Spike anything with no open children **except an Epic** | **Yes** |
26
+ | **Container** | An **Epic**, or *any* item (of any type) that has open child work | **No** — state rolls up from children |
27
27
 
28
- The classification is **structural, not nominal**: an item is a container if it has child work, regardless of its declared type. A "Task" that has acquired sub-tasks is a container for rollup purposes. The type label is a strong default (Epic/Story/Spike are containers by design), but the presence of children is decisive. See the childless-parent exception below for the converse case.
28
+ The classification is **structural, not nominal**: an item is a container if it has open child work, regardless of its declared type. A "Task" that has acquired sub-tasks is a container for rollup purposes. The single nominal exception is the **Epic**, which is a pure rollup container by design and is treated as a container even when childless; for every other type the presence of children is decisive. See the childless-parent exception below for the converse case.
29
29
 
30
30
  ### How each vendor encodes hierarchy
31
31
 
@@ -49,12 +49,12 @@ The permission boundary is the maintainer-applied build-ready role, not authorsh
49
49
 
50
50
  ## Childless-parent exception
51
51
 
52
- A container *type* with **no child work** is, structurally, a leaf — and may be build-ready **iff its issue type is itself a valid leaf work unit**.
52
+ A childless item is, structurally, a leaf — and may be build-ready **unless its issue type is Epic**.
53
53
 
54
- - A **Task** or **Bug** with no children → leaf → may be build-ready. (Many real tickets are flat Tasks with no sub-tasks; this rule must not strand them.)
55
- - An **Epic, Story, or Spike** with no children → still **not** build-ready. These types are coordination containers by design; an empty one is an incomplete decomposition, not an implementable unit. The correct repair is to decompose it (add leaf children) or reclassify it to a leaf type — not to claim it.
54
+ - A **Task, Bug, Story, Spike,** or **Improvement** with no children → leaf → may be build-ready. Many real tickets are flat Tasks with no sub-tasks; just as common, a **Story** is implemented directly as a single shippable increment and a **Spike** *is* the investigation work unit. None of these need to be decomposed to be claimable, and this rule must not strand them. (A childless Story/Spike promoted to a leaf this way is single-repo like any other leaf — see `repo-scope-split`.)
55
+ - An **Epic** with no children → still **not** build-ready. An Epic is a pure rollup container by design: its body is a high-level summary, never a directly implementable unit, so a childless Epic carrying the build-ready role is an incomplete decomposition or a mis-applied role — not work. The correct repair is to decompose it (add leaf children) or reclassify it to a leaf type — not to claim it.
56
56
 
57
- So the exception is narrow: childlessness *enables* build-ready only for types that are leaf work units to begin with. It never promotes an Epic/Story/Spike to directly implementable.
57
+ So the exception is narrow only at the top: childlessness promotes every type **except Epic** to a build-ready leaf. A childless Epic is never directly implementable; everything else, when childless, is.
58
58
 
59
59
  ## Parent status rollup (the state machine)
60
60
 
@@ -112,7 +112,7 @@ This action is **terminal-only**:
112
112
  Skills that enforce this invariant or perform rollup cite this rule by slug (the `leaf-only-lifecycle` rule) instead of restating it:
113
113
 
114
114
  - **Decomposition / write** (`*-to-tracker`, `*-write-*`) — apply the `ready` role to leaves only; never to containers.
115
- - **Validate** (`*-validate-*`) — FAIL a container carrying the build-ready role; FAIL a childless Epic/Story/Spike marked build-ready.
115
+ - **Validate** (`*-validate-*`) — FAIL a container carrying the build-ready role; FAIL a childless **Epic** marked build-ready (a childless Story/Spike is a valid leaf and passes).
116
116
  - **Build intake** (`*-build-intake`, `tracker-build-intake`) — dispatch leaves only; move or safe-block containers with stale build-ready roles according to vendor lifecycle semantics.
117
117
  - **Rollup** — derive parent state from children per the state machine above. `repair-intake`
118
118
  also uses this rule to close out parent/container rollups that were left open after every
@@ -1,6 +1,6 @@
1
1
  # Repo Scope & Work-Time Splitting
2
2
 
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.
3
+ Leaf work units are single-repo. A **leaf work unit** is an individually implementable ticket with no open child tickets — the by-design leaf types **Bug, Task, Sub-task, Improvement**, plus a childless **Story** or **Spike** (a childless Story/Spike is structurally a leaf — see `leaf-only-lifecycle`). Each must name exactly one repository. An **Epic**, and any **Story or Spike that still holds child work**, are coordination containers and may span repos.
4
4
 
5
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
 
@@ -47,7 +47,7 @@ Resolve the current repo per the `config-resolution` "Repo scoping" section (con
47
47
 
48
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
49
 
50
- A container (Epic/Story/Spike) is handled by the leaf-only gate, not here — containers may span repos, may keep multiple `repo:<name>` labels for visibility, and are never claimed/built directly. Only a leaf work unit is split or skipped by repo scope.
50
+ A container (an Epic, or any item with open child work) is handled by the leaf-only gate, not here — containers may span repos, may keep multiple `repo:<name>` labels for visibility, and are never claimed/built directly. Only a leaf work unit — including a now-childless Story/Spike that the leaf-only gate treats as a leaf — is split or skipped by repo scope.
51
51
 
52
52
  ## Vendor mechanics
53
53
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: github-build-intake
3
- description: "GitHub counterpart to lisa:jira-build-intake. Scans a GitHub repository for issues carrying the configured `ready` build label, processes the first eligible issue, runs leaf work via lisa:github-agent, relabels to the configured `done` label on completion, then exits. Enforces the claim-time arm of the `leaf-only-lifecycle` rule: a parent/container with open child work (or a childless Epic/Story/Spike) that still carries a stale build-ready label is moved out of the ready pickup queue into the configured `claimed` label with a lifecycle-repair comment, never dispatched to lisa:github-agent. The `ready` label is the human-flipped signal that an issue is truly ready for direct development pickup — mirroring how Notion PRDs work product Draft → Ready → (us) In Review → Blocked|Ticketed."
3
+ description: "GitHub counterpart to lisa:jira-build-intake. Scans a GitHub repository for issues carrying the configured `ready` build label, processes the first eligible issue, runs leaf work via lisa:github-agent, relabels to the configured `done` label on completion, then exits. Enforces the claim-time arm of the `leaf-only-lifecycle` rule: a parent/container with open child work (or a childless Epic) that still carries a stale build-ready label is moved out of the ready pickup queue into the configured `claimed` label with a lifecycle-repair comment, never dispatched to lisa:github-agent. The `ready` label is the human-flipped signal that an issue is truly ready for direct development pickup — mirroring how Notion PRDs work product Draft → Ready → (us) In Review → Blocked|Ticketed."
4
4
  allowed-tools: ["Skill", "Bash"]
5
5
  ---
6
6
 
@@ -209,16 +209,16 @@ Classify and act (first match wins). `type:` is read from the issue's labels (`t
209
209
  | Condition | Class | Action |
210
210
  |---|---|---|
211
211
  | `OPEN_CHILDREN > 0` (open child work, any type) | **Container** | **Move to `$CLAIMED` as lifecycle repair — do NOT dispatch** |
212
- | no open children AND `type {Epic, Story, Spike}` | **Childless container-type** | **Move to `$CLAIMED` as lifecycle repair — do NOT dispatch** |
213
- | no open children AND `type {Bug, Task, Sub-task, Improvement}` (or no `type:` label) | **Leaf work unit** | **Proceed to 3b claim** |
212
+ | no open children AND `type = Epic` | **Childless Epic (pure rollup container)** | **Move to `$CLAIMED` as lifecycle repair — do NOT dispatch** |
213
+ | no open children AND `type Epic` (Bug, Task, Sub-task, Improvement, Story, Spike, or no `type:` label) | **Leaf work unit** | **Proceed to 3b claim** |
214
214
 
215
- The childless-parent exception is narrow: childlessness enables direct build-agent dispatch **only** for types that are leaf work units to begin with. A childless Epic/Story/Spike is an incomplete decomposition, not an implementable unit it is moved out of the ready pickup queue for repair/rollup and never dispatched.
215
+ The childless-parent exception promotes every childless type **except Epic** to a dispatchable leaf: a childless Story is a directly shippable increment and a childless Spike *is* the investigation unit, so neither is stranded. Only a childless **Epic** is held back — an Epic is a pure rollup container by design, and a childless one is an incomplete decomposition or a mis-applied role, moved out of the ready pickup queue for repair/rollup and never dispatched.
216
216
 
217
217
  **Lifecycle repair (default action for a flagged container).** Move the issue out of the pickup queue by removing `$READY` and adding `$CLAIMED`, post a single lifecycle-repair comment, and record the issue under "Repaired (container)" in the summary. Do NOT invoke `lisa:github-agent`. Keep the comment idempotent — skip posting if an identical `[claude-build-intake]` lifecycle-repair comment already exists on the issue, so a re-entrant cycle doesn't spam it.
218
218
 
219
219
  ```bash
220
220
  gh issue edit <number> --repo <org>/<repo> --remove-label "$READY" --add-label "$CLAIMED"
221
- gh issue comment <number> --repo <org>/<repo> --body "[claude-build-intake] Lifecycle repair: this issue carried the build-ready role ($READY) but is a parent/container with open child work (or a childless Epic/Story/Spike). I moved it to $CLAIMED without invoking the build agent. For parent/container issues, $CLAIMED means rollup/build-lane progress through child/leaf work; direct implementation must happen on leaf issues. Build-ready is leaf-only per leaf-only-lifecycle — move $READY onto its leaf children, or decompose/reclassify a childless Epic/Story/Spike."
221
+ gh issue comment <number> --repo <org>/<repo> --body "[claude-build-intake] Lifecycle repair: this issue carried the build-ready role ($READY) but is a parent/container with open child work (or a childless Epic). I moved it to $CLAIMED without invoking the build agent. For parent/container issues, $CLAIMED means rollup/build-lane progress through child/leaf work; direct implementation must happen on leaf issues. Build-ready is leaf-only per leaf-only-lifecycle — move $READY onto its leaf children, or decompose/reclassify a childless Epic."
222
222
  ```
223
223
 
224
224
  This gate never blocks a legitimate flat Task/Bug: those have no open children and a leaf `type:`, so they fall straight through to the claim in 3b.
@@ -326,7 +326,7 @@ Total PRs opened: <n>
326
326
 
327
327
  ## Idempotency & safety
328
328
 
329
- - **Leaf-only claim gate runs first**: Phase 3a classifies each candidate before any leaf claim; a container with open child work (or a childless Epic/Story/Spike) is moved `$READY` → `$CLAIMED` as lifecycle repair and never dispatched. The lifecycle-repair comment is idempotent — a re-entrant cycle does not re-post it.
329
+ - **Leaf-only claim gate runs first**: Phase 3a classifies each candidate before any leaf claim; a container with open child work (or a childless Epic) is moved `$READY` → `$CLAIMED` as lifecycle repair and never dispatched. The lifecycle-repair comment is idempotent — a re-entrant cycle does not re-post it.
330
330
  - **Dependency hold runs before leaf claim**: explicit `Blocked by:` relationships are resolved after container repair is ruled out but before `$READY → $CLAIMED`; active blockers leave the leaf candidate in `$READY` and are reported as skipped, not blocked.
331
331
  - **Claim-first ordering**: `$CLAIMED` set BEFORE `lisa:github-agent` invocation for leaves; containers are also moved to `$CLAIMED` to leave the ready pickup queue, but are not dispatched.
332
332
  - **No writes outside the lifecycle**: this skill only relabels `$READY → $CLAIMED` and `$CLAIMED → $DONE`. For containers, `$READY → $CLAIMED` is a lifecycle repair, not a direct build claim. Every other label change is owned by `lisa:github-agent`.
@@ -351,7 +351,7 @@ If the repo has not adopted the `status:*` label namespace, this skill cannot ru
351
351
 
352
352
  ## Rules
353
353
 
354
- - **Dispatch leaves only.** Per the `leaf-only-lifecycle` rule, never dispatch a container — an issue with open child work, or a childless Epic/Story/Spike — even if it carries the build-ready role. Move it `$READY → $CLAIMED` as lifecycle repair (Phase 3a); never silently implement a container.
354
+ - **Dispatch leaves only.** Per the `leaf-only-lifecycle` rule, never dispatch a container — an issue with open child work, or a childless Epic — even if it carries the build-ready role. Move it `$READY → $CLAIMED` as lifecycle repair (Phase 3a); never silently implement a container.
355
355
  - Never relabel an issue outside the cycle's allowed transitions. The `$CLAIMED` label is the signature of cycle ownership for leaves, and the parent/container progress state for lifecycle repairs.
356
356
  - Never bypass `lisa:github-agent` to do build work directly. `lisa:github-agent` owns the per-issue lifecycle.
357
357
  - Never auto-transition past `$DONE`. Downstream labels (terminal `status:done`, etc.) are owned by QA / PM / merge automation.