@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
package/package.json
CHANGED
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
"ws": ">=8.20.1"
|
|
96
96
|
},
|
|
97
97
|
"name": "@codyswann/lisa",
|
|
98
|
-
"version": "2.
|
|
98
|
+
"version": "2.217.0",
|
|
99
99
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
100
100
|
"main": "dist/index.js",
|
|
101
101
|
"exports": {
|
|
@@ -32,16 +32,24 @@ resolvable anchor exists).
|
|
|
32
32
|
```text
|
|
33
33
|
## confluence-to-tracker dry-run: <PRD title>
|
|
34
34
|
|
|
35
|
+
### Requirement register
|
|
36
|
+
- R1 §"<section heading>": "<verbatim requirement text>"
|
|
37
|
+
- R2 §"<section heading>": "<verbatim requirement text>"
|
|
38
|
+
- ...
|
|
39
|
+
|
|
35
40
|
### Planned hierarchy
|
|
36
41
|
- Epic: <summary>
|
|
37
42
|
prd_section: "<heading text from the PRD that produced this epic>"
|
|
38
43
|
prd_anchor: "<inline-comment anchor text>" # null if no specific section
|
|
44
|
+
requirements: [R1, R2] # register ids this ticket exists to satisfy; [] only for derived work
|
|
39
45
|
- Story 1.1: <summary>
|
|
40
46
|
prd_section: "<heading or user-story line>"
|
|
41
47
|
prd_anchor: "<anchor>"
|
|
48
|
+
requirements: [R1]
|
|
42
49
|
- Sub-task [<repo>]: <summary>
|
|
43
50
|
prd_section: "<heading or AC bullet>"
|
|
44
51
|
prd_anchor: "<anchor>"
|
|
52
|
+
requirements: [R1]
|
|
45
53
|
- ...
|
|
46
54
|
- Story 1.2: ...
|
|
47
55
|
|
|
@@ -87,6 +95,38 @@ Why parent-page-based, not label-based: scoped Atlassian API tokens cannot write
|
|
|
87
95
|
|
|
88
96
|
Bypassing `lisa-tracker-write` produces thin tickets that the rest of the lifecycle (triage, ticket-verify, journey, evidence) treats as broken. Read operations on Atlassian (ticket reads, JQL search, Confluence page reads, comment fetches) are still performed in this skill — but ONLY via `lisa-atlassian-access` (`operation: read-ticket | search-issues | read-page | search-pages | list-sites`), never via direct MCP tool calls or `acli`.
|
|
89
97
|
|
|
98
|
+
## Source Requirement Section (shared format)
|
|
99
|
+
|
|
100
|
+
Every ticket created by this skill — epic, story, and sub-task alike —
|
|
101
|
+
carries a `## Source Requirement` section in its description so anyone can
|
|
102
|
+
answer "why was this done?" without leaving the ticket:
|
|
103
|
+
|
|
104
|
+
```markdown
|
|
105
|
+
## Source Requirement
|
|
106
|
+
|
|
107
|
+
- **PRD**: [<PRD title>](<PRD URL>) §"<section heading>"
|
|
108
|
+
- **Requirement (R3)**: "<verbatim requirement text from the PRD>"
|
|
109
|
+
|
|
110
|
+
This ticket exists to satisfy the quoted requirement. If implementation
|
|
111
|
+
scope drifts from the quoted text, the PRD is the authority — raise the
|
|
112
|
+
conflict rather than silently reinterpreting it.
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Rules:
|
|
116
|
+
|
|
117
|
+
- **Verbatim quotes, never paraphrases.** The quote is what survives later
|
|
118
|
+
PRD edits, and it must be readable by a non-technical operator.
|
|
119
|
+
- **Multiple requirements** → one `**Requirement (Rn)**` line each.
|
|
120
|
+
- **Derived / cross-cutting work** (no single requirement) uses the
|
|
121
|
+
supporting form instead:
|
|
122
|
+
`- **Requirement**: Derived work supporting R3, R7 — no single PRD section.`
|
|
123
|
+
- **All the way down**: sub-tasks carry full quotes, not just a pointer at
|
|
124
|
+
the parent Story, so a leaf claimed by build-intake in isolation is
|
|
125
|
+
self-explanatory.
|
|
126
|
+
- JIRA descriptions render the section as `h2. Source Requirement`;
|
|
127
|
+
GitHub/Linear use the markdown heading. `lisa-tracker-write` and the
|
|
128
|
+
validators treat the section as mandatory for PRD-sourced tickets.
|
|
129
|
+
|
|
90
130
|
## Input
|
|
91
131
|
|
|
92
132
|
A Confluence PRD page URL or page ID. The PRD is expected to have:
|
|
@@ -150,6 +190,34 @@ If env vars are not available, ask the user to provide them explicitly before pr
|
|
|
150
190
|
- Engineering comments (prefixed with "Engineering:" or wrench emoji) that identify technical constraints
|
|
151
191
|
- Cross-PRD dependencies (references to other features or shared infrastructure)
|
|
152
192
|
|
|
193
|
+
### Phase 1.4: Requirement Register (traceability)
|
|
194
|
+
|
|
195
|
+
Every ticket this skill creates must be able to answer "why was this done?"
|
|
196
|
+
by pointing at the PRD requirement it satisfies. Build that mapping now,
|
|
197
|
+
while parsing the PRD — it cannot be reliably reconstructed afterwards.
|
|
198
|
+
|
|
199
|
+
1. **Atomize the PRD into requirements** in document order: goals, user
|
|
200
|
+
stories, functional and non-functional requirements, acceptance-criteria
|
|
201
|
+
bullets, and important notes. Use the same atomization
|
|
202
|
+
`lisa-prd-ticket-coverage` uses so the two views line up.
|
|
203
|
+
2. **Assign sequential register ids** (`R1`, `R2`, …). Ids are
|
|
204
|
+
per-generation, not durable — the **verbatim quote is the durable
|
|
205
|
+
anchor**; if the PRD is edited and re-planned, ids may shift but quotes
|
|
206
|
+
still identify the requirement.
|
|
207
|
+
3. **Record each entry** as `{ id, verbatim_text, section_heading }` plus
|
|
208
|
+
the inline-comment anchor capture described in the dry-run format above.
|
|
209
|
+
4. **Tag every planned ticket** — epic, story, AND sub-task — with the
|
|
210
|
+
register ids it exists to satisfy. All the way down: sub-tasks carry
|
|
211
|
+
their own requirement quotes so a leaf dispatched in isolation is
|
|
212
|
+
self-explanatory. A ticket that genuinely traces to no single
|
|
213
|
+
requirement (cross-cutting infrastructure, derived enablement work)
|
|
214
|
+
gets `requirements: []` and must say which requirements it *supports*
|
|
215
|
+
in its Source Requirement section instead.
|
|
216
|
+
|
|
217
|
+
The register feeds three consumers: the `## Source Requirement` section on
|
|
218
|
+
every created ticket (Phases 3–5), the dry-run report (above), and the
|
|
219
|
+
requirement tokens in the PRD back-link (Phase 7).
|
|
220
|
+
|
|
153
221
|
### Phase 1.5: Extract Source Artifacts
|
|
154
222
|
|
|
155
223
|
PRDs typically reference external design, UX, and data artifacts (Figma files, Lovable prototypes, Loom walkthroughs, screenshots, example payloads, peer 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.
|
|
@@ -196,8 +264,10 @@ For each PRD epic, **invoke the `lisa-tracker-write` skill** (do not invoke `lis
|
|
|
196
264
|
|
|
197
265
|
- `project_key`: resolved by `lisa-tracker-write` from `.lisa.config.json`
|
|
198
266
|
- `issue_type`: `Epic`
|
|
267
|
+
- `prd_source`: the originating PRD URL — mandatory for every ticket this skill creates; it arms the validator's S16 traceability gate
|
|
199
268
|
- `summary`: epic title from the PRD
|
|
200
269
|
- `description_body`: a draft of the 3-audience description containing:
|
|
270
|
+
- A **Source Requirement** section (see the shared format above) citing the Confluence page URL, section heading, and the verbatim text of every register requirement (`R-id`) this epic exists to satisfy
|
|
201
271
|
- **Context / Business Value**: epic summary from the PRD, originating Confluence URL, business outcome
|
|
202
272
|
- **Technical Approach**: cross-cutting integration points and constraints surfaced in Phase 2 codebase research
|
|
203
273
|
- List of user stories the epic contains
|
|
@@ -226,9 +296,10 @@ For each story, **invoke `lisa-tracker-write`** with:
|
|
|
226
296
|
|
|
227
297
|
- `project_key`: resolved by `lisa-tracker-write` from `.lisa.config.json`
|
|
228
298
|
- `issue_type`: `Story`
|
|
299
|
+
- `prd_source`: the originating PRD URL — mandatory for every ticket this skill creates; it arms the validator's S16 traceability gate
|
|
229
300
|
- `epic_parent`: the Epic key captured in Phase 3 (mandatory)
|
|
230
301
|
- `summary`: prefixed per the naming convention above
|
|
231
|
-
- `description_body`: 3-audience description as in `lisa-notion-to-tracker` Phase 4
|
|
302
|
+
- `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
|
|
232
303
|
- `artifacts`: the Phase 1.5 artifacts filtered by domain per the inheritance table below
|
|
233
304
|
|
|
234
305
|
| Story type | Inherits domains |
|
|
@@ -253,6 +324,7 @@ Delegate sub-task creation to **parallel agents** (one per epic or batch of stor
|
|
|
253
324
|
Each sub-task MUST:
|
|
254
325
|
1. **Be scoped to exactly ONE repo** — indicated in brackets in the summary: `[repo-name]` and in the description's `## Repository` / `h2. Repository` section
|
|
255
326
|
2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking
|
|
327
|
+
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).
|
|
256
328
|
|
|
257
329
|
**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.
|
|
258
330
|
|
|
@@ -277,6 +349,7 @@ After all tickets are created, present a summary table to the user:
|
|
|
277
349
|
- All Epics with keys and URLs
|
|
278
350
|
- All Stories grouped by Epic
|
|
279
351
|
- All Sub-tasks grouped by Story with repo tags
|
|
352
|
+
- **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
353
|
- Repo distribution
|
|
281
354
|
- **Artifact Preservation Matrix**
|
|
282
355
|
- Blockers list with recommendations and alternatives
|
|
@@ -292,7 +365,8 @@ Invoke `lisa-prd-backlink` with:
|
|
|
292
365
|
|
|
293
366
|
- `source_type: "confluence"`
|
|
294
367
|
- `source_ref`: the original Confluence page URL
|
|
295
|
-
- `tickets`: the full list created in Phases 3–5, each entry as `{ key, title, type, url, parent_key }`
|
|
368
|
+
- `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)
|
|
369
|
+
- `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
370
|
|
|
297
371
|
If `lisa-prd-backlink` fails (page permission denied, Confluence 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.
|
|
298
372
|
|
|
@@ -321,10 +395,11 @@ tickets that downstream skills (triage, journey, evidence) cannot use.
|
|
|
321
395
|
|
|
322
396
|
For each sub-task, invoke `lisa-tracker-write` with:
|
|
323
397
|
- issue_type: "Sub-task"
|
|
398
|
+
- prd_source: [the originating PRD URL — mandatory; arms the S16 traceability gate]
|
|
324
399
|
- parent: the parent story key
|
|
325
400
|
- project_key: [PROJECT]
|
|
326
401
|
- summary: prefixed with the repo in brackets, e.g. "[backend-api] Add audit log table"
|
|
327
|
-
- description_body: a 3-section draft (Context / Technical Approach / Acceptance Criteria) plus `h2. Repository` naming exactly one repo
|
|
402
|
+
- 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]
|
|
328
403
|
- gherkin_acceptance_criteria: derived from the story's functional requirements
|
|
329
404
|
- sign_in_account: [test user credentials from config — name + role + how to obtain]
|
|
330
405
|
- target_environment: "dev"
|
|
@@ -28,21 +28,29 @@ This skill supports two modes, controlled by a `dry_run` flag in `$ARGUMENTS`:
|
|
|
28
28
|
- **`dry_run: false`** (default — full mode): run all phases, write tickets via `lisa-tracker-write`, run the preservation gate, report.
|
|
29
29
|
- **`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-github-prd-intake`) can decide whether to proceed.
|
|
30
30
|
|
|
31
|
-
Dry-run output format is identical to `lisa-notion-to-tracker` / `lisa-confluence-to-tracker` / `lisa-linear-to-tracker`. Reuse the same fields, including `prd_anchor` and `prd_section
|
|
31
|
+
Dry-run output format is identical to `lisa-notion-to-tracker` / `lisa-confluence-to-tracker` / `lisa-linear-to-tracker`. Reuse the same fields, including `prd_anchor` and `prd_section`, the `### Requirement register` section, and the per-node `requirements:` lists. For GitHub, `prd_anchor` is a section heading from the PRD body when the failure traces to a specific section; otherwise `null` (the caller posts unanchored failures as a rollup comment on the PRD issue).
|
|
32
32
|
|
|
33
33
|
```text
|
|
34
34
|
## github-to-tracker dry-run: <PRD title>
|
|
35
35
|
|
|
36
|
+
### Requirement register
|
|
37
|
+
- R1 §"<section heading>": "<verbatim requirement text>"
|
|
38
|
+
- R2 §"<section heading>": "<verbatim requirement text>"
|
|
39
|
+
- ...
|
|
40
|
+
|
|
36
41
|
### Planned hierarchy
|
|
37
42
|
- Epic: <summary>
|
|
38
43
|
prd_section: "<heading text from the PRD body or sub-issue title that produced this epic>"
|
|
39
44
|
prd_anchor: "<heading text or sub-issue ref or null>"
|
|
45
|
+
requirements: [R1, R2] # register ids this ticket exists to satisfy; [] only for derived work
|
|
40
46
|
- Story 1.1: <summary>
|
|
41
47
|
prd_section: "<heading or user-story line>"
|
|
42
48
|
prd_anchor: "<heading or sub-issue ref or null>"
|
|
49
|
+
requirements: [R1]
|
|
43
50
|
- Sub-task [<repo>]: <summary>
|
|
44
51
|
prd_section: "<heading or AC bullet>"
|
|
45
52
|
prd_anchor: "<heading or sub-issue ref or null>"
|
|
53
|
+
requirements: [R1]
|
|
46
54
|
- ...
|
|
47
55
|
- Story 1.2: ...
|
|
48
56
|
|
|
@@ -77,6 +85,38 @@ Bypassing the shim layer produces tickets that the rest of the lifecycle (triage
|
|
|
77
85
|
|
|
78
86
|
The `gh` reads in this skill are limited to reading the source PRD issue, its sub-issues, and its comments. They never write.
|
|
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 body 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 GitHub issue ref. The PRD is expected to have:
|
|
@@ -133,6 +173,36 @@ If env vars are not available, ask the user to provide them explicitly before pr
|
|
|
133
173
|
- Engineering comments (prefixed with "Engineering:" or 🔧) that identify technical constraints.
|
|
134
174
|
- Cross-PRD dependencies (references to other GitHub issues, Notion / Confluence / Linear PRDs, shared infrastructure).
|
|
135
175
|
|
|
176
|
+
### Phase 1.4: Requirement Register (traceability)
|
|
177
|
+
|
|
178
|
+
Every ticket this skill creates must be able to answer "why was this done?"
|
|
179
|
+
by pointing at the PRD requirement it satisfies. Build that mapping now,
|
|
180
|
+
while parsing the PRD — it cannot be reliably reconstructed afterwards.
|
|
181
|
+
|
|
182
|
+
1. **Atomize the PRD into requirements** in document order: goals, user
|
|
183
|
+
stories, functional and non-functional requirements, acceptance-criteria
|
|
184
|
+
bullets, and important notes — across the PRD issue body AND every
|
|
185
|
+
sub-issue body. Use the same atomization `lisa-prd-ticket-coverage`
|
|
186
|
+
uses so the two views line up.
|
|
187
|
+
2. **Assign sequential register ids** (`R1`, `R2`, …). Ids are
|
|
188
|
+
per-generation, not durable — the **verbatim quote is the durable
|
|
189
|
+
anchor**; if the PRD is edited and re-planned, ids may shift but quotes
|
|
190
|
+
still identify the requirement.
|
|
191
|
+
3. **Record each entry** as `{ id, verbatim_text, section_heading }`,
|
|
192
|
+
where `section_heading` is the markdown heading (or sub-issue ref)
|
|
193
|
+
the requirement lives under — the same value used for `prd_anchor`.
|
|
194
|
+
4. **Tag every planned ticket** — Epic, Story, AND Sub-task — with the
|
|
195
|
+
register ids it exists to satisfy. All the way down: sub-tasks carry
|
|
196
|
+
their own requirement quotes so a leaf dispatched in isolation is
|
|
197
|
+
self-explanatory. A ticket that genuinely traces to no single
|
|
198
|
+
requirement (cross-cutting infrastructure, derived enablement work)
|
|
199
|
+
gets `requirements: []` and must say which requirements it *supports*
|
|
200
|
+
in its Source Requirement section instead.
|
|
201
|
+
|
|
202
|
+
The register feeds three consumers: the `## Source Requirement` section on
|
|
203
|
+
every created ticket (Phases 3–5), the dry-run report (above), and the
|
|
204
|
+
requirement tokens in the PRD back-link (Phase 7).
|
|
205
|
+
|
|
136
206
|
### Phase 1.5: Extract Source Artifacts
|
|
137
207
|
|
|
138
208
|
PRDs typically reference external design, UX, and data artifacts (Figma files, Lovable prototypes, Loom walkthroughs, screenshots, example payloads, peer Notion / Confluence / Linear 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.
|
|
@@ -178,8 +248,10 @@ Walkthrough findings are surfaced back to product via the orchestrating intake s
|
|
|
178
248
|
For each epic identified in Phase 1, **invoke the `lisa-tracker-write` shim** (do not call `lisa-jira-write-ticket` or `lisa-github-write-issue` directly). Pass it everything it needs to enforce its quality gates:
|
|
179
249
|
|
|
180
250
|
- `issue_type`: `Epic`
|
|
251
|
+
- `prd_source`: the originating PRD URL — mandatory for every ticket this skill creates; it arms the validator's S16 traceability gate
|
|
181
252
|
- `summary`: epic title from the PRD
|
|
182
253
|
- `body`: a draft of the multi-section description containing:
|
|
254
|
+
- A **Source Requirement** section (see the shared format above) citing the GitHub Issue PRD URL, section heading, and the verbatim text of every register requirement (`R-id`) this epic exists to satisfy
|
|
183
255
|
- **Context / Business Value**: epic summary from the PRD, originating GitHub PRD URL, business outcome
|
|
184
256
|
- **Technical Approach**: cross-cutting integration points and constraints surfaced in Phase 2 codebase research
|
|
185
257
|
- List of user stories the epic contains
|
|
@@ -209,9 +281,10 @@ For each Epic, plan two kinds of Stories:
|
|
|
209
281
|
For each Story, **invoke `lisa-tracker-write`** with:
|
|
210
282
|
|
|
211
283
|
- `issue_type`: `Story`
|
|
284
|
+
- `prd_source`: the originating PRD URL — mandatory for every ticket this skill creates; it arms the validator's S16 traceability gate
|
|
212
285
|
- `parent_ref` / `epic_parent`: the Epic ref captured in Phase 3 (mandatory)
|
|
213
286
|
- `summary`: prefixed per the naming convention above
|
|
214
|
-
- `body`: multi-section description as in `lisa-notion-to-tracker` Phase 4
|
|
287
|
+
- `body`: multi-section 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
|
|
215
288
|
- `artifacts`: the Phase 1.5 artifacts filtered by domain per the inheritance table:
|
|
216
289
|
|
|
217
290
|
| Story type | Inherits domains |
|
|
@@ -236,6 +309,7 @@ Delegate sub-task creation to **parallel agents** (one per epic or batch of stor
|
|
|
236
309
|
Each sub-task MUST:
|
|
237
310
|
1. **Be scoped to exactly ONE repo** — indicated in brackets in the summary: `[repo-name]` and in the body/description's `## Repository` / `h2. Repository` section.
|
|
238
311
|
2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking.
|
|
312
|
+
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).
|
|
239
313
|
|
|
240
314
|
**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-github-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-github-write-issue` 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.
|
|
241
315
|
|
|
@@ -260,6 +334,7 @@ After all tickets are created, present a summary table to the user:
|
|
|
260
334
|
- All Epics with refs and URLs
|
|
261
335
|
- All Stories grouped by Epic
|
|
262
336
|
- All Sub-tasks grouped by Story with repo tags
|
|
337
|
+
- **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
|
|
263
338
|
- Repo distribution
|
|
264
339
|
- **Artifact Preservation Matrix**
|
|
265
340
|
- Blockers list with recommendations and alternatives
|
|
@@ -275,7 +350,8 @@ Invoke `lisa-prd-backlink` with:
|
|
|
275
350
|
|
|
276
351
|
- `source_type: "github"`
|
|
277
352
|
- `source_ref`: the original GitHub Issue URL or `<org>/<repo>#<n>` token
|
|
278
|
-
- `tickets`: the full list created in Phases 3–5, each entry as `{ key, title, type, url, parent_key }`
|
|
353
|
+
- `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)
|
|
354
|
+
- `requirement_register`: the Phase 1.4 register (`{ id, verbatim_text, section_heading }` entries), so the back-link section can render the requirement → tickets view
|
|
279
355
|
|
|
280
356
|
If `lisa-prd-backlink` fails (permission denied, GitHub unreachable, issue locked), 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.
|
|
281
357
|
|
|
@@ -304,9 +380,10 @@ that downstream skills (triage, journey, evidence) cannot use.
|
|
|
304
380
|
|
|
305
381
|
For each sub-task, invoke `lisa-tracker-write` with:
|
|
306
382
|
- issue_type: "Sub-task"
|
|
383
|
+
- prd_source: [the originating PRD URL — mandatory; arms the S16 traceability gate]
|
|
307
384
|
- parent_ref: the parent story ref
|
|
308
385
|
- summary: prefixed with the repo in brackets, e.g. "[backend-api] Add audit log table"
|
|
309
|
-
- body: a multi-section draft (Context / Technical Approach / Acceptance Criteria / etc.) plus `## Repository` / `h2. Repository` naming exactly one repo
|
|
386
|
+
- body: a multi-section draft (Context / Technical Approach / Acceptance Criteria / etc.) plus `## Repository` / `h2. Repository` naming exactly one repo, plus `## 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]
|
|
310
387
|
- gherkin_acceptance_criteria: derived from the story's functional requirements
|
|
311
388
|
- sign_in_account: [test user credentials from config]
|
|
312
389
|
- target_environment: "dev"
|
|
@@ -65,6 +65,7 @@ remote_links: [{ url: "https://github.com/.../pull/42", title: "PR #42" }]
|
|
|
65
65
|
journey_followup: auto # auto | none — see S11
|
|
66
66
|
build_ready: true # caller asserts the build-ready role (status:ready) is/would be applied — see S15
|
|
67
67
|
child_refs: ["my-org/my-repo#601", "my-org/my-repo#602"] # known child work (sub-issues / task-list / "Blocked by" parentage) — see S15
|
|
68
|
+
prd_source: "https://notion.so/..." # set when the issue was generated from a PRD — requires the Source Requirement section, see S16
|
|
68
69
|
```
|
|
69
70
|
|
|
70
71
|
If the caller passes only an issue ref, fetch via `gh issue view <number> --repo <org>/<repo> --json number,title,body,labels,state,milestone,assignees`, parse the body sections, derive the spec fields, then run gates. The parser lives in `lisa-github-read-issue` (composition).
|
|
@@ -92,6 +93,7 @@ Each gate is tagged with a fixed `category` and a `product_relevant` boolean. Ca
|
|
|
92
93
|
| S13 Relationship Search | `dependency` | true |
|
|
93
94
|
| S14 Evidence manifest binding (leaf work units) | `acceptance-criteria` | true |
|
|
94
95
|
| S15 Leaf-only build-ready | `structural` | false |
|
|
96
|
+
| S16 Source Requirement traceability | `product-clarity` | true |
|
|
95
97
|
| F1 Issue type label exists in repo | `structural` | false |
|
|
96
98
|
| F2 Parent sub-issue exists and is the right type | `structural` | false |
|
|
97
99
|
| F3 Linked issues exist | `structural` | false |
|
|
@@ -235,6 +237,34 @@ Remediation: `"Build-ready (status:ready) is leaf-only per leaf-only-lifecycle.
|
|
|
235
237
|
|
|
236
238
|
`product_relevant: false` — a build-ready container is a lifecycle/decomposition error for the caller to repair, not a product question.
|
|
237
239
|
|
|
240
|
+
#### S16 — Source Requirement traceability (PRD-sourced issues)
|
|
241
|
+
|
|
242
|
+
Answers "why was this done?": every issue generated from a PRD must carry
|
|
243
|
+
the requirement it exists to satisfy, quoted verbatim, at every level of
|
|
244
|
+
the hierarchy — sub-issues included, so a leaf claimed by build-intake in
|
|
245
|
+
isolation is self-explanatory.
|
|
246
|
+
|
|
247
|
+
**When the gate applies.** Run S16 whenever the spec declares `prd_source`
|
|
248
|
+
(all `*-to-tracker` decomposition paths set it). Without `prd_source`
|
|
249
|
+
(ad-hoc issues with no PRD lineage) the gate is `N/A` — but if a
|
|
250
|
+
`Source Requirement` section is present anyway, still validate its shape
|
|
251
|
+
so a malformed section never passes silently.
|
|
252
|
+
|
|
253
|
+
**What must be present.** a `Source Requirement` section (`##` markdown heading) containing:
|
|
254
|
+
|
|
255
|
+
1. A link to the source PRD (the `**PRD**:` line), and
|
|
256
|
+
2. At least one `**Requirement` line with **verbatim quoted text**, or the
|
|
257
|
+
explicit derived-work form (`Derived work supporting R3, R7 — no single
|
|
258
|
+
PRD section.`).
|
|
259
|
+
|
|
260
|
+
Missing section, missing PRD link, empty/paraphrased requirement text
|
|
261
|
+
(quotes shorter than a few words, or prose with no quotation), or a bare
|
|
262
|
+
R-id with no quote: FAIL with remediation
|
|
263
|
+
`"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."`
|
|
264
|
+
|
|
265
|
+
`product_relevant: true` — a issue whose requirement cannot be traced is
|
|
266
|
+
a product-clarity problem: nobody can tell why the work exists.
|
|
267
|
+
|
|
238
268
|
### Feasibility Gates (require GitHub lookups; skip in `--spec-only`)
|
|
239
269
|
|
|
240
270
|
#### F1 — Issue type label exists in repo
|
|
@@ -321,6 +351,7 @@ Output is a single fenced text block. Callers parse it; do not add free-form pro
|
|
|
321
351
|
- [PASS|FAIL|N/A] S13 Relationship Search — <one-line reason>
|
|
322
352
|
- [PASS|FAIL|N/A] S14 Evidence manifest binding — <one-line reason>
|
|
323
353
|
- [PASS|FAIL|N/A] S15 Leaf-only build-ready — <one-line reason>
|
|
354
|
+
- [PASS|FAIL|N/A] S16 Source Requirement traceability — <one-line reason>
|
|
324
355
|
|
|
325
356
|
### Feasibility Gates (omit this section when --spec-only)
|
|
326
357
|
- [PASS|FAIL|N/A] F1 Issue type label exists in repo — <one-line reason>
|
|
@@ -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.
|