@codyswann/lisa 2.147.7 → 2.149.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/dist/codex/command-skill-transformer.d.ts +4 -2
- package/dist/codex/command-skill-transformer.d.ts.map +1 -1
- package/dist/codex/command-skill-transformer.js +10 -7
- package/dist/codex/command-skill-transformer.js.map +1 -1
- package/dist/codex/skills-installer.d.ts +1 -2
- package/dist/codex/skills-installer.d.ts.map +1 -1
- package/dist/codex/skills-installer.js +9 -176
- package/dist/codex/skills-installer.js.map +1 -1
- package/dist/core/config.d.ts +4 -3
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +1 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/lisa-skill-sources.d.ts +63 -0
- package/dist/core/lisa-skill-sources.d.ts.map +1 -0
- package/dist/core/lisa-skill-sources.js +197 -0
- package/dist/core/lisa-skill-sources.js.map +1 -0
- package/dist/core/lisa.d.ts +12 -0
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +33 -0
- package/dist/core/lisa.js.map +1 -1
- package/dist/migrations/ensure-jest-rn-mock-accessibility-manager.d.ts +38 -0
- package/dist/migrations/ensure-jest-rn-mock-accessibility-manager.d.ts.map +1 -0
- package/dist/migrations/ensure-jest-rn-mock-accessibility-manager.js +110 -0
- package/dist/migrations/ensure-jest-rn-mock-accessibility-manager.js.map +1 -0
- package/dist/migrations/index.d.ts +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +3 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/opencode/manifest.d.ts +26 -0
- package/dist/opencode/manifest.d.ts.map +1 -0
- package/dist/opencode/manifest.js +94 -0
- package/dist/opencode/manifest.js.map +1 -0
- package/dist/opencode/skills-installer.d.ts +32 -0
- package/dist/opencode/skills-installer.d.ts.map +1 -0
- package/dist/opencode/skills-installer.js +159 -0
- package/dist/opencode/skills-installer.js.map +1 -0
- package/expo/copy-overwrite/knip.json +1 -0
- package/expo/package-lisa/package.lisa.json +0 -2
- 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/reference/leaf-only-lifecycle.md +9 -4
- package/plugins/lisa/skills/github-build-intake/SKILL.md +10 -0
- package/plugins/lisa/skills/jira-build-intake/SKILL.md +10 -0
- package/plugins/lisa/skills/linear-build-intake/SKILL.md +10 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/github-build-intake/SKILL.md +10 -0
- package/plugins/lisa-agy/skills/jira-build-intake/SKILL.md +10 -0
- package/plugins/lisa-agy/skills/linear-build-intake/SKILL.md +10 -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/reference/leaf-only-lifecycle.md +9 -4
- package/plugins/lisa-copilot/skills/github-build-intake/SKILL.md +10 -0
- package/plugins/lisa-copilot/skills/jira-build-intake/SKILL.md +10 -0
- package/plugins/lisa-copilot/skills/linear-build-intake/SKILL.md +10 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/rules/leaf-only-lifecycle-reference.mdc +9 -4
- package/plugins/lisa-cursor/skills/github-build-intake/SKILL.md +10 -0
- package/plugins/lisa-cursor/skills/jira-build-intake/SKILL.md +10 -0
- package/plugins/lisa-cursor/skills/linear-build-intake/SKILL.md +10 -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/reference/leaf-only-lifecycle.md +9 -4
- package/plugins/src/base/skills/github-build-intake/SKILL.md +10 -0
- package/plugins/src/base/skills/jira-build-intake/SKILL.md +10 -0
- package/plugins/src/base/skills/linear-build-intake/SKILL.md +10 -0
- package/scripts/internal-opencode-skill-policy.json +3 -0
|
@@ -58,7 +58,7 @@ So the exception is narrow only at the top: childlessness promotes every type **
|
|
|
58
58
|
|
|
59
59
|
## Parent status rollup (the state machine)
|
|
60
60
|
|
|
61
|
-
A parent/container never sets its own lifecycle state; it **derives** it from the roll-up of its children's states. Rollup is evaluated whenever a child transitions (or when intake observes the child set
|
|
61
|
+
A parent/container never sets its own lifecycle state; it **derives** it from the roll-up of its children's states. Rollup is evaluated whenever a child transitions — the **forward** arm runs in each `*-build-intake` done step the moment a leaf reaches `done`, walking the leaf's ancestor chain (see Citation → Rollup) — or when intake observes the child set, with `repair-intake` as the **recovery** net for parents left un-rolled. Using the canonical build-lifecycle roles from `config-resolution` (`ready`, `claimed`, `review`, `blocked`, `done`):
|
|
62
62
|
|
|
63
63
|
Evaluate over the **env ladder** `in-progress < dev < staging < production` — the ordered keys of the project's env-keyed `done` map, with `claimed`/`review` as the rung below the first env (a single-environment project has only the `production` rung). Take the **first** match:
|
|
64
64
|
|
|
@@ -114,9 +114,14 @@ Skills that enforce this invariant or perform rollup cite this rule by slug (the
|
|
|
114
114
|
- **Decomposition / write** (`*-to-tracker`, `*-write-*`) — apply the `ready` role to leaves only; never to containers.
|
|
115
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
|
-
- **Rollup** — derive parent state from children per the state machine above.
|
|
118
|
-
|
|
119
|
-
|
|
117
|
+
- **Rollup** — derive parent state from children per the state machine above. The **forward**
|
|
118
|
+
rollup fires the moment a leaf transitions to `done`: each `*-build-intake` done step (`3d.1`)
|
|
119
|
+
walks the leaf's ancestor chain and invokes `*-sync --rollup`, so a parent advances/closes as
|
|
120
|
+
soon as its last required child ships rather than waiting on a cron. `*-sync --rollup` is the
|
|
121
|
+
single rollup implementation; `repair-intake` calls the same path as the **recovery** net,
|
|
122
|
+
closing out parent/container rollups that were left open after every required child became
|
|
123
|
+
terminal — e.g. children closed outside the Lisa flow (external automation), or completed while
|
|
124
|
+
no forward `*-build-intake` cycle ran.
|
|
120
125
|
- **Terminal native closure** (`*-build-intake`, `repair-intake`, terminal helpers) — after a leaf
|
|
121
126
|
or all-terminal rollup parent reaches the true terminal `done` role, finalize it through the
|
|
122
127
|
provider's native close / complete / resolve mechanism where available; never do this for
|
|
@@ -300,6 +300,16 @@ This close is idempotent: if the issue is already closed, record that native clo
|
|
|
300
300
|
|
|
301
301
|
For any non-Success outcome, do NOT transition. The issue sits in `$CLAIMED` (or wherever `lisa:github-agent` left it) — humans take it from there.
|
|
302
302
|
|
|
303
|
+
#### 3d.1 Roll up the parent chain (forward rollup)
|
|
304
|
+
|
|
305
|
+
Run this **only after a successful `$DONE` transition in 3d** (the leaf actually reached an env — intermediate or terminal). This is the **forward** arm of the `leaf-only-lifecycle` rule's *"rollup is evaluated whenever a child transitions"* requirement: a leaf reaching `$DONE` is exactly such a transition, so its parent's derived state may now have changed — the last open child of a Story just shipped, so the Story rolls up to `$DONE` and closes, which may in turn complete its Epic. Without this step a fully-built parent stays open until the recovery `lisa:repair-intake` cron happens to run.
|
|
306
|
+
|
|
307
|
+
1. Resolve the leaf's parent using the same hierarchy `lisa:github-read-issue` uses — native sub-issue parent first (GraphQL `parent`), then body parentage (`Parent: #<n>` / `Parent Epic: #<n>`). If the leaf has no parent, skip — nothing to roll up.
|
|
308
|
+
2. Walk **up the ancestor chain bottom-up**: for the immediate parent, then its parent, and so on, invoke `lisa:github-sync <org>/<repo>#<ancestor> --rollup`. That skill derives the ancestor's `status:*` from its children per `leaf-only-lifecycle`, applies it only when it differs (never `status:ready`), and performs terminal native closure (`gh issue close --reason completed`) when the derived env is the production/terminal `$DONE`. It is idempotent and safe-defaults (suggests, does not guess) when the rolled state is ambiguous.
|
|
309
|
+
3. Stop walking up when an ancestor has no parent, or when `--rollup` reports no change (a higher ancestor cannot advance past an unchanged child). Record each rolled-up ancestor and its derived state in the summary.
|
|
310
|
+
|
|
311
|
+
This does not re-implement the state machine — it delegates to `lisa:github-sync --rollup`, the single rollup implementation `lisa:repair-intake` also uses, so the forward and recovery paths can never drift. Children closed **outside** this flow (e.g. by external automation) are not observed here; `lisa:repair-intake` remains the recovery net for those.
|
|
312
|
+
|
|
303
313
|
#### 3e. Stop
|
|
304
314
|
|
|
305
315
|
Stop immediately after the first claimed, skipped, blocked, held, or errored issue. Later scheduler invocations process the remaining ready issues.
|
|
@@ -218,6 +218,16 @@ If `lisa:jira-agent` returned Success:
|
|
|
218
218
|
|
|
219
219
|
For any non-Success outcome, do NOT transition. The ticket sits in `$CLAIMED` (or wherever `lisa:jira-agent` left it for the Blocked case) — the cycle's job is done; humans take it from there.
|
|
220
220
|
|
|
221
|
+
#### 3d.1 Roll up the parent chain (forward rollup)
|
|
222
|
+
|
|
223
|
+
Run this **only after a successful `$DONE` transition in 3d**. This is the **forward** arm of the `leaf-only-lifecycle` rule's *"rollup is evaluated whenever a child transitions"* requirement: a leaf reaching `$DONE` may complete its parent Story, which may in turn complete its Epic. Without this step a fully-built parent stays open until the recovery `lisa:repair-intake` cron happens to run.
|
|
224
|
+
|
|
225
|
+
1. Resolve the ticket's parent using the same hierarchy `lisa:jira-read-ticket` uses — the native Epic → Story → Sub-task parentage (parent field / Epic link). If the ticket has no parent, skip — nothing to roll up.
|
|
226
|
+
2. Walk **up the ancestor chain bottom-up** (Sub-task → Story → Epic): for each ancestor invoke `lisa:jira-sync <ANCESTOR-KEY> --rollup`. That skill derives the ancestor's status from its children per `leaf-only-lifecycle`, applies it via `lisa:atlassian-access` `operation: transition` only when it differs (never the build-ready status), and performs terminal native resolution (`statusCategory = Done` with a resolution when the workflow requires one) when the derived env is the terminal `$DONE`. It is idempotent and safe-defaults (suggests, does not guess) when the rolled state is ambiguous.
|
|
227
|
+
3. Stop walking up when an ancestor has no parent, or when `--rollup` reports no change. Record each rolled-up ancestor and its derived state in the summary.
|
|
228
|
+
|
|
229
|
+
This does not re-implement the state machine — it delegates to `lisa:jira-sync --rollup`, the single rollup implementation `lisa:repair-intake` also uses, so the forward and recovery paths can never drift. Children closed **outside** this flow are not observed here; `lisa:repair-intake` remains the recovery net for those.
|
|
230
|
+
|
|
221
231
|
#### 3e. Stop
|
|
222
232
|
|
|
223
233
|
Stop immediately after the first claimed, skipped, blocked, held, or errored ticket. Later scheduler invocations process the remaining ready tickets.
|
|
@@ -228,6 +228,16 @@ If `lisa:linear-agent` returned Success:
|
|
|
228
228
|
|
|
229
229
|
For any non-Success outcome, do NOT transition. The Issue sits where the agent left it — humans take it from there.
|
|
230
230
|
|
|
231
|
+
#### 3d.1 Roll up the parent chain (forward rollup)
|
|
232
|
+
|
|
233
|
+
Run this **only after a successful `$DONE` transition in 3d**. This is the **forward** arm of the `leaf-only-lifecycle` rule's *"rollup is evaluated whenever a child transitions"* requirement: a leaf reaching `$DONE` may complete its parent Issue, which may in turn complete its Project. Without this step a fully-built parent stays open until the recovery `lisa:repair-intake` cron happens to run.
|
|
234
|
+
|
|
235
|
+
1. Resolve the Issue's parent using the same hierarchy `lisa:linear-read-issue` uses — native parentage: a sub-issue's `parentId`, and Project membership via `projectId` for the Epic-equivalent. If the Issue has no parent, skip — nothing to roll up.
|
|
236
|
+
2. Walk **up the ancestor chain bottom-up** (sub-issue → parent Issue → Project): for each ancestor invoke `lisa:linear-sync <ANCESTOR-ID> --rollup`. That skill derives the ancestor's `status:*` from its children per `leaf-only-lifecycle`, applies it via `mcp__linear-server__save_issue` only when it differs (never `status:ready`), and moves the native Linear `state` to the configured Done / Completed state when the derived env is the terminal `$DONE`. It is idempotent and safe-defaults (suggests, does not guess) when the rolled state is ambiguous.
|
|
237
|
+
3. Stop walking up when an ancestor has no parent, or when `--rollup` reports no change. Record each rolled-up ancestor and its derived state in the summary.
|
|
238
|
+
|
|
239
|
+
This does not re-implement the state machine — it delegates to `lisa:linear-sync --rollup`, the single rollup implementation `lisa:repair-intake` also uses, so the forward and recovery paths can never drift. Children closed **outside** this flow are not observed here; `lisa:repair-intake` remains the recovery net for those.
|
|
240
|
+
|
|
231
241
|
#### 3e. Stop
|
|
232
242
|
|
|
233
243
|
Stop immediately after the first claimed, skipped, blocked, held, or errored Issue. Later scheduler invocations process the remaining ready Issues.
|
|
@@ -63,7 +63,7 @@ So the exception is narrow only at the top: childlessness promotes every type **
|
|
|
63
63
|
|
|
64
64
|
## Parent status rollup (the state machine)
|
|
65
65
|
|
|
66
|
-
A parent/container never sets its own lifecycle state; it **derives** it from the roll-up of its children's states. Rollup is evaluated whenever a child transitions (or when intake observes the child set
|
|
66
|
+
A parent/container never sets its own lifecycle state; it **derives** it from the roll-up of its children's states. Rollup is evaluated whenever a child transitions — the **forward** arm runs in each `*-build-intake` done step the moment a leaf reaches `done`, walking the leaf's ancestor chain (see Citation → Rollup) — or when intake observes the child set, with `repair-intake` as the **recovery** net for parents left un-rolled. Using the canonical build-lifecycle roles from `config-resolution` (`ready`, `claimed`, `review`, `blocked`, `done`):
|
|
67
67
|
|
|
68
68
|
Evaluate over the **env ladder** `in-progress < dev < staging < production` — the ordered keys of the project's env-keyed `done` map, with `claimed`/`review` as the rung below the first env (a single-environment project has only the `production` rung). Take the **first** match:
|
|
69
69
|
|
|
@@ -119,9 +119,14 @@ Skills that enforce this invariant or perform rollup cite this rule by slug (the
|
|
|
119
119
|
- **Decomposition / write** (`*-to-tracker`, `*-write-*`) — apply the `ready` role to leaves only; never to containers.
|
|
120
120
|
- **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).
|
|
121
121
|
- **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.
|
|
122
|
-
- **Rollup** — derive parent state from children per the state machine above.
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
- **Rollup** — derive parent state from children per the state machine above. The **forward**
|
|
123
|
+
rollup fires the moment a leaf transitions to `done`: each `*-build-intake` done step (`3d.1`)
|
|
124
|
+
walks the leaf's ancestor chain and invokes `*-sync --rollup`, so a parent advances/closes as
|
|
125
|
+
soon as its last required child ships rather than waiting on a cron. `*-sync --rollup` is the
|
|
126
|
+
single rollup implementation; `repair-intake` calls the same path as the **recovery** net,
|
|
127
|
+
closing out parent/container rollups that were left open after every required child became
|
|
128
|
+
terminal — e.g. children closed outside the Lisa flow (external automation), or completed while
|
|
129
|
+
no forward `*-build-intake` cycle ran.
|
|
125
130
|
- **Terminal native closure** (`*-build-intake`, `repair-intake`, terminal helpers) — after a leaf
|
|
126
131
|
or all-terminal rollup parent reaches the true terminal `done` role, finalize it through the
|
|
127
132
|
provider's native close / complete / resolve mechanism where available; never do this for
|
|
@@ -300,6 +300,16 @@ This close is idempotent: if the issue is already closed, record that native clo
|
|
|
300
300
|
|
|
301
301
|
For any non-Success outcome, do NOT transition. The issue sits in `$CLAIMED` (or wherever `lisa:github-agent` left it) — humans take it from there.
|
|
302
302
|
|
|
303
|
+
#### 3d.1 Roll up the parent chain (forward rollup)
|
|
304
|
+
|
|
305
|
+
Run this **only after a successful `$DONE` transition in 3d** (the leaf actually reached an env — intermediate or terminal). This is the **forward** arm of the `leaf-only-lifecycle` rule's *"rollup is evaluated whenever a child transitions"* requirement: a leaf reaching `$DONE` is exactly such a transition, so its parent's derived state may now have changed — the last open child of a Story just shipped, so the Story rolls up to `$DONE` and closes, which may in turn complete its Epic. Without this step a fully-built parent stays open until the recovery `lisa:repair-intake` cron happens to run.
|
|
306
|
+
|
|
307
|
+
1. Resolve the leaf's parent using the same hierarchy `lisa:github-read-issue` uses — native sub-issue parent first (GraphQL `parent`), then body parentage (`Parent: #<n>` / `Parent Epic: #<n>`). If the leaf has no parent, skip — nothing to roll up.
|
|
308
|
+
2. Walk **up the ancestor chain bottom-up**: for the immediate parent, then its parent, and so on, invoke `lisa:github-sync <org>/<repo>#<ancestor> --rollup`. That skill derives the ancestor's `status:*` from its children per `leaf-only-lifecycle`, applies it only when it differs (never `status:ready`), and performs terminal native closure (`gh issue close --reason completed`) when the derived env is the production/terminal `$DONE`. It is idempotent and safe-defaults (suggests, does not guess) when the rolled state is ambiguous.
|
|
309
|
+
3. Stop walking up when an ancestor has no parent, or when `--rollup` reports no change (a higher ancestor cannot advance past an unchanged child). Record each rolled-up ancestor and its derived state in the summary.
|
|
310
|
+
|
|
311
|
+
This does not re-implement the state machine — it delegates to `lisa:github-sync --rollup`, the single rollup implementation `lisa:repair-intake` also uses, so the forward and recovery paths can never drift. Children closed **outside** this flow (e.g. by external automation) are not observed here; `lisa:repair-intake` remains the recovery net for those.
|
|
312
|
+
|
|
303
313
|
#### 3e. Stop
|
|
304
314
|
|
|
305
315
|
Stop immediately after the first claimed, skipped, blocked, held, or errored issue. Later scheduler invocations process the remaining ready issues.
|
|
@@ -218,6 +218,16 @@ If `lisa:jira-agent` returned Success:
|
|
|
218
218
|
|
|
219
219
|
For any non-Success outcome, do NOT transition. The ticket sits in `$CLAIMED` (or wherever `lisa:jira-agent` left it for the Blocked case) — the cycle's job is done; humans take it from there.
|
|
220
220
|
|
|
221
|
+
#### 3d.1 Roll up the parent chain (forward rollup)
|
|
222
|
+
|
|
223
|
+
Run this **only after a successful `$DONE` transition in 3d**. This is the **forward** arm of the `leaf-only-lifecycle` rule's *"rollup is evaluated whenever a child transitions"* requirement: a leaf reaching `$DONE` may complete its parent Story, which may in turn complete its Epic. Without this step a fully-built parent stays open until the recovery `lisa:repair-intake` cron happens to run.
|
|
224
|
+
|
|
225
|
+
1. Resolve the ticket's parent using the same hierarchy `lisa:jira-read-ticket` uses — the native Epic → Story → Sub-task parentage (parent field / Epic link). If the ticket has no parent, skip — nothing to roll up.
|
|
226
|
+
2. Walk **up the ancestor chain bottom-up** (Sub-task → Story → Epic): for each ancestor invoke `lisa:jira-sync <ANCESTOR-KEY> --rollup`. That skill derives the ancestor's status from its children per `leaf-only-lifecycle`, applies it via `lisa:atlassian-access` `operation: transition` only when it differs (never the build-ready status), and performs terminal native resolution (`statusCategory = Done` with a resolution when the workflow requires one) when the derived env is the terminal `$DONE`. It is idempotent and safe-defaults (suggests, does not guess) when the rolled state is ambiguous.
|
|
227
|
+
3. Stop walking up when an ancestor has no parent, or when `--rollup` reports no change. Record each rolled-up ancestor and its derived state in the summary.
|
|
228
|
+
|
|
229
|
+
This does not re-implement the state machine — it delegates to `lisa:jira-sync --rollup`, the single rollup implementation `lisa:repair-intake` also uses, so the forward and recovery paths can never drift. Children closed **outside** this flow are not observed here; `lisa:repair-intake` remains the recovery net for those.
|
|
230
|
+
|
|
221
231
|
#### 3e. Stop
|
|
222
232
|
|
|
223
233
|
Stop immediately after the first claimed, skipped, blocked, held, or errored ticket. Later scheduler invocations process the remaining ready tickets.
|
|
@@ -228,6 +228,16 @@ If `lisa:linear-agent` returned Success:
|
|
|
228
228
|
|
|
229
229
|
For any non-Success outcome, do NOT transition. The Issue sits where the agent left it — humans take it from there.
|
|
230
230
|
|
|
231
|
+
#### 3d.1 Roll up the parent chain (forward rollup)
|
|
232
|
+
|
|
233
|
+
Run this **only after a successful `$DONE` transition in 3d**. This is the **forward** arm of the `leaf-only-lifecycle` rule's *"rollup is evaluated whenever a child transitions"* requirement: a leaf reaching `$DONE` may complete its parent Issue, which may in turn complete its Project. Without this step a fully-built parent stays open until the recovery `lisa:repair-intake` cron happens to run.
|
|
234
|
+
|
|
235
|
+
1. Resolve the Issue's parent using the same hierarchy `lisa:linear-read-issue` uses — native parentage: a sub-issue's `parentId`, and Project membership via `projectId` for the Epic-equivalent. If the Issue has no parent, skip — nothing to roll up.
|
|
236
|
+
2. Walk **up the ancestor chain bottom-up** (sub-issue → parent Issue → Project): for each ancestor invoke `lisa:linear-sync <ANCESTOR-ID> --rollup`. That skill derives the ancestor's `status:*` from its children per `leaf-only-lifecycle`, applies it via `mcp__linear-server__save_issue` only when it differs (never `status:ready`), and moves the native Linear `state` to the configured Done / Completed state when the derived env is the terminal `$DONE`. It is idempotent and safe-defaults (suggests, does not guess) when the rolled state is ambiguous.
|
|
237
|
+
3. Stop walking up when an ancestor has no parent, or when `--rollup` reports no change. Record each rolled-up ancestor and its derived state in the summary.
|
|
238
|
+
|
|
239
|
+
This does not re-implement the state machine — it delegates to `lisa:linear-sync --rollup`, the single rollup implementation `lisa:repair-intake` also uses, so the forward and recovery paths can never drift. Children closed **outside** this flow are not observed here; `lisa:repair-intake` remains the recovery net for those.
|
|
240
|
+
|
|
231
241
|
#### 3e. Stop
|
|
232
242
|
|
|
233
243
|
Stop immediately after the first claimed, skipped, blocked, held, or errored Issue. Later scheduler invocations process the remaining ready Issues.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.149.1",
|
|
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.
|
|
3
|
+
"version": "2.149.1",
|
|
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.
|
|
3
|
+
"version": "2.149.1",
|
|
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.
|
|
3
|
+
"version": "2.149.1",
|
|
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.
|
|
3
|
+
"version": "2.149.1",
|
|
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"
|
|
@@ -58,7 +58,7 @@ So the exception is narrow only at the top: childlessness promotes every type **
|
|
|
58
58
|
|
|
59
59
|
## Parent status rollup (the state machine)
|
|
60
60
|
|
|
61
|
-
A parent/container never sets its own lifecycle state; it **derives** it from the roll-up of its children's states. Rollup is evaluated whenever a child transitions (or when intake observes the child set
|
|
61
|
+
A parent/container never sets its own lifecycle state; it **derives** it from the roll-up of its children's states. Rollup is evaluated whenever a child transitions — the **forward** arm runs in each `*-build-intake` done step the moment a leaf reaches `done`, walking the leaf's ancestor chain (see Citation → Rollup) — or when intake observes the child set, with `repair-intake` as the **recovery** net for parents left un-rolled. Using the canonical build-lifecycle roles from `config-resolution` (`ready`, `claimed`, `review`, `blocked`, `done`):
|
|
62
62
|
|
|
63
63
|
Evaluate over the **env ladder** `in-progress < dev < staging < production` — the ordered keys of the project's env-keyed `done` map, with `claimed`/`review` as the rung below the first env (a single-environment project has only the `production` rung). Take the **first** match:
|
|
64
64
|
|
|
@@ -114,9 +114,14 @@ Skills that enforce this invariant or perform rollup cite this rule by slug (the
|
|
|
114
114
|
- **Decomposition / write** (`*-to-tracker`, `*-write-*`) — apply the `ready` role to leaves only; never to containers.
|
|
115
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
|
-
- **Rollup** — derive parent state from children per the state machine above.
|
|
118
|
-
|
|
119
|
-
|
|
117
|
+
- **Rollup** — derive parent state from children per the state machine above. The **forward**
|
|
118
|
+
rollup fires the moment a leaf transitions to `done`: each `*-build-intake` done step (`3d.1`)
|
|
119
|
+
walks the leaf's ancestor chain and invokes `*-sync --rollup`, so a parent advances/closes as
|
|
120
|
+
soon as its last required child ships rather than waiting on a cron. `*-sync --rollup` is the
|
|
121
|
+
single rollup implementation; `repair-intake` calls the same path as the **recovery** net,
|
|
122
|
+
closing out parent/container rollups that were left open after every required child became
|
|
123
|
+
terminal — e.g. children closed outside the Lisa flow (external automation), or completed while
|
|
124
|
+
no forward `*-build-intake` cycle ran.
|
|
120
125
|
- **Terminal native closure** (`*-build-intake`, `repair-intake`, terminal helpers) — after a leaf
|
|
121
126
|
or all-terminal rollup parent reaches the true terminal `done` role, finalize it through the
|
|
122
127
|
provider's native close / complete / resolve mechanism where available; never do this for
|
|
@@ -300,6 +300,16 @@ This close is idempotent: if the issue is already closed, record that native clo
|
|
|
300
300
|
|
|
301
301
|
For any non-Success outcome, do NOT transition. The issue sits in `$CLAIMED` (or wherever `lisa:github-agent` left it) — humans take it from there.
|
|
302
302
|
|
|
303
|
+
#### 3d.1 Roll up the parent chain (forward rollup)
|
|
304
|
+
|
|
305
|
+
Run this **only after a successful `$DONE` transition in 3d** (the leaf actually reached an env — intermediate or terminal). This is the **forward** arm of the `leaf-only-lifecycle` rule's *"rollup is evaluated whenever a child transitions"* requirement: a leaf reaching `$DONE` is exactly such a transition, so its parent's derived state may now have changed — the last open child of a Story just shipped, so the Story rolls up to `$DONE` and closes, which may in turn complete its Epic. Without this step a fully-built parent stays open until the recovery `lisa:repair-intake` cron happens to run.
|
|
306
|
+
|
|
307
|
+
1. Resolve the leaf's parent using the same hierarchy `lisa:github-read-issue` uses — native sub-issue parent first (GraphQL `parent`), then body parentage (`Parent: #<n>` / `Parent Epic: #<n>`). If the leaf has no parent, skip — nothing to roll up.
|
|
308
|
+
2. Walk **up the ancestor chain bottom-up**: for the immediate parent, then its parent, and so on, invoke `lisa:github-sync <org>/<repo>#<ancestor> --rollup`. That skill derives the ancestor's `status:*` from its children per `leaf-only-lifecycle`, applies it only when it differs (never `status:ready`), and performs terminal native closure (`gh issue close --reason completed`) when the derived env is the production/terminal `$DONE`. It is idempotent and safe-defaults (suggests, does not guess) when the rolled state is ambiguous.
|
|
309
|
+
3. Stop walking up when an ancestor has no parent, or when `--rollup` reports no change (a higher ancestor cannot advance past an unchanged child). Record each rolled-up ancestor and its derived state in the summary.
|
|
310
|
+
|
|
311
|
+
This does not re-implement the state machine — it delegates to `lisa:github-sync --rollup`, the single rollup implementation `lisa:repair-intake` also uses, so the forward and recovery paths can never drift. Children closed **outside** this flow (e.g. by external automation) are not observed here; `lisa:repair-intake` remains the recovery net for those.
|
|
312
|
+
|
|
303
313
|
#### 3e. Stop
|
|
304
314
|
|
|
305
315
|
Stop immediately after the first claimed, skipped, blocked, held, or errored issue. Later scheduler invocations process the remaining ready issues.
|