@codyswann/lisa 2.216.0 → 2.217.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa/.codex-plugin/skills/lisa-confluence-to-tracker/SKILL.md +78 -3
  5. package/plugins/lisa/.codex-plugin/skills/lisa-github-to-tracker/SKILL.md +81 -4
  6. package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +31 -0
  7. package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +16 -0
  8. package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +32 -0
  9. package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +16 -0
  10. package/plugins/lisa/.codex-plugin/skills/lisa-linear-to-tracker/SKILL.md +82 -4
  11. package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +31 -0
  12. package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +16 -0
  13. package/plugins/lisa/.codex-plugin/skills/lisa-notion-to-tracker/SKILL.md +78 -2
  14. package/plugins/lisa/.codex-plugin/skills/lisa-prd-backlink/SKILL.md +12 -3
  15. package/plugins/lisa/.codex-plugin/skills/lisa-prd-ticket-coverage/SKILL.md +17 -0
  16. package/plugins/lisa/skills/lisa-confluence-to-tracker/SKILL.md +78 -3
  17. package/plugins/lisa/skills/lisa-github-to-tracker/SKILL.md +81 -4
  18. package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +31 -0
  19. package/plugins/lisa/skills/lisa-github-write-issue/SKILL.md +16 -0
  20. package/plugins/lisa/skills/lisa-jira-validate-ticket/SKILL.md +32 -0
  21. package/plugins/lisa/skills/lisa-jira-write-ticket/SKILL.md +16 -0
  22. package/plugins/lisa/skills/lisa-linear-to-tracker/SKILL.md +82 -4
  23. package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +31 -0
  24. package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +16 -0
  25. package/plugins/lisa/skills/lisa-notion-to-tracker/SKILL.md +78 -2
  26. package/plugins/lisa/skills/lisa-prd-backlink/SKILL.md +12 -3
  27. package/plugins/lisa/skills/lisa-prd-ticket-coverage/SKILL.md +17 -0
  28. package/plugins/lisa-agy/plugin.json +1 -1
  29. package/plugins/lisa-agy/skills/lisa-confluence-to-tracker/SKILL.md +78 -3
  30. package/plugins/lisa-agy/skills/lisa-github-to-tracker/SKILL.md +81 -4
  31. package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +31 -0
  32. package/plugins/lisa-agy/skills/lisa-github-write-issue/SKILL.md +16 -0
  33. package/plugins/lisa-agy/skills/lisa-jira-validate-ticket/SKILL.md +32 -0
  34. package/plugins/lisa-agy/skills/lisa-jira-write-ticket/SKILL.md +16 -0
  35. package/plugins/lisa-agy/skills/lisa-linear-to-tracker/SKILL.md +82 -4
  36. package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +31 -0
  37. package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +16 -0
  38. package/plugins/lisa-agy/skills/lisa-notion-to-tracker/SKILL.md +78 -2
  39. package/plugins/lisa-agy/skills/lisa-prd-backlink/SKILL.md +12 -3
  40. package/plugins/lisa-agy/skills/lisa-prd-ticket-coverage/SKILL.md +17 -0
  41. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  43. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  44. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-copilot/skills/lisa-confluence-to-tracker/SKILL.md +78 -3
  48. package/plugins/lisa-copilot/skills/lisa-github-to-tracker/SKILL.md +81 -4
  49. package/plugins/lisa-copilot/skills/lisa-github-validate-issue/SKILL.md +31 -0
  50. package/plugins/lisa-copilot/skills/lisa-github-write-issue/SKILL.md +16 -0
  51. package/plugins/lisa-copilot/skills/lisa-jira-validate-ticket/SKILL.md +32 -0
  52. package/plugins/lisa-copilot/skills/lisa-jira-write-ticket/SKILL.md +16 -0
  53. package/plugins/lisa-copilot/skills/lisa-linear-to-tracker/SKILL.md +82 -4
  54. package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +31 -0
  55. package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +16 -0
  56. package/plugins/lisa-copilot/skills/lisa-notion-to-tracker/SKILL.md +78 -2
  57. package/plugins/lisa-copilot/skills/lisa-prd-backlink/SKILL.md +12 -3
  58. package/plugins/lisa-copilot/skills/lisa-prd-ticket-coverage/SKILL.md +17 -0
  59. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-cursor/skills/lisa-confluence-to-tracker/SKILL.md +78 -3
  61. package/plugins/lisa-cursor/skills/lisa-github-to-tracker/SKILL.md +81 -4
  62. package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +31 -0
  63. package/plugins/lisa-cursor/skills/lisa-github-write-issue/SKILL.md +16 -0
  64. package/plugins/lisa-cursor/skills/lisa-jira-validate-ticket/SKILL.md +32 -0
  65. package/plugins/lisa-cursor/skills/lisa-jira-write-ticket/SKILL.md +16 -0
  66. package/plugins/lisa-cursor/skills/lisa-linear-to-tracker/SKILL.md +82 -4
  67. package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +31 -0
  68. package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +16 -0
  69. package/plugins/lisa-cursor/skills/lisa-notion-to-tracker/SKILL.md +78 -2
  70. package/plugins/lisa-cursor/skills/lisa-prd-backlink/SKILL.md +12 -3
  71. package/plugins/lisa-cursor/skills/lisa-prd-ticket-coverage/SKILL.md +17 -0
  72. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  74. package/plugins/lisa-expo-agy/plugin.json +1 -1
  75. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  79. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  80. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  84. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  85. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  89. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  90. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  93. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  94. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  95. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  98. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  99. package/plugins/lisa-rails-agy/plugin.json +1 -1
  100. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  101. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  102. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  103. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  104. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  105. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  106. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  107. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  108. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  109. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  110. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  111. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  112. package/plugins/src/base/skills/lisa-confluence-to-tracker/SKILL.md +78 -3
  113. package/plugins/src/base/skills/lisa-github-to-tracker/SKILL.md +81 -4
  114. package/plugins/src/base/skills/lisa-github-validate-issue/SKILL.md +31 -0
  115. package/plugins/src/base/skills/lisa-github-write-issue/SKILL.md +16 -0
  116. package/plugins/src/base/skills/lisa-jira-validate-ticket/SKILL.md +32 -0
  117. package/plugins/src/base/skills/lisa-jira-write-ticket/SKILL.md +16 -0
  118. package/plugins/src/base/skills/lisa-linear-to-tracker/SKILL.md +82 -4
  119. package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +31 -0
  120. package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +16 -0
  121. package/plugins/src/base/skills/lisa-notion-to-tracker/SKILL.md +78 -2
  122. package/plugins/src/base/skills/lisa-prd-backlink/SKILL.md +12 -3
  123. package/plugins/src/base/skills/lisa-prd-ticket-coverage/SKILL.md +17 -0
  124. package/typescript/copy-overwrite/.github/GITHUB_ACTIONS.md +1 -1
  125. package/typescript/create-only/.github/workflows/claude-ci-auto-fix.yml +14 -6
  126. package/typescript/create-only/.github/workflows/claude-deploy-auto-fix.yml +11 -4
package/package.json CHANGED
@@ -95,7 +95,7 @@
95
95
  "ws": ">=8.20.1"
96
96
  },
97
97
  "name": "@codyswann/lisa",
98
- "version": "2.216.0",
98
+ "version": "2.217.1",
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": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.216.0",
3
+ "version": "2.217.1",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.216.0",
3
+ "version": "2.217.1",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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`. 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).
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.