@codyswann/lisa 2.147.3 → 2.147.4
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 +1 -1
- package/plugins/lisa/rules/eager/leaf-only-lifecycle.md +1 -1
- package/plugins/lisa/rules/reference/leaf-only-lifecycle.md +1 -1
- package/plugins/lisa/skills/github-validate-issue/SKILL.md +1 -1
- package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +1 -1
- package/plugins/lisa/skills/linear-validate-issue/SKILL.md +2 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/github-validate-issue/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/jira-validate-ticket/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/linear-validate-issue/SKILL.md +2 -0
- 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 +1 -1
- package/plugins/lisa-copilot/rules/eager/leaf-only-lifecycle.md +1 -1
- package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +1 -1
- package/plugins/lisa-copilot/skills/github-validate-issue/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/jira-validate-ticket/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/linear-validate-issue/SKILL.md +2 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/rules/leaf-only-lifecycle-reference.mdc +1 -1
- package/plugins/lisa-cursor/rules/leaf-only-lifecycle.mdc +1 -1
- package/plugins/lisa-cursor/skills/github-validate-issue/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/jira-validate-ticket/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/linear-validate-issue/SKILL.md +2 -0
- 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/rules/eager/leaf-only-lifecycle.md +1 -1
- package/plugins/src/base/rules/reference/leaf-only-lifecycle.md +1 -1
- package/plugins/src/base/skills/github-validate-issue/SKILL.md +1 -1
- package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +1 -1
- package/plugins/src/base/skills/linear-validate-issue/SKILL.md +2 -0
package/package.json
CHANGED
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"lodash": ">=4.18.1"
|
|
85
85
|
},
|
|
86
86
|
"name": "@codyswann/lisa",
|
|
87
|
-
"version": "2.147.
|
|
87
|
+
"version": "2.147.4",
|
|
88
88
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
89
89
|
"main": "dist/index.js",
|
|
90
90
|
"exports": {
|
|
@@ -7,7 +7,7 @@ A leaf is structurally defined: **no open children** AND not an Epic — the by-
|
|
|
7
7
|
## Invariant
|
|
8
8
|
|
|
9
9
|
- **At decomposition/write time** — only leaves receive the `ready` role. Parent containers are created in their non-ready state.
|
|
10
|
-
- **At validate time** — `*-validate-*` FAILs any container carrying the build-ready role.
|
|
10
|
+
- **At validate time** — `*-validate-*` FAILs any container carrying the build-ready role. The parent-declared gate (S7) does **not** FAIL a build-ready leaf with no parent (flat Task/Improvement or childless Story/Spike); a Sub-task is the one exception and always needs a parent.
|
|
11
11
|
- **At claim time** — build-intake claims leaves only. A container with a stale build-ready role is rolled up or safe-blocked, NEVER implemented.
|
|
12
12
|
|
|
13
13
|
## Childless-parent exception
|
|
@@ -42,7 +42,7 @@ Where a vendor lacks native hierarchy for a given pair, a text link or metadata
|
|
|
42
42
|
**Build-ready means a directly implementable leaf work unit.** Therefore:
|
|
43
43
|
|
|
44
44
|
- **At decomposition / write time** — when a PRD decomposes into a hierarchy, only the leaf work units receive the `ready` role (status/label). Parent containers (Epic, Story, Project, and any parent issue that has child work) are created in their normal non-ready state and never receive the build-ready role directly. The leaves are what downstream build intake will claim.
|
|
45
|
-
- **At validate time** — the `*-validate-*` gate FAILs any container carrying the build-ready role. This is the symmetric write-side guard: a stale or hand-applied build-ready role on a parent is a lifecycle error.
|
|
45
|
+
- **At validate time** — the `*-validate-*` gate FAILs any container carrying the build-ready role. This is the symmetric write-side guard: a stale or hand-applied build-ready role on a parent is a lifecycle error. Conversely, the parent-declared gate (S7) does **not** FAIL a build-ready leaf that has no parent: a flat Task/Improvement or a childless Story/Spike may stand alone, so a missing parent on such a leaf is `N/A`. Stranding a parentless build-ready leaf would directly violate the "must not be stranded" guarantee below. (A Sub-task is the one exception — it always requires a parent.)
|
|
46
46
|
- **At claim time** — build intake scans for the `ready` role but dispatches **only leaf work units**. A container that still carries a stale build-ready role (e.g. applied before this rule existed) is **not dispatched**: intake either moves it into the vendor's parent/container progress state or safely blocks it with a clear lifecycle-repair message. Intake never silently implements a container.
|
|
47
47
|
|
|
48
48
|
The permission boundary is the maintainer-applied build-ready role, not authorship — do not add author-based guards (PRD #522 non-goal). This rule narrows *what* may carry that role, not *who* may apply it.
|
|
@@ -147,7 +147,7 @@ When `issue_type = Spike`, body must include:
|
|
|
147
147
|
|
|
148
148
|
#### S7 — Parent sub-issue declared
|
|
149
149
|
|
|
150
|
-
When `issue_type ∉ {Bug, Epic}`, `parent_ref` must be set.
|
|
150
|
+
When `issue_type ∉ {Bug, Epic}`, `parent_ref` must be set — **except for a build-ready leaf work unit**, which may stand alone. A flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle`, which states such leaves "must not be stranded"; for these a missing parent is `N/A`, not a FAIL. This mirrors the leaf carve-out already in S10/S15. A `Sub-task` is exempt from this exception — it always requires a parent. When a parent IS declared, the native sub-issue link is set by `lisa:github-write-issue` Phase 6 step 3. (Validity of a declared parent is checked in feasibility gate F2.)
|
|
151
151
|
|
|
152
152
|
#### S8 — Target Backend Environment
|
|
153
153
|
|
|
@@ -148,7 +148,7 @@ When `issue_type = Spike`, description must include:
|
|
|
148
148
|
|
|
149
149
|
#### S7 — Epic parent declared
|
|
150
150
|
|
|
151
|
-
When `issue_type ∉ {Bug, Epic}`, `parent_key` must be set. (Validity of
|
|
151
|
+
When `issue_type ∉ {Bug, Epic}`, `parent_key` must be set — **except for a build-ready leaf work unit**, which may stand alone. A flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle`, which states such leaves "must not be stranded"; for these a missing parent is `N/A`, not a FAIL. This mirrors the leaf carve-out already in S10/S15. A `Sub-task` is exempt from this exception — it always requires a parent. (Validity of a declared parent key is checked in feasibility gates.)
|
|
152
152
|
|
|
153
153
|
#### S8 — Target Backend Environment
|
|
154
154
|
|
|
@@ -153,6 +153,8 @@ When `issue_type ∈ {Story, Task, Improvement}` AND the item is part of an Epic
|
|
|
153
153
|
|
|
154
154
|
For top-level Bug / Spike not under an Epic, this gate is N/A.
|
|
155
155
|
|
|
156
|
+
A **build-ready leaf work unit** that is not part of an Epic context stands alone: a flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle` ("must not be stranded"), so a missing `parent_project_id` is `N/A`, not a FAIL. A `Sub-task` is exempt from this exception — it always requires `parent_issue_id`. This mirrors the leaf carve-out already in S10/S15.
|
|
157
|
+
|
|
156
158
|
#### S8 — Target Backend Environment
|
|
157
159
|
|
|
158
160
|
When `runtime_behavior_change = true`, description must contain `## Target Backend Environment` with one of `dev`, `staging`, `prod`. Skipped for doc-only / config-only / type-only / Epic.
|
|
@@ -147,7 +147,7 @@ When `issue_type = Spike`, body must include:
|
|
|
147
147
|
|
|
148
148
|
#### S7 — Parent sub-issue declared
|
|
149
149
|
|
|
150
|
-
When `issue_type ∉ {Bug, Epic}`, `parent_ref` must be set.
|
|
150
|
+
When `issue_type ∉ {Bug, Epic}`, `parent_ref` must be set — **except for a build-ready leaf work unit**, which may stand alone. A flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle`, which states such leaves "must not be stranded"; for these a missing parent is `N/A`, not a FAIL. This mirrors the leaf carve-out already in S10/S15. A `Sub-task` is exempt from this exception — it always requires a parent. When a parent IS declared, the native sub-issue link is set by `lisa:github-write-issue` Phase 6 step 3. (Validity of a declared parent is checked in feasibility gate F2.)
|
|
151
151
|
|
|
152
152
|
#### S8 — Target Backend Environment
|
|
153
153
|
|
|
@@ -148,7 +148,7 @@ When `issue_type = Spike`, description must include:
|
|
|
148
148
|
|
|
149
149
|
#### S7 — Epic parent declared
|
|
150
150
|
|
|
151
|
-
When `issue_type ∉ {Bug, Epic}`, `parent_key` must be set. (Validity of
|
|
151
|
+
When `issue_type ∉ {Bug, Epic}`, `parent_key` must be set — **except for a build-ready leaf work unit**, which may stand alone. A flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle`, which states such leaves "must not be stranded"; for these a missing parent is `N/A`, not a FAIL. This mirrors the leaf carve-out already in S10/S15. A `Sub-task` is exempt from this exception — it always requires a parent. (Validity of a declared parent key is checked in feasibility gates.)
|
|
152
152
|
|
|
153
153
|
#### S8 — Target Backend Environment
|
|
154
154
|
|
|
@@ -153,6 +153,8 @@ When `issue_type ∈ {Story, Task, Improvement}` AND the item is part of an Epic
|
|
|
153
153
|
|
|
154
154
|
For top-level Bug / Spike not under an Epic, this gate is N/A.
|
|
155
155
|
|
|
156
|
+
A **build-ready leaf work unit** that is not part of an Epic context stands alone: a flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle` ("must not be stranded"), so a missing `parent_project_id` is `N/A`, not a FAIL. A `Sub-task` is exempt from this exception — it always requires `parent_issue_id`. This mirrors the leaf carve-out already in S10/S15.
|
|
157
|
+
|
|
156
158
|
#### S8 — Target Backend Environment
|
|
157
159
|
|
|
158
160
|
When `runtime_behavior_change = true`, description must contain `## Target Backend Environment` with one of `dev`, `staging`, `prod`. Skipped for doc-only / config-only / type-only / Epic.
|
|
@@ -7,7 +7,7 @@ A leaf is structurally defined: **no open children** AND not an Epic — the by-
|
|
|
7
7
|
## Invariant
|
|
8
8
|
|
|
9
9
|
- **At decomposition/write time** — only leaves receive the `ready` role. Parent containers are created in their non-ready state.
|
|
10
|
-
- **At validate time** — `*-validate-*` FAILs any container carrying the build-ready role.
|
|
10
|
+
- **At validate time** — `*-validate-*` FAILs any container carrying the build-ready role. The parent-declared gate (S7) does **not** FAIL a build-ready leaf with no parent (flat Task/Improvement or childless Story/Spike); a Sub-task is the one exception and always needs a parent.
|
|
11
11
|
- **At claim time** — build-intake claims leaves only. A container with a stale build-ready role is rolled up or safe-blocked, NEVER implemented.
|
|
12
12
|
|
|
13
13
|
## Childless-parent exception
|
|
@@ -42,7 +42,7 @@ Where a vendor lacks native hierarchy for a given pair, a text link or metadata
|
|
|
42
42
|
**Build-ready means a directly implementable leaf work unit.** Therefore:
|
|
43
43
|
|
|
44
44
|
- **At decomposition / write time** — when a PRD decomposes into a hierarchy, only the leaf work units receive the `ready` role (status/label). Parent containers (Epic, Story, Project, and any parent issue that has child work) are created in their normal non-ready state and never receive the build-ready role directly. The leaves are what downstream build intake will claim.
|
|
45
|
-
- **At validate time** — the `*-validate-*` gate FAILs any container carrying the build-ready role. This is the symmetric write-side guard: a stale or hand-applied build-ready role on a parent is a lifecycle error.
|
|
45
|
+
- **At validate time** — the `*-validate-*` gate FAILs any container carrying the build-ready role. This is the symmetric write-side guard: a stale or hand-applied build-ready role on a parent is a lifecycle error. Conversely, the parent-declared gate (S7) does **not** FAIL a build-ready leaf that has no parent: a flat Task/Improvement or a childless Story/Spike may stand alone, so a missing parent on such a leaf is `N/A`. Stranding a parentless build-ready leaf would directly violate the "must not be stranded" guarantee below. (A Sub-task is the one exception — it always requires a parent.)
|
|
46
46
|
- **At claim time** — build intake scans for the `ready` role but dispatches **only leaf work units**. A container that still carries a stale build-ready role (e.g. applied before this rule existed) is **not dispatched**: intake either moves it into the vendor's parent/container progress state or safely blocks it with a clear lifecycle-repair message. Intake never silently implements a container.
|
|
47
47
|
|
|
48
48
|
The permission boundary is the maintainer-applied build-ready role, not authorship — do not add author-based guards (PRD #522 non-goal). This rule narrows *what* may carry that role, not *who* may apply it.
|
|
@@ -147,7 +147,7 @@ When `issue_type = Spike`, body must include:
|
|
|
147
147
|
|
|
148
148
|
#### S7 — Parent sub-issue declared
|
|
149
149
|
|
|
150
|
-
When `issue_type ∉ {Bug, Epic}`, `parent_ref` must be set.
|
|
150
|
+
When `issue_type ∉ {Bug, Epic}`, `parent_ref` must be set — **except for a build-ready leaf work unit**, which may stand alone. A flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle`, which states such leaves "must not be stranded"; for these a missing parent is `N/A`, not a FAIL. This mirrors the leaf carve-out already in S10/S15. A `Sub-task` is exempt from this exception — it always requires a parent. When a parent IS declared, the native sub-issue link is set by `lisa:github-write-issue` Phase 6 step 3. (Validity of a declared parent is checked in feasibility gate F2.)
|
|
151
151
|
|
|
152
152
|
#### S8 — Target Backend Environment
|
|
153
153
|
|
|
@@ -148,7 +148,7 @@ When `issue_type = Spike`, description must include:
|
|
|
148
148
|
|
|
149
149
|
#### S7 — Epic parent declared
|
|
150
150
|
|
|
151
|
-
When `issue_type ∉ {Bug, Epic}`, `parent_key` must be set. (Validity of
|
|
151
|
+
When `issue_type ∉ {Bug, Epic}`, `parent_key` must be set — **except for a build-ready leaf work unit**, which may stand alone. A flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle`, which states such leaves "must not be stranded"; for these a missing parent is `N/A`, not a FAIL. This mirrors the leaf carve-out already in S10/S15. A `Sub-task` is exempt from this exception — it always requires a parent. (Validity of a declared parent key is checked in feasibility gates.)
|
|
152
152
|
|
|
153
153
|
#### S8 — Target Backend Environment
|
|
154
154
|
|
|
@@ -153,6 +153,8 @@ When `issue_type ∈ {Story, Task, Improvement}` AND the item is part of an Epic
|
|
|
153
153
|
|
|
154
154
|
For top-level Bug / Spike not under an Epic, this gate is N/A.
|
|
155
155
|
|
|
156
|
+
A **build-ready leaf work unit** that is not part of an Epic context stands alone: a flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle` ("must not be stranded"), so a missing `parent_project_id` is `N/A`, not a FAIL. A `Sub-task` is exempt from this exception — it always requires `parent_issue_id`. This mirrors the leaf carve-out already in S10/S15.
|
|
157
|
+
|
|
156
158
|
#### S8 — Target Backend Environment
|
|
157
159
|
|
|
158
160
|
When `runtime_behavior_change = true`, description must contain `## Target Backend Environment` with one of `dev`, `staging`, `prod`. Skipped for doc-only / config-only / type-only / Epic.
|
|
@@ -47,7 +47,7 @@ Where a vendor lacks native hierarchy for a given pair, a text link or metadata
|
|
|
47
47
|
**Build-ready means a directly implementable leaf work unit.** Therefore:
|
|
48
48
|
|
|
49
49
|
- **At decomposition / write time** — when a PRD decomposes into a hierarchy, only the leaf work units receive the `ready` role (status/label). Parent containers (Epic, Story, Project, and any parent issue that has child work) are created in their normal non-ready state and never receive the build-ready role directly. The leaves are what downstream build intake will claim.
|
|
50
|
-
- **At validate time** — the `*-validate-*` gate FAILs any container carrying the build-ready role. This is the symmetric write-side guard: a stale or hand-applied build-ready role on a parent is a lifecycle error.
|
|
50
|
+
- **At validate time** — the `*-validate-*` gate FAILs any container carrying the build-ready role. This is the symmetric write-side guard: a stale or hand-applied build-ready role on a parent is a lifecycle error. Conversely, the parent-declared gate (S7) does **not** FAIL a build-ready leaf that has no parent: a flat Task/Improvement or a childless Story/Spike may stand alone, so a missing parent on such a leaf is `N/A`. Stranding a parentless build-ready leaf would directly violate the "must not be stranded" guarantee below. (A Sub-task is the one exception — it always requires a parent.)
|
|
51
51
|
- **At claim time** — build intake scans for the `ready` role but dispatches **only leaf work units**. A container that still carries a stale build-ready role (e.g. applied before this rule existed) is **not dispatched**: intake either moves it into the vendor's parent/container progress state or safely blocks it with a clear lifecycle-repair message. Intake never silently implements a container.
|
|
52
52
|
|
|
53
53
|
The permission boundary is the maintainer-applied build-ready role, not authorship — do not add author-based guards (PRD #522 non-goal). This rule narrows *what* may carry that role, not *who* may apply it.
|
|
@@ -12,7 +12,7 @@ A leaf is structurally defined: **no open children** AND not an Epic — the by-
|
|
|
12
12
|
## Invariant
|
|
13
13
|
|
|
14
14
|
- **At decomposition/write time** — only leaves receive the `ready` role. Parent containers are created in their non-ready state.
|
|
15
|
-
- **At validate time** — `*-validate-*` FAILs any container carrying the build-ready role.
|
|
15
|
+
- **At validate time** — `*-validate-*` FAILs any container carrying the build-ready role. The parent-declared gate (S7) does **not** FAIL a build-ready leaf with no parent (flat Task/Improvement or childless Story/Spike); a Sub-task is the one exception and always needs a parent.
|
|
16
16
|
- **At claim time** — build-intake claims leaves only. A container with a stale build-ready role is rolled up or safe-blocked, NEVER implemented.
|
|
17
17
|
|
|
18
18
|
## Childless-parent exception
|
|
@@ -147,7 +147,7 @@ When `issue_type = Spike`, body must include:
|
|
|
147
147
|
|
|
148
148
|
#### S7 — Parent sub-issue declared
|
|
149
149
|
|
|
150
|
-
When `issue_type ∉ {Bug, Epic}`, `parent_ref` must be set.
|
|
150
|
+
When `issue_type ∉ {Bug, Epic}`, `parent_ref` must be set — **except for a build-ready leaf work unit**, which may stand alone. A flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle`, which states such leaves "must not be stranded"; for these a missing parent is `N/A`, not a FAIL. This mirrors the leaf carve-out already in S10/S15. A `Sub-task` is exempt from this exception — it always requires a parent. When a parent IS declared, the native sub-issue link is set by `lisa:github-write-issue` Phase 6 step 3. (Validity of a declared parent is checked in feasibility gate F2.)
|
|
151
151
|
|
|
152
152
|
#### S8 — Target Backend Environment
|
|
153
153
|
|
|
@@ -148,7 +148,7 @@ When `issue_type = Spike`, description must include:
|
|
|
148
148
|
|
|
149
149
|
#### S7 — Epic parent declared
|
|
150
150
|
|
|
151
|
-
When `issue_type ∉ {Bug, Epic}`, `parent_key` must be set. (Validity of
|
|
151
|
+
When `issue_type ∉ {Bug, Epic}`, `parent_key` must be set — **except for a build-ready leaf work unit**, which may stand alone. A flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle`, which states such leaves "must not be stranded"; for these a missing parent is `N/A`, not a FAIL. This mirrors the leaf carve-out already in S10/S15. A `Sub-task` is exempt from this exception — it always requires a parent. (Validity of a declared parent key is checked in feasibility gates.)
|
|
152
152
|
|
|
153
153
|
#### S8 — Target Backend Environment
|
|
154
154
|
|
|
@@ -153,6 +153,8 @@ When `issue_type ∈ {Story, Task, Improvement}` AND the item is part of an Epic
|
|
|
153
153
|
|
|
154
154
|
For top-level Bug / Spike not under an Epic, this gate is N/A.
|
|
155
155
|
|
|
156
|
+
A **build-ready leaf work unit** that is not part of an Epic context stands alone: a flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle` ("must not be stranded"), so a missing `parent_project_id` is `N/A`, not a FAIL. A `Sub-task` is exempt from this exception — it always requires `parent_issue_id`. This mirrors the leaf carve-out already in S10/S15.
|
|
157
|
+
|
|
156
158
|
#### S8 — Target Backend Environment
|
|
157
159
|
|
|
158
160
|
When `runtime_behavior_change = true`, description must contain `## Target Backend Environment` with one of `dev`, `staging`, `prod`. Skipped for doc-only / config-only / type-only / Epic.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.147.
|
|
3
|
+
"version": "2.147.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.147.
|
|
3
|
+
"version": "2.147.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.147.
|
|
3
|
+
"version": "2.147.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.147.
|
|
3
|
+
"version": "2.147.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.147.
|
|
3
|
+
"version": "2.147.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -7,7 +7,7 @@ A leaf is structurally defined: **no open children** AND not an Epic — the by-
|
|
|
7
7
|
## Invariant
|
|
8
8
|
|
|
9
9
|
- **At decomposition/write time** — only leaves receive the `ready` role. Parent containers are created in their non-ready state.
|
|
10
|
-
- **At validate time** — `*-validate-*` FAILs any container carrying the build-ready role.
|
|
10
|
+
- **At validate time** — `*-validate-*` FAILs any container carrying the build-ready role. The parent-declared gate (S7) does **not** FAIL a build-ready leaf with no parent (flat Task/Improvement or childless Story/Spike); a Sub-task is the one exception and always needs a parent.
|
|
11
11
|
- **At claim time** — build-intake claims leaves only. A container with a stale build-ready role is rolled up or safe-blocked, NEVER implemented.
|
|
12
12
|
|
|
13
13
|
## Childless-parent exception
|
|
@@ -42,7 +42,7 @@ Where a vendor lacks native hierarchy for a given pair, a text link or metadata
|
|
|
42
42
|
**Build-ready means a directly implementable leaf work unit.** Therefore:
|
|
43
43
|
|
|
44
44
|
- **At decomposition / write time** — when a PRD decomposes into a hierarchy, only the leaf work units receive the `ready` role (status/label). Parent containers (Epic, Story, Project, and any parent issue that has child work) are created in their normal non-ready state and never receive the build-ready role directly. The leaves are what downstream build intake will claim.
|
|
45
|
-
- **At validate time** — the `*-validate-*` gate FAILs any container carrying the build-ready role. This is the symmetric write-side guard: a stale or hand-applied build-ready role on a parent is a lifecycle error.
|
|
45
|
+
- **At validate time** — the `*-validate-*` gate FAILs any container carrying the build-ready role. This is the symmetric write-side guard: a stale or hand-applied build-ready role on a parent is a lifecycle error. Conversely, the parent-declared gate (S7) does **not** FAIL a build-ready leaf that has no parent: a flat Task/Improvement or a childless Story/Spike may stand alone, so a missing parent on such a leaf is `N/A`. Stranding a parentless build-ready leaf would directly violate the "must not be stranded" guarantee below. (A Sub-task is the one exception — it always requires a parent.)
|
|
46
46
|
- **At claim time** — build intake scans for the `ready` role but dispatches **only leaf work units**. A container that still carries a stale build-ready role (e.g. applied before this rule existed) is **not dispatched**: intake either moves it into the vendor's parent/container progress state or safely blocks it with a clear lifecycle-repair message. Intake never silently implements a container.
|
|
47
47
|
|
|
48
48
|
The permission boundary is the maintainer-applied build-ready role, not authorship — do not add author-based guards (PRD #522 non-goal). This rule narrows *what* may carry that role, not *who* may apply it.
|
|
@@ -147,7 +147,7 @@ When `issue_type = Spike`, body must include:
|
|
|
147
147
|
|
|
148
148
|
#### S7 — Parent sub-issue declared
|
|
149
149
|
|
|
150
|
-
When `issue_type ∉ {Bug, Epic}`, `parent_ref` must be set.
|
|
150
|
+
When `issue_type ∉ {Bug, Epic}`, `parent_ref` must be set — **except for a build-ready leaf work unit**, which may stand alone. A flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle`, which states such leaves "must not be stranded"; for these a missing parent is `N/A`, not a FAIL. This mirrors the leaf carve-out already in S10/S15. A `Sub-task` is exempt from this exception — it always requires a parent. When a parent IS declared, the native sub-issue link is set by `lisa:github-write-issue` Phase 6 step 3. (Validity of a declared parent is checked in feasibility gate F2.)
|
|
151
151
|
|
|
152
152
|
#### S8 — Target Backend Environment
|
|
153
153
|
|
|
@@ -148,7 +148,7 @@ When `issue_type = Spike`, description must include:
|
|
|
148
148
|
|
|
149
149
|
#### S7 — Epic parent declared
|
|
150
150
|
|
|
151
|
-
When `issue_type ∉ {Bug, Epic}`, `parent_key` must be set. (Validity of
|
|
151
|
+
When `issue_type ∉ {Bug, Epic}`, `parent_key` must be set — **except for a build-ready leaf work unit**, which may stand alone. A flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle`, which states such leaves "must not be stranded"; for these a missing parent is `N/A`, not a FAIL. This mirrors the leaf carve-out already in S10/S15. A `Sub-task` is exempt from this exception — it always requires a parent. (Validity of a declared parent key is checked in feasibility gates.)
|
|
152
152
|
|
|
153
153
|
#### S8 — Target Backend Environment
|
|
154
154
|
|
|
@@ -153,6 +153,8 @@ When `issue_type ∈ {Story, Task, Improvement}` AND the item is part of an Epic
|
|
|
153
153
|
|
|
154
154
|
For top-level Bug / Spike not under an Epic, this gate is N/A.
|
|
155
155
|
|
|
156
|
+
A **build-ready leaf work unit** that is not part of an Epic context stands alone: a flat `Task` / `Improvement`, or a childless `Story` / `Spike` (no open child work) with `build_ready = true`, is an independently claimable leaf per `leaf-only-lifecycle` ("must not be stranded"), so a missing `parent_project_id` is `N/A`, not a FAIL. A `Sub-task` is exempt from this exception — it always requires `parent_issue_id`. This mirrors the leaf carve-out already in S10/S15.
|
|
157
|
+
|
|
156
158
|
#### S8 — Target Backend Environment
|
|
157
159
|
|
|
158
160
|
When `runtime_behavior_change = true`, description must contain `## Target Backend Environment` with one of `dev`, `staging`, `prod`. Skipped for doc-only / config-only / type-only / Epic.
|