@codyswann/lisa 2.6.4 → 2.8.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.
Files changed (124) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +10 -1
  3. package/plugins/lisa/agents/confluence-prd-intake.md +5 -5
  4. package/plugins/lisa/agents/github-agent.md +141 -0
  5. package/plugins/lisa/agents/github-build-intake.md +62 -0
  6. package/plugins/lisa/agents/github-prd-intake.md +64 -0
  7. package/plugins/lisa/agents/linear-prd-intake.md +5 -5
  8. package/plugins/lisa/agents/notion-prd-intake.md +5 -5
  9. package/plugins/lisa/agents/verification-specialist.md +8 -2
  10. package/plugins/lisa/commands/codify-verification.md +6 -0
  11. package/plugins/lisa/commands/intake.md +2 -2
  12. package/plugins/lisa/commands/plan.md +2 -2
  13. package/plugins/lisa/hooks/block-no-verify.sh +37 -0
  14. package/plugins/lisa/rules/intent-routing.md +21 -15
  15. package/plugins/lisa/rules/tracker-resolution.md +76 -0
  16. package/plugins/lisa/rules/verification.md +2 -2
  17. package/plugins/lisa/skills/codify-verification/SKILL.md +152 -0
  18. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +11 -11
  19. package/plugins/lisa/skills/{confluence-to-jira → confluence-to-tracker}/SKILL.md +31 -31
  20. package/plugins/lisa/skills/github-add-journey/SKILL.md +114 -0
  21. package/plugins/lisa/skills/github-build-intake/SKILL.md +188 -0
  22. package/plugins/lisa/skills/github-create/SKILL.md +101 -0
  23. package/plugins/lisa/skills/github-evidence/SKILL.md +116 -0
  24. package/plugins/lisa/skills/github-journey/SKILL.md +121 -0
  25. package/plugins/lisa/skills/github-prd-intake/SKILL.md +286 -0
  26. package/plugins/lisa/skills/github-read-issue/SKILL.md +248 -0
  27. package/plugins/lisa/skills/github-sync/SKILL.md +73 -0
  28. package/plugins/lisa/skills/github-to-tracker/SKILL.md +312 -0
  29. package/plugins/lisa/skills/github-validate-issue/SKILL.md +288 -0
  30. package/plugins/lisa/skills/github-verify/SKILL.md +29 -0
  31. package/plugins/lisa/skills/github-write-issue/SKILL.md +304 -0
  32. package/plugins/lisa/skills/implement/SKILL.md +4 -4
  33. package/plugins/lisa/skills/intake/SKILL.md +14 -4
  34. package/plugins/lisa/skills/jira-source-artifacts/SKILL.md +1 -1
  35. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +3 -3
  36. package/plugins/lisa/skills/jira-verify/SKILL.md +1 -1
  37. package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
  38. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +10 -10
  39. package/plugins/lisa/skills/{linear-to-jira → linear-to-tracker}/SKILL.md +30 -31
  40. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +11 -11
  41. package/plugins/{src/base/skills/notion-to-jira → lisa/skills/notion-to-tracker}/SKILL.md +34 -34
  42. package/plugins/lisa/skills/plan/SKILL.md +8 -6
  43. package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +22 -12
  44. package/plugins/lisa/skills/product-walkthrough/SKILL.md +1 -1
  45. package/plugins/lisa/skills/spec-conformance/SKILL.md +2 -3
  46. package/plugins/lisa/skills/ticket-triage/SKILL.md +7 -7
  47. package/plugins/lisa/skills/tracker-add-journey/SKILL.md +24 -0
  48. package/plugins/lisa/skills/tracker-build-intake/SKILL.md +25 -0
  49. package/plugins/lisa/skills/tracker-create/SKILL.md +24 -0
  50. package/plugins/lisa/skills/tracker-evidence/SKILL.md +24 -0
  51. package/plugins/lisa/skills/tracker-journey/SKILL.md +24 -0
  52. package/plugins/lisa/skills/tracker-read/SKILL.md +25 -0
  53. package/plugins/lisa/skills/tracker-sync/SKILL.md +26 -0
  54. package/plugins/lisa/skills/tracker-validate/SKILL.md +35 -0
  55. package/plugins/lisa/skills/tracker-verify/SKILL.md +25 -0
  56. package/plugins/lisa/skills/tracker-write/SKILL.md +43 -0
  57. package/plugins/lisa/skills/verification-lifecycle/SKILL.md +31 -9
  58. package/plugins/lisa/skills/verify/SKILL.md +7 -6
  59. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-expo/skills/jira-verify/SKILL.md +1 -1
  62. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-rails/skills/jira-verify/SKILL.md +1 -1
  65. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  66. package/plugins/src/base/.claude-plugin/plugin.json +6 -0
  67. package/plugins/src/base/agents/confluence-prd-intake.md +5 -5
  68. package/plugins/src/base/agents/github-agent.md +141 -0
  69. package/plugins/src/base/agents/github-build-intake.md +62 -0
  70. package/plugins/src/base/agents/github-prd-intake.md +64 -0
  71. package/plugins/src/base/agents/linear-prd-intake.md +5 -5
  72. package/plugins/src/base/agents/notion-prd-intake.md +5 -5
  73. package/plugins/src/base/agents/verification-specialist.md +8 -2
  74. package/plugins/src/base/commands/codify-verification.md +6 -0
  75. package/plugins/src/base/commands/intake.md +2 -2
  76. package/plugins/src/base/commands/plan.md +2 -2
  77. package/plugins/src/base/hooks/block-no-verify.sh +37 -0
  78. package/plugins/src/base/rules/intent-routing.md +21 -15
  79. package/plugins/src/base/rules/tracker-resolution.md +76 -0
  80. package/plugins/src/base/rules/verification.md +2 -2
  81. package/plugins/src/base/skills/codify-verification/SKILL.md +152 -0
  82. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +11 -11
  83. package/plugins/src/base/skills/{confluence-to-jira → confluence-to-tracker}/SKILL.md +31 -31
  84. package/plugins/src/base/skills/github-add-journey/SKILL.md +114 -0
  85. package/plugins/src/base/skills/github-build-intake/SKILL.md +188 -0
  86. package/plugins/src/base/skills/github-create/SKILL.md +101 -0
  87. package/plugins/src/base/skills/github-evidence/SKILL.md +116 -0
  88. package/plugins/src/base/skills/github-journey/SKILL.md +121 -0
  89. package/plugins/src/base/skills/github-prd-intake/SKILL.md +286 -0
  90. package/plugins/src/base/skills/github-read-issue/SKILL.md +248 -0
  91. package/plugins/src/base/skills/github-sync/SKILL.md +73 -0
  92. package/plugins/src/base/skills/github-to-tracker/SKILL.md +312 -0
  93. package/plugins/src/base/skills/github-validate-issue/SKILL.md +288 -0
  94. package/plugins/src/base/skills/github-verify/SKILL.md +29 -0
  95. package/plugins/src/base/skills/github-write-issue/SKILL.md +304 -0
  96. package/plugins/src/base/skills/implement/SKILL.md +4 -4
  97. package/plugins/src/base/skills/intake/SKILL.md +14 -4
  98. package/plugins/src/base/skills/jira-source-artifacts/SKILL.md +1 -1
  99. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +3 -3
  100. package/plugins/src/base/skills/jira-verify/SKILL.md +1 -1
  101. package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
  102. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +10 -10
  103. package/plugins/src/base/skills/{linear-to-jira → linear-to-tracker}/SKILL.md +30 -31
  104. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +11 -11
  105. package/plugins/{lisa/skills/notion-to-jira → src/base/skills/notion-to-tracker}/SKILL.md +34 -34
  106. package/plugins/src/base/skills/plan/SKILL.md +8 -6
  107. package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +22 -12
  108. package/plugins/src/base/skills/product-walkthrough/SKILL.md +1 -1
  109. package/plugins/src/base/skills/spec-conformance/SKILL.md +2 -3
  110. package/plugins/src/base/skills/ticket-triage/SKILL.md +7 -7
  111. package/plugins/src/base/skills/tracker-add-journey/SKILL.md +24 -0
  112. package/plugins/src/base/skills/tracker-build-intake/SKILL.md +25 -0
  113. package/plugins/src/base/skills/tracker-create/SKILL.md +24 -0
  114. package/plugins/src/base/skills/tracker-evidence/SKILL.md +24 -0
  115. package/plugins/src/base/skills/tracker-journey/SKILL.md +24 -0
  116. package/plugins/src/base/skills/tracker-read/SKILL.md +25 -0
  117. package/plugins/src/base/skills/tracker-sync/SKILL.md +26 -0
  118. package/plugins/src/base/skills/tracker-validate/SKILL.md +35 -0
  119. package/plugins/src/base/skills/tracker-verify/SKILL.md +25 -0
  120. package/plugins/src/base/skills/tracker-write/SKILL.md +43 -0
  121. package/plugins/src/base/skills/verification-lifecycle/SKILL.md +31 -9
  122. package/plugins/src/base/skills/verify/SKILL.md +7 -6
  123. package/plugins/src/expo/skills/jira-verify/SKILL.md +1 -1
  124. package/plugins/src/rails/skills/jira-verify/SKILL.md +1 -1
@@ -0,0 +1,152 @@
1
+ ---
2
+ name: codify-verification
3
+ description: "Convert empirical verification into a regression test so it never has to be re-proven manually. Runs after a verification passes — picks the appropriate test framework for the verification type (Playwright for UI/browser, integration test for API/DB/auth, benchmark for performance, etc.), generates the test, wires it into the project's test runner, and confirms it executes. Mandatory step in the verification lifecycle and in the Build/Fix/Improve flows."
4
+ allowed-tools: ["Bash", "Read", "Edit", "Write", "Glob", "Grep", "Skill"]
5
+ ---
6
+
7
+ # Codify Verification: $ARGUMENTS
8
+
9
+ Take the empirical verification that just passed and encode it as an automated regression test. The manual proof becomes a repeatable check that catches future regressions.
10
+
11
+ This skill is invoked from the verification lifecycle (between Execute and Spec Conformance) and from each work-type sub-flow (Build / Fix / Improve) after the local verification step.
12
+
13
+ ## When to invoke
14
+
15
+ Invoke once per empirical verification that produced PASS evidence. If a single change had three verifications (UI flow, API endpoint, DB query), this skill runs three times — or once with the three verifications batched, but each must produce its own committed test.
16
+
17
+ ## When to skip
18
+
19
+ Skip codification only for verification types whose proof is inherently non-behavioral:
20
+
21
+ - **PR** — proof is the PR description itself
22
+ - **Documentation** — proof is content review
23
+ - **Deploy** — proof is deployment output and health endpoints (already covered by ops-verify-health)
24
+ - **Investigate-Only spikes** — produce findings, not shipped code
25
+
26
+ For every other verification type, codification is mandatory. If the codification is not possible (e.g., the test framework doesn't exist and can't be installed in scope), escalate via the lifecycle's Escalation Protocol — do not silently skip.
27
+
28
+ ## Inputs
29
+
30
+ The caller must provide:
31
+
32
+ - The verification type (UI, API, Database, Auth, Security, Performance, Background Jobs, Cache, Configuration, Email/Notification, Observability, Infrastructure)
33
+ - The exact steps that were performed (URL visited, request made, query run, etc.)
34
+ - The expected outcome (status code, UI state, row count, log entry, etc.)
35
+ - The proof artifact captured (screenshot path, response body, query output, log excerpt)
36
+
37
+ If any of these are missing, ask the caller before generating a test — a test built on guesswork will not match the verification it claims to encode.
38
+
39
+ ## Process
40
+
41
+ ### 1. Discover existing test infrastructure
42
+
43
+ Before creating anything new, find what the project already has. Use the Tool Discovery Process from `verification-lifecycle`. Specifically check for:
44
+
45
+ - **Browser/E2E**: `playwright.config.*`, `cypress.config.*`, `e2e/` directory, `tests/e2e/`, Playwright/Cypress in `package.json` devDependencies
46
+ - **API/integration**: `tests/integration/`, `spec/`, `test/integration/`, supertest/fetch helpers, Vitest/Jest integration configs
47
+ - **Database**: integration test setup with migrations, factory files, seed scripts
48
+ - **Performance**: existing benchmark suite (`benchmarks/`, `bench/`), `vitest bench`, k6 scripts
49
+ - **Mobile (RN/Expo)**: Detox config, Maestro flows
50
+ - **Backend jobs**: existing job-test harness, queue integration tests
51
+
52
+ Do NOT install a new framework if one already exists for the verification type. Use what's there.
53
+
54
+ ### 2. Map verification type → framework
55
+
56
+ | Verification type | Preferred framework (use whichever the project already has) |
57
+ |---|---|
58
+ | UI (web) | Playwright > Cypress > Selenium |
59
+ | UI (mobile) | Maestro > Detox > Playwright (mobile emulation) |
60
+ | API | project's integration test runner (Vitest / Jest / RSpec / pytest) with HTTP client (supertest / fetch / faraday) |
61
+ | Database | integration test with real DB + migrations applied |
62
+ | Auth | API or UI test asserting role-gated access (multi-role coverage) |
63
+ | Security | regression test that reproduces the attack and asserts safe handling |
64
+ | Performance | benchmark in the project's bench harness, asserting against the baseline captured in the verification |
65
+ | Background Jobs | integration test that enqueues, drains the queue, and asserts terminal state |
66
+ | Cache | integration test asserting hit/miss/invalidation behavior |
67
+ | Configuration | integration test that loads config and asserts effect |
68
+ | Email/Notification | test capturing outbound message via project's mailer test mode |
69
+ | Observability | test asserting structured log/metric/trace emission |
70
+ | Infrastructure | test or script asserting infra state (terraform plan diff, CDK snapshot test) |
71
+
72
+ If the project lacks the preferred framework AND no acceptable substitute exists, escalate.
73
+
74
+ ### 3. Generate the test
75
+
76
+ The generated test must:
77
+
78
+ - **Encode the exact verification that passed**, not a paraphrase. Same URL, same input, same assertion target.
79
+ - **Assert the observable outcome**, not implementation details. If the verification confirmed "user sees order confirmation", the test asserts that text/element is visible — not that a particular function was called.
80
+ - **Be deterministic.** No reliance on timing, network flakiness, real third-party services, or mutable shared state. Use the project's existing fixtures, factories, mocks, and seed data conventions.
81
+ - **Be self-contained.** Set up its own preconditions and clean up after itself, following the project's existing test isolation patterns.
82
+ - **Be named after the behavior, not the bug/ticket.** `displays order confirmation after checkout` not `fixes PROJ-1234`.
83
+ - **Live in the project's existing test directory** for that type. Do not create a parallel test tree.
84
+
85
+ For Playwright UI tests specifically:
86
+ - Use the project's existing `test` fixture / `page` fixture / auth helper if one exists
87
+ - Prefer role/text selectors (`getByRole`, `getByText`) over CSS/XPath — they survive markup churn
88
+ - Capture a trace or screenshot only if the project's existing tests do; do not invent a new artifact convention
89
+ - Mirror the project's existing config for base URL, retries, and test isolation
90
+
91
+ ### 4. Run the test in isolation
92
+
93
+ Run only the new test, using whatever per-test invocation the project supports:
94
+
95
+ - Playwright: `npx playwright test path/to/new.spec.ts`
96
+ - Vitest: `npx vitest run path/to/new.spec.ts`
97
+ - Jest: `npx jest path/to/new.test.ts`
98
+ - RSpec: `bundle exec rspec path/to/new_spec.rb`
99
+
100
+ Confirm:
101
+ 1. The test PASSES against the current code (the change being shipped)
102
+ 2. The test would have FAILED before the change (sanity check by mentally reverting, or for bug fixes, by running against the pre-fix commit if cheap)
103
+
104
+ For a bug fix, step 2 is mandatory and easy: check out the failing commit, run the new test, see it fail, return to the fix branch. This proves the test actually guards the regression.
105
+
106
+ ### 5. Wire it into the suite
107
+
108
+ Confirm the test is picked up by the project's standard test command (the one CI runs). Run that command and confirm the count went up by exactly the number of tests added.
109
+
110
+ If the test is in a directory the standard test command excludes (e.g., E2E suite that runs separately in CI), confirm the appropriate CI workflow includes it.
111
+
112
+ ### 6. Commit
113
+
114
+ Commit the test in the same PR as the change it codifies, in its own atomic commit:
115
+
116
+ - Build/feature: `test: add e2e for <behavior>`
117
+ - Bug fix: `test: add regression test for <bug behavior>`
118
+ - Performance: `test: add benchmark asserting <metric> <baseline>`
119
+
120
+ The commit message body should reference the verification it encodes (one line linking to the proof artifact or the verification report section).
121
+
122
+ ### 7. Record evidence
123
+
124
+ Append to the verification report (or PR description):
125
+
126
+ ```markdown
127
+ ### Codified Verifications
128
+
129
+ | # | Verification | Framework | Test file | Status |
130
+ |---|--------------|-----------|-----------|--------|
131
+ | 1 | <description> | Playwright | `e2e/checkout.spec.ts::displays order confirmation after checkout` | PASS |
132
+ ```
133
+
134
+ This evidence shows the verification is now guarded.
135
+
136
+ ## Output
137
+
138
+ For each empirical verification passed in:
139
+
140
+ - A new test file (or extension to an existing test file) committed to the PR
141
+ - Confirmation that the test passes against the current branch
142
+ - The test file path + test name recorded in the verification report
143
+
144
+ If codification was skipped, an explicit reason recorded in the report (one of the skip conditions above) — never silent.
145
+
146
+ ## Rules
147
+
148
+ - Never claim a verification is codified without running the new test and observing it pass
149
+ - Never disable, skip, or `.skip()` the new test "temporarily" to make CI green — fix the test or fix the underlying change
150
+ - Never use `expect(true).toBe(true)` placeholders or smoke-only assertions that don't actually exercise the verified behavior
151
+ - Never reuse the verification's manual artifact (screenshot, curl output) as a "test" — those are evidence, not regression coverage
152
+ - If the project lacks the appropriate framework, escalate via Human Action Packet rather than installing one mid-task without approval
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: confluence-prd-intake
3
- description: "Scans a Confluence space (or a parent page) for PRD pages labelled `prd-ready` and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written and the label flipped to `prd-ticketed`; PRDs that fail get clarifying-question comments and the label flipped to `prd-blocked`. Confluence counterpart of `lisa:notion-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (confluence-to-jira, jira-validate-ticket, jira-source-artifacts, product-walkthrough)."
3
+ description: "Scans a Confluence space (or a parent page) for PRD pages labelled `prd-ready` and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written and the label flipped to `prd-ticketed`; PRDs that fail get clarifying-question comments and the label flipped to `prd-blocked`. Confluence counterpart of `lisa:notion-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (confluence-to-tracker, tracker-validate, jira-source-artifacts, product-walkthrough)."
4
4
  allowed-tools: ["Skill", "Bash", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluenceSpaces", "mcp__atlassian__getPagesInConfluenceSpace", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__searchConfluenceUsingCql", "mcp__atlassian__updateConfluencePage", "mcp__atlassian__createConfluenceFooterComment", "mcp__atlassian__createConfluenceInlineComment", "mcp__atlassian__getConfluencePageFooterComments", "mcp__atlassian__getConfluencePageInlineComments", "mcp__atlassian__getAccessibleAtlassianResources"]
5
5
  ---
6
6
 
@@ -99,19 +99,19 @@ The `updateConfluencePage` call must preserve the page body; only the labels cha
99
99
 
100
100
  #### 3b. Dry-run validation
101
101
 
102
- Invoke the `lisa:confluence-to-jira` skill with `dry_run: true` and the PRD's URL. The skill returns a structured report containing:
102
+ Invoke the `lisa:confluence-to-tracker` skill with `dry_run: true` and the PRD's URL. The skill returns a structured report containing:
103
103
  - The planned ticket hierarchy
104
104
  - Per-ticket validation verdicts and remediation
105
105
  - An overall PASS / FAIL verdict
106
106
  - A failure count
107
107
 
108
- This call also indirectly invokes `lisa:jira-source-artifacts` (artifact extraction + classification) and `lisa:product-walkthrough` (when the PRD touches existing user-facing surfaces). All gate logic lives in `lisa:jira-validate-ticket`, which `lisa:confluence-to-jira` calls per ticket.
108
+ This call also indirectly invokes `lisa:jira-source-artifacts` (artifact extraction + classification) and `lisa:product-walkthrough` (when the PRD touches existing user-facing surfaces). All gate logic lives in `lisa:tracker-validate`, which `lisa:confluence-to-tracker` calls per ticket.
109
109
 
110
110
  #### 3c. Branch on the verdict
111
111
 
112
112
  **If `PASS`** (every planned ticket passed every applicable gate):
113
113
 
114
- 1. Re-invoke `lisa:confluence-to-jira` with `dry_run: false` to actually write the tickets. This re-runs Phases 1-5 and runs the preservation gate (Phase 5.5).
114
+ 1. Re-invoke `lisa:confluence-to-tracker` with `dry_run: false` to actually write the tickets. This re-runs Phases 1-5 and runs the preservation gate (Phase 5.5).
115
115
  2. Capture the created ticket keys from the skill's output.
116
116
  3. Post a Confluence **footer comment** on the PRD via `mcp__atlassian__createConfluenceFooterComment` listing the created tickets (epic, stories, sub-tasks) with their JIRA URLs. Lead with: `"Ticketed by Claude. Created N JIRA issues — see below. Add the prd-shipped label after the work is delivered."`
117
117
  4. Transition labels: remove `prd-in-review`, add `prd-ticketed` via `updateConfluencePage`.
@@ -124,7 +124,7 @@ The audience for these comments is the **product team**, not engineers. They are
124
124
  ##### 3c.1 Partition failures
125
125
 
126
126
  1. Drop every failure where `product_relevant = false`. Those are internal data-quality problems — the agent should fix its own spec rather than ask product to clarify a missing core field. Record the dropped failures under `Errors` in the cycle summary so engineers can see them; never surface them on the PRD.
127
- 2. Group the remaining product-relevant failures by `prd_anchor` (the inline-comment anchor from `confluence-to-jira`'s dry-run report). Failures that share an anchor become one comment thread on that block. Failures with `prd_anchor: null` are batched into one footer comment, since they have no source section to attach to.
127
+ 2. Group the remaining product-relevant failures by `prd_anchor` (the inline-comment anchor from `confluence-to-tracker`'s dry-run report). Failures that share an anchor become one comment thread on that block. Failures with `prd_anchor: null` are batched into one footer comment, since they have no source section to attach to.
128
128
 
129
129
  ##### 3c.2 Render each comment
130
130
 
@@ -173,7 +173,7 @@ Use these exact badge labels — they are the validator's category values transl
173
173
 
174
174
  - Gate IDs (`S4`, `F2`, etc.). Never appear in a comment body.
175
175
  - JIRA terminology that has no product meaning (e.g. "Gherkin", "epic parent", "issue link", "validation journey", "sub-task hierarchy"). Paraphrase before posting.
176
- - Internal skill names (`lisa:jira-validate-ticket`, `confluence-to-jira`).
176
+ - Internal skill names (`lisa:tracker-validate`, `confluence-to-tracker`).
177
177
  - Engineering shorthand (`AC`, `OOS`, `repo`, `env var`).
178
178
  - "Clarify this" / "Please specify" without candidate resolutions. The validator is required to provide candidates; if `recommendation` is empty or vague, treat the failure as an Error and surface internally rather than posting a useless comment.
179
179
 
@@ -199,7 +199,7 @@ Per-ticket gates prove each ticket is well-formed; they do NOT prove the *set* o
199
199
  | `GAPS_FOUND` | The created ticket set is incomplete. (a) For each gap, post a comment using the same product-facing template as Phase 3c.3 — inline-anchored when `prd_anchor` is non-null, footer otherwise; category badge from the gap's `category` field; `What's unclear` and `Recommendation` from the audit report's `what` and `recommendation` fields. Apply the same forbidden-language rules from Phase 3c.5. (b) Post one footer summary comment listing the tickets that *were* successfully created (so product knows what to keep vs. what to extend). (c) Transition labels from `prd-ticketed` back to `prd-blocked` via `updateConfluencePage`. |
200
200
  | `NO_TICKETS_FOUND` | Should not happen if step 2 succeeded. If it does, log it as an Error in the cycle summary and leave label as `prd-ticketed` with a comment flagging the audit failure for human review. |
201
201
 
202
- 3. The created tickets remain in JIRA regardless of the verdict — they are valid in their own right. The audit only tells us whether *more* are needed.
202
+ 3. The created tickets remain in the destination tracker regardless of the verdict — they are valid in their own right. The audit only tells us whether *more* are needed.
203
203
 
204
204
  ### Phase 4 — Summary report
205
205
 
@@ -229,24 +229,24 @@ Print to the agent's output. Do not write this summary to Confluence or JIRA —
229
229
  ## Idempotency & safety
230
230
 
231
231
  - **Single-cycle scope**: this skill processes the `prd-ready` set as it exists at the start of Phase 2. New `prd-ready` PRDs added mid-cycle are picked up next run.
232
- - **No writes outside the lifecycle**: this skill only ever writes to JIRA via `lisa:confluence-to-jira` (which delegates to `lisa:jira-write-ticket`), and only ever changes Confluence labels among `prd-in-review`, `prd-blocked`, `prd-ticketed`. It never edits PRD body content, never touches `prd-draft` or `prd-shipped`, never deletes pages.
232
+ - **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:confluence-to-tracker` (which delegates to `lisa:tracker-write`), and only ever changes Confluence labels among `prd-in-review`, `prd-blocked`, `prd-ticketed`. It never edits PRD body content, never touches `prd-draft` or `prd-shipped`, never deletes pages.
233
233
  - **Claim-first ordering**: the label flip to `prd-in-review` happens BEFORE validation runs, so a re-entrant call won't double-process.
234
234
  - **Failure isolation**: an exception processing one PRD must not stop the cycle. Catch, record under "Errors" in the summary, continue to the next PRD. The PRD that errored is left labelled `prd-in-review` — the human investigates from there.
235
235
  - **Single-label invariant**: after every transition, verify exactly one lifecycle label is present on the page. If two are present (rare race), surface as an Error and skip — do NOT auto-resolve, the human decides.
236
236
 
237
237
  ## Configuration
238
238
 
239
- Same env vars as `lisa:confluence-to-jira` — `JIRA_PROJECT`, `JIRA_SERVER`, `CONFLUENCE_HOST`, `E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL`. If any required value is missing, surface the missing key(s) and exit this cycle — never invent values.
239
+ Same env vars as `lisa:confluence-to-tracker` — `JIRA_PROJECT`, `JIRA_SERVER`, `CONFLUENCE_HOST`, `E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL`. If any required value is missing, surface the missing key(s) and exit this cycle — never invent values.
240
240
 
241
241
  ## Rules
242
242
 
243
- - Never write to JIRA outside of `lisa:confluence-to-jira` → `lisa:jira-write-ticket`. The validator's verdict gates progress; bypassing it produces broken tickets.
243
+ - Never write to the destination tracker outside of `lisa:confluence-to-tracker` → `lisa:tracker-write`. The validator's verdict gates progress; bypassing it produces broken tickets.
244
244
  - Never add or remove a label this skill doesn't own (`prd-in-review`, `prd-blocked`, `prd-ticketed`). Product owns `prd-draft`, `prd-ready`, `prd-shipped`.
245
245
  - Never edit the PRD's body. Communication with product happens only through Confluence comments. If `updateConfluencePage` requires a body in the payload, refetch and pass it back unchanged.
246
246
  - Never post a single page-level dump of all gate failures. One inline comment per `prd_anchor` group (or one footer summary for unanchored failures only). Comments must be inline-anchored where possible, categorized, plain-language, and contain a concrete recommendation.
247
247
  - Never include a gate ID, internal skill name, or engineering shorthand in a comment body.
248
248
  - Never run more than one intake cycle concurrently against the same scope. This skill assumes serial execution.
249
- - If `lisa:confluence-to-jira` returns errors, treat them as gate failures: comment + `prd-blocked`. Don't silently fail.
249
+ - If `lisa:confluence-to-tracker` returns errors, treat them as gate failures: comment + `prd-blocked`. Don't silently fail.
250
250
 
251
251
  ## Adoption (one-time per project)
252
252
 
@@ -1,21 +1,21 @@
1
1
  ---
2
- name: confluence-to-jira
2
+ name: confluence-to-tracker
3
3
  description: >
4
- Break down a Confluence PRD page into JIRA epics, stories, and sub-tasks. Use this skill whenever the
5
- user shares a Confluence PRD URL and wants it converted into JIRA tickets, or asks to "break down
6
- this Confluence spec", "create tickets from a Confluence page", "turn this Confluence doc into JIRA",
7
- or similar. This skill mirrors `lisa:notion-to-jira` for projects whose PRDs live in Confluence —
4
+ Break down a Confluence PRD page into Epics, Stories, and Sub-tasks in the configured destination tracker (JIRA or GitHub Issues per .lisa.config.json). Use this skill whenever the
5
+ user shares a Confluence PRD URL and wants it converted into tracker tickets, or asks to "break down
6
+ this Confluence spec", "create tickets from a Confluence page", "turn this Confluence doc into tickets",
7
+ or similar. This skill mirrors `lisa:notion-to-tracker` for projects whose PRDs live in Confluence —
8
8
  the workflow, gates, dry-run mode, and validation rules are identical; only the source-of-truth tool
9
9
  surface differs (Confluence MCP instead of Notion MCP).
10
- allowed-tools: ["Skill", "Bash", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getConfluencePageFooterComments", "mcp__atlassian__getConfluencePageInlineComments", "mcp__atlassian__getConfluenceCommentChildren", "mcp__atlassian__searchConfluenceUsingCql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__atlassian__getJiraIssueRemoteIssueLinks"]
10
+ allowed-tools: ["Skill", "Bash", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getConfluencePageFooterComments", "mcp__atlassian__getConfluencePageInlineComments", "mcp__atlassian__getConfluenceCommentChildren", "mcp__atlassian__searchConfluenceUsingCql", "mcp__atlassian__getAccessibleAtlassianResources"]
11
11
  ---
12
12
 
13
- # Confluence PRD to JIRA Breakdown
13
+ # Confluence PRD to Tracker Breakdown
14
14
 
15
- Convert a Confluence PRD into a structured JIRA ticket hierarchy: Epics > Stories > Sub-tasks.
15
+ Convert a Confluence PRD into a structured ticket hierarchy in the configured destination tracker (JIRA or GitHub Issues per .lisa.config.json): Epics > Stories > Sub-tasks.
16
16
  Each sub-task is scoped to exactly one repo and includes an empirical verification plan.
17
17
 
18
- This skill is the Confluence counterpart of `lisa:notion-to-jira`. The two skills share the same
18
+ This skill is the Confluence counterpart of `lisa:notion-to-tracker`. The two skills share the same
19
19
  phases, gates, dry-run contract, and per-ticket validation logic. Only the PRD-side fetch / comment
20
20
  tools differ. When changing workflow logic, change BOTH skills together so the two source vendors
21
21
  stay behaviorally identical.
@@ -24,16 +24,16 @@ stay behaviorally identical.
24
24
 
25
25
  This skill supports two modes, controlled by a `dry_run` flag in `$ARGUMENTS`:
26
26
 
27
- - **`dry_run: false`** (default — full mode): run all phases, write tickets via `lisa:jira-write-ticket`, run the preservation gate, report.
28
- - **`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:jira-validate-ticket` (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:confluence-prd-intake`) can decide whether to proceed.
27
+ - **`dry_run: false`** (default — full mode): run all phases, write tickets via `lisa:tracker-write`, run the preservation gate, report.
28
+ - **`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:confluence-prd-intake`) can decide whether to proceed.
29
29
 
30
- Dry-run output format is identical to `lisa:notion-to-jira`'s. Reuse the same fields, including
30
+ Dry-run output format is identical to `lisa:notion-to-tracker`'s. Reuse the same fields, including
31
31
  `prd_anchor` and `prd_section`. The only difference: `prd_anchor` is the inline-comment anchor text
32
32
  that `createConfluenceInlineComment` accepts (typically the full selected substring; truncate if it
33
33
  exceeds the tool's max anchor length and emit `null` if no resolvable anchor exists).
34
34
 
35
35
  ```text
36
- ## confluence-to-jira dry-run: <PRD title>
36
+ ## confluence-to-tracker dry-run: <PRD title>
37
37
 
38
38
  ### Planned hierarchy
39
39
  - Epic: <summary>
@@ -67,11 +67,11 @@ The dry-run mode never writes to JIRA and never calls `mcp__atlassian__createJir
67
67
  modifies the source Confluence page, never adds/removes labels, and never posts comments — that is the
68
68
  orchestrating skill's responsibility (`lisa:confluence-prd-intake`).
69
69
 
70
- ## Hard Rule: All Writes Go Through `lisa:jira-write-ticket`
70
+ ## Hard Rule: All Writes Go Through `lisa:tracker-write`
71
71
 
72
- **Every JIRA ticket created by this skill — every epic, story, and sub-task — MUST be created by invoking the `lisa:jira-write-ticket` skill. Never call `mcp__atlassian__createJiraIssue`, `mcp__atlassian__editJiraIssue`, `mcp__atlassian__createIssueLink`, or any other Atlassian write tool directly from this skill or from any sub-agent it spawns.**
72
+ **Every JIRA ticket created by this skill — every epic, story, and sub-task — MUST be created by invoking the `lisa:tracker-write` skill. Never call `mcp__atlassian__createJiraIssue`, `mcp__atlassian__editJiraIssue`, `mcp__atlassian__createIssueLink`, or any other Atlassian write tool directly from this skill or from any sub-agent it spawns.**
73
73
 
74
- `lisa:jira-write-ticket` enforces gates this skill does not:
74
+ `lisa:tracker-write` enforces gates this skill does not:
75
75
  - 3-audience description (Context / Technical Approach / Acceptance Criteria)
76
76
  - Gherkin acceptance criteria
77
77
  - Epic parent validation
@@ -80,7 +80,7 @@ orchestrating skill's responsibility (`lisa:confluence-prd-intake`).
80
80
  - Sign-in account and target environment recorded in description
81
81
  - Post-create verification
82
82
 
83
- Bypassing `lisa:jira-write-ticket` produces thin tickets that the rest of the lifecycle (triage, ticket-verify, journey, evidence) treats as broken. The Atlassian read tools (`getJiraIssue`, `searchJiraIssuesUsingJql`, `getJiraIssueRemoteIssueLinks`, `getAccessibleAtlassianResources`, `getJiraProjectIssueTypesMetadata`, `getVisibleJiraProjects`, and the Confluence read endpoints listed in `allowed-tools` above) ARE allowed for context gathering and the Phase 5.5 preservation gate.
83
+ Bypassing `lisa:tracker-write` produces thin tickets that the rest of the lifecycle (triage, ticket-verify, journey, evidence) treats as broken. The Atlassian read tools (`getJiraIssue`, `searchJiraIssuesUsingJql`, `getJiraIssueRemoteIssueLinks`, `getAccessibleAtlassianResources`, `getJiraProjectIssueTypesMetadata`, `getVisibleJiraProjects`, and the Confluence read endpoints listed in `allowed-tools` above) ARE allowed for context gathering and the Phase 5.5 preservation gate.
84
84
 
85
85
  ## Input
86
86
 
@@ -165,7 +165,7 @@ The existing-component reuse expectation is defined in `lisa:jira-source-artifac
165
165
 
166
166
  ### Phase 2: Codebase + Live Product Research
167
167
 
168
- Identical to `lisa:notion-to-jira` Phase 2. Two complementary inputs ground PRD analysis: the **code** (what's there to reuse / extend) and the **live product** (what users see today). Skipping either produces tickets that misjudge the change.
168
+ Identical to `lisa:notion-to-tracker` Phase 2. Two complementary inputs ground PRD analysis: the **code** (what's there to reuse / extend) and the **live product** (what users see today). Skipping either produces tickets that misjudge the change.
169
169
 
170
170
  **2a. Codebase research.** If the session doesn't already have codebase context, explore the repos to understand what exists. Use Explore agents for repos not yet examined.
171
171
 
@@ -177,9 +177,9 @@ Walkthrough findings are attached to the originating Confluence PRD as a **foote
177
177
 
178
178
  ### Phase 3: Create Epics
179
179
 
180
- > **Mode guard**: In `dry_run: true` mode, do not invoke `lisa:jira-write-ticket` in this phase. Instead, draft the epic spec (summary, description_body, artifacts) and validate it with `lisa:jira-validate-ticket --spec-only`. Record the drafted spec (including a placeholder epic key like `DRY-RUN-EPIC-1`) for Phase 4 to use as parent references. In `dry_run: false` mode (default), proceed as described below.
180
+ > **Mode guard**: In `dry_run: true` mode, do not invoke `lisa:tracker-write` in this phase. Instead, draft the epic spec (summary, description_body, artifacts) and validate it with `lisa:tracker-validate --spec-only`. Record the drafted spec (including a placeholder epic key like `DRY-RUN-EPIC-1`) for Phase 4 to use as parent references. In `dry_run: false` mode (default), proceed as described below.
181
181
 
182
- For each PRD epic, **invoke the `lisa:jira-write-ticket` skill** (do not call `createJiraIssue` directly). Pass it everything it needs to enforce its quality gates:
182
+ For each PRD epic, **invoke the `lisa:tracker-write` skill** (do not call `createJiraIssue` directly). Pass it everything it needs to enforce its quality gates:
183
183
 
184
184
  - `project_key`: from `JIRA_PROJECT` config
185
185
  - `issue_type`: `Epic`
@@ -199,7 +199,7 @@ Capture the returned epic key — Phase 4 needs it as the parent for stories.
199
199
 
200
200
  ### Phase 4: Create Stories
201
201
 
202
- > **Mode guard**: In `dry_run: true` mode, do not invoke `lisa:jira-write-ticket` in this phase. Instead, draft each story spec and validate it with `lisa:jira-validate-ticket --spec-only`. Use placeholder keys (e.g. `DRY-RUN-STORY-1.1`) for any downstream references. In `dry_run: false` mode (default), proceed as described below.
202
+ > **Mode guard**: In `dry_run: true` mode, do not invoke `lisa:tracker-write` in this phase. Instead, draft each story spec and validate it with `lisa:tracker-validate --spec-only`. Use placeholder keys (e.g. `DRY-RUN-STORY-1.1`) for any downstream references. In `dry_run: false` mode (default), proceed as described below.
203
203
 
204
204
  For each Epic, plan two kinds of stories:
205
205
  - **One "X.0 Setup" story** for data model and infrastructure prerequisites
@@ -207,13 +207,13 @@ For each Epic, plan two kinds of stories:
207
207
 
208
208
  **Story naming convention**: Prefix the summary with a short code derived from the PRD title (e.g., `[CU-1.1]` for "Contract Upload").
209
209
 
210
- For each story, **invoke `lisa:jira-write-ticket`** with:
210
+ For each story, **invoke `lisa:tracker-write`** with:
211
211
 
212
212
  - `project_key`: from `JIRA_PROJECT` config
213
213
  - `issue_type`: `Story`
214
214
  - `epic_parent`: the Epic key captured in Phase 3 (mandatory)
215
215
  - `summary`: prefixed per the naming convention above
216
- - `description_body`: 3-audience description as in `lisa:notion-to-jira` Phase 4
216
+ - `description_body`: 3-audience description as in `lisa:notion-to-tracker` Phase 4
217
217
  - `artifacts`: the Phase 1.5 artifacts filtered by domain per the inheritance table below
218
218
 
219
219
  | Story type | Inherits domains |
@@ -227,7 +227,7 @@ Capture each returned story key — Phase 5 needs it as the parent for sub-tasks
227
227
 
228
228
  ### Phase 5: Create Sub-tasks
229
229
 
230
- Delegate sub-task creation to **parallel agents** (one per epic or batch of stories) for efficiency. **Every spawned agent must invoke `lisa:jira-write-ticket` for each sub-task — no agent may call `createJiraIssue` directly.**
230
+ Delegate sub-task creation to **parallel agents** (one per epic or batch of stories) for efficiency. **Every spawned agent must invoke `lisa:tracker-write` for each sub-task — no agent may call `createJiraIssue` directly.**
231
231
 
232
232
  Each sub-task MUST:
233
233
  1. **Be scoped to exactly ONE repo** — indicated in brackets in the summary: `[repo-name]`
@@ -241,9 +241,9 @@ Run the preservation gate defined in `lisa:jira-source-artifacts` §8 against th
241
241
 
242
242
  To run the gate, this skill must:
243
243
 
244
- 1. Pull the remote links of every epic and story created in this run via `mcp__atlassian__getJiraIssueRemoteIssueLinks`.
244
+ 1. Pull the remote links of every epic and story created in this run via `lisa:tracker-read (vendor-neutral; dispatches to jira-read-ticket or github-read-issue)`.
245
245
  2. Apply the §8 preservation matrix and verdict rules.
246
- 3. If the gate fails: list each dropped/misrouted artifact and either re-attach via `lisa:jira-write-ticket` (UPDATE mode) or stop and ask the human.
246
+ 3. If the gate fails: list each dropped/misrouted artifact and either re-attach via `lisa:tracker-write` (UPDATE mode) or stop and ask the human.
247
247
  4. If the gate passes: print the matrix compactly and proceed to Phase 6.
248
248
 
249
249
  This gate is not optional.
@@ -275,13 +275,13 @@ When delegating to agents, provide this context. **The "MUST invoke jira-write-t
275
275
  ```text
276
276
  Create JIRA sub-tasks in the [PROJECT] project at [CLOUD_ID].
277
277
 
278
- CRITICAL: For each sub-task, invoke the `lisa:jira-write-ticket` skill via the Skill tool.
279
- Do NOT call `mcp__atlassian__createJiraIssue` directly. The `lisa:jira-write-ticket` skill
278
+ CRITICAL: For each sub-task, invoke the `lisa:tracker-write` skill via the Skill tool.
279
+ Do NOT call `mcp__atlassian__createJiraIssue` directly. The `lisa:tracker-write` skill
280
280
  enforces required quality gates (Gherkin acceptance criteria, 3-audience description,
281
281
  single-repo scope, sign-in/environment fields, post-create verification). Bypassing it
282
282
  produces broken tickets that downstream skills (triage, journey, evidence) cannot use.
283
283
 
284
- For each sub-task, invoke `lisa:jira-write-ticket` with:
284
+ For each sub-task, invoke `lisa:tracker-write` with:
285
285
  - issue_type: "Sub-task"
286
286
  - parent: the parent story key
287
287
  - project_key: [PROJECT]
@@ -297,9 +297,9 @@ For each sub-task, invoke `lisa:jira-write-ticket` with:
297
297
  Each sub-task must:
298
298
  1. Be scoped to ONE repo only — repo named in brackets in the summary
299
299
  2. Include the Empirical Verification Plan in the description
300
- 3. Be created via `lisa:jira-write-ticket`, not via direct MCP calls
300
+ 3. Be created via `lisa:tracker-write`, not via direct MCP calls
301
301
 
302
- If `lisa:jira-write-ticket` rejects a sub-task, fix the input and re-invoke. Do NOT fall back
302
+ If `lisa:tracker-write` rejects a sub-task, fix the input and re-invoke. Do NOT fall back
303
303
  to a direct `createJiraIssue` call to bypass the gate.
304
304
 
305
305
  Test user info: [credentials from config]
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: github-add-journey
3
+ description: "Add a Validation Journey section to an existing GitHub Issue by analyzing the change type and generating appropriate verification steps with evidence markers. The GitHub counterpart of lisa:jira-add-journey."
4
+ allowed-tools: ["Bash", "Skill"]
5
+ ---
6
+
7
+ # Add Validation Journey to Existing GitHub Issue
8
+
9
+ Read an existing GitHub Issue, analyze the change type, and append a `## Validation Journey` markdown section with appropriate verification steps based on the project's verification patterns.
10
+
11
+ ## Arguments
12
+
13
+ `$ARGUMENTS`: `<ISSUE_REF>`
14
+
15
+ - `ISSUE_REF` (required): GitHub issue ref — `org/repo#<number>` or full GitHub issue URL.
16
+
17
+ ## Prerequisites
18
+
19
+ - `gh` CLI authenticated (`gh auth status`).
20
+
21
+ ## Workflow
22
+
23
+ ### Step 1: Read the Issue
24
+
25
+ ```bash
26
+ gh issue view <number> --repo <org>/<repo> --json number,title,body,labels,assignees,milestone,url
27
+ ```
28
+
29
+ Extract: title, body, type (from `type:` label), components (from `component:` labels), assignees, linked PRs.
30
+
31
+ ### Step 2: Check for Existing Journey
32
+
33
+ Parse the body for an existing `## Validation Journey` heading. If present and the section contains at least one `[EVIDENCE: <name>]` marker, the issue already has a journey — report this to the user and stop.
34
+
35
+ ### Step 3: Analyze the Change Type
36
+
37
+ Examine the body, acceptance criteria, and codebase to determine the change type:
38
+
39
+ 1. **API/GraphQL changes** — New or modified endpoints, request/response schemas
40
+ 2. **Database migration** — Schema changes, new tables/columns, indexes
41
+ 3. **Background job/queue** — New job processors, queue consumers, event handlers
42
+ 4. **Library/utility** — Exported functions, shared modules, npm package changes
43
+ 5. **Security fix** — Auth, authorization, input validation, OWASP vulnerabilities
44
+ 6. **Authentication/authorization** — Role-based access, session management, tokens
45
+
46
+ Use Explore agents or read the codebase directly to understand which files are affected.
47
+
48
+ ### Step 4: Map Change Type to Verification Pattern
49
+
50
+ | Change Type | Verification Approach |
51
+ |---|---|
52
+ | API/GraphQL | curl commands verifying endpoints, status codes, response schemas |
53
+ | Database migration | Migration execution + schema verification + rollback check |
54
+ | Background job/queue | Enqueue + process + state change verification |
55
+ | Library/utility | Test execution + build verification + export check |
56
+ | Security fix | Exploit reproduction pre-fix + exploit failure post-fix |
57
+ | Auth/authz | Multi-role verification with explicit status codes |
58
+
59
+ ### Step 5: Draft the Validation Journey
60
+
61
+ Compose the journey with `[EVIDENCE: name]` markers at key verification points:
62
+
63
+ ```markdown
64
+ ## Validation Journey
65
+
66
+ ### Prerequisites
67
+ - List required services, database, env vars
68
+
69
+ ### Steps
70
+ 1. Verify current state before changes
71
+ 2. Apply the change
72
+ 3. Verify expected new state [EVIDENCE: state-name]
73
+ 4. Test error/edge cases [EVIDENCE: error-case]
74
+ 5. Verify rollback if applicable [EVIDENCE: rollback]
75
+
76
+ ### Assertions
77
+ - Describe what must be true after verification
78
+ ```
79
+
80
+ ### Guidelines for Drafting
81
+
82
+ 1. **2–5 evidence markers** — Focus on proving the change works and handles errors.
83
+ 2. **Concrete, runnable steps** — `Run \`curl -s localhost:3000/health | jq .status\`` not "Check the endpoint".
84
+ 3. **Include environment setup** — Database connection, running services, env vars.
85
+ 4. **Evidence names in kebab-case** — `api-response`, `schema-check`, `rate-limit-hit`.
86
+ 5. **Assertions are measurable** — `Returns 200 with {status: ok}` not "API works correctly".
87
+ 6. **Cover happy path AND error path** — At minimum, one success and one failure marker.
88
+
89
+ ### Step 6: Present to User for Approval
90
+
91
+ Display the drafted Validation Journey and ask for confirmation before appending it to the issue body. (If invoked from a parent skill running unattended — e.g., `lisa:github-write-issue` Phase 6 step 5 — proceed without the prompt.)
92
+
93
+ ### Step 7: Append to Issue Body
94
+
95
+ After approval:
96
+
97
+ ```bash
98
+ current_body=$(gh issue view <number> --repo <org>/<repo> --json body --jq '.body')
99
+ # Compose new body: existing + "\n\n## Validation Journey\n..." (or replace if present)
100
+ gh issue edit <number> --repo <org>/<repo> --body-file /tmp/updated-body.md
101
+ ```
102
+
103
+ Preserve every other section verbatim — never re-render the body from parsed fields, since the issue may carry `extra_sections` we don't recognize.
104
+
105
+ ### Step 8: Verify
106
+
107
+ Re-read the issue and confirm the `## Validation Journey` section is present and includes at least one `[EVIDENCE: <name>]` marker.
108
+
109
+ ## When to Use This Skill
110
+
111
+ - Issue was created before the Validation Journey convention was established.
112
+ - Issue was created manually without following `lisa:github-create` guidelines.
113
+ - Issue needs a journey added or updated based on implementation progress.
114
+ - Before starting work on an issue, to ensure verification steps are documented.