@codyswann/lisa 2.104.5 → 2.104.7
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/config-resolution.md +7 -19
- package/plugins/lisa/rules/prd-lifecycle-rollup.md +16 -15
- package/plugins/lisa/scripts/queue-contract-resolution.mjs +24 -29
- package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +14 -35
- package/plugins/lisa/skills/github-prd-intake/SKILL.md +13 -30
- package/plugins/lisa/skills/linear-prd-intake/SKILL.md +14 -32
- package/plugins/lisa/skills/notion-prd-intake/SKILL.md +12 -31
- package/plugins/lisa/skills/setup-confluence/SKILL.md +1 -1
- package/plugins/lisa/skills/verify-prd/SKILL.md +7 -7
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-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-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-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-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-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-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/src/base/rules/config-resolution.md +7 -19
- package/plugins/src/base/rules/prd-lifecycle-rollup.md +16 -15
- package/plugins/src/base/scripts/queue-contract-resolution.mjs +24 -29
- package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +14 -35
- package/plugins/src/base/skills/github-prd-intake/SKILL.md +13 -30
- package/plugins/src/base/skills/linear-prd-intake/SKILL.md +14 -32
- package/plugins/src/base/skills/notion-prd-intake/SKILL.md +12 -31
- package/plugins/src/base/skills/setup-confluence/SKILL.md +1 -1
- package/plugins/src/base/skills/verify-prd/SKILL.md +7 -7
|
@@ -34,24 +34,13 @@ BLOCKED=$(read_role blocked "prd-blocked")
|
|
|
34
34
|
TICKETED=$(read_role ticketed "prd-ticketed")
|
|
35
35
|
SHIPPED=$(read_role shipped "prd-shipped")
|
|
36
36
|
SENTINEL=$(read_role sentinel "prd-intake-feedback")
|
|
37
|
-
|
|
38
|
-
# Resolve a boolean rollup flag. Local overrides global per-key; default when unset.
|
|
39
|
-
read_rollup_flag() {
|
|
40
|
-
local key="$1" default="$2"
|
|
41
|
-
local local_v global_v
|
|
42
|
-
local_v=$(jq -r ".linear.labels.prd.rollup.${key} // empty" .lisa.config.local.json 2>/dev/null)
|
|
43
|
-
global_v=$(jq -r ".linear.labels.prd.rollup.${key} // empty" .lisa.config.json 2>/dev/null)
|
|
44
|
-
echo "${local_v:-${global_v:-$default}}"
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
CLOSE_ON_SHIPPED=$(read_rollup_flag closeOnShipped false)
|
|
48
37
|
```
|
|
49
38
|
|
|
50
39
|
In prose below, the role names refer to the resolved labels: e.g. "the `ready` label" means whatever `linear.labels.prd.ready` resolves to (default: `prd-ready`).
|
|
51
40
|
|
|
52
|
-
This skill is the Linear counterpart of `lisa:notion-prd-intake` and `lisa:confluence-prd-intake`, and shares its PRD
|
|
41
|
+
This skill is the Linear counterpart of `lisa:notion-prd-intake` and `lisa:confluence-prd-intake`, and shares its PRD shipped rollup phase (3f) with `lisa:github-prd-intake`. The phases, gates, comment templates, and rules are identical — the only differences are (1) the lifecycle is encoded as **project labels** instead of a status property, (2) the fetch / update tools are Linear MCP, and (3) clarifying-question comments land on a sentinel feedback Issue under the project (because Linear's MCP does not expose project-level comments). Keep all four intake skills behaviorally aligned: when changing intake logic — including the rollup phase — change them together.
|
|
53
42
|
|
|
54
|
-
The **PRD
|
|
43
|
+
The **PRD shipped rollup phase (3f)** transitions a `$TICKETED` PRD project to `$SHIPPED` once all its generated top-level work is terminal, per the `prd-lifecycle-rollup` rule. This is the Linear leg of the same vendor-neutral rollup that `lisa:github-prd-intake` implements for GitHub (LPC-1.3 #584); only the vendor surface (Linear workflow states + project labels) differs.
|
|
55
44
|
|
|
56
45
|
## Confirmation policy
|
|
57
46
|
|
|
@@ -89,9 +78,9 @@ This skill transitions:
|
|
|
89
78
|
- `$IN_REVIEW` → `$BLOCKED` (gate failures or coverage gaps)
|
|
90
79
|
- `$IN_REVIEW` → `$TICKETED` (success)
|
|
91
80
|
- `$TICKETED` → `$BLOCKED` (post-write coverage gaps from Phase 3e)
|
|
92
|
-
- `$TICKETED` → `$SHIPPED` (PRD
|
|
81
|
+
- `$TICKETED` → `$SHIPPED` (PRD shipped rollup, Phase 3f — only when **all** generated top-level children are terminal)
|
|
93
82
|
|
|
94
|
-
It never touches the `draft` or `verified` labels — those labels are owned by product (`verified` is set by `/lisa:verify-prd` after empirical PRD-level acceptance). The `shipped` label is set by this skill's **rollup phase (3f)** when, and only when, the PRD project's generated top-level work is all terminal — per the `prd-lifecycle-rollup` rule; product may also set it by hand. Rollup never advances a PRD to `shipped` on partial completion, and never archives a PRD project
|
|
83
|
+
It never touches the `draft` or `verified` labels — those labels are owned by product (`verified` is set by `/lisa:verify-prd` after empirical PRD-level acceptance). The `shipped` label is set by this skill's **rollup phase (3f)** when, and only when, the PRD project's generated top-level work is all terminal — per the `prd-lifecycle-rollup` rule; product may also set it by hand. Rollup never advances a PRD to `shipped` on partial completion, and never archives a PRD project at shipped. `/lisa:verify-prd` archives or completes the project only after a verified PASS.
|
|
95
84
|
|
|
96
85
|
A "transition" means: remove the old lifecycle label and add the new one in a single `save_project` call (passing the full new label set in the `labels` array). The skill MUST verify that exactly one lifecycle label exists on the project after the update — having two simultaneously breaks idempotency.
|
|
97
86
|
|
|
@@ -239,25 +228,19 @@ Per-ticket gates prove each ticket is well-formed; they do NOT prove the *set* o
|
|
|
239
228
|
|
|
240
229
|
3. The created tickets remain in the destination tracker regardless of the verdict — they are valid in their own right. The audit only tells us whether *more* are needed.
|
|
241
230
|
|
|
242
|
-
#### 3f. PRD
|
|
231
|
+
#### 3f. PRD shipped rollup
|
|
243
232
|
|
|
244
233
|
A PRD's lifecycle terminal state (`shipped`) is **derived** from whether the work it generated is done — it is never set by hand here on its own authority. This phase implements the Linear leg of that derivation, per the `prd-lifecycle-rollup` rule (cite it by slug; do not restate its taxonomy or terminal-state semantics here). It is behaviorally identical to `lisa:github-prd-intake`'s Phase 3f — only the vendor surface (Linear workflow states + project labels via Linear MCP) differs from GitHub's (issue close + labels via `gh`).
|
|
245
234
|
|
|
246
235
|
Rollup runs over PRD projects that are already `$TICKETED` (the only state from which a PRD can ship): the freshly-ticketed project from Phase 3c, and — because rollup also catches PRDs whose children finished in a *later* cycle — every project currently carrying `$TICKETED`. Process each independently; one PRD never blocks another's rollup.
|
|
247
236
|
|
|
248
|
-
##### 3f.0
|
|
249
|
-
|
|
250
|
-
Closure is gated on `linear.labels.prd.rollup.closeOnShipped` (default `false`), resolved via `read_rollup_flag` (defined in the Workflow resolution block, same local-overrides-global precedence the lifecycle labels use):
|
|
251
|
-
|
|
252
|
-
```bash
|
|
253
|
-
CLOSE_ON_SHIPPED=$(read_rollup_flag closeOnShipped false)
|
|
254
|
-
```
|
|
237
|
+
##### 3f.0 Shipped remains active for verification
|
|
255
238
|
|
|
256
|
-
|
|
239
|
+
There is no close/archive configuration at the shipped hop. Rollup sets `$SHIPPED` and leaves the PRD project **active** so Phase 3g can dispatch `/lisa:verify-prd`. Provider-native archive/completion is owned by `/lisa:verify-prd` after it transitions `$SHIPPED → verified` on a PASS.
|
|
257
240
|
|
|
258
241
|
##### 3f.1 Idempotency guard (no-op if already shipped)
|
|
259
242
|
|
|
260
|
-
Rollup is keyed by the PRD's current state. If the PRD project already carries `$SHIPPED
|
|
243
|
+
Rollup is keyed by the PRD's current state. If the PRD project already carries `$SHIPPED`, it is a **no-op** — do not re-transition, do not archive, do not re-comment. Record it as `already shipped (no-op)` in the cycle summary and move on. This is what makes re-running intake safe.
|
|
261
244
|
|
|
262
245
|
##### 3f.2 Read the generated top-level child set
|
|
263
246
|
|
|
@@ -284,7 +267,7 @@ The set of **required** children for the all-terminal check is the top-level chi
|
|
|
284
267
|
**All required children terminal** (every required top-level child is terminal; at least one required child exists):
|
|
285
268
|
|
|
286
269
|
1. Transition labels: remove `$TICKETED`, add `$SHIPPED` via `mcp__linear-server__save_project({id, labels})`. Verify exactly one lifecycle label remains (the single-label invariant).
|
|
287
|
-
2.
|
|
270
|
+
2. Leave the PRD active for `/lisa:verify-prd`; do not archive at the shipped hop.
|
|
288
271
|
3. Post a short rollup comment on the sentinel feedback issue naming the terminal child set and (when dropped children exist) the dropped set, so the audit trail records *why* the PRD shipped. Lead with `"Shipped by Claude — all generated top-level work is complete."`
|
|
289
272
|
|
|
290
273
|
**Any required child incomplete / blocked**:
|
|
@@ -294,13 +277,13 @@ The set of **required** children for the all-terminal check is the top-level chi
|
|
|
294
277
|
|
|
295
278
|
##### 3f.5 Rollup cites the rule
|
|
296
279
|
|
|
297
|
-
This phase implements exactly one PRD-lifecycle hop — `$TICKETED → $SHIPPED` — and
|
|
280
|
+
This phase implements exactly one PRD-lifecycle hop — `$TICKETED → $SHIPPED` — and deliberately leaves native archive/completion to `/lisa:verify-prd` after `$SHIPPED → verified`. All terminal-state semantics, the generated-top-level-work boundary, and the dedupe-by-child-ref idempotency come from the `prd-lifecycle-rollup` rule; this skill is its Linear implementation, not a second source of truth.
|
|
298
281
|
|
|
299
282
|
#### 3g. PRD verification dispatch (close the loop on shipped PRDs)
|
|
300
283
|
|
|
301
284
|
`shipped` and `verified` are distinct facts about a PRD (see the `prd-lifecycle-rollup` rule's "PRD-level verification vs ticket verification" and "Closing the loop" sections). Rollup (3f) only reaches `$SHIPPED`; the `shipped → verified` (pass) / `shipped → ticketed` (fail) hops are owned by `/lisa:verify-prd`. This phase **closes that loop** by dispatching the initiative-level acceptance gate for shipped PRDs. It never performs the verification transition itself — the "never sets the verification outcome" invariant holds: `lisa:verify-prd`, not this skill, sets `verified` (or, on failure, re-opens the PRD to `ticketed`).
|
|
302
285
|
|
|
303
|
-
Re-query the projects currently carrying the `$SHIPPED` label via `mcp__linear-server__list_projects` (filtered by the `$SHIPPED` project label, **including archived projects** — so PRDs
|
|
286
|
+
Re-query the projects currently carrying the `$SHIPPED` label via `mcp__linear-server__list_projects` (filtered by the `$SHIPPED` project label, **including archived projects** — so shipped PRDs remain active for `lisa:verify-prd`). Pick the **first** one and invoke `lisa:verify-prd <project-url>`. Process **one shipped PRD per cycle** — `lisa:verify-prd` is a heavy full flow (spec-conformance + empirical verification + fix-issue creation), so it is bounded exactly like the single-ready-PRD claim in Phase 3; the scheduler drains the rest.
|
|
304
287
|
|
|
305
288
|
**Per-cycle combined bound:** each scheduler cycle dispatches at most one ready PRD (the Phase 3 single-ready-PRD claim) **and** at most one shipped PRD for verification (this Phase 3g dispatch), for a maximum of two PRD operations per cycle. Ready intake runs first (Phase 3), then shipped verify (Phase 3g).
|
|
306
289
|
|
|
@@ -352,11 +335,11 @@ Idempotency: the helper finds-or-creates. Re-runs of the cycle reuse the same se
|
|
|
352
335
|
## Idempotency & safety
|
|
353
336
|
|
|
354
337
|
- **One item per cycle**: this skill processes the first eligible ready project from Phase 2, then exits. New or remaining `$READY` projects are picked up by later scheduler invocations.
|
|
355
|
-
- **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:linear-to-tracker` (which delegates to `lisa:tracker-write`), only ever changes Linear project labels among `$IN_REVIEW`, `$BLOCKED`, `$TICKETED`, and `$SHIPPED` (the last via the rollup phase 3f only), only ever creates/comments on the sentinel feedback issue (never any other Linear issue). It never edits project descriptions, never edits Linear documents, never touches the `draft` label,
|
|
338
|
+
- **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:linear-to-tracker` (which delegates to `lisa:tracker-write`), only ever changes Linear project labels among `$IN_REVIEW`, `$BLOCKED`, `$TICKETED`, and `$SHIPPED` (the last via the rollup phase 3f only), only ever creates/comments on the sentinel feedback issue (never any other Linear issue). It never edits project descriptions, never edits Linear documents, never touches the `draft` label, never archives projects at the shipped hop, and never deletes projects.
|
|
356
339
|
- **Claim-first ordering**: the label flip to `$IN_REVIEW` happens BEFORE validation runs, so a re-entrant call won't double-process.
|
|
357
340
|
- **Failure handling**: an exception processing the selected project is caught and recorded under "Errors" in the summary, then the cycle exits. The project that errored is left labelled `$IN_REVIEW` — the human investigates from there.
|
|
358
341
|
- **Single-label invariant**: after every transition, verify exactly one lifecycle label is present on the project. If two are present (rare race), surface as an Error and skip — do NOT auto-resolve, the human decides.
|
|
359
|
-
- **Rollup idempotency**: rollup (Phase 3f) is a no-op on a PRD project already carrying `$SHIPPED`
|
|
342
|
+
- **Rollup idempotency**: rollup (Phase 3f) is a no-op on a PRD project already carrying `$SHIPPED` — no duplicate transition, no shipped-time archive, no duplicate comment. The all-terminal condition is a pure function of the children's current states (deduped by child-ref identity), so recomputing it is safe to re-run. Native archive/completion only follows verified PASS in `/lisa:verify-prd`.
|
|
360
343
|
|
|
361
344
|
## Configuration
|
|
362
345
|
|
|
@@ -374,14 +357,13 @@ Destination tracker config (jira / github / linear) is consumed by `lisa:tracker
|
|
|
374
357
|
| `.lisa.config.json` `linear.labels.prd.blocked` | `prd-blocked` | Project label set on validation failure |
|
|
375
358
|
| `.lisa.config.json` `linear.labels.prd.ticketed` | `prd-ticketed` | Project label set on success |
|
|
376
359
|
| `.lisa.config.json` `linear.labels.prd.shipped` | `prd-shipped` | Project label set by the rollup phase (3f) when all generated top-level work is terminal; product may also set it by hand |
|
|
377
|
-
| `.lisa.config.json` `linear.labels.prd.rollup.closeOnShipped` | `false` | When `true`, rollup archives the PRD project after the `$SHIPPED` transition; when `false`, sets `$SHIPPED` and leaves it active |
|
|
378
360
|
| `.lisa.config.json` `linear.labels.prd.sentinel` | `prd-intake-feedback` | Issue-level label marking the sentinel feedback issue |
|
|
379
361
|
|
|
380
362
|
## Rules
|
|
381
363
|
|
|
382
364
|
- Never write to the destination tracker outside of `lisa:linear-to-tracker` → `lisa:tracker-write`. The validator's verdict gates progress; bypassing it produces broken tickets.
|
|
383
365
|
- Never add or remove a label this skill doesn't own (`$IN_REVIEW`, `$BLOCKED`, `$TICKETED`, and `$SHIPPED` via the rollup phase only). Product owns the `draft` and `ready` labels; product and the rollup phase (3f) both set `shipped`. The issue-level `$SENTINEL` label is owned by this skill but is not a lifecycle label.
|
|
384
|
-
- Set `$SHIPPED`
|
|
366
|
+
- Set `$SHIPPED` only from the rollup phase, and only when all generated top-level children are terminal per the `prd-lifecycle-rollup` rule. Never ship on partial completion and never archive at shipped.
|
|
385
367
|
- Never edit a project's description or any attached Linear document. Communication with product happens only through comments on sub-issues or on the sentinel feedback issue.
|
|
386
368
|
- Never post a single dump of all gate failures on one comment. One comment per `prd_anchor` group on the relevant sub-issue (or one comment on the sentinel feedback issue for unanchored failures only). Comments must be sub-issue-anchored where possible, categorized, plain-language, and contain a concrete recommendation.
|
|
387
369
|
- Never include a gate ID, internal skill name, or engineering shorthand in a comment body.
|
|
@@ -37,22 +37,11 @@ BLOCKED=$(read_role blocked "Blocked")
|
|
|
37
37
|
TICKETED=$(read_role ticketed "Ticketed")
|
|
38
38
|
SHIPPED=$(read_role shipped "Shipped")
|
|
39
39
|
STATUS_PROP=$(jq -r '.notion.statusProperty // "Status"' .lisa.config.json 2>/dev/null)
|
|
40
|
-
|
|
41
|
-
# Resolve a boolean rollup flag. Local overrides global per-key; default when unset.
|
|
42
|
-
read_rollup_flag() {
|
|
43
|
-
local key="$1" default="$2"
|
|
44
|
-
local local_v global_v
|
|
45
|
-
local_v=$(jq -r ".notion.rollup.${key} // empty" .lisa.config.local.json 2>/dev/null)
|
|
46
|
-
global_v=$(jq -r ".notion.rollup.${key} // empty" .lisa.config.json 2>/dev/null)
|
|
47
|
-
echo "${local_v:-${global_v:-$default}}"
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
CLOSE_ON_SHIPPED=$(read_rollup_flag closeOnShipped false)
|
|
51
40
|
```
|
|
52
41
|
|
|
53
42
|
In prose below, the role names refer to the resolved values: e.g. "the `ready` status" means whatever `notion.values.ready` resolves to (default: `Ready`).
|
|
54
43
|
|
|
55
|
-
This skill shares its PRD
|
|
44
|
+
This skill shares its PRD shipped rollup phase (3f) with `lisa:github-prd-intake`, `lisa:linear-prd-intake`, and `lisa:confluence-prd-intake`. The phases, gates, comment templates, and rollup behavior are identical across all four intake skills — only the vendor surface differs. Keep all four behaviorally aligned: when changing intake logic — including the rollup phase — change them together. The **PRD shipped rollup phase (3f)** transitions a `$TICKETED` PRD to `$SHIPPED` once all its generated top-level work is terminal, per the `prd-lifecycle-rollup` rule; this is the Notion leg of the same vendor-neutral rollup (LPC-1.3 #584), using the documented generated-work section since Notion has no native ticket hierarchy.
|
|
56
45
|
|
|
57
46
|
## Confirmation policy
|
|
58
47
|
|
|
@@ -84,7 +73,7 @@ draft → ready → in_review → blocked | ticketed → shipped → verified
|
|
|
84
73
|
|
|
85
74
|
`verified` is the terminal status after `shipped`: it means the shipped product has been empirically checked against the PRD (set by `/lisa:verify-prd`, not by this intake skill). A failed post-ship verification does **not** use `blocked`; `/lisa:verify-prd` re-opens the PRD `shipped → ticketed` and creates build-ready fix tickets that auto-build and trigger a re-verify (the self-healing loop), introducing no `verifying` / `verification-failed` status. Like `draft` and `shipped`, `verified` is **product-owned** — this intake skill never sets, clears, or otherwise touches it. See the "PRD-level verification vs ticket verification" section of the `prd-lifecycle-rollup` rule.
|
|
86
75
|
|
|
87
|
-
This skill transitions `ready → in_review`, then `in_review → blocked` or `in_review → ticketed`, then (via the rollup phase 3f) `ticketed → shipped`. It never touches `draft` or `verified` — those statuses are owned by product (`verified` is set by `/lisa:verify-prd` after empirical PRD-level acceptance). The `shipped` status is set by this skill's **rollup phase (3f)** when, and only when, the PRD's generated top-level work is all terminal — per the `prd-lifecycle-rollup` rule; product may also set it by hand. Rollup never advances a PRD to `shipped` on partial completion, and never archives a PRD page
|
|
76
|
+
This skill transitions `ready → in_review`, then `in_review → blocked` or `in_review → ticketed`, then (via the rollup phase 3f) `ticketed → shipped`. It never touches `draft` or `verified` — those statuses are owned by product (`verified` is set by `/lisa:verify-prd` after empirical PRD-level acceptance). The `shipped` status is set by this skill's **rollup phase (3f)** when, and only when, the PRD's generated top-level work is all terminal — per the `prd-lifecycle-rollup` rule; product may also set it by hand. Rollup never advances a PRD to `shipped` on partial completion, and never archives a PRD page at shipped. `/lisa:verify-prd` archives the page only after a verified PASS.
|
|
88
77
|
|
|
89
78
|
## Phases
|
|
90
79
|
|
|
@@ -243,25 +232,19 @@ The access skill resolves a `prd_anchor` substring to the matching block ID by p
|
|
|
243
232
|
|
|
244
233
|
Stop immediately after the claimed PRD is ticketed, blocked, or recorded as an error.
|
|
245
234
|
|
|
246
|
-
#### 3f. PRD
|
|
235
|
+
#### 3f. PRD shipped rollup
|
|
247
236
|
|
|
248
237
|
A PRD's lifecycle terminal state (`shipped`) is **derived** from whether the work it generated is done — it is never set by hand here on its own authority. This phase implements the Notion leg of that derivation, per the `prd-lifecycle-rollup` rule (cite it by slug; do not restate its taxonomy or terminal-state semantics here). It is behaviorally identical to `lisa:github-prd-intake`'s Phase 3f — only the vendor surface (a Notion status property via `lisa:notion-access` + the documented generated-work section) differs from GitHub's (issue close + labels via `gh`).
|
|
249
238
|
|
|
250
239
|
Rollup runs over PRD pages that are already `$TICKETED` (the only state from which a PRD can ship): the freshly-ticketed PRD from Phase 3c, and — because rollup also catches PRDs whose children finished in a *later* cycle — every page currently in `$STATUS_PROP = $TICKETED` (re-query the database with operation `query-database` filtered on the ticketed status). Process each independently; one PRD never blocks another's rollup.
|
|
251
240
|
|
|
252
|
-
##### 3f.0
|
|
241
|
+
##### 3f.0 Shipped remains active for verification
|
|
253
242
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
```bash
|
|
257
|
-
CLOSE_ON_SHIPPED=$(read_rollup_flag closeOnShipped false)
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
When `false` (the default), rollup sets `$STATUS_PROP = $SHIPPED` but leaves the page **active** for a human to archive. When `true`, rollup also archives the page (where Notion supports archival) after the `shipped` transition. Closure NEVER happens before all generated top-level work is terminal (`prd-lifecycle-rollup` rule; PRD #525 non-goal).
|
|
243
|
+
There is no archive configuration at the shipped hop. Rollup sets `$STATUS_PROP = $SHIPPED` and leaves the PRD page **active** so Phase 3g can dispatch `/lisa:verify-prd`. Provider-native archival is owned by `/lisa:verify-prd` after it transitions `$SHIPPED → verified` on a PASS.
|
|
261
244
|
|
|
262
245
|
##### 3f.1 Idempotency guard (no-op if already shipped)
|
|
263
246
|
|
|
264
|
-
Rollup is keyed by the PRD's current state. If the PRD already has `$STATUS_PROP = $SHIPPED
|
|
247
|
+
Rollup is keyed by the PRD's current state. If the PRD already has `$STATUS_PROP = $SHIPPED`, it is a **no-op** — do not re-transition, do not archive, do not re-comment. Record it as `already shipped (no-op)` in the cycle summary and move on. This is what makes re-running intake safe.
|
|
265
248
|
|
|
266
249
|
##### 3f.2 Read the generated top-level child set
|
|
267
250
|
|
|
@@ -286,7 +269,7 @@ The set of **required** children for the all-terminal check is the top-level chi
|
|
|
286
269
|
**All required children terminal** (every required top-level child is terminal; at least one required child exists):
|
|
287
270
|
|
|
288
271
|
1. Set `$STATUS_PROP = $SHIPPED` by invoking `lisa:notion-access` operation `write-page` with payload `{ "id": "<PRD-page-id>", "properties": { "<STATUS_PROP>": { "status": { "name": "<SHIPPED>" } } } }` (use `"select"` instead of `"status"` if the property is a select).
|
|
289
|
-
2.
|
|
272
|
+
2. Leave the PRD active for `/lisa:verify-prd`; do not archive at the shipped hop.
|
|
290
273
|
3. Post a short rollup Notion comment naming the terminal child set and (when dropped children exist) the dropped set, so the audit trail records *why* the PRD shipped. Lead with `"Shipped by Claude — all generated top-level work is complete."`
|
|
291
274
|
|
|
292
275
|
**Any required child incomplete / blocked**:
|
|
@@ -296,7 +279,7 @@ The set of **required** children for the all-terminal check is the top-level chi
|
|
|
296
279
|
|
|
297
280
|
##### 3f.5 Rollup cites the rule
|
|
298
281
|
|
|
299
|
-
This phase implements exactly one PRD-lifecycle hop — `$TICKETED → $SHIPPED` — and
|
|
282
|
+
This phase implements exactly one PRD-lifecycle hop — `$TICKETED → $SHIPPED` — and deliberately leaves native archival to `/lisa:verify-prd` after `$SHIPPED → verified`. All terminal-state semantics, the generated-top-level-work boundary, and the dedupe-by-child-ref idempotency come from the `prd-lifecycle-rollup` rule; this skill is its Notion implementation, not a second source of truth.
|
|
300
283
|
|
|
301
284
|
#### 3g. PRD verification dispatch (close the loop on shipped PRDs)
|
|
302
285
|
|
|
@@ -306,7 +289,7 @@ Re-query the PRDs currently in the `$SHIPPED` status via `lisa:notion-access` `o
|
|
|
306
289
|
|
|
307
290
|
**Per-cycle combined bound:** each scheduler cycle dispatches at most one ready PRD (the Phase 3 single-ready-PRD claim) **and** at most one shipped PRD for verification (this Phase 3g dispatch), for a maximum of two PRD operations per cycle. Ready intake runs first (Phase 3), then shipped verify (Phase 3g).
|
|
308
291
|
|
|
309
|
-
`lisa:verify-prd` owns the outcome: on a CONFORMS verdict with all empirical checks passing it transitions `$SHIPPED → verified` and posts evidence; on a conformance miss or a failing/unavailable check it **re-opens the PRD `$SHIPPED → ticketed`** (never `blocked`) and creates **build-ready** fix tickets registered as the PRD's generated work, then posts a failure report — the fix tickets auto-build, rollup (3f) re-ships the PRD once they are terminal, and a later cycle re-verifies (the self-healing loop). Either branch moves the PRD out of `$SHIPPED`, so it is not re-picked this cycle; a PRD whose generated work is not actually terminal is guard-stopped by `lisa:verify-prd` (left `$SHIPPED`) — that is verify-prd's gate, not this skill's.
|
|
292
|
+
`lisa:verify-prd` owns the outcome: on a CONFORMS verdict with all empirical checks passing it transitions `$SHIPPED → verified` and posts evidence; on a conformance miss or a failing/unavailable check it **re-opens the PRD `$SHIPPED → ticketed`** (never `blocked`) and creates **build-ready** fix tickets registered as the PRD's generated work, then posts a failure report — the fix tickets auto-build, rollup (3f) re-ships the PRD once they are terminal, and a later cycle re-verifies (the self-healing loop). Either branch moves the PRD out of `$SHIPPED`, so it is not re-picked this cycle; a PRD whose generated work is not actually terminal is guard-stopped by `lisa:verify-prd` (left `$SHIPPED`) — that is verify-prd's gate, not this skill's. This phase, like 3f, is **behaviorally identical across all four intake skills** (`github-prd-intake`, `linear-prd-intake`, `notion-prd-intake`, `confluence-prd-intake`) — only the `$SHIPPED` query surface differs; keep them aligned. Record the dispatched PRD + verify-prd's verdict in the summary.
|
|
310
293
|
|
|
311
294
|
### Phase 4 — Summary report
|
|
312
295
|
|
|
@@ -336,10 +319,10 @@ Print to the agent's output. Do not write this summary to Notion or the destinat
|
|
|
336
319
|
## Idempotency & safety
|
|
337
320
|
|
|
338
321
|
- **One item per cycle**: this skill processes the first eligible ready PRD from Phase 2, then exits. New or remaining ready PRDs are picked up by later scheduler invocations.
|
|
339
|
-
- **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:notion-to-tracker` (which delegates to `lisa:tracker-write`), and only ever changes the Notion status property to `$IN_REVIEW`, `$BLOCKED`, `$TICKETED`, or `$SHIPPED` (the last via the rollup phase 3f only). It never edits PRD content, never touches `$DRAFT`, never
|
|
322
|
+
- **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:notion-to-tracker` (which delegates to `lisa:tracker-write`), and only ever changes the Notion status property to `$IN_REVIEW`, `$BLOCKED`, `$TICKETED`, or `$SHIPPED` (the last via the rollup phase 3f only). It never edits PRD content, never touches `$DRAFT`, never archives pages at the shipped hop, and never deletes pages.
|
|
340
323
|
- **Claim-first ordering**: the status flip to `$IN_REVIEW` is set BEFORE validation runs, so a re-entrant call won't double-process.
|
|
341
324
|
- **Failure handling**: an exception processing the selected PRD is caught and recorded under "Errors" in the summary, then the cycle exits. The PRD that errored is left in `$IN_REVIEW` — the human investigates from there.
|
|
342
|
-
- **Rollup idempotency**: rollup (Phase 3f) is a no-op on a PRD already in `$STATUS_PROP = $SHIPPED`
|
|
325
|
+
- **Rollup idempotency**: rollup (Phase 3f) is a no-op on a PRD already in `$STATUS_PROP = $SHIPPED` — no duplicate transition, no shipped-time archive, no duplicate comment. The all-terminal condition is a pure function of the children's current states (deduped by child-ref identity), so recomputing it is safe to re-run. Native archival only follows verified PASS in `/lisa:verify-prd`.
|
|
343
326
|
|
|
344
327
|
## Configuration
|
|
345
328
|
|
|
@@ -357,8 +340,6 @@ This skill reads project configuration from `.lisa.config.json` (with `.lisa.con
|
|
|
357
340
|
| `notion.values.blocked` | `Blocked` | Value the agent sets on validation failure |
|
|
358
341
|
| `notion.values.ticketed` | `Ticketed` | Value the agent sets on success |
|
|
359
342
|
| `notion.values.shipped` | `Shipped` | Value the rollup phase (3f) sets when all generated top-level work is terminal; product may also set it by hand |
|
|
360
|
-
| `notion.rollup.closeOnShipped` | `false` | When `true`, rollup archives the PRD page after the `$SHIPPED` transition; when `false`, sets `$SHIPPED` and leaves the page active |
|
|
361
|
-
|
|
362
343
|
### From environment variables
|
|
363
344
|
|
|
364
345
|
| Variable | Purpose |
|
|
@@ -371,7 +352,7 @@ This skill reads project configuration from `.lisa.config.json` (with `.lisa.con
|
|
|
371
352
|
|
|
372
353
|
- Never write to the destination tracker outside of `lisa:notion-to-tracker` → `lisa:tracker-write`. The validator's verdict gates progress; bypassing it produces broken tickets.
|
|
373
354
|
- Never set the Notion status to a value this skill doesn't own (`$IN_REVIEW`, `$BLOCKED`, `$TICKETED`, and `$SHIPPED` via the rollup phase only). Product owns `$DRAFT` and `$READY`; product and the rollup phase (3f) both set `$SHIPPED`.
|
|
374
|
-
- Set `$SHIPPED`
|
|
355
|
+
- Set `$SHIPPED` only from the rollup phase, and only when all generated top-level children are terminal per the `prd-lifecycle-rollup` rule. Never ship on partial completion and never archive at shipped.
|
|
375
356
|
- Never edit the PRD's body. Communication with product happens only through Notion comments.
|
|
376
357
|
- Never post a single page-level dump of all gate failures. One comment per `prd_anchor` group (or one page-level summary for unanchored failures only). The audience is product, not engineers — comments must be block-anchored, categorized, plain-language, and contain a concrete recommendation. See Phase 3c.3 for the required template and Phase 3c.5 for forbidden language.
|
|
377
358
|
- Never include a gate ID, internal skill name, or engineering shorthand in a Notion comment body. If the validator's `what` or `recommendation` field uses one, paraphrase before posting.
|
|
@@ -35,7 +35,7 @@ If neither arg is supplied, ask which mode (or both). Setting only `parentPageId
|
|
|
35
35
|
|
|
36
36
|
### Step 3 — Create lifecycle parent pages
|
|
37
37
|
|
|
38
|
-
Confluence PRD lifecycle is **parent-page-based**, not label-based (see the `config-resolution` rule for why — Atlassian's scoped API tokens cannot write labels). Each lifecycle role gets its own parent page; a PRD's state = which parent it's a child of. The full PRD lifecycle is `draft → ready → in_review → (blocked | ticketed) → shipped → verified` (the `prd-lifecycle-rollup` rule, slug `prd-lifecycle-rollup`): rollup performs the `ticketed → shipped` hop, then `/lisa:verify-prd` performs the terminal `shipped → verified` (pass) / `shipped →
|
|
38
|
+
Confluence PRD lifecycle is **parent-page-based**, not label-based (see the `config-resolution` rule for why — Atlassian's scoped API tokens cannot write labels). Each lifecycle role gets its own parent page; a PRD's state = which parent it's a child of. The full PRD lifecycle is `draft → ready → in_review → (blocked | ticketed) → shipped → verified` (the `prd-lifecycle-rollup` rule, slug `prd-lifecycle-rollup`): rollup performs the `ticketed → shipped` hop, then `/lisa:verify-prd` performs the terminal `shipped → verified` (pass) / `shipped → ticketed` (fail) hop. `verified` is the terminal lifecycle state after `shipped` (the `verified` role from the `config-resolution` rule, #591).
|
|
39
39
|
|
|
40
40
|
#### 3a. Decide where the parents live
|
|
41
41
|
|
|
@@ -183,12 +183,12 @@ Otherwise apply the vendor-appropriate transition. This is the `shipped → veri
|
|
|
183
183
|
```bash
|
|
184
184
|
gh issue edit <prd-num> --repo <org>/<repo> --remove-label "$SHIPPED" --add-label "$VERIFIED"
|
|
185
185
|
```
|
|
186
|
-
Verify exactly **one** PRD-lifecycle label remains afterward (the single-label invariant `github-prd-intake` enforces) — a re-run must never leave both `$SHIPPED` and `$VERIFIED`, nor two copies of `$VERIFIED`. For Linear, set the project/issue label equivalently.
|
|
187
|
-
- **Notion** — set the PRD page's `notion.statusProperty` (default `Status`) to the resolved `verified` value (default `Verified`). A status property holds exactly one value, so re-setting the same value is inherently a no-op.
|
|
188
|
-
- **Confluence** — move the PRD page's `parentId` to `confluence.parents.verified` (the parent-page-based lifecycle; Atlassian scoped tokens cannot write labels — see `config-resolution`). A page has exactly one parent, so re-parenting to the same parent is a no-op.
|
|
189
|
-
- **JIRA** — transition the PRD issue to the configured `verified` status. An issue holds exactly one status; if already `verified`, skip the transition.
|
|
186
|
+
Verify exactly **one** PRD-lifecycle label remains afterward (the single-label invariant `github-prd-intake` enforces) — a re-run must never leave both `$SHIPPED` and `$VERIFIED`, nor two copies of `$VERIFIED`. For GitHub, close the PRD issue immediately after the label transition with `gh issue close <prd-num> --repo <org>/<repo> --reason completed`; if it is already closed, record that native closure was already satisfied. For Linear, set the project/issue label equivalently, then archive/complete the project or issue using the vendor's native terminal mechanism where available.
|
|
187
|
+
- **Notion** — set the PRD page's `notion.statusProperty` (default `Status`) to the resolved `verified` value (default `Verified`). A status property holds exactly one value, so re-setting the same value is inherently a no-op. Then archive the page through `lisa:notion-access` where supported; if the page is already archived, record that native archival was already satisfied.
|
|
188
|
+
- **Confluence** — move the PRD page's `parentId` to `confluence.parents.verified` (the parent-page-based lifecycle; Atlassian scoped tokens cannot write labels — see `config-resolution`). A page has exactly one parent, so re-parenting to the same parent is a no-op. Then archive the page where the deployment supports archival; if archival is unavailable, report the capability-aware no-op or setup gap.
|
|
189
|
+
- **JIRA** — transition the PRD issue to the configured `verified` status. An issue holds exactly one status; if already `verified`, skip the transition. Then resolve/close the issue using the configured terminal workflow transition where supported.
|
|
190
190
|
|
|
191
|
-
`verified` is the terminal, product-owned PRD state; this skill is the **only** automated writer of it (intake/rollup never set it).
|
|
191
|
+
`verified` is the terminal, product-owned PRD state; this skill is the **only** automated writer of it (intake/rollup never set it). After the verified transition, close, archive, or complete the PRD natively where the source vendor supports it. This close-out is mandatory and idempotent; do not introduce a configuration flag to skip it.
|
|
192
192
|
|
|
193
193
|
### 6.3 — Post verification evidence on the PRD
|
|
194
194
|
|
|
@@ -317,7 +317,7 @@ The guards are woven into Phases 6 and 7 above; this phase collects them as one
|
|
|
317
317
|
|
|
318
318
|
2. **Fix issues — dedupe by a stable marker, reference don't duplicate.** Each fix issue carries `<!-- lisa:verify-prd-fix prd=<prd-ref> req=<stable-req-id> -->`, keyed by the PRD ref + a stable requirement/AC identity. Before creating a fix issue, search for an **open** issue carrying that exact marker; if found, reference/update it instead of creating a second one (Phase 7.4). The dedupe key is the marker (a stable ref), **never the issue title** — a renamed fix issue is still matched by its marker, and two distinct requirements get two distinct markers even if their titles collide (`prd-lifecycle-rollup`: "Match by stable ref, never by title"). A *closed* prior fix issue does not suppress a new one (a re-failure after a closed fix is a genuine regression).
|
|
319
319
|
|
|
320
|
-
3. **Lifecycle transition — no-op when already
|
|
320
|
+
3. **Lifecycle transition + verified native close-out — no-op when already satisfied.** The Phase 6.2 / 7.2 transition is keyed by the PRD's current state: if the PRD already carries `$VERIFIED` (PASS) or `$TICKETED` (FAIL), the transition is a no-op — no re-label, no second copy of the label/status — mirroring `github-prd-intake` Phase 3f.1's "no-op if already shipped." After any transition, exactly **one** PRD-lifecycle label/status remains (the single-label invariant); a re-run never leaves both `$SHIPPED` and the target role, nor two copies of the target role. For Notion/Confluence/JIRA the single-value status/parent makes re-setting the same value inherently idempotent. On the PASS path, provider-native closure/archive/completion is also idempotent: if it is already closed, archived, or completed, record the satisfied state and do not error.
|
|
321
321
|
|
|
322
322
|
Because every Phase 6/7 write is one of these three idempotent operations, the **whole skill is idempotent**: the end state after N runs equals the end state after 1 run — one evidence-or-failure comment, one fix issue per still-failing requirement, one lifecycle label/status. Computing the verdict itself is a pure function of the PRD's current state and its children's current states, so recomputing it on a re-run is safe (`prd-lifecycle-rollup` idempotency rule).
|
|
323
323
|
|
|
@@ -368,7 +368,7 @@ shipped → ticketed (re-opened for fixes; round: N) fix tickets (ready): <
|
|
|
368
368
|
- **Never reimplement spec conformance or verification.** Phase 4 invokes the `spec-conformance` skill (the single source of truth for the coverage matrix and the `CONFORMS`/`PARTIAL`/`DIVERGES` verdict); Phase 5 invokes `verification-lifecycle` (which in turn invokes `codify-verification` and, for UI, `product-walkthrough`). This skill orchestrates those skills against the PRD; it does not duplicate their logic.
|
|
369
369
|
- **Quality gates are not verification.** Tests, typecheck, and lint are prerequisites enforced by hooks/CI. Phase 5 requires running the actual shipped system and observing results on a surface chosen from what the PRD delivered — never substituting a green test suite for empirical proof (`verification` rule).
|
|
370
370
|
- **The verification surface is PRD-dependent.** Classify the empirical surface (browser/API/CLI/DB/logs/…) from what the PRD shipped; do not assume a fixed surface. A single-environment project with no deployed app verifies on its CLI/dry-run surface per the PRD's Empirical Verification Plan.
|
|
371
|
-
- **`verified` is product-owned and terminal.** This skill is the only automated writer of the `verified` role; intake/rollup never set it. The PASS hop
|
|
371
|
+
- **`verified` is product-owned and terminal.** This skill is the only automated writer of the `verified` role; intake/rollup never set it. The PASS hop also performs provider-native close/archive/completion where supported, and that close-out is mandatory and idempotent.
|
|
372
372
|
- **Verification failure never uses `blocked`; it re-opens to `ticketed`.** The FAIL hop sets the existing `ticketed` PRD role (`config-resolution`) and creates build-ready fix tickets registered as the PRD's generated work, so the lifecycle stays small (`prd-lifecycle-rollup` "No extra failure states") and self-heals — the fix tickets auto-build, rollup re-ships the PRD, and a later cycle re-verifies. `blocked` remains the *intake* (ready-stage validation) failure role, not the verification one; the FAIL hop never closes or archives the PRD.
|
|
373
373
|
- **Top-level only.** Exclude leaf Sub-tasks and Stories nested under a generated Epic. The PRD owns its top-level work; those top-level units own their descendants (`prd-lifecycle-rollup` generated-top-level-work contract).
|
|
374
374
|
- **Cite, don't restate.** The generated-top-level-work boundary, the per-vendor terminal predicate, the env-keyed `done` resolution, the dedupe-by-child-ref idempotency key, and the `shipped → verified | ticketed` PRD-level verification hops all come from the `prd-lifecycle-rollup` rule; the `verified`/`shipped`/`blocked`/`ticketed` role vocabulary comes from `config-resolution`. This skill is a consumer of those contracts, not a second source of truth.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.104.
|
|
3
|
+
"version": "2.104.7",
|
|
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.104.
|
|
3
|
+
"version": "2.104.7",
|
|
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"
|
|
@@ -58,8 +58,7 @@ fi
|
|
|
58
58
|
"verified": "<page-id>"
|
|
59
59
|
},
|
|
60
60
|
"dashboardPageId": "<page-id>",
|
|
61
|
-
"feedbackPageId": "<page-id>"
|
|
62
|
-
"rollup": { "closeOnShipped": false }
|
|
61
|
+
"feedbackPageId": "<page-id>"
|
|
63
62
|
},
|
|
64
63
|
"github": {
|
|
65
64
|
"org": "<org-or-user>",
|
|
@@ -86,8 +85,7 @@ fi
|
|
|
86
85
|
"ready": "prd-ready", "in_review": "prd-in-review",
|
|
87
86
|
"blocked": "prd-blocked", "ticketed": "prd-ticketed",
|
|
88
87
|
"shipped": "prd-shipped", "verified": "prd-verified",
|
|
89
|
-
"sentinel": "prd-intake-feedback"
|
|
90
|
-
"rollup": { "closeOnShipped": false }
|
|
88
|
+
"sentinel": "prd-intake-feedback"
|
|
91
89
|
}
|
|
92
90
|
}
|
|
93
91
|
},
|
|
@@ -99,8 +97,7 @@ fi
|
|
|
99
97
|
"draft": "Draft", "ready": "Ready", "in_review": "In Review",
|
|
100
98
|
"blocked": "Blocked", "ticketed": "Ticketed", "shipped": "Shipped",
|
|
101
99
|
"verified": "Verified"
|
|
102
|
-
}
|
|
103
|
-
"rollup": { "closeOnShipped": false }
|
|
100
|
+
}
|
|
104
101
|
},
|
|
105
102
|
"linear": {
|
|
106
103
|
"workspace": "<workspace-slug>",
|
|
@@ -118,8 +115,7 @@ fi
|
|
|
118
115
|
"ready": "prd-ready", "in_review": "prd-in-review",
|
|
119
116
|
"blocked": "prd-blocked", "ticketed": "prd-ticketed",
|
|
120
117
|
"shipped": "prd-shipped", "verified": "prd-verified",
|
|
121
|
-
"sentinel": "prd-intake-feedback"
|
|
122
|
-
"rollup": { "closeOnShipped": false }
|
|
118
|
+
"sentinel": "prd-intake-feedback"
|
|
123
119
|
}
|
|
124
120
|
}
|
|
125
121
|
},
|
|
@@ -291,17 +287,9 @@ Every lifecycle skill operates on a fixed set of **roles** (`ready`, `claimed`,
|
|
|
291
287
|
| `verified` | Shipped product empirically checked against the PRD | `Verified` (status) | `prd-verified` (label); parent-page lookup (Confluence) |
|
|
292
288
|
| `sentinel` | (PRD-intake feedback issue marker, GitHub/Linear self-host only) | — | `prd-intake-feedback` |
|
|
293
289
|
|
|
294
|
-
### PRD rollup
|
|
295
|
-
|
|
296
|
-
PRD lifecycle completion is **derived** from the PRD's generated top-level work, not set independently — see the `prd-lifecycle-rollup` rule for the full contract (generated-top-level-work definition, per-vendor terminal-state predicate, the `shipped` transition, and the child-ref idempotency key). When all required generated top-level children are terminal, rollup transitions the PRD to its `shipped` role; the `prd.rollup` block configures the optional close/archive step that follows.
|
|
297
|
-
|
|
298
|
-
The `rollup` object lives in each PRD-source vendor section (`github.labels.prd.rollup`, `linear.labels.prd.rollup`, `notion.rollup`, `confluence.rollup`):
|
|
299
|
-
|
|
300
|
-
| Key | Required | Default | Notes |
|
|
301
|
-
|-----|----------|---------|-------|
|
|
302
|
-
| `closeOnShipped` | no | `false` | When `true`, rollup closes/archives the PRD after the `shipped` transition (GitHub: close the issue; Linear: move to a closed/archived state; JIRA: transition to Done; Confluence/Notion: archive where supported). When `false` (the default), the PRD is set to `shipped` but left open for a human to close. Closure never happens before all generated top-level work is terminal. |
|
|
290
|
+
### PRD rollup behavior
|
|
303
291
|
|
|
304
|
-
|
|
292
|
+
PRD lifecycle completion is **derived** from the PRD's generated top-level work, not set independently — see the `prd-lifecycle-rollup` rule for the full contract (generated-top-level-work definition, per-vendor terminal-state predicate, the `shipped` transition, verified native closure, and the child-ref idempotency key). When all required generated top-level children are terminal, rollup transitions the PRD to its `shipped` role and leaves it open/active for `/lisa:verify-prd`. There is no project-configurable close-on-shipped flag: provider-native closure/archive/completion happens only after `/lisa:verify-prd` passes and moves the PRD to `verified`.
|
|
305
293
|
|
|
306
294
|
### Repair intake config (`intake.repair`)
|
|
307
295
|
|
|
@@ -370,7 +358,7 @@ The true terminal `done` value is also the only value that triggers provider-nat
|
|
|
370
358
|
### What's configurable, what's not
|
|
371
359
|
|
|
372
360
|
- **Status / label NAMES** are configurable per project — that's the point of the vocabulary maps.
|
|
373
|
-
- **Role SEMANTICS and TRANSITIONS** are not. The build lifecycle is always `ready → claimed → done` (with optional `review` for label-driven systems). The PRD lifecycle is always `ready → in_review → (blocked | ticketed) → shipped`, then verification may move `shipped → verified` on a pass or `shipped →
|
|
361
|
+
- **Role SEMANTICS and TRANSITIONS** are not. The build lifecycle is always `ready → claimed → done` (with optional `review` for label-driven systems). The PRD lifecycle is always `ready → in_review → (blocked | ticketed) → shipped`, then verification may move `shipped → verified` on a pass or `shipped → ticketed` on a failed verification. `verified` is terminal and product-owned like `draft` and `shipped`; Lisa does not add `prd-verifying` or `prd-verification-failed` states. Skills hardcode these transitions because they encode the design intent of the framework, not the project's preferences.
|
|
374
362
|
- **Extra statuses/labels** the project uses outside these roles are fine — lisa never touches them.
|
|
375
363
|
|
|
376
364
|
### Defaults vs. requirements
|