@codyswann/lisa 2.215.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
|
@@ -38,16 +38,24 @@ resolvable anchor exists).
|
|
|
38
38
|
```text
|
|
39
39
|
## confluence-to-tracker dry-run: <PRD title>
|
|
40
40
|
|
|
41
|
+
### Requirement register
|
|
42
|
+
- R1 §"<section heading>": "<verbatim requirement text>"
|
|
43
|
+
- R2 §"<section heading>": "<verbatim requirement text>"
|
|
44
|
+
- ...
|
|
45
|
+
|
|
41
46
|
### Planned hierarchy
|
|
42
47
|
- Epic: <summary>
|
|
43
48
|
prd_section: "<heading text from the PRD that produced this epic>"
|
|
44
49
|
prd_anchor: "<inline-comment anchor text>" # null if no specific section
|
|
50
|
+
requirements: [R1, R2] # register ids this ticket exists to satisfy; [] only for derived work
|
|
45
51
|
- Story 1.1: <summary>
|
|
46
52
|
prd_section: "<heading or user-story line>"
|
|
47
53
|
prd_anchor: "<anchor>"
|
|
54
|
+
requirements: [R1]
|
|
48
55
|
- Sub-task [<repo>]: <summary>
|
|
49
56
|
prd_section: "<heading or AC bullet>"
|
|
50
57
|
prd_anchor: "<anchor>"
|
|
58
|
+
requirements: [R1]
|
|
51
59
|
- ...
|
|
52
60
|
- Story 1.2: ...
|
|
53
61
|
|
|
@@ -93,6 +101,38 @@ Why parent-page-based, not label-based: scoped Atlassian API tokens cannot write
|
|
|
93
101
|
|
|
94
102
|
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`.
|
|
95
103
|
|
|
104
|
+
## Source Requirement Section (shared format)
|
|
105
|
+
|
|
106
|
+
Every ticket created by this skill — epic, story, and sub-task alike —
|
|
107
|
+
carries a `## Source Requirement` section in its description so anyone can
|
|
108
|
+
answer "why was this done?" without leaving the ticket:
|
|
109
|
+
|
|
110
|
+
```markdown
|
|
111
|
+
## Source Requirement
|
|
112
|
+
|
|
113
|
+
- **PRD**: [<PRD title>](<PRD URL>) §"<section heading>"
|
|
114
|
+
- **Requirement (R3)**: "<verbatim requirement text from the PRD>"
|
|
115
|
+
|
|
116
|
+
This ticket exists to satisfy the quoted requirement. If implementation
|
|
117
|
+
scope drifts from the quoted text, the PRD is the authority — raise the
|
|
118
|
+
conflict rather than silently reinterpreting it.
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Rules:
|
|
122
|
+
|
|
123
|
+
- **Verbatim quotes, never paraphrases.** The quote is what survives later
|
|
124
|
+
PRD edits, and it must be readable by a non-technical operator.
|
|
125
|
+
- **Multiple requirements** → one `**Requirement (Rn)**` line each.
|
|
126
|
+
- **Derived / cross-cutting work** (no single requirement) uses the
|
|
127
|
+
supporting form instead:
|
|
128
|
+
`- **Requirement**: Derived work supporting R3, R7 — no single PRD section.`
|
|
129
|
+
- **All the way down**: sub-tasks carry full quotes, not just a pointer at
|
|
130
|
+
the parent Story, so a leaf claimed by build-intake in isolation is
|
|
131
|
+
self-explanatory.
|
|
132
|
+
- JIRA descriptions render the section as `h2. Source Requirement`;
|
|
133
|
+
GitHub/Linear use the markdown heading. `lisa-tracker-write` and the
|
|
134
|
+
validators treat the section as mandatory for PRD-sourced tickets.
|
|
135
|
+
|
|
96
136
|
## Input
|
|
97
137
|
|
|
98
138
|
A Confluence PRD page URL or page ID. The PRD is expected to have:
|
|
@@ -156,6 +196,34 @@ If env vars are not available, ask the user to provide them explicitly before pr
|
|
|
156
196
|
- Engineering comments (prefixed with "Engineering:" or wrench emoji) that identify technical constraints
|
|
157
197
|
- Cross-PRD dependencies (references to other features or shared infrastructure)
|
|
158
198
|
|
|
199
|
+
### Phase 1.4: Requirement Register (traceability)
|
|
200
|
+
|
|
201
|
+
Every ticket this skill creates must be able to answer "why was this done?"
|
|
202
|
+
by pointing at the PRD requirement it satisfies. Build that mapping now,
|
|
203
|
+
while parsing the PRD — it cannot be reliably reconstructed afterwards.
|
|
204
|
+
|
|
205
|
+
1. **Atomize the PRD into requirements** in document order: goals, user
|
|
206
|
+
stories, functional and non-functional requirements, acceptance-criteria
|
|
207
|
+
bullets, and important notes. Use the same atomization
|
|
208
|
+
`lisa-prd-ticket-coverage` uses so the two views line up.
|
|
209
|
+
2. **Assign sequential register ids** (`R1`, `R2`, …). Ids are
|
|
210
|
+
per-generation, not durable — the **verbatim quote is the durable
|
|
211
|
+
anchor**; if the PRD is edited and re-planned, ids may shift but quotes
|
|
212
|
+
still identify the requirement.
|
|
213
|
+
3. **Record each entry** as `{ id, verbatim_text, section_heading }` plus
|
|
214
|
+
the inline-comment anchor capture described in the dry-run format above.
|
|
215
|
+
4. **Tag every planned ticket** — epic, story, AND sub-task — with the
|
|
216
|
+
register ids it exists to satisfy. All the way down: sub-tasks carry
|
|
217
|
+
their own requirement quotes so a leaf dispatched in isolation is
|
|
218
|
+
self-explanatory. A ticket that genuinely traces to no single
|
|
219
|
+
requirement (cross-cutting infrastructure, derived enablement work)
|
|
220
|
+
gets `requirements: []` and must say which requirements it *supports*
|
|
221
|
+
in its Source Requirement section instead.
|
|
222
|
+
|
|
223
|
+
The register feeds three consumers: the `## Source Requirement` section on
|
|
224
|
+
every created ticket (Phases 3–5), the dry-run report (above), and the
|
|
225
|
+
requirement tokens in the PRD back-link (Phase 7).
|
|
226
|
+
|
|
159
227
|
### Phase 1.5: Extract Source Artifacts
|
|
160
228
|
|
|
161
229
|
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.
|
|
@@ -202,8 +270,10 @@ For each PRD epic, **invoke the `lisa-tracker-write` skill** (do not invoke `lis
|
|
|
202
270
|
|
|
203
271
|
- `project_key`: resolved by `lisa-tracker-write` from `.lisa.config.json`
|
|
204
272
|
- `issue_type`: `Epic`
|
|
273
|
+
- `prd_source`: the originating PRD URL — mandatory for every ticket this skill creates; it arms the validator's S16 traceability gate
|
|
205
274
|
- `summary`: epic title from the PRD
|
|
206
275
|
- `description_body`: a draft of the 3-audience description containing:
|
|
276
|
+
- 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
|
|
207
277
|
- **Context / Business Value**: epic summary from the PRD, originating Confluence URL, business outcome
|
|
208
278
|
- **Technical Approach**: cross-cutting integration points and constraints surfaced in Phase 2 codebase research
|
|
209
279
|
- List of user stories the epic contains
|
|
@@ -232,9 +302,10 @@ For each story, **invoke `lisa-tracker-write`** with:
|
|
|
232
302
|
|
|
233
303
|
- `project_key`: resolved by `lisa-tracker-write` from `.lisa.config.json`
|
|
234
304
|
- `issue_type`: `Story`
|
|
305
|
+
- `prd_source`: the originating PRD URL — mandatory for every ticket this skill creates; it arms the validator's S16 traceability gate
|
|
235
306
|
- `epic_parent`: the Epic key captured in Phase 3 (mandatory)
|
|
236
307
|
- `summary`: prefixed per the naming convention above
|
|
237
|
-
- `description_body`: 3-audience description as in `lisa-notion-to-tracker` Phase 4
|
|
308
|
+
- `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
|
|
238
309
|
- `artifacts`: the Phase 1.5 artifacts filtered by domain per the inheritance table below
|
|
239
310
|
|
|
240
311
|
| Story type | Inherits domains |
|
|
@@ -259,6 +330,7 @@ Delegate sub-task creation to **parallel agents** (one per epic or batch of stor
|
|
|
259
330
|
Each sub-task MUST:
|
|
260
331
|
1. **Be scoped to exactly ONE repo** — indicated in brackets in the summary: `[repo-name]` and in the description's `## Repository` / `h2. Repository` section
|
|
261
332
|
2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking
|
|
333
|
+
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).
|
|
262
334
|
|
|
263
335
|
**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.
|
|
264
336
|
|
|
@@ -283,6 +355,7 @@ After all tickets are created, present a summary table to the user:
|
|
|
283
355
|
- All Epics with keys and URLs
|
|
284
356
|
- All Stories grouped by Epic
|
|
285
357
|
- All Sub-tasks grouped by Story with repo tags
|
|
358
|
+
- **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
|
|
286
359
|
- Repo distribution
|
|
287
360
|
- **Artifact Preservation Matrix**
|
|
288
361
|
- Blockers list with recommendations and alternatives
|
|
@@ -298,7 +371,8 @@ Invoke `lisa-prd-backlink` with:
|
|
|
298
371
|
|
|
299
372
|
- `source_type: "confluence"`
|
|
300
373
|
- `source_ref`: the original Confluence page URL
|
|
301
|
-
- `tickets`: the full list created in Phases 3–5, each entry as `{ key, title, type, url, parent_key }`
|
|
374
|
+
- `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)
|
|
375
|
+
- `requirement_register`: the Phase 1.4 register (`{ id, verbatim_text, section_heading }` entries), so the back-link section can render the requirement → tickets view
|
|
302
376
|
|
|
303
377
|
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.
|
|
304
378
|
|
|
@@ -327,10 +401,11 @@ tickets that downstream skills (triage, journey, evidence) cannot use.
|
|
|
327
401
|
|
|
328
402
|
For each sub-task, invoke `lisa-tracker-write` with:
|
|
329
403
|
- issue_type: "Sub-task"
|
|
404
|
+
- prd_source: [the originating PRD URL — mandatory; arms the S16 traceability gate]
|
|
330
405
|
- parent: the parent story key
|
|
331
406
|
- project_key: [PROJECT]
|
|
332
407
|
- 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
|
|
408
|
+
- 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
409
|
- gherkin_acceptance_criteria: derived from the story's functional requirements
|
|
335
410
|
- sign_in_account: [test user credentials from config — name + role + how to obtain]
|
|
336
411
|
- target_environment: "dev"
|
|
@@ -36,21 +36,29 @@ This skill supports two modes, controlled by a `dry_run` flag in `$ARGUMENTS`:
|
|
|
36
36
|
- **`dry_run: false`** (default — full mode): run all phases, write tickets via `lisa-tracker-write`, run the preservation gate, report.
|
|
37
37
|
- **`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.
|
|
38
38
|
|
|
39
|
-
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
|
|
39
|
+
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).
|
|
40
40
|
|
|
41
41
|
```text
|
|
42
42
|
## github-to-tracker dry-run: <PRD title>
|
|
43
43
|
|
|
44
|
+
### Requirement register
|
|
45
|
+
- R1 §"<section heading>": "<verbatim requirement text>"
|
|
46
|
+
- R2 §"<section heading>": "<verbatim requirement text>"
|
|
47
|
+
- ...
|
|
48
|
+
|
|
44
49
|
### Planned hierarchy
|
|
45
50
|
- Epic: <summary>
|
|
46
51
|
prd_section: "<heading text from the PRD body or sub-issue title that produced this epic>"
|
|
47
52
|
prd_anchor: "<heading text or sub-issue ref or null>"
|
|
53
|
+
requirements: [R1, R2] # register ids this ticket exists to satisfy; [] only for derived work
|
|
48
54
|
- Story 1.1: <summary>
|
|
49
55
|
prd_section: "<heading or user-story line>"
|
|
50
56
|
prd_anchor: "<heading or sub-issue ref or null>"
|
|
57
|
+
requirements: [R1]
|
|
51
58
|
- Sub-task [<repo>]: <summary>
|
|
52
59
|
prd_section: "<heading or AC bullet>"
|
|
53
60
|
prd_anchor: "<heading or sub-issue ref or null>"
|
|
61
|
+
requirements: [R1]
|
|
54
62
|
- ...
|
|
55
63
|
- Story 1.2: ...
|
|
56
64
|
|
|
@@ -85,6 +93,38 @@ Bypassing the shim layer produces tickets that the rest of the lifecycle (triage
|
|
|
85
93
|
|
|
86
94
|
The `gh` reads in this skill are limited to reading the source PRD issue, its sub-issues, and its comments. They never write.
|
|
87
95
|
|
|
96
|
+
## Source Requirement Section (shared format)
|
|
97
|
+
|
|
98
|
+
Every ticket created by this skill — Epic, Story, and Sub-task alike —
|
|
99
|
+
carries a `## Source Requirement` section in its body so anyone can
|
|
100
|
+
answer "why was this done?" without leaving the ticket:
|
|
101
|
+
|
|
102
|
+
```markdown
|
|
103
|
+
## Source Requirement
|
|
104
|
+
|
|
105
|
+
- **PRD**: [<PRD title>](<PRD URL>) §"<section heading>"
|
|
106
|
+
- **Requirement (R3)**: "<verbatim requirement text from the PRD>"
|
|
107
|
+
|
|
108
|
+
This ticket exists to satisfy the quoted requirement. If implementation
|
|
109
|
+
scope drifts from the quoted text, the PRD is the authority — raise the
|
|
110
|
+
conflict rather than silently reinterpreting it.
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Rules:
|
|
114
|
+
|
|
115
|
+
- **Verbatim quotes, never paraphrases.** The quote is what survives later
|
|
116
|
+
PRD edits, and it must be readable by a non-technical operator.
|
|
117
|
+
- **Multiple requirements** → one `**Requirement (Rn)**` line each.
|
|
118
|
+
- **Derived / cross-cutting work** (no single requirement) uses the
|
|
119
|
+
supporting form instead:
|
|
120
|
+
`- **Requirement**: Derived work supporting R3, R7 — no single PRD section.`
|
|
121
|
+
- **All the way down**: sub-tasks carry full quotes, not just a pointer at
|
|
122
|
+
the parent Story, so a leaf claimed by build-intake in isolation is
|
|
123
|
+
self-explanatory.
|
|
124
|
+
- JIRA descriptions render the section as `h2. Source Requirement`;
|
|
125
|
+
GitHub/Linear use the markdown heading. `lisa-tracker-write` and the
|
|
126
|
+
validators treat the section as mandatory for PRD-sourced tickets.
|
|
127
|
+
|
|
88
128
|
## Input
|
|
89
129
|
|
|
90
130
|
A GitHub issue ref. The PRD is expected to have:
|
|
@@ -141,6 +181,36 @@ If env vars are not available, ask the user to provide them explicitly before pr
|
|
|
141
181
|
- Engineering comments (prefixed with "Engineering:" or 🔧) that identify technical constraints.
|
|
142
182
|
- Cross-PRD dependencies (references to other GitHub issues, Notion / Confluence / Linear PRDs, shared infrastructure).
|
|
143
183
|
|
|
184
|
+
### Phase 1.4: Requirement Register (traceability)
|
|
185
|
+
|
|
186
|
+
Every ticket this skill creates must be able to answer "why was this done?"
|
|
187
|
+
by pointing at the PRD requirement it satisfies. Build that mapping now,
|
|
188
|
+
while parsing the PRD — it cannot be reliably reconstructed afterwards.
|
|
189
|
+
|
|
190
|
+
1. **Atomize the PRD into requirements** in document order: goals, user
|
|
191
|
+
stories, functional and non-functional requirements, acceptance-criteria
|
|
192
|
+
bullets, and important notes — across the PRD issue body AND every
|
|
193
|
+
sub-issue body. Use the same atomization `lisa-prd-ticket-coverage`
|
|
194
|
+
uses so the two views line up.
|
|
195
|
+
2. **Assign sequential register ids** (`R1`, `R2`, …). Ids are
|
|
196
|
+
per-generation, not durable — the **verbatim quote is the durable
|
|
197
|
+
anchor**; if the PRD is edited and re-planned, ids may shift but quotes
|
|
198
|
+
still identify the requirement.
|
|
199
|
+
3. **Record each entry** as `{ id, verbatim_text, section_heading }`,
|
|
200
|
+
where `section_heading` is the markdown heading (or sub-issue ref)
|
|
201
|
+
the requirement lives under — the same value used for `prd_anchor`.
|
|
202
|
+
4. **Tag every planned ticket** — Epic, Story, AND Sub-task — with the
|
|
203
|
+
register ids it exists to satisfy. All the way down: sub-tasks carry
|
|
204
|
+
their own requirement quotes so a leaf dispatched in isolation is
|
|
205
|
+
self-explanatory. A ticket that genuinely traces to no single
|
|
206
|
+
requirement (cross-cutting infrastructure, derived enablement work)
|
|
207
|
+
gets `requirements: []` and must say which requirements it *supports*
|
|
208
|
+
in its Source Requirement section instead.
|
|
209
|
+
|
|
210
|
+
The register feeds three consumers: the `## Source Requirement` section on
|
|
211
|
+
every created ticket (Phases 3–5), the dry-run report (above), and the
|
|
212
|
+
requirement tokens in the PRD back-link (Phase 7).
|
|
213
|
+
|
|
144
214
|
### Phase 1.5: Extract Source Artifacts
|
|
145
215
|
|
|
146
216
|
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.
|
|
@@ -186,8 +256,10 @@ Walkthrough findings are surfaced back to product via the orchestrating intake s
|
|
|
186
256
|
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:
|
|
187
257
|
|
|
188
258
|
- `issue_type`: `Epic`
|
|
259
|
+
- `prd_source`: the originating PRD URL — mandatory for every ticket this skill creates; it arms the validator's S16 traceability gate
|
|
189
260
|
- `summary`: epic title from the PRD
|
|
190
261
|
- `body`: a draft of the multi-section description containing:
|
|
262
|
+
- 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
|
|
191
263
|
- **Context / Business Value**: epic summary from the PRD, originating GitHub PRD URL, business outcome
|
|
192
264
|
- **Technical Approach**: cross-cutting integration points and constraints surfaced in Phase 2 codebase research
|
|
193
265
|
- List of user stories the epic contains
|
|
@@ -217,9 +289,10 @@ For each Epic, plan two kinds of Stories:
|
|
|
217
289
|
For each Story, **invoke `lisa-tracker-write`** with:
|
|
218
290
|
|
|
219
291
|
- `issue_type`: `Story`
|
|
292
|
+
- `prd_source`: the originating PRD URL — mandatory for every ticket this skill creates; it arms the validator's S16 traceability gate
|
|
220
293
|
- `parent_ref` / `epic_parent`: the Epic ref captured in Phase 3 (mandatory)
|
|
221
294
|
- `summary`: prefixed per the naming convention above
|
|
222
|
-
- `body`: multi-section description as in `lisa-notion-to-tracker` Phase 4
|
|
295
|
+
- `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
|
|
223
296
|
- `artifacts`: the Phase 1.5 artifacts filtered by domain per the inheritance table:
|
|
224
297
|
|
|
225
298
|
| Story type | Inherits domains |
|
|
@@ -244,6 +317,7 @@ Delegate sub-task creation to **parallel agents** (one per epic or batch of stor
|
|
|
244
317
|
Each sub-task MUST:
|
|
245
318
|
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.
|
|
246
319
|
2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking.
|
|
320
|
+
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
321
|
|
|
248
322
|
**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.
|
|
249
323
|
|
|
@@ -268,6 +342,7 @@ After all tickets are created, present a summary table to the user:
|
|
|
268
342
|
- All Epics with refs and URLs
|
|
269
343
|
- All Stories grouped by Epic
|
|
270
344
|
- All Sub-tasks grouped by Story with repo tags
|
|
345
|
+
- **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
|
|
271
346
|
- Repo distribution
|
|
272
347
|
- **Artifact Preservation Matrix**
|
|
273
348
|
- Blockers list with recommendations and alternatives
|
|
@@ -283,7 +358,8 @@ Invoke `lisa-prd-backlink` with:
|
|
|
283
358
|
|
|
284
359
|
- `source_type: "github"`
|
|
285
360
|
- `source_ref`: the original GitHub Issue URL or `<org>/<repo>#<n>` token
|
|
286
|
-
- `tickets`: the full list created in Phases 3–5, each entry as `{ key, title, type, url, parent_key }`
|
|
361
|
+
- `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)
|
|
362
|
+
- `requirement_register`: the Phase 1.4 register (`{ id, verbatim_text, section_heading }` entries), so the back-link section can render the requirement → tickets view
|
|
287
363
|
|
|
288
364
|
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.
|
|
289
365
|
|
|
@@ -312,9 +388,10 @@ that downstream skills (triage, journey, evidence) cannot use.
|
|
|
312
388
|
|
|
313
389
|
For each sub-task, invoke `lisa-tracker-write` with:
|
|
314
390
|
- issue_type: "Sub-task"
|
|
391
|
+
- prd_source: [the originating PRD URL — mandatory; arms the S16 traceability gate]
|
|
315
392
|
- parent_ref: the parent story ref
|
|
316
393
|
- summary: prefixed with the repo in brackets, e.g. "[backend-api] Add audit log table"
|
|
317
|
-
- body: a multi-section draft (Context / Technical Approach / Acceptance Criteria / etc.) plus `## Repository` / `h2. Repository` naming exactly one repo
|
|
394
|
+
- 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]
|
|
318
395
|
- gherkin_acceptance_criteria: derived from the story's functional requirements
|
|
319
396
|
- sign_in_account: [test user credentials from config]
|
|
320
397
|
- 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.
|