@codyswann/lisa 2.216.0 → 2.217.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/.codex-plugin/skills/lisa-confluence-to-tracker/SKILL.md +78 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-github-to-tracker/SKILL.md +81 -4
- package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +31 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +16 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +32 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +16 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-to-tracker/SKILL.md +82 -4
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +31 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +16 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-to-tracker/SKILL.md +78 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-backlink/SKILL.md +12 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-ticket-coverage/SKILL.md +17 -0
- package/plugins/lisa/skills/lisa-confluence-to-tracker/SKILL.md +78 -3
- package/plugins/lisa/skills/lisa-github-to-tracker/SKILL.md +81 -4
- package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +31 -0
- package/plugins/lisa/skills/lisa-github-write-issue/SKILL.md +16 -0
- package/plugins/lisa/skills/lisa-jira-validate-ticket/SKILL.md +32 -0
- package/plugins/lisa/skills/lisa-jira-write-ticket/SKILL.md +16 -0
- package/plugins/lisa/skills/lisa-linear-to-tracker/SKILL.md +82 -4
- package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +31 -0
- package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +16 -0
- package/plugins/lisa/skills/lisa-notion-to-tracker/SKILL.md +78 -2
- package/plugins/lisa/skills/lisa-prd-backlink/SKILL.md +12 -3
- package/plugins/lisa/skills/lisa-prd-ticket-coverage/SKILL.md +17 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-confluence-to-tracker/SKILL.md +78 -3
- package/plugins/lisa-agy/skills/lisa-github-to-tracker/SKILL.md +81 -4
- package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +31 -0
- package/plugins/lisa-agy/skills/lisa-github-write-issue/SKILL.md +16 -0
- package/plugins/lisa-agy/skills/lisa-jira-validate-ticket/SKILL.md +32 -0
- package/plugins/lisa-agy/skills/lisa-jira-write-ticket/SKILL.md +16 -0
- package/plugins/lisa-agy/skills/lisa-linear-to-tracker/SKILL.md +82 -4
- package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +31 -0
- package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +16 -0
- package/plugins/lisa-agy/skills/lisa-notion-to-tracker/SKILL.md +78 -2
- package/plugins/lisa-agy/skills/lisa-prd-backlink/SKILL.md +12 -3
- package/plugins/lisa-agy/skills/lisa-prd-ticket-coverage/SKILL.md +17 -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/skills/lisa-confluence-to-tracker/SKILL.md +78 -3
- package/plugins/lisa-copilot/skills/lisa-github-to-tracker/SKILL.md +81 -4
- package/plugins/lisa-copilot/skills/lisa-github-validate-issue/SKILL.md +31 -0
- package/plugins/lisa-copilot/skills/lisa-github-write-issue/SKILL.md +16 -0
- package/plugins/lisa-copilot/skills/lisa-jira-validate-ticket/SKILL.md +32 -0
- package/plugins/lisa-copilot/skills/lisa-jira-write-ticket/SKILL.md +16 -0
- package/plugins/lisa-copilot/skills/lisa-linear-to-tracker/SKILL.md +82 -4
- package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +31 -0
- package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +16 -0
- package/plugins/lisa-copilot/skills/lisa-notion-to-tracker/SKILL.md +78 -2
- package/plugins/lisa-copilot/skills/lisa-prd-backlink/SKILL.md +12 -3
- package/plugins/lisa-copilot/skills/lisa-prd-ticket-coverage/SKILL.md +17 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-confluence-to-tracker/SKILL.md +78 -3
- package/plugins/lisa-cursor/skills/lisa-github-to-tracker/SKILL.md +81 -4
- package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +31 -0
- package/plugins/lisa-cursor/skills/lisa-github-write-issue/SKILL.md +16 -0
- package/plugins/lisa-cursor/skills/lisa-jira-validate-ticket/SKILL.md +32 -0
- package/plugins/lisa-cursor/skills/lisa-jira-write-ticket/SKILL.md +16 -0
- package/plugins/lisa-cursor/skills/lisa-linear-to-tracker/SKILL.md +82 -4
- package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +31 -0
- package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +16 -0
- package/plugins/lisa-cursor/skills/lisa-notion-to-tracker/SKILL.md +78 -2
- package/plugins/lisa-cursor/skills/lisa-prd-backlink/SKILL.md +12 -3
- package/plugins/lisa-cursor/skills/lisa-prd-ticket-coverage/SKILL.md +17 -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-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-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/skills/lisa-confluence-to-tracker/SKILL.md +78 -3
- package/plugins/src/base/skills/lisa-github-to-tracker/SKILL.md +81 -4
- package/plugins/src/base/skills/lisa-github-validate-issue/SKILL.md +31 -0
- package/plugins/src/base/skills/lisa-github-write-issue/SKILL.md +16 -0
- package/plugins/src/base/skills/lisa-jira-validate-ticket/SKILL.md +32 -0
- package/plugins/src/base/skills/lisa-jira-write-ticket/SKILL.md +16 -0
- package/plugins/src/base/skills/lisa-linear-to-tracker/SKILL.md +82 -4
- package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +31 -0
- package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +16 -0
- package/plugins/src/base/skills/lisa-notion-to-tracker/SKILL.md +78 -2
- package/plugins/src/base/skills/lisa-prd-backlink/SKILL.md +12 -3
- package/plugins/src/base/skills/lisa-prd-ticket-coverage/SKILL.md +17 -0
|
@@ -41,6 +41,7 @@ Resolve `<ORG>` and `<REPO>` from the ref or from `.lisa.config.json`.
|
|
|
41
41
|
| Target backend environment | Runtime-behavior changes | Recorded under `## Target Backend Environment`. Skip only for doc / config / type-only. |
|
|
42
42
|
| Sign-in account / credentials | Authenticated-surface tickets | Recorded under `## Sign-in Required`. |
|
|
43
43
|
| Repository | Bug, Task, Sub-task | GitHub Issues live in exactly one repo by definition — record the repo name under `## Repository`, and reject any AC bullet that references a different repo. |
|
|
44
|
+
| Source Requirement | PRD-sourced issues (`prd_source` provided) | `## Source Requirement` with PRD link + verbatim requirement quote(s) — see Phase 3; enforced at every level, sub-issues included. |
|
|
44
45
|
|
|
45
46
|
Optional but recommended: assignee, milestone, components (label `component:<name>`), story points (label `points:<n>`), labels.
|
|
46
47
|
|
|
@@ -51,6 +52,20 @@ Use `gh api repos/<org>/<repo>/labels --paginate` to discover existing labels be
|
|
|
51
52
|
The description (issue body) MUST address three audiences. Reject and rewrite if any are missing.
|
|
52
53
|
|
|
53
54
|
```markdown
|
|
55
|
+
## Source Requirement
|
|
56
|
+
[Required whenever the issue originates from a PRD (the caller passes
|
|
57
|
+
`prd_source`). Answers "why was this done?" — cite the PRD and quote the
|
|
58
|
+
requirement(s) VERBATIM, never paraphrased:
|
|
59
|
+
- **PRD**: <PRD title + link> §"<section heading>"
|
|
60
|
+
- **Requirement (R3)**: "<verbatim requirement text from the PRD>"
|
|
61
|
+
One Requirement line per satisfied requirement. Derived / cross-cutting
|
|
62
|
+
work that traces to no single requirement uses the supporting form:
|
|
63
|
+
"Derived work supporting R3, R7 — no single PRD section." Close with:
|
|
64
|
+
"This issue exists to satisfy the quoted requirement. If implementation
|
|
65
|
+
scope drifts from the quoted text, the PRD is the authority — raise the
|
|
66
|
+
conflict rather than silently reinterpreting it." Omit the section only
|
|
67
|
+
for ad-hoc issues with no PRD lineage.]
|
|
68
|
+
|
|
54
69
|
## Context / Business Value
|
|
55
70
|
[Why this matters. Stakeholder-facing. Concrete user impact or business outcome.
|
|
56
71
|
Link to the originating Slack thread, PRD page, incident, or customer report.]
|
|
@@ -115,6 +130,7 @@ Scenario: <name>
|
|
|
115
130
|
```
|
|
116
131
|
|
|
117
132
|
Rules:
|
|
133
|
+
- PRD-sourced issues (caller passed `prd_source`) MUST carry the Source Requirement section with verbatim quotes — paraphrases are rejected (validator gate S16). This applies at every level, sub-issues included: a leaf claimed in isolation must explain its own "why".
|
|
118
134
|
- Every acceptance criterion uses Given/When/Then. No vague "should work" language.
|
|
119
135
|
- Every criterion is independently verifiable.
|
|
120
136
|
- If the issue is a Bug, include reproduction steps, expected vs. actual behavior, and environment.
|
|
@@ -62,6 +62,7 @@ links: [{ key: "PROJ-99", type: "is blocked by" }] # known issue links (may be
|
|
|
62
62
|
remote_links: [{ url: "https://github.com/...", title: "PR #42" }]
|
|
63
63
|
build_ready: true # caller asserts the build-ready role (status:ready) is/would be applied — see S15
|
|
64
64
|
child_refs: ["PROJ-601", "PROJ-602"] # known child work (sub-tasks / "is blocked by" parentage) — see S15
|
|
65
|
+
prd_source: "https://notion.so/..." # set when the ticket was generated from a PRD — requires the Source Requirement section, see S16
|
|
65
66
|
```
|
|
66
67
|
|
|
67
68
|
If the caller passes only a ticket key, fetch the ticket via `lisa-atlassian-access` `operation: read-ticket key: <KEY>`, derive the same fields from the fetched data — including `build_ready` (label set contains `status:ready`) and `child_refs` (sub-tasks plus `is blocked by` parentage, resolved as in `lisa-jira-read-ticket`) so S15 can classify the ticket — then run gates.
|
|
@@ -89,6 +90,7 @@ Each gate is tagged with a fixed `category` and a `product_relevant` boolean. Ca
|
|
|
89
90
|
| S13 Relationship Search | `dependency` | true |
|
|
90
91
|
| S14 Evidence manifest binding (leaf work units) | `acceptance-criteria` | true |
|
|
91
92
|
| S15 Leaf-only build-ready | `structural` | false |
|
|
93
|
+
| S16 Source Requirement traceability | `product-clarity` | true |
|
|
92
94
|
| F1 Issue type valid in project | `structural` | false |
|
|
93
95
|
| F2 Epic parent exists and is an Epic | `structural` | false |
|
|
94
96
|
| F3 Linked tickets exist | `structural` | false |
|
|
@@ -236,6 +238,35 @@ Remediation: `"Build-ready (status:ready) is leaf-only per leaf-only-lifecycle.
|
|
|
236
238
|
|
|
237
239
|
`product_relevant: false` — a build-ready container is a lifecycle/decomposition error for the caller to repair, not a product question.
|
|
238
240
|
|
|
241
|
+
#### S16 — Source Requirement traceability (PRD-sourced tickets)
|
|
242
|
+
|
|
243
|
+
Answers "why was this done?": every ticket generated from a PRD must carry
|
|
244
|
+
the requirement it exists to satisfy, quoted verbatim, at every level of
|
|
245
|
+
the hierarchy — sub-tasks included, so a leaf claimed by build-intake in
|
|
246
|
+
isolation is self-explanatory.
|
|
247
|
+
|
|
248
|
+
**When the gate applies.** Run S16 whenever the spec declares `prd_source`
|
|
249
|
+
(all `*-to-tracker` decomposition paths set it). Without `prd_source`
|
|
250
|
+
(ad-hoc tickets with no PRD lineage) the gate is `N/A` — but if a
|
|
251
|
+
`Source Requirement` section is present anyway, still validate its shape
|
|
252
|
+
so a malformed section never passes silently.
|
|
253
|
+
|
|
254
|
+
**What must be present.** A `Source Requirement` section (`h2.` / `##` in
|
|
255
|
+
proposed text, or an ADF heading in live JIRA) containing:
|
|
256
|
+
|
|
257
|
+
1. A link to the source PRD (the `**PRD**:` line), and
|
|
258
|
+
2. At least one `**Requirement` line with **verbatim quoted text**, or the
|
|
259
|
+
explicit derived-work form (`Derived work supporting R3, R7 — no single
|
|
260
|
+
PRD section.`).
|
|
261
|
+
|
|
262
|
+
Missing section, missing PRD link, empty/paraphrased requirement text
|
|
263
|
+
(quotes shorter than a few words, or prose with no quotation), or a bare
|
|
264
|
+
R-id with no quote: FAIL with remediation
|
|
265
|
+
`"Add a Source Requirement section citing the PRD link and quoting the requirement(s) this ticket satisfies verbatim (see the Source Requirement shared format in the *-to-tracker skills). Derived work must name the requirements it supports."`
|
|
266
|
+
|
|
267
|
+
`product_relevant: true` — a ticket whose requirement cannot be traced is
|
|
268
|
+
a product-clarity problem: nobody can tell why the work exists.
|
|
269
|
+
|
|
239
270
|
### Feasibility Gates (require JIRA lookups; skip in dry-run if requested)
|
|
240
271
|
|
|
241
272
|
#### F1 — Issue type valid in project
|
|
@@ -310,6 +341,7 @@ Output is a single fenced text block. Callers parse it; do not add free-form pro
|
|
|
310
341
|
- [PASS|FAIL|N/A] S13 Relationship Search — <one-line reason>
|
|
311
342
|
- [PASS|FAIL|N/A] S14 Evidence manifest binding — <one-line reason>
|
|
312
343
|
- [PASS|FAIL|N/A] S15 Leaf-only build-ready — <one-line reason>
|
|
344
|
+
- [PASS|FAIL|N/A] S16 Source Requirement traceability — <one-line reason>
|
|
313
345
|
|
|
314
346
|
### Feasibility Gates (omit this section when --spec-only)
|
|
315
347
|
- [PASS|FAIL|N/A] F1 Issue type valid in project — <one-line reason>
|
|
@@ -38,6 +38,7 @@ Required fields (stop and ask if missing — do not invent values):
|
|
|
38
38
|
| Target backend environment | Runtime-behavior changes | `dev` / `staging` / `prod`; recorded in description (Phase 3). Skip only for doc/config/type-only tickets. |
|
|
39
39
|
| Sign-in account / credentials | Tickets that touch authenticated surfaces | Name the account (or source — 1Password item, env var, seeded fixture) and role; recorded in description (Phase 3). Omit when sign-in is not required. |
|
|
40
40
|
| Single-repo scope | Bug, Task, Sub-task, Improvement | These leaf work units MUST cover one repo only. If the work crosses repos, split it before creating. Epic / Spike / Story may span repos. |
|
|
41
|
+
| Source Requirement | PRD-sourced tickets (`prd_source` provided) | `h2. Source Requirement` with PRD link + verbatim requirement quote(s) — see Phase 3; enforced at every level, sub-tasks included |
|
|
41
42
|
|
|
42
43
|
Optional but recommended: assignee, components, fix versions, labels, sprint, story points, reporter.
|
|
43
44
|
|
|
@@ -48,6 +49,20 @@ Issue-type validity and required custom fields are enforced by `lisa-jira-valida
|
|
|
48
49
|
The description MUST address three audiences. Reject and rewrite if any are missing.
|
|
49
50
|
|
|
50
51
|
```text
|
|
52
|
+
h2. Source Requirement
|
|
53
|
+
[Required whenever the ticket originates from a PRD (the caller passes
|
|
54
|
+
`prd_source`). Answers "why was this done?" — cite the PRD and quote the
|
|
55
|
+
requirement(s) VERBATIM, never paraphrased:
|
|
56
|
+
- **PRD**: <PRD title + link> §"<section heading>"
|
|
57
|
+
- **Requirement (R3)**: "<verbatim requirement text from the PRD>"
|
|
58
|
+
One Requirement line per satisfied requirement. Derived / cross-cutting
|
|
59
|
+
work that traces to no single requirement uses the supporting form:
|
|
60
|
+
"Derived work supporting R3, R7 — no single PRD section." Close with:
|
|
61
|
+
"This ticket exists to satisfy the quoted requirement. If implementation
|
|
62
|
+
scope drifts from the quoted text, the PRD is the authority — raise the
|
|
63
|
+
conflict rather than silently reinterpreting it." Omit the section only
|
|
64
|
+
for ad-hoc tickets with no PRD lineage.]
|
|
65
|
+
|
|
51
66
|
h2. Context / Business Value
|
|
52
67
|
[Why this matters. Stakeholder-facing. Concrete user impact or business outcome.
|
|
53
68
|
Link to the originating Slack thread, Notion doc, incident, or customer report.]
|
|
@@ -93,6 +108,7 @@ h2. Validation Journey
|
|
|
93
108
|
```
|
|
94
109
|
|
|
95
110
|
Rules:
|
|
111
|
+
- PRD-sourced tickets (caller passed `prd_source`) MUST carry the Source Requirement section with verbatim quotes — paraphrases are rejected (validator gate S16). This applies at every level, sub-tasks included: a leaf claimed in isolation must explain its own "why".
|
|
96
112
|
- Every acceptance criterion uses Given/When/Then. No vague "should work" language.
|
|
97
113
|
- Every criterion is independently verifiable (UI, API, data, or performance check).
|
|
98
114
|
- If the ticket is a Bug, include reproduction steps, expected vs. actual behavior, and environment.
|
|
@@ -32,21 +32,29 @@ This skill supports two modes, controlled by a `dry_run` flag in `$ARGUMENTS`:
|
|
|
32
32
|
- **`dry_run: false`** (default — full mode): run all phases, write tickets via `lisa-tracker-write`, run the preservation gate, report.
|
|
33
33
|
- **`dry_run: true`** (planning + validation only — no writes): run Phases 1, 1.5, 1.6, 2, 3, 4 to plan the hierarchy and draft each ticket spec, then call `lisa-tracker-validate` (with `--spec-only`) on every drafted ticket. Aggregate the per-ticket validator reports into a single dry-run report. **Skip Phase 5 (sub-task creation), Phase 5.5 (preservation gate), and Phase 6 (results report)** — none of those make sense without writes. Return the dry-run report so the caller (e.g. `lisa-linear-prd-intake`) can decide whether to proceed.
|
|
34
34
|
|
|
35
|
-
Dry-run output format is identical to `lisa-notion-to-tracker`'s and `lisa-confluence-to-tracker`'s. Reuse the same fields, including `prd_anchor` and `prd_section
|
|
35
|
+
Dry-run output format is identical to `lisa-notion-to-tracker`'s and `lisa-confluence-to-tracker`'s. Reuse the same fields, including `prd_anchor` and `prd_section`, the `### Requirement register` section, and the per-node `requirements:` lists. The only difference: Linear has no inline-comment selection-anchor primitive at the project level — `prd_anchor` is the anchor a downstream caller would use to *post a comment on the related sub-issue* (typically the issue identifier, e.g. `LIN-123`, scoped to a section heading). When the failure does not map to any single sub-issue, set `prd_anchor: null` and the caller falls back to its sentinel feedback channel.
|
|
36
36
|
|
|
37
37
|
```text
|
|
38
38
|
## linear-to-tracker dry-run: <PRD title>
|
|
39
39
|
|
|
40
|
+
### Requirement register
|
|
41
|
+
- R1 §"<section heading>": "<verbatim requirement text>"
|
|
42
|
+
- R2 §"<section heading>": "<verbatim requirement text>"
|
|
43
|
+
- ...
|
|
44
|
+
|
|
40
45
|
### Planned hierarchy
|
|
41
46
|
- Epic: <summary>
|
|
42
47
|
prd_section: "<heading text from the project description / document that produced this epic>"
|
|
43
48
|
prd_anchor: "<linear issue identifier or null>"
|
|
49
|
+
requirements: [R1, R2] # register ids this ticket exists to satisfy; [] only for derived work
|
|
44
50
|
- Story 1.1: <summary>
|
|
45
51
|
prd_section: "<heading or user-story line>"
|
|
46
52
|
prd_anchor: "<linear issue identifier or null>"
|
|
53
|
+
requirements: [R1]
|
|
47
54
|
- Sub-task [<repo>]: <summary>
|
|
48
55
|
prd_section: "<heading or AC bullet>"
|
|
49
56
|
prd_anchor: "<linear issue identifier or null>"
|
|
57
|
+
requirements: [R1]
|
|
50
58
|
- ...
|
|
51
59
|
- Story 1.2: ...
|
|
52
60
|
|
|
@@ -82,6 +90,38 @@ The dry-run mode never writes to JIRA and never calls `mcp__atlassian__createJir
|
|
|
82
90
|
|
|
83
91
|
Bypassing `lisa-tracker-write` produces thin tickets that the rest of the lifecycle (triage, ticket-verify, journey, evidence) treats as broken. Atlassian reads in this skill are limited to the tools listed in `allowed-tools` (currently `getJiraIssueRemoteIssueLinks`) for the Phase 5.5 preservation gate. The Linear read tools listed in `allowed-tools` above are PRD-side only and never write.
|
|
84
92
|
|
|
93
|
+
## Source Requirement Section (shared format)
|
|
94
|
+
|
|
95
|
+
Every ticket created by this skill — epic, story, and sub-task alike —
|
|
96
|
+
carries a `## Source Requirement` section in its description so anyone can
|
|
97
|
+
answer "why was this done?" without leaving the ticket:
|
|
98
|
+
|
|
99
|
+
```markdown
|
|
100
|
+
## Source Requirement
|
|
101
|
+
|
|
102
|
+
- **PRD**: [<PRD title>](<PRD URL>) §"<section heading>"
|
|
103
|
+
- **Requirement (R3)**: "<verbatim requirement text from the PRD>"
|
|
104
|
+
|
|
105
|
+
This ticket exists to satisfy the quoted requirement. If implementation
|
|
106
|
+
scope drifts from the quoted text, the PRD is the authority — raise the
|
|
107
|
+
conflict rather than silently reinterpreting it.
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Rules:
|
|
111
|
+
|
|
112
|
+
- **Verbatim quotes, never paraphrases.** The quote is what survives later
|
|
113
|
+
PRD edits, and it must be readable by a non-technical operator.
|
|
114
|
+
- **Multiple requirements** → one `**Requirement (Rn)**` line each.
|
|
115
|
+
- **Derived / cross-cutting work** (no single requirement) uses the
|
|
116
|
+
supporting form instead:
|
|
117
|
+
`- **Requirement**: Derived work supporting R3, R7 — no single PRD section.`
|
|
118
|
+
- **All the way down**: sub-tasks carry full quotes, not just a pointer at
|
|
119
|
+
the parent Story, so a leaf claimed by build-intake in isolation is
|
|
120
|
+
self-explanatory.
|
|
121
|
+
- JIRA descriptions render the section as `h2. Source Requirement`;
|
|
122
|
+
GitHub/Linear use the markdown heading. `lisa-tracker-write` and the
|
|
123
|
+
validators treat the section as mandatory for PRD-sourced tickets.
|
|
124
|
+
|
|
85
125
|
## Input
|
|
86
126
|
|
|
87
127
|
A Linear project URL, slug, or ID. The PRD is expected to have:
|
|
@@ -137,6 +177,37 @@ If env vars are not available, ask the user to provide them explicitly before pr
|
|
|
137
177
|
- Engineering comments (prefixed with "Engineering:" or wrench emoji) that identify technical constraints
|
|
138
178
|
- Cross-PRD dependencies (references to other Linear projects, documents, or shared infrastructure)
|
|
139
179
|
|
|
180
|
+
### Phase 1.4: Requirement Register (traceability)
|
|
181
|
+
|
|
182
|
+
Every ticket this skill creates must be able to answer "why was this done?"
|
|
183
|
+
by pointing at the PRD requirement it satisfies. Build that mapping now,
|
|
184
|
+
while parsing the PRD — it cannot be reliably reconstructed afterwards.
|
|
185
|
+
|
|
186
|
+
1. **Atomize the PRD into requirements** in document order: goals, user
|
|
187
|
+
stories, functional and non-functional requirements, acceptance-criteria
|
|
188
|
+
bullets, and important notes — across the project description, every
|
|
189
|
+
attached document, and every sub-issue description. Use the same
|
|
190
|
+
atomization `lisa-prd-ticket-coverage` uses so the two views line up.
|
|
191
|
+
2. **Assign sequential register ids** (`R1`, `R2`, …). Ids are
|
|
192
|
+
per-generation, not durable — the **verbatim quote is the durable
|
|
193
|
+
anchor**; if the PRD is edited and re-planned, ids may shift but quotes
|
|
194
|
+
still identify the requirement.
|
|
195
|
+
3. **Record each entry** as `{ id, verbatim_text, section_heading }`,
|
|
196
|
+
where `section_heading` is the markdown heading (or the sub-issue
|
|
197
|
+
identifier) the requirement lives under — the same value used for
|
|
198
|
+
`prd_anchor`.
|
|
199
|
+
4. **Tag every planned ticket** — epic, story, AND sub-task — with the
|
|
200
|
+
register ids it exists to satisfy. All the way down: sub-tasks carry
|
|
201
|
+
their own requirement quotes so a leaf dispatched in isolation is
|
|
202
|
+
self-explanatory. A ticket that genuinely traces to no single
|
|
203
|
+
requirement (cross-cutting infrastructure, derived enablement work)
|
|
204
|
+
gets `requirements: []` and must say which requirements it *supports*
|
|
205
|
+
in its Source Requirement section instead.
|
|
206
|
+
|
|
207
|
+
The register feeds three consumers: the `## Source Requirement` section on
|
|
208
|
+
every created ticket (Phases 3–5), the dry-run report (above), and the
|
|
209
|
+
requirement tokens in the PRD back-link (Phase 7).
|
|
210
|
+
|
|
140
211
|
### Phase 1.5: Extract Source Artifacts
|
|
141
212
|
|
|
142
213
|
PRDs typically reference external design, UX, and data artifacts (Figma files, Lovable prototypes, Loom walkthroughs, screenshots, example payloads, peer Linear or Confluence pages). These MUST be preserved onto the resulting tickets — otherwise developers picking up a ticket lose the source of truth. This is the failure mode this step exists to prevent.
|
|
@@ -183,8 +254,10 @@ For each epic identified in Phase 1, **invoke the `lisa-tracker-write` skill** (
|
|
|
183
254
|
|
|
184
255
|
- `project_key`: resolved by `lisa-tracker-write` from `.lisa.config.json`
|
|
185
256
|
- `issue_type`: `Epic`
|
|
257
|
+
- `prd_source`: the originating PRD URL — mandatory for every ticket this skill creates; it arms the validator's S16 traceability gate
|
|
186
258
|
- `summary`: epic title from the PRD
|
|
187
259
|
- `description_body`: a draft of the 3-audience description containing:
|
|
260
|
+
- A **Source Requirement** section (see the shared format above) citing the Linear project URL, section heading, and the verbatim text of every register requirement (`R-id`) this epic exists to satisfy
|
|
188
261
|
- **Context / Business Value**: epic summary from the PRD, originating Linear project URL, business outcome
|
|
189
262
|
- **Technical Approach**: cross-cutting integration points and constraints surfaced in Phase 2 codebase research
|
|
190
263
|
- List of user stories the epic contains
|
|
@@ -213,9 +286,10 @@ For each story, **invoke `lisa-tracker-write`** with:
|
|
|
213
286
|
|
|
214
287
|
- `project_key`: resolved by `lisa-tracker-write` from `.lisa.config.json`
|
|
215
288
|
- `issue_type`: `Story`
|
|
289
|
+
- `prd_source`: the originating PRD URL — mandatory for every ticket this skill creates; it arms the validator's S16 traceability gate
|
|
216
290
|
- `epic_parent`: the Epic key captured in Phase 3 (mandatory)
|
|
217
291
|
- `summary`: prefixed per the naming convention above
|
|
218
|
-
- `description_body`: 3-audience description as in `lisa-notion-to-tracker` Phase 4
|
|
292
|
+
- `description_body`: 3-audience description as in `lisa-notion-to-tracker` Phase 4, including as its first element a **Source Requirement** section (shared format above) quoting the register requirement(s) this story satisfies
|
|
219
293
|
- `artifacts`: the Phase 1.5 artifacts filtered by domain per the inheritance table below
|
|
220
294
|
|
|
221
295
|
| Story type | Inherits domains |
|
|
@@ -240,6 +314,7 @@ Delegate sub-task creation to **parallel agents** (one per epic or batch of stor
|
|
|
240
314
|
Each sub-task MUST:
|
|
241
315
|
1. **Be scoped to exactly ONE repo** — indicated in brackets in the summary: `[repo-name]` and in the description's `## Repository` / `h2. Repository` section
|
|
242
316
|
2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking
|
|
317
|
+
3. **Carry its own `## Source Requirement` section** (shared format above) with the full verbatim quote(s) from the Phase 1.4 register — a leaf claimed by build-intake in isolation must be self-explanatory. When a sub-task is split per-repo, every split child inherits the same requirement quote(s).
|
|
243
318
|
|
|
244
319
|
**Leaf-only build-ready (`leaf-only-lifecycle`)**: Sub-tasks are the **leaf work units** of the decomposition — they are the ONLY items in the hierarchy that receive the build-ready label. `lisa-tracker-write` applies `status:ready` here so downstream build intake (`lisa-tracker-build-intake`) claims the leaves and never the Epic or Stories. Apply `status:ready` to each Sub-task; never to its parent Story or Epic (Phases 3–4). `lisa-tracker-write` enforces the same invariant on the write side, so a Sub-task split into per-repo children (the cross-repo case above) carries build-ready on the children, not on any intermediate parent that gains child work.
|
|
245
320
|
|
|
@@ -264,6 +339,7 @@ After all tickets are created, present a summary table to the user:
|
|
|
264
339
|
- All Epics with keys and URLs
|
|
265
340
|
- All Stories grouped by Epic
|
|
266
341
|
- All Sub-tasks grouped by Story with repo tags
|
|
342
|
+
- **Requirement coverage** — one row per Phase 1.4 register entry (`R-id`, quote excerpt, tickets that declare it); requirements with zero tickets are a gap to resolve before reporting success
|
|
267
343
|
- Repo distribution
|
|
268
344
|
- **Artifact Preservation Matrix**
|
|
269
345
|
- Blockers list with recommendations and alternatives
|
|
@@ -279,7 +355,8 @@ Invoke `lisa-prd-backlink` with:
|
|
|
279
355
|
|
|
280
356
|
- `source_type: "linear"`
|
|
281
357
|
- `source_ref`: the original Linear project URL
|
|
282
|
-
- `tickets`: the full list created in Phases 3–5, each entry as `{ key, title, type, url, parent_key }`
|
|
358
|
+
- `tickets`: the full list created in Phases 3–5, each entry as `{ key, title, type, url, parent_key, requirements }` — `requirements` is the list of Phase 1.4 register ids the ticket satisfies (empty for derived work)
|
|
359
|
+
- `requirement_register`: the Phase 1.4 register (`{ id, verbatim_text, section_heading }` entries), so the back-link section can render the requirement → tickets view
|
|
283
360
|
|
|
284
361
|
If `lisa-prd-backlink` fails (permission denied, Linear unreachable), surface the error in the Phase 6 report rather than aborting — the tickets are already created. Recommend the user re-run `lisa-prd-backlink` standalone once the source is reachable.
|
|
285
362
|
|
|
@@ -307,10 +384,11 @@ produces broken tickets that downstream skills (triage, journey, evidence) canno
|
|
|
307
384
|
|
|
308
385
|
For each sub-task, invoke `lisa-tracker-write` with:
|
|
309
386
|
- issue_type: "Sub-task"
|
|
387
|
+
- prd_source: [the originating PRD URL — mandatory; arms the S16 traceability gate]
|
|
310
388
|
- parent: the parent story key
|
|
311
389
|
- project_key: [PROJECT]
|
|
312
390
|
- summary: prefixed with the repo in brackets, e.g. "[backend-api] Add audit log table"
|
|
313
|
-
- description_body: a 3-section draft (Context / Technical Approach / Acceptance Criteria) plus `h2. Repository` naming exactly one repo
|
|
391
|
+
- description_body: a 3-section draft (Context / Technical Approach / Acceptance Criteria) plus `h2. Repository` naming exactly one repo, plus `h2. Source Requirement` quoting the PRD requirement(s) this sub-task satisfies VERBATIM with the PRD link and register id(s) — [paste the exact requirement text and R-ids for each sub-task from the requirement register; do not let the agent paraphrase]
|
|
314
392
|
- gherkin_acceptance_criteria: derived from the story's functional requirements
|
|
315
393
|
- sign_in_account: [test user credentials from config — name + role + how to obtain]
|
|
316
394
|
- target_environment: "dev"
|
|
@@ -63,6 +63,7 @@ relations: [{ id: "ENG-99", type: "blocked_by" }] # known issue relations (may
|
|
|
63
63
|
remote_links: [{ url: "https://github.com/...", title: "PR #42" }]
|
|
64
64
|
build_ready: true # caller asserts the build-ready role (status:ready) is/would be applied — see S15
|
|
65
65
|
child_refs: ["ENG-601", "ENG-602"] # known child work (sub-issues / project-member issues / blocked_by parentage) — see S15
|
|
66
|
+
prd_source: "https://notion.so/..." # set when the Issue was generated from a PRD — requires the Source Requirement section, see S16
|
|
66
67
|
```
|
|
67
68
|
|
|
68
69
|
If the caller passes only an identifier, fetch the item via `lisa-linear-access operation: get-issue` (Issue) or `lisa-linear-access operation: get-project` (Project), derive the same fields from the fetched data — including `build_ready` (label set contains `status:ready`) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa-linear-read-issue`) so S15 can classify the item — then run gates.
|
|
@@ -90,6 +91,7 @@ Each gate is tagged with a fixed `category` and a `product_relevant` boolean. Ca
|
|
|
90
91
|
| S13 Relationship Search | `dependency` | true |
|
|
91
92
|
| S14 Evidence manifest binding (leaf work units) | `acceptance-criteria` | true |
|
|
92
93
|
| S15 Leaf-only build-ready | `structural` | false |
|
|
94
|
+
| S16 Source Requirement traceability | `product-clarity` | true |
|
|
93
95
|
| F1 Issue type valid in team | `structural` | false |
|
|
94
96
|
| F2 Project parent exists and is in same team | `structural` | false |
|
|
95
97
|
| F3 Linked items exist | `structural` | false |
|
|
@@ -239,6 +241,34 @@ Remediation: `"Build-ready (status:ready) is leaf-only per leaf-only-lifecycle.
|
|
|
239
241
|
|
|
240
242
|
`product_relevant: false` — a build-ready container is a lifecycle/decomposition error for the caller to repair, not a product question.
|
|
241
243
|
|
|
244
|
+
#### S16 — Source Requirement traceability (PRD-sourced Issues)
|
|
245
|
+
|
|
246
|
+
Answers "why was this done?": every Issue generated from a PRD must carry
|
|
247
|
+
the requirement it exists to satisfy, quoted verbatim, at every level of
|
|
248
|
+
the hierarchy — sub-issues included, so a leaf claimed by build-intake in
|
|
249
|
+
isolation is self-explanatory.
|
|
250
|
+
|
|
251
|
+
**When the gate applies.** Run S16 whenever the spec declares `prd_source`
|
|
252
|
+
(all `*-to-tracker` decomposition paths set it). Without `prd_source`
|
|
253
|
+
(ad-hoc issues with no PRD lineage) the gate is `N/A` — but if a
|
|
254
|
+
`Source Requirement` section is present anyway, still validate its shape
|
|
255
|
+
so a malformed section never passes silently.
|
|
256
|
+
|
|
257
|
+
**What must be present.** a `Source Requirement` section (`##` markdown heading) containing:
|
|
258
|
+
|
|
259
|
+
1. A link to the source PRD (the `**PRD**:` line), and
|
|
260
|
+
2. At least one `**Requirement` line with **verbatim quoted text**, or the
|
|
261
|
+
explicit derived-work form (`Derived work supporting R3, R7 — no single
|
|
262
|
+
PRD section.`).
|
|
263
|
+
|
|
264
|
+
Missing section, missing PRD link, empty/paraphrased requirement text
|
|
265
|
+
(quotes shorter than a few words, or prose with no quotation), or a bare
|
|
266
|
+
R-id with no quote: FAIL with remediation
|
|
267
|
+
`"Add a Source Requirement section citing the PRD link and quoting the requirement(s) this issue satisfies verbatim (see the Source Requirement shared format in the *-to-tracker skills). Derived work must name the requirements it supports."`
|
|
268
|
+
|
|
269
|
+
`product_relevant: true` — a issue whose requirement cannot be traced is
|
|
270
|
+
a product-clarity problem: nobody can tell why the work exists.
|
|
271
|
+
|
|
242
272
|
### Feasibility Gates (require Linear lookups; skip in dry-run if requested)
|
|
243
273
|
|
|
244
274
|
#### F1 — Issue type valid in team
|
|
@@ -317,6 +347,7 @@ Output is a single fenced text block. Callers parse it; do not add free-form pro
|
|
|
317
347
|
- [PASS|FAIL|N/A] S13 Relationship Search — <one-line reason>
|
|
318
348
|
- [PASS|FAIL|N/A] S14 Evidence manifest binding — <one-line reason>
|
|
319
349
|
- [PASS|FAIL|N/A] S15 Leaf-only build-ready — <one-line reason>
|
|
350
|
+
- [PASS|FAIL|N/A] S16 Source Requirement traceability — <one-line reason>
|
|
320
351
|
|
|
321
352
|
### Feasibility Gates (omit when --spec-only)
|
|
322
353
|
- [PASS|FAIL|N/A] F1 Issue type valid in team — <one-line reason>
|
|
@@ -60,6 +60,7 @@ Required fields (stop and ask if missing — never invent values):
|
|
|
60
60
|
| Target backend environment | Runtime-behavior changes | `dev` / `staging` / `prod`; recorded in description (Phase 3). Skip only for doc/config/type-only items. |
|
|
61
61
|
| Sign-in account / credentials | Items that touch authenticated surfaces | Name the account (or source — 1Password item, env var, seeded fixture) and role; recorded in description. Omit when sign-in is not required. |
|
|
62
62
|
| Single-repo scope | Bug, Task, Sub-task | These types MUST cover one repo only. If the work crosses repos, split it before creating. Epic / Spike / Story may span repos. |
|
|
63
|
+
| Source Requirement | PRD-sourced Issues (`prd_source` provided) | `## Source Requirement` with PRD link + verbatim requirement quote(s) — see Phase 3; enforced at every level, sub-issues included. |
|
|
63
64
|
|
|
64
65
|
Optional but recommended: assignee, estimate (story points), labels, project milestone (fix-version equivalent), cycle.
|
|
65
66
|
|
|
@@ -68,6 +69,20 @@ Optional but recommended: assignee, estimate (story points), labels, project mil
|
|
|
68
69
|
Linear descriptions are markdown (NOT Jira wiki markup — no `h2.` headings, use `##` instead). The description MUST address three audiences. Reject and rewrite if any are missing.
|
|
69
70
|
|
|
70
71
|
```markdown
|
|
72
|
+
## Source Requirement
|
|
73
|
+
[Required whenever the Issue originates from a PRD (the caller passes
|
|
74
|
+
`prd_source`). Answers "why was this done?" — cite the PRD and quote the
|
|
75
|
+
requirement(s) VERBATIM, never paraphrased:
|
|
76
|
+
- **PRD**: <PRD title + link> §"<section heading>"
|
|
77
|
+
- **Requirement (R3)**: "<verbatim requirement text from the PRD>"
|
|
78
|
+
One Requirement line per satisfied requirement. Derived / cross-cutting
|
|
79
|
+
work that traces to no single requirement uses the supporting form:
|
|
80
|
+
"Derived work supporting R3, R7 — no single PRD section." Close with:
|
|
81
|
+
"This Issue exists to satisfy the quoted requirement. If implementation
|
|
82
|
+
scope drifts from the quoted text, the PRD is the authority — raise the
|
|
83
|
+
conflict rather than silently reinterpreting it." Omit the section only
|
|
84
|
+
for ad-hoc Issues with no PRD lineage.]
|
|
85
|
+
|
|
71
86
|
## Context / Business Value
|
|
72
87
|
[Why this matters. Stakeholder-facing. Concrete user impact or business outcome.
|
|
73
88
|
Link to the originating Slack thread, Notion doc, incident, or customer report.]
|
|
@@ -108,6 +123,7 @@ Linear descriptions are markdown (NOT Jira wiki markup — no `h2.` headings, us
|
|
|
108
123
|
```
|
|
109
124
|
|
|
110
125
|
Rules:
|
|
126
|
+
- PRD-sourced Issues (caller passed `prd_source`) MUST carry the Source Requirement section with verbatim quotes — paraphrases are rejected (validator gate S16). This applies at every level, sub-issues included: a leaf claimed in isolation must explain its own "why".
|
|
111
127
|
- Every acceptance criterion uses Given/When/Then. No vague "should work" language.
|
|
112
128
|
- Every criterion is independently verifiable (UI, API, data, or performance check).
|
|
113
129
|
- If the item is a Bug, include reproduction steps, expected vs. actual behavior, and environment.
|
|
@@ -28,16 +28,24 @@ Dry-run output format:
|
|
|
28
28
|
```text
|
|
29
29
|
## notion-to-tracker dry-run: <PRD title>
|
|
30
30
|
|
|
31
|
+
### Requirement register
|
|
32
|
+
- R1 §"<section heading>": "<verbatim requirement text>"
|
|
33
|
+
- R2 §"<section heading>": "<verbatim requirement text>"
|
|
34
|
+
- ...
|
|
35
|
+
|
|
31
36
|
### Planned hierarchy
|
|
32
37
|
- Epic: <summary>
|
|
33
38
|
prd_section: "<heading text from the PRD that produced this epic>"
|
|
34
39
|
prd_anchor: "<first ~10 chars>...<last ~10 chars>" # for selection_with_ellipsis; null if no specific section
|
|
40
|
+
requirements: [R1, R2] # register ids this ticket exists to satisfy; [] only for derived work
|
|
35
41
|
- Story 1.1: <summary>
|
|
36
42
|
prd_section: "<heading or user-story line>"
|
|
37
43
|
prd_anchor: "<start>...<end>"
|
|
44
|
+
requirements: [R1]
|
|
38
45
|
- Sub-task [<repo>]: <summary>
|
|
39
46
|
prd_section: "<heading or AC bullet>"
|
|
40
47
|
prd_anchor: "<start>...<end>"
|
|
48
|
+
requirements: [R1]
|
|
41
49
|
- ...
|
|
42
50
|
- Story 1.2: ...
|
|
43
51
|
|
|
@@ -77,6 +85,38 @@ The dry-run mode never writes to JIRA and never calls `mcp__atlassian__createJir
|
|
|
77
85
|
|
|
78
86
|
Bypassing `lisa-tracker-write` produces thin tickets that the rest of the lifecycle (triage, ticket-verify, journey, evidence) treats as broken. This is the most common failure mode this skill has had — calling `createJiraIssue` directly is a regression, not an optimization. The Atlassian read tools (`getJiraIssue`, `searchJiraIssuesUsingJql`, `getJiraIssueRemoteIssueLinks`, `getAccessibleAtlassianResources`, `getJiraProjectIssueTypesMetadata`, `getVisibleJiraProjects`) ARE allowed for context gathering and the Phase 5.5 preservation gate.
|
|
79
87
|
|
|
88
|
+
## Source Requirement Section (shared format)
|
|
89
|
+
|
|
90
|
+
Every ticket created by this skill — epic, story, and sub-task alike —
|
|
91
|
+
carries a `## Source Requirement` section in its description so anyone can
|
|
92
|
+
answer "why was this done?" without leaving the ticket:
|
|
93
|
+
|
|
94
|
+
```markdown
|
|
95
|
+
## Source Requirement
|
|
96
|
+
|
|
97
|
+
- **PRD**: [<PRD title>](<PRD URL>) §"<section heading>"
|
|
98
|
+
- **Requirement (R3)**: "<verbatim requirement text from the PRD>"
|
|
99
|
+
|
|
100
|
+
This ticket exists to satisfy the quoted requirement. If implementation
|
|
101
|
+
scope drifts from the quoted text, the PRD is the authority — raise the
|
|
102
|
+
conflict rather than silently reinterpreting it.
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Rules:
|
|
106
|
+
|
|
107
|
+
- **Verbatim quotes, never paraphrases.** The quote is what survives later
|
|
108
|
+
PRD edits, and it must be readable by a non-technical operator.
|
|
109
|
+
- **Multiple requirements** → one `**Requirement (Rn)**` line each.
|
|
110
|
+
- **Derived / cross-cutting work** (no single requirement) uses the
|
|
111
|
+
supporting form instead:
|
|
112
|
+
`- **Requirement**: Derived work supporting R3, R7 — no single PRD section.`
|
|
113
|
+
- **All the way down**: sub-tasks carry full quotes, not just a pointer at
|
|
114
|
+
the parent Story, so a leaf claimed by build-intake in isolation is
|
|
115
|
+
self-explanatory.
|
|
116
|
+
- JIRA descriptions render the section as `h2. Source Requirement`;
|
|
117
|
+
GitHub/Linear use the markdown heading. `lisa-tracker-write` and the
|
|
118
|
+
validators treat the section as mandatory for PRD-sourced tickets.
|
|
119
|
+
|
|
80
120
|
## Input
|
|
81
121
|
|
|
82
122
|
A Notion PRD URL. The PRD is expected to have:
|
|
@@ -122,6 +162,34 @@ If env vars are not available, ask the user to provide them explicitly before pr
|
|
|
122
162
|
- Engineering comments (prefixed with "Engineering:" or wrench emoji) that identify technical constraints
|
|
123
163
|
- Cross-PRD dependencies (references to other features or shared infrastructure)
|
|
124
164
|
|
|
165
|
+
### Phase 1.4: Requirement Register (traceability)
|
|
166
|
+
|
|
167
|
+
Every ticket this skill creates must be able to answer "why was this done?"
|
|
168
|
+
by pointing at the PRD requirement it satisfies. Build that mapping now,
|
|
169
|
+
while parsing the PRD — it cannot be reliably reconstructed afterwards.
|
|
170
|
+
|
|
171
|
+
1. **Atomize the PRD into requirements** in document order: goals, user
|
|
172
|
+
stories, functional and non-functional requirements, acceptance-criteria
|
|
173
|
+
bullets, and important notes. Use the same atomization
|
|
174
|
+
`lisa-prd-ticket-coverage` uses so the two views line up.
|
|
175
|
+
2. **Assign sequential register ids** (`R1`, `R2`, …). Ids are
|
|
176
|
+
per-generation, not durable — the **verbatim quote is the durable
|
|
177
|
+
anchor**; if the PRD is edited and re-planned, ids may shift but quotes
|
|
178
|
+
still identify the requirement.
|
|
179
|
+
3. **Record each entry** as `{ id, verbatim_text, section_heading }` plus
|
|
180
|
+
the `prd_anchor` capture described above.
|
|
181
|
+
4. **Tag every planned ticket** — epic, story, AND sub-task — with the
|
|
182
|
+
register ids it exists to satisfy. All the way down: sub-tasks carry
|
|
183
|
+
their own requirement quotes so a leaf dispatched in isolation is
|
|
184
|
+
self-explanatory. A ticket that genuinely traces to no single
|
|
185
|
+
requirement (cross-cutting infrastructure, derived enablement work)
|
|
186
|
+
gets `requirements: []` and must say which requirements it *supports*
|
|
187
|
+
in its Source Requirement section instead.
|
|
188
|
+
|
|
189
|
+
The register feeds three consumers: the `## Source Requirement` section on
|
|
190
|
+
every created ticket (Phases 3–5), the dry-run report (above), and the
|
|
191
|
+
requirement tokens in the PRD back-link (Phase 7).
|
|
192
|
+
|
|
125
193
|
### Phase 1.5: Extract Source Artifacts
|
|
126
194
|
|
|
127
195
|
PRDs typically reference external design, UX, and data artifacts (Figma files, Lovable prototypes, Loom walkthroughs, screenshots, example payloads, Confluence pages). These MUST be preserved onto the resulting tickets — otherwise developers picking up a ticket lose the source of truth. This is the failure mode this step exists to prevent.
|
|
@@ -173,9 +241,11 @@ Walkthrough findings are attached to the originating Notion PRD as a comment ("C
|
|
|
173
241
|
For each PRD epic, **invoke the `lisa-tracker-write` skill** (do not call `createJiraIssue` directly). Pass it everything it needs to enforce its quality gates:
|
|
174
242
|
|
|
175
243
|
- `project_key`: resolved by `lisa-tracker-write` from `.lisa.config.json`
|
|
244
|
+
- `prd_source`: the originating PRD URL — mandatory for every ticket this skill creates; it arms the validator's S16 traceability gate
|
|
176
245
|
- `issue_type`: `Epic`
|
|
177
246
|
- `summary`: epic title from the PRD
|
|
178
247
|
- `description_body`: a draft of the 3-audience description containing:
|
|
248
|
+
- A **Source Requirement** section (see the shared format below) citing the PRD URL, section heading, and the verbatim text of every register requirement (`R-id`) this epic exists to satisfy
|
|
179
249
|
- **Context / Business Value**: epic summary from the PRD, originating Notion URL, business outcome
|
|
180
250
|
- **Technical Approach**: cross-cutting integration points and constraints surfaced in Phase 2 codebase research
|
|
181
251
|
- List of user stories the epic contains
|
|
@@ -206,10 +276,12 @@ For each Epic, plan two kinds of stories:
|
|
|
206
276
|
For each story, **invoke `lisa-tracker-write`** with:
|
|
207
277
|
|
|
208
278
|
- `project_key`: resolved by `lisa-tracker-write` from `.lisa.config.json`
|
|
279
|
+
- `prd_source`: the originating PRD URL (arms S16)
|
|
209
280
|
- `issue_type`: `Story`
|
|
210
281
|
- `epic_parent`: the Epic key captured in Phase 3 (mandatory — `lisa-tracker-write` rejects non-bug, non-epic tickets without an epic parent)
|
|
211
282
|
- `summary`: prefixed per the naming convention above
|
|
212
283
|
- `description_body`: a draft of the 3-audience description containing:
|
|
284
|
+
- A **Source Requirement** section (shared format below) quoting the register requirement(s) this story satisfies
|
|
213
285
|
- **Context / Business Value**: the user story statement from the PRD
|
|
214
286
|
- **Technical Approach**: notes from engineering comments and Phase 2 codebase research
|
|
215
287
|
- **Acceptance Criteria** (Gherkin) derived from the functional requirements — `lisa-tracker-write` will reject prose-only acceptance criteria
|
|
@@ -244,6 +316,7 @@ Delegate sub-task creation to **parallel agents** (one per epic or batch of stor
|
|
|
244
316
|
Each sub-task MUST:
|
|
245
317
|
1. **Be scoped to exactly ONE repo** — indicated in brackets in the summary: `[repo-name]` and in the description's `## Repository` / `h2. Repository` section. `lisa-tracker-write` enforces single-repo scope on Sub-task; cross-repo or unscoped sub-tasks will be rejected and must be split/restamped before delegation.
|
|
246
318
|
2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking
|
|
319
|
+
3. **Carry its own `## Source Requirement` section** (shared format above) with the full verbatim quote(s) from the Phase 1.4 register — a leaf claimed by build-intake in isolation must be self-explanatory. When a sub-task is split per-repo, every split child inherits the same requirement quote(s).
|
|
247
320
|
|
|
248
321
|
**Leaf-only build-ready (`leaf-only-lifecycle`)**: Sub-tasks are the **leaf work units** of the decomposition — they are the ONLY items in the hierarchy that receive the build-ready label. `lisa-tracker-write` applies `status:ready` here so downstream build intake (`lisa-tracker-build-intake`) claims the leaves and never the Epic or Stories. Apply `status:ready` to each Sub-task; never to its parent Story or Epic (Phases 3–4). `lisa-tracker-write` enforces the same invariant on the write side, so a Sub-task split into per-repo children (the cross-repo case above) carries build-ready on the children, not on any intermediate parent that gains child work.
|
|
249
322
|
|
|
@@ -277,6 +350,7 @@ After all tickets are created, present a summary table to the user:
|
|
|
277
350
|
- All Epics with keys and URLs
|
|
278
351
|
- All Stories grouped by Epic
|
|
279
352
|
- All Sub-tasks grouped by Story with repo tags
|
|
353
|
+
- **Requirement coverage** — one row per Phase 1.4 register entry (`R-id`, quote excerpt, tickets that declare it); requirements with zero tickets are a gap to resolve before reporting success
|
|
280
354
|
- Repo distribution (how many tasks per repo)
|
|
281
355
|
- **Artifact Preservation Matrix** — one row per artifact showing which epic/stories reference it
|
|
282
356
|
- Blockers list with recommendations and alternatives
|
|
@@ -292,7 +366,8 @@ Invoke `lisa-prd-backlink` with:
|
|
|
292
366
|
|
|
293
367
|
- `source_type: "notion"`
|
|
294
368
|
- `source_ref`: the original PRD URL
|
|
295
|
-
- `tickets`: the full list created in Phases 3–5, each entry as `{ key, title, type, url, parent_key }`
|
|
369
|
+
- `tickets`: the full list created in Phases 3–5, each entry as `{ key, title, type, url, parent_key, requirements }` — `requirements` is the list of Phase 1.4 register ids the ticket satisfies (empty for derived work)
|
|
370
|
+
- `requirement_register`: the Phase 1.4 register (`{ id, verbatim_text, section_heading }` entries), so the back-link section can render the requirement → tickets view
|
|
296
371
|
|
|
297
372
|
If `lisa-prd-backlink` fails (PRD permission denied, Notion unreachable, source mutated mid-run), surface the error in the Phase 6 report rather than aborting — the tickets are already created and their value to the team is not blocked by the back-link write. Recommend the user re-run `lisa-prd-backlink` standalone once the source is reachable again.
|
|
298
373
|
|
|
@@ -329,8 +404,9 @@ For each sub-task, invoke `lisa-tracker-write` with:
|
|
|
329
404
|
- issue_type: "Sub-task"
|
|
330
405
|
- parent: the parent story key
|
|
331
406
|
- project_key: [PROJECT]
|
|
407
|
+
- prd_source: [the originating PRD URL — mandatory; arms the S16 traceability gate]
|
|
332
408
|
- summary: prefixed with the repo in brackets, e.g. "[backend-api] Add audit log table"
|
|
333
|
-
- description_body: a 3-section draft (Context / Technical Approach / Acceptance Criteria) plus `h2. Repository` naming exactly one repo
|
|
409
|
+
- description_body: a 3-section draft (Context / Technical Approach / Acceptance Criteria) plus `h2. Repository` naming exactly one repo, plus `h2. Source Requirement` quoting the PRD requirement(s) this sub-task satisfies VERBATIM with the PRD link and register id(s) — [paste the exact requirement text and R-ids for each sub-task from the requirement register; do not let the agent paraphrase]
|
|
334
410
|
- gherkin_acceptance_criteria: derived from the story's functional requirements
|
|
335
411
|
- sign_in_account: [test user credentials from config — name + role + how to obtain]
|
|
336
412
|
- target_environment: "dev"
|
|
@@ -19,7 +19,10 @@ Pass `$ARGUMENTS` as a single JSON-style block:
|
|
|
19
19
|
"source_type": "notion" | "confluence" | "linear" | "github" | "file",
|
|
20
20
|
"source_ref": "<URL, page id, project id, issue ref, or absolute file path>",
|
|
21
21
|
"tickets": [
|
|
22
|
-
{ "key": "<tracker-key>", "title": "<summary>", "type": "Epic|Story|Task|Sub-task|Bug|Spike", "url": "<link>", "parent_key": "<key or null>" }
|
|
22
|
+
{ "key": "<tracker-key>", "title": "<summary>", "type": "Epic|Story|Task|Sub-task|Bug|Spike", "url": "<link>", "parent_key": "<key or null>", "requirements": ["R1", "R3"] }
|
|
23
|
+
],
|
|
24
|
+
"requirement_register": [
|
|
25
|
+
{ "id": "R1", "verbatim_text": "<requirement text quoted from the PRD>", "section_heading": "<PRD heading>" }
|
|
23
26
|
],
|
|
24
27
|
"section_heading": "## Tickets" // optional override; default "## Tickets"
|
|
25
28
|
}
|
|
@@ -58,6 +61,11 @@ The rendered section must be deterministic — same inputs produce identical out
|
|
|
58
61
|
|
|
59
62
|
_Generated by `lisa-prd-backlink`. Regenerated on every Plan run; do not edit by hand._
|
|
60
63
|
|
|
64
|
+
### Requirement coverage
|
|
65
|
+
|
|
66
|
+
- **R1** §"<PRD heading>": "<verbatim requirement text>" — [<key>](<url>), [<key>](<url>)
|
|
67
|
+
- **R2** §"<PRD heading>": "<verbatim requirement text>" — _no tickets — gap_
|
|
68
|
+
|
|
61
69
|
### <Epic key>: <Epic title>
|
|
62
70
|
|
|
63
71
|
- [<Epic key>](<url>) — Epic <!-- lisa:gw ref=<ref> url=<url> type=Epic parent= -->
|
|
@@ -80,7 +88,7 @@ _Generated by `lisa-prd-backlink`. Regenerated on every Plan run; do not edit by
|
|
|
80
88
|
Every list entry ends with a single-line HTML comment — invisible in rendered markdown, so the section stays clean for humans, but a stable, greppable record for machines:
|
|
81
89
|
|
|
82
90
|
```text
|
|
83
|
-
<!-- lisa:gw ref=<ref> url=<url> type=<type> parent=<parent-ref or empty> -->
|
|
91
|
+
<!-- lisa:gw ref=<ref> url=<url> type=<type> parent=<parent-ref or empty> reqs=<comma-separated requirement ids or empty> -->
|
|
84
92
|
```
|
|
85
93
|
|
|
86
94
|
- **`lisa-gw`** — a fixed sentinel (`gw` = generated work). A reader enumerates the generated child set by matching `<!-- lisa:gw ` lines; it never has to parse the surrounding prose, headings, or indentation.
|
|
@@ -88,8 +96,9 @@ Every list entry ends with a single-line HTML comment — invisible in rendered
|
|
|
88
96
|
- **`url`** — the canonical URL of the work item.
|
|
89
97
|
- **`type`** — `Epic | Story | Task | Sub-task | Bug | Spike` (verbatim from the ticket's `type`).
|
|
90
98
|
- **`parent`** — the **`ref`** of this entry's parent (its `parent_key` resolved to the parent's ref), or **empty** when the entry is top-level (`parent_key` null/empty). A reader selects the **generated top-level child set** — exactly what the PRD owns per the rule — as every `lisa-gw` line whose `parent` is empty.
|
|
99
|
+
- **`reqs`** — comma-separated requirement register ids (`R1,R3`) the ticket's `requirements` list declares, or **empty** for derived work or tickets created before traceability. This makes the requirement → tickets mapping parseable from the PRD alone: a reader answers "which tickets carry R3?" by matching `reqs=` tokens, deterministically — no inference.
|
|
91
100
|
|
|
92
|
-
The visible markdown link and the token always carry the same `ref`/`url`/`type`; the token is the authoritative machine field (the prose may wrap or be reflowed by a host editor, the comment line will not). Field order within the token is fixed (`ref`, `url`, `type`, `parent`) so output is byte-stable.
|
|
101
|
+
The visible markdown link and the token always carry the same `ref`/`url`/`type`; the token is the authoritative machine field (the prose may wrap or be reflowed by a host editor, the comment line will not). Field order within the token is fixed (`ref`, `url`, `type`, `parent`, `reqs`) so output is byte-stable.
|
|
93
102
|
|
|
94
103
|
If the input contains zero items, write the section header with a single line: `_No tickets created — Plan flow may not have completed._` Do not omit the section; presence-of-section is itself a signal to Debrief, and the always-written guarantee means a reader can always distinguish "ran, produced nothing" from "never ran."
|
|
95
104
|
|