@codyswann/lisa 2.126.2 → 2.127.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.
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +2 -1
- package/plugins/lisa/.mcp.json +8 -0
- package/plugins/lisa/rules/eager/base-rules.md +1 -1
- package/plugins/lisa/rules/eager/leaf-only-lifecycle.md +4 -4
- package/plugins/lisa/rules/eager/repo-scope-split.md +1 -1
- package/plugins/lisa/rules/reference/config-resolution.md +1 -1
- package/plugins/lisa/rules/reference/leaf-only-lifecycle.md +9 -9
- package/plugins/lisa/rules/reference/repo-scope-split.md +2 -2
- package/plugins/lisa/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/lisa/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/lisa/skills/intake-explain/SKILL.md +3 -3
- package/plugins/lisa/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/lisa/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/lisa/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/lisa/skills/repair-intake/SKILL.md +2 -2
- package/plugins/lisa/skills/tracker-build-intake/SKILL.md +4 -4
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/lisa-agy/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-agy/skills/intake-explain/SKILL.md +3 -3
- package/plugins/lisa-agy/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/lisa-agy/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/lisa-agy/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/lisa-agy/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-agy/skills/repair-intake/SKILL.md +2 -2
- package/plugins/lisa-agy/skills/tracker-build-intake/SKILL.md +4 -4
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +7 -1
- package/plugins/lisa-copilot/.mcp.json +8 -0
- package/plugins/lisa-copilot/rules/eager/base-rules.md +1 -1
- package/plugins/lisa-copilot/rules/eager/leaf-only-lifecycle.md +4 -4
- package/plugins/lisa-copilot/rules/eager/repo-scope-split.md +1 -1
- package/plugins/lisa-copilot/rules/reference/config-resolution.md +1 -1
- package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +9 -9
- package/plugins/lisa-copilot/rules/reference/repo-scope-split.md +2 -2
- package/plugins/lisa-copilot/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/lisa-copilot/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-copilot/skills/intake-explain/SKILL.md +3 -3
- package/plugins/lisa-copilot/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/lisa-copilot/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/lisa-copilot/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/lisa-copilot/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-copilot/skills/repair-intake/SKILL.md +2 -2
- package/plugins/lisa-copilot/skills/tracker-build-intake/SKILL.md +4 -4
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/mcp.json +8 -0
- package/plugins/lisa-cursor/rules/base-rules.mdc +1 -1
- package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +1 -1
- package/plugins/lisa-cursor/rules/leaf-only-lifecycle-reference.mdc +9 -9
- package/plugins/lisa-cursor/rules/leaf-only-lifecycle.mdc +4 -4
- package/plugins/lisa-cursor/rules/repo-scope-split-reference.mdc +2 -2
- package/plugins/lisa-cursor/rules/repo-scope-split.mdc +1 -1
- package/plugins/lisa-cursor/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/lisa-cursor/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-cursor/skills/intake-explain/SKILL.md +3 -3
- package/plugins/lisa-cursor/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/lisa-cursor/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/lisa-cursor/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/lisa-cursor/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-cursor/skills/repair-intake/SKILL.md +2 -2
- package/plugins/lisa-cursor/skills/tracker-build-intake/SKILL.md +4 -4
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/.mcp.json +8 -0
- package/plugins/src/base/rules/eager/base-rules.md +1 -1
- package/plugins/src/base/rules/eager/leaf-only-lifecycle.md +4 -4
- package/plugins/src/base/rules/eager/repo-scope-split.md +1 -1
- package/plugins/src/base/rules/reference/config-resolution.md +1 -1
- package/plugins/src/base/rules/reference/leaf-only-lifecycle.md +9 -9
- package/plugins/src/base/rules/reference/repo-scope-split.md +2 -2
- package/plugins/src/base/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/src/base/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/src/base/skills/intake-explain/SKILL.md +3 -3
- package/plugins/src/base/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/src/base/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/src/base/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/src/base/skills/repair-intake/SKILL.md +2 -2
- package/plugins/src/base/skills/tracker-build-intake/SKILL.md +4 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jira-build-intake
|
|
3
|
-
description: "Symmetric counterpart to notion-prd-intake on the JIRA side. Scans a JIRA project (or JQL filter) for tickets in the configured `ready` status, claims the first eligible ticket by transitioning to the configured `claimed` status, runs the implementation/build flow via jira-agent, transitions to the configured `done` status 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
|
|
3
|
+
description: "Symmetric counterpart to notion-prd-intake on the JIRA side. Scans a JIRA project (or JQL filter) for tickets in the configured `ready` status, claims the first eligible ticket by transitioning to the configured `claimed` status, runs the implementation/build flow via jira-agent, transitions to the configured `done` status 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 status is skipped or safe-blocked with a lifecycle-repair comment, never claimed. The `ready` status is the human-flipped signal that a TODO ticket is truly ready for development — mirroring how Notion PRDs work product Draft → Ready → (us) In Review → Blocked|Ticketed."
|
|
4
4
|
allowed-tools: ["Skill", "Bash"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -159,17 +159,17 @@ Classify and act (first match wins). The issue type comes from the ticket's `iss
|
|
|
159
159
|
| Condition | Class | Action |
|
|
160
160
|
|---|---|---|
|
|
161
161
|
| `OPEN_CHILDREN > 0` (open child work, any type) | **Container** | **Skip / safe-block — do NOT claim** |
|
|
162
|
-
| no open children AND type
|
|
163
|
-
| no open children AND type
|
|
162
|
+
| no open children AND type = Epic | **Childless Epic (pure rollup container)** | **Skip / safe-block — do NOT claim** |
|
|
163
|
+
| no open children AND type ≠ Epic (Bug, Task, Sub-task, Improvement, Story, Spike, or no recognized type) | **Leaf work unit** | **Proceed to 3b claim** |
|
|
164
164
|
|
|
165
|
-
The childless-parent exception
|
|
165
|
+
The childless-parent exception promotes every childless type **except Epic** to a claimable 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** stays unclaimed — an Epic is a pure rollup container by design, and a childless one is an incomplete decomposition or a mis-applied role, never an implementable unit.
|
|
166
166
|
|
|
167
167
|
**Safe-block (default action for a flagged container).** Leave the build-ready status in place (don't silently transition it away — that hides the lifecycle error), post a single lifecycle-repair comment, record the ticket under "Skipped (container)" in the summary, and end the cycle. Do NOT transition to `$CLAIMED`. Keep the comment idempotent — skip posting if an identical `[claude-build-intake]` lifecycle-repair comment already exists on the ticket, so a re-entrant cycle doesn't spam it.
|
|
168
168
|
|
|
169
169
|
Post via `lisa:atlassian-access` `operation: comment key: <TICKET> body: "<message>"` with:
|
|
170
170
|
|
|
171
171
|
```text
|
|
172
|
-
[claude-build-intake] Not claimed: this ticket carries the build-ready status ($READY) but is a container with open child work (or a childless Epic
|
|
172
|
+
[claude-build-intake] Not claimed: this ticket carries the build-ready status ($READY) but is a container with open child work (or a childless Epic), which violates the leaf-only-lifecycle rule. Build-ready (status:ready) is leaf-only per leaf-only-lifecycle — an agent claims and implements leaves, never a container. Repair: move $READY off this parent onto its leaf children (or, for a childless Epic, decompose it into leaf children or reclassify it to a leaf type). A parent's lifecycle state rolls up from its children and is never set to ready directly.
|
|
173
173
|
```
|
|
174
174
|
|
|
175
175
|
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.
|
|
@@ -242,7 +242,7 @@ Total PRs opened: <n>
|
|
|
242
242
|
|
|
243
243
|
## Idempotency & safety
|
|
244
244
|
|
|
245
|
-
- **Leaf-only claim gate runs first**: Phase 3a classifies each candidate before any claim; a container with open child work (or a childless Epic
|
|
245
|
+
- **Leaf-only claim gate runs first**: Phase 3a classifies each candidate before any claim; a container with open child work (or a childless Epic) is skipped/safe-blocked, never claimed (the `leaf-only-lifecycle` rule's claim-time arm). The safe-block comment is idempotent — a re-entrant cycle does not re-post it.
|
|
246
246
|
- **Claim-first ordering**: `$CLAIMED` set BEFORE `lisa:jira-agent` invocation — no double-pickup.
|
|
247
247
|
- **No writes outside the lifecycle**: this skill only transitions `$READY → $CLAIMED` and `$CLAIMED → $DONE`, then verifies terminal native resolution when `$DONE` is the true terminal state per `leaf-only-lifecycle`. Every other status change is owned by `lisa:jira-agent` (which suggests transitions but only auto-transitions on the verify-FAIL path).
|
|
248
248
|
- **Terminal native closure**: for terminal `$DONE`, the resulting JIRA issue must be in a resolved / closed state (`statusCategory = Done` and resolution set when required). Intermediate env statuses stay unresolved / open.
|
|
@@ -276,7 +276,7 @@ If a ready-equivalent status does not exist in the JIRA project's workflow, this
|
|
|
276
276
|
|
|
277
277
|
## Rules
|
|
278
278
|
|
|
279
|
-
- **Claim leaves only.** Per the `leaf-only-lifecycle` rule, never claim a container — a ticket with open child work, or a childless Epic
|
|
279
|
+
- **Claim leaves only.** Per the `leaf-only-lifecycle` rule, never claim a container — a ticket with open child work, or a childless Epic — even if it carries the build-ready status. Skip or safe-block it (Phase 3a); never silently implement a container.
|
|
280
280
|
- Never transition a ticket the cycle didn't claim. The `$CLAIMED` transition is the signature of cycle ownership.
|
|
281
281
|
- Never bypass `lisa:jira-agent` to do build work directly. `lisa:jira-agent` owns the per-ticket lifecycle (read, verify, triage, route, sync, evidence). This skill is the dispatcher, not the builder.
|
|
282
282
|
- Never auto-transition past `$DONE`. Downstream statuses are owned by QA / product / a future verification-intake skill — not this one.
|
|
@@ -162,9 +162,9 @@ If the spec doesn't set `authenticated_surface`, infer it: scan the description
|
|
|
162
162
|
|
|
163
163
|
#### S10 — Repository section, single-repo scope
|
|
164
164
|
|
|
165
|
-
When `issue_type ∈ {Bug, Task, Sub-task, Improvement}
|
|
165
|
+
When `issue_type ∈ {Bug, Task, Sub-task, Improvement}` — or a **build-ready childless Story/Spike** (a claimable leaf per `leaf-only-lifecycle`) — description must contain `h2. Repository` naming exactly one repo. Multiple repos OR cross-repo references in AC: FAIL with recommendation `"Split into per-repo work units under a shared parent Story (see lisa:task-decomposition step 1.5)"`.
|
|
166
166
|
|
|
167
|
-
|
|
167
|
+
An **Epic**, or a **Story/Spike that still holds child work** (or is not build-ready): skipped (may span repos — coordination containers, not claimable leaf work units).
|
|
168
168
|
|
|
169
169
|
This gate is `product_relevant: false` because cross-repo work units are not a product question — they are a decomposition error. Callers (`lisa:notion-to-tracker`, `lisa:confluence-to-tracker`, `lisa:linear-to-tracker`, `lisa:github-to-tracker`) MUST pre-split cross-repo work into per-repo work units during the decomposition phase per `lisa:task-decomposition` step 1.5; an S10 failure here indicates the agent skipped that step and must auto-split + revalidate before writing, not surface a clarifying comment to product.
|
|
170
170
|
|
|
@@ -200,7 +200,7 @@ When `issue_type ∈ {Bug, Task, Sub-task, Improvement}` AND `runtime_behavior_c
|
|
|
200
200
|
|
|
201
201
|
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.
|
|
202
202
|
|
|
203
|
-
This gate depends on S11. It is `N/A` for Epic
|
|
203
|
+
This gate depends on S11. It is `N/A` for containers — an **Epic**, or any item with open child work (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:jira-add-journey`.
|
|
204
204
|
|
|
205
205
|
#### S15 — Leaf-only build-ready
|
|
206
206
|
|
|
@@ -212,20 +212,19 @@ Enforces the build-side of the vendor-neutral `leaf-only-lifecycle` rule: **only
|
|
|
212
212
|
|
|
213
213
|
Apply this decision and FAIL the two invariant-violating cases:
|
|
214
214
|
|
|
215
|
-
1. **Container with child work + build-ready** —
|
|
216
|
-
2. **Childless
|
|
215
|
+
1. **Container with child work + build-ready** — child work is present (any type that has open children), AND build-ready. FAIL. A parent organizes work; it is never claimed and implemented directly. Its lifecycle state rolls up from its children.
|
|
216
|
+
2. **Childless Epic + build-ready** — `issue_type = Epic` with **no** child work, AND build-ready. Still FAIL: an Epic is a pure rollup container by design, and a childless one is an incomplete decomposition or a mis-applied role, not an implementable unit. (A childless Story or Spike is **not** failed here — the childless-parent exception in `leaf-only-lifecycle` promotes every childless non-Epic type to a build-ready leaf.)
|
|
217
217
|
|
|
218
|
-
PASS (the childless-parent exception) when the ticket is build-ready and is a **leaf work unit**: `issue_type
|
|
218
|
+
PASS (the childless-parent exception) when the ticket is build-ready and is a **leaf work unit**: it has **no** open child work and `issue_type ≠ Epic` (i.e. `Bug, Task, Sub-task, Improvement`, or a childless `Story` / `Spike`). A flat Task/Bug, or a childless Story/Spike with no sub-tasks, is a valid build-ready leaf and must not be stranded.
|
|
219
219
|
|
|
220
220
|
| issue_type | has child work | build-ready | S15 |
|
|
221
221
|
|---|---|---|---|
|
|
222
|
-
| Bug / Task / Sub-task / Improvement | no | yes | **PASS** (leaf) |
|
|
223
|
-
|
|
|
224
|
-
| Epic
|
|
225
|
-
| Epic / Story / Spike | no | yes | **FAIL** (childless container-type, exception does not apply) |
|
|
222
|
+
| Bug / Task / Sub-task / Improvement / Story / Spike | no | yes | **PASS** (leaf) |
|
|
223
|
+
| any type | yes | yes | **FAIL** (structurally a container) |
|
|
224
|
+
| Epic | no | yes | **FAIL** (childless Epic — pure rollup container, exception does not apply) |
|
|
226
225
|
| any | any | no | **N/A** (not build-ready) |
|
|
227
226
|
|
|
228
|
-
Remediation: `"Build-ready (status:ready) is leaf-only per leaf-only-lifecycle. Move status:ready off this container onto its leaf children (or, for a childless Epic
|
|
227
|
+
Remediation: `"Build-ready (status:ready) is leaf-only per leaf-only-lifecycle. Move status:ready off this container onto its leaf children (or, for a childless Epic, decompose it into leaf children or reclassify it to a leaf type); a parent's lifecycle state rolls up from its children and is never set to ready directly."`
|
|
229
228
|
|
|
230
229
|
`product_relevant: false` — a build-ready container is a lifecycle/decomposition error for the caller to repair, not a product question.
|
|
231
230
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-build-intake
|
|
3
|
-
description: "Symmetric counterpart to lisa:jira-build-intake on the Linear side. Scans a Linear team for Issues carrying the configured `ready` build label, claims the first eligible Issue by relabeling to the configured `claimed` label, runs the implementation/build flow via lisa:linear-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
|
|
3
|
+
description: "Symmetric counterpart to lisa:jira-build-intake on the Linear side. Scans a Linear team for Issues carrying the configured `ready` build label, claims the first eligible Issue by relabeling to the configured `claimed` label, runs the implementation/build flow via lisa:linear-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 skipped or safe-blocked with a lifecycle-repair comment, never claimed. The `ready` label is the human-flipped signal that an Issue is truly ready for development — mirroring how Notion PRDs work Draft → Ready → (us) In Review → Blocked|Ticketed."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_teams", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -167,17 +167,17 @@ Classify and act (first match wins). The type comes from the Issue's `type:` lab
|
|
|
167
167
|
| Condition | Class | Action |
|
|
168
168
|
|---|---|---|
|
|
169
169
|
| `OPEN_CHILDREN > 0` (open child work, any type) | **Container** | **Skip / safe-block — do NOT claim** |
|
|
170
|
-
| no open children AND type
|
|
171
|
-
| no open children AND type
|
|
170
|
+
| no open children AND type = Epic (a Linear Project) | **Childless Epic/Project (pure rollup container)** | **Skip / safe-block — do NOT claim** |
|
|
171
|
+
| no open children AND type ≠ Epic (Bug, Task, Sub-task, Improvement, Story, Spike, or no `type:` label) | **Leaf work unit** | **Proceed to 3b claim** |
|
|
172
172
|
|
|
173
|
-
The childless-parent exception
|
|
173
|
+
The childless-parent exception promotes every childless type **except Epic** to a claimable 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** (a Linear Project) stays unclaimed — it is a pure rollup container by design, and a childless one is an incomplete decomposition or a mis-applied role, never an implementable unit.
|
|
174
174
|
|
|
175
175
|
**Safe-block (default action for a flagged container).** Leave the build-ready label in place (don't silently strip it — that hides the lifecycle error), post a single lifecycle-repair comment, record the Issue under "Skipped (container)" in the summary, and end the cycle. Do NOT relabel to `$CLAIMED`. 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.
|
|
176
176
|
|
|
177
177
|
Post via `mcp__linear-server__save_comment` with:
|
|
178
178
|
|
|
179
179
|
```text
|
|
180
|
-
[claude-build-intake] Not claimed: this Issue carries the build-ready label ($READY) but is a container with open child work (or a childless Epic
|
|
180
|
+
[claude-build-intake] Not claimed: this Issue carries the build-ready label ($READY) but is a container with open child work (or a childless Epic), which violates the leaf-only-lifecycle rule. Build-ready (status:ready) is leaf-only per leaf-only-lifecycle — an agent claims and implements leaves, never a container. Repair: move $READY off this parent onto its leaf children (or, for a childless Epic, decompose it into leaf children or reclassify it to a leaf type). A parent's lifecycle state rolls up from its children and is never set to ready directly.
|
|
181
181
|
```
|
|
182
182
|
|
|
183
183
|
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.
|
|
@@ -252,7 +252,7 @@ Total PRs opened: <n>
|
|
|
252
252
|
|
|
253
253
|
## Idempotency & safety
|
|
254
254
|
|
|
255
|
-
- **Leaf-only claim gate runs first**: Phase 3a classifies each candidate before any claim; a container with open child work (or a childless Epic
|
|
255
|
+
- **Leaf-only claim gate runs first**: Phase 3a classifies each candidate before any claim; a container with open child work (or a childless Epic) is skipped/safe-blocked, never claimed (the `leaf-only-lifecycle` rule's claim-time arm). The safe-block comment is idempotent — a re-entrant cycle does not re-post it.
|
|
256
256
|
- **Claim-first ordering**: `$CLAIMED` set BEFORE agent invocation — no double-pickup.
|
|
257
257
|
- **No writes outside the lifecycle**: this skill only adds/removes `$READY`, `$CLAIMED`, `$DONE`, plus terminal-only native state completion required by `leaf-only-lifecycle`. Every other label change (and non-terminal native state change) is owned by the agent or `lisa:linear-evidence`.
|
|
258
258
|
- **Terminal native closure**: after the `$DONE` label is applied, move the Linear Issue to a native completed state only when `$DONE` is the true terminal done value; intermediate env labels stay open / active.
|
|
@@ -273,7 +273,7 @@ If the team hasn't adopted these labels, the first run exits with an adoption hi
|
|
|
273
273
|
|
|
274
274
|
## Rules
|
|
275
275
|
|
|
276
|
-
- **Claim leaves only.** Per the `leaf-only-lifecycle` rule, never claim a container — an Issue with open child work, or a childless Epic
|
|
276
|
+
- **Claim leaves only.** Per the `leaf-only-lifecycle` rule, never claim a container — an Issue with open child work, or a childless Epic — even if it carries the build-ready label. Skip or safe-block it (Phase 3a); never silently implement a container.
|
|
277
277
|
- Never relabel an Issue the cycle didn't claim. The `$CLAIMED` transition is the signature of cycle ownership.
|
|
278
278
|
- Never bypass `lisa:linear-agent` to do build work directly. The agent owns the per-Issue lifecycle.
|
|
279
279
|
- Never auto-transition past `$DONE`. Downstream labels are owned by QA / product / a future verification-intake skill.
|
|
@@ -165,9 +165,9 @@ If the spec doesn't set `authenticated_surface`, infer it: scan the description
|
|
|
165
165
|
|
|
166
166
|
#### S10 — Repository section, single-repo scope
|
|
167
167
|
|
|
168
|
-
When `issue_type ∈ {Bug, Task, Sub-task, Improvement}
|
|
168
|
+
When `issue_type ∈ {Bug, Task, Sub-task, Improvement}` — or a **build-ready childless Story/Spike** (a claimable leaf per `leaf-only-lifecycle`) — description must contain `## Repository` naming exactly one repo. Multiple repos OR cross-repo references in AC: FAIL with recommendation `"Split into per-repo work units under a shared parent Story (see lisa:task-decomposition step 1.5)"`.
|
|
169
169
|
|
|
170
|
-
|
|
170
|
+
An **Epic** (a Linear Project), or a **Story/Spike that still holds child work** (or is not build-ready): skipped (may span repos — coordination containers, not claimable leaf work units).
|
|
171
171
|
|
|
172
172
|
This gate is `product_relevant: false` because cross-repo work units are not a product question — they are a decomposition error. Callers (`lisa:linear-to-tracker`, `lisa:notion-to-tracker`, etc.) MUST pre-split cross-repo work into per-repo work units during the decomposition phase per `lisa:task-decomposition` step 1.5; an S10 failure here indicates the agent skipped that step and must auto-split + revalidate before writing, not surface a clarifying comment to product.
|
|
173
173
|
|
|
@@ -201,7 +201,7 @@ When `issue_type ∈ {Bug, Task, Sub-task, Improvement}` AND `runtime_behavior_c
|
|
|
201
201
|
|
|
202
202
|
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.
|
|
203
203
|
|
|
204
|
-
This gate depends on S11. It is `N/A` for Project
|
|
204
|
+
This gate depends on S11. It is `N/A` for containers — a **Project** (the Epic equivalent), or any item with open child work (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:linear-add-journey`.
|
|
205
205
|
|
|
206
206
|
#### S15 — Leaf-only build-ready
|
|
207
207
|
|
|
@@ -213,20 +213,19 @@ Enforces the build-side of the vendor-neutral `leaf-only-lifecycle` rule: **only
|
|
|
213
213
|
|
|
214
214
|
Apply this decision and FAIL the two invariant-violating cases:
|
|
215
215
|
|
|
216
|
-
1. **Container with child work + build-ready** —
|
|
217
|
-
2. **Childless
|
|
216
|
+
1. **Container with child work + build-ready** — child work is present (any type that has open children), AND build-ready. FAIL. A parent organizes work; it is never claimed and implemented directly. Its lifecycle state rolls up from its children.
|
|
217
|
+
2. **Childless Epic/Project + build-ready** — `issue_type = Epic` (a Linear Project) with **no** child work, AND build-ready. Still FAIL: an Epic/Project is a pure rollup container by design, and a childless one is an incomplete decomposition or a mis-applied role, not an implementable unit. (A childless Story or Spike is **not** failed here — the childless-parent exception in `leaf-only-lifecycle` promotes every childless non-Epic type to a build-ready leaf.)
|
|
218
218
|
|
|
219
|
-
PASS (the childless-parent exception) when the item is build-ready and is a **leaf work unit**: `issue_type
|
|
219
|
+
PASS (the childless-parent exception) when the item is build-ready and is a **leaf work unit**: it has **no** open child work and `issue_type ≠ Epic` (i.e. `Bug, Task, Sub-task, Improvement`, or a childless `Story` / `Spike`). A flat Task/Bug, or a childless Story/Spike with no sub-issues, is a valid build-ready leaf and must not be stranded.
|
|
220
220
|
|
|
221
221
|
| issue_type | has child work | build-ready | S15 |
|
|
222
222
|
|---|---|---|---|
|
|
223
|
-
| Bug / Task / Sub-task / Improvement | no | yes | **PASS** (leaf) |
|
|
224
|
-
|
|
|
225
|
-
| Epic
|
|
226
|
-
| Epic / Story / Spike | no | yes | **FAIL** (childless container-type, exception does not apply) |
|
|
223
|
+
| Bug / Task / Sub-task / Improvement / Story / Spike | no | yes | **PASS** (leaf) |
|
|
224
|
+
| any type | yes | yes | **FAIL** (structurally a container) |
|
|
225
|
+
| Epic (Project) | no | yes | **FAIL** (childless Epic/Project — pure rollup container, exception does not apply) |
|
|
227
226
|
| any | any | no | **N/A** (not build-ready) |
|
|
228
227
|
|
|
229
|
-
Remediation: `"Build-ready (status:ready) is leaf-only per leaf-only-lifecycle. Move status:ready off this container onto its leaf children (or, for a childless Epic
|
|
228
|
+
Remediation: `"Build-ready (status:ready) is leaf-only per leaf-only-lifecycle. Move status:ready off this container onto its leaf children (or, for a childless Epic, decompose it into leaf children or reclassify it to a leaf type); a parent's lifecycle state rolls up from its children and is never set to ready directly."`
|
|
230
229
|
|
|
231
230
|
`product_relevant: false` — a build-ready container is a lifecycle/decomposition error for the caller to repair, not a product question.
|
|
232
231
|
|
|
@@ -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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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.
|