@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.
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +10 -1
- package/plugins/lisa/agents/confluence-prd-intake.md +5 -5
- package/plugins/lisa/agents/github-agent.md +141 -0
- package/plugins/lisa/agents/github-build-intake.md +62 -0
- package/plugins/lisa/agents/github-prd-intake.md +64 -0
- package/plugins/lisa/agents/linear-prd-intake.md +5 -5
- package/plugins/lisa/agents/notion-prd-intake.md +5 -5
- package/plugins/lisa/agents/verification-specialist.md +8 -2
- package/plugins/lisa/commands/codify-verification.md +6 -0
- package/plugins/lisa/commands/intake.md +2 -2
- package/plugins/lisa/commands/plan.md +2 -2
- package/plugins/lisa/hooks/block-no-verify.sh +37 -0
- package/plugins/lisa/rules/intent-routing.md +21 -15
- package/plugins/lisa/rules/tracker-resolution.md +76 -0
- package/plugins/lisa/rules/verification.md +2 -2
- package/plugins/lisa/skills/codify-verification/SKILL.md +152 -0
- package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +11 -11
- package/plugins/lisa/skills/{confluence-to-jira → confluence-to-tracker}/SKILL.md +31 -31
- package/plugins/lisa/skills/github-add-journey/SKILL.md +114 -0
- package/plugins/lisa/skills/github-build-intake/SKILL.md +188 -0
- package/plugins/lisa/skills/github-create/SKILL.md +101 -0
- package/plugins/lisa/skills/github-evidence/SKILL.md +116 -0
- package/plugins/lisa/skills/github-journey/SKILL.md +121 -0
- package/plugins/lisa/skills/github-prd-intake/SKILL.md +286 -0
- package/plugins/lisa/skills/github-read-issue/SKILL.md +248 -0
- package/plugins/lisa/skills/github-sync/SKILL.md +73 -0
- package/plugins/lisa/skills/github-to-tracker/SKILL.md +312 -0
- package/plugins/lisa/skills/github-validate-issue/SKILL.md +288 -0
- package/plugins/lisa/skills/github-verify/SKILL.md +29 -0
- package/plugins/lisa/skills/github-write-issue/SKILL.md +304 -0
- package/plugins/lisa/skills/implement/SKILL.md +4 -4
- package/plugins/lisa/skills/intake/SKILL.md +14 -4
- package/plugins/lisa/skills/jira-source-artifacts/SKILL.md +1 -1
- package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +3 -3
- package/plugins/lisa/skills/jira-verify/SKILL.md +1 -1
- package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
- package/plugins/lisa/skills/linear-prd-intake/SKILL.md +10 -10
- package/plugins/lisa/skills/{linear-to-jira → linear-to-tracker}/SKILL.md +30 -31
- package/plugins/lisa/skills/notion-prd-intake/SKILL.md +11 -11
- package/plugins/{src/base/skills/notion-to-jira → lisa/skills/notion-to-tracker}/SKILL.md +34 -34
- package/plugins/lisa/skills/plan/SKILL.md +8 -6
- package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +22 -12
- package/plugins/lisa/skills/product-walkthrough/SKILL.md +1 -1
- package/plugins/lisa/skills/spec-conformance/SKILL.md +2 -3
- package/plugins/lisa/skills/ticket-triage/SKILL.md +7 -7
- package/plugins/lisa/skills/tracker-add-journey/SKILL.md +24 -0
- package/plugins/lisa/skills/tracker-build-intake/SKILL.md +25 -0
- package/plugins/lisa/skills/tracker-create/SKILL.md +24 -0
- package/plugins/lisa/skills/tracker-evidence/SKILL.md +24 -0
- package/plugins/lisa/skills/tracker-journey/SKILL.md +24 -0
- package/plugins/lisa/skills/tracker-read/SKILL.md +25 -0
- package/plugins/lisa/skills/tracker-sync/SKILL.md +26 -0
- package/plugins/lisa/skills/tracker-validate/SKILL.md +35 -0
- package/plugins/lisa/skills/tracker-verify/SKILL.md +25 -0
- package/plugins/lisa/skills/tracker-write/SKILL.md +43 -0
- package/plugins/lisa/skills/verification-lifecycle/SKILL.md +31 -9
- package/plugins/lisa/skills/verify/SKILL.md +7 -6
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/skills/jira-verify/SKILL.md +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/skills/jira-verify/SKILL.md +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/.claude-plugin/plugin.json +6 -0
- package/plugins/src/base/agents/confluence-prd-intake.md +5 -5
- package/plugins/src/base/agents/github-agent.md +141 -0
- package/plugins/src/base/agents/github-build-intake.md +62 -0
- package/plugins/src/base/agents/github-prd-intake.md +64 -0
- package/plugins/src/base/agents/linear-prd-intake.md +5 -5
- package/plugins/src/base/agents/notion-prd-intake.md +5 -5
- package/plugins/src/base/agents/verification-specialist.md +8 -2
- package/plugins/src/base/commands/codify-verification.md +6 -0
- package/plugins/src/base/commands/intake.md +2 -2
- package/plugins/src/base/commands/plan.md +2 -2
- package/plugins/src/base/hooks/block-no-verify.sh +37 -0
- package/plugins/src/base/rules/intent-routing.md +21 -15
- package/plugins/src/base/rules/tracker-resolution.md +76 -0
- package/plugins/src/base/rules/verification.md +2 -2
- package/plugins/src/base/skills/codify-verification/SKILL.md +152 -0
- package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +11 -11
- package/plugins/src/base/skills/{confluence-to-jira → confluence-to-tracker}/SKILL.md +31 -31
- package/plugins/src/base/skills/github-add-journey/SKILL.md +114 -0
- package/plugins/src/base/skills/github-build-intake/SKILL.md +188 -0
- package/plugins/src/base/skills/github-create/SKILL.md +101 -0
- package/plugins/src/base/skills/github-evidence/SKILL.md +116 -0
- package/plugins/src/base/skills/github-journey/SKILL.md +121 -0
- package/plugins/src/base/skills/github-prd-intake/SKILL.md +286 -0
- package/plugins/src/base/skills/github-read-issue/SKILL.md +248 -0
- package/plugins/src/base/skills/github-sync/SKILL.md +73 -0
- package/plugins/src/base/skills/github-to-tracker/SKILL.md +312 -0
- package/plugins/src/base/skills/github-validate-issue/SKILL.md +288 -0
- package/plugins/src/base/skills/github-verify/SKILL.md +29 -0
- package/plugins/src/base/skills/github-write-issue/SKILL.md +304 -0
- package/plugins/src/base/skills/implement/SKILL.md +4 -4
- package/plugins/src/base/skills/intake/SKILL.md +14 -4
- package/plugins/src/base/skills/jira-source-artifacts/SKILL.md +1 -1
- package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +3 -3
- package/plugins/src/base/skills/jira-verify/SKILL.md +1 -1
- package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
- package/plugins/src/base/skills/linear-prd-intake/SKILL.md +10 -10
- package/plugins/src/base/skills/{linear-to-jira → linear-to-tracker}/SKILL.md +30 -31
- package/plugins/src/base/skills/notion-prd-intake/SKILL.md +11 -11
- package/plugins/{lisa/skills/notion-to-jira → src/base/skills/notion-to-tracker}/SKILL.md +34 -34
- package/plugins/src/base/skills/plan/SKILL.md +8 -6
- package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +22 -12
- package/plugins/src/base/skills/product-walkthrough/SKILL.md +1 -1
- package/plugins/src/base/skills/spec-conformance/SKILL.md +2 -3
- package/plugins/src/base/skills/ticket-triage/SKILL.md +7 -7
- package/plugins/src/base/skills/tracker-add-journey/SKILL.md +24 -0
- package/plugins/src/base/skills/tracker-build-intake/SKILL.md +25 -0
- package/plugins/src/base/skills/tracker-create/SKILL.md +24 -0
- package/plugins/src/base/skills/tracker-evidence/SKILL.md +24 -0
- package/plugins/src/base/skills/tracker-journey/SKILL.md +24 -0
- package/plugins/src/base/skills/tracker-read/SKILL.md +25 -0
- package/plugins/src/base/skills/tracker-sync/SKILL.md +26 -0
- package/plugins/src/base/skills/tracker-validate/SKILL.md +35 -0
- package/plugins/src/base/skills/tracker-verify/SKILL.md +25 -0
- package/plugins/src/base/skills/tracker-write/SKILL.md +43 -0
- package/plugins/src/base/skills/verification-lifecycle/SKILL.md +31 -9
- package/plugins/src/base/skills/verify/SKILL.md +7 -6
- package/plugins/src/expo/skills/jira-verify/SKILL.md +1 -1
- package/plugins/src/rails/skills/jira-verify/SKILL.md +1 -1
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: github-to-tracker
|
|
3
|
+
description: >
|
|
4
|
+
Break down a GitHub Issue PRD into Epics, Stories, and Sub-tasks in the configured destination tracker
|
|
5
|
+
(JIRA via lisa:tracker-write → lisa:jira-write-ticket, or GitHub Issues itself via lisa:tracker-write
|
|
6
|
+
→ lisa:github-write-issue). Use this skill whenever the user shares a GitHub issue URL and wants it
|
|
7
|
+
converted into tickets, or asks to "break down this GitHub PRD", "create tickets from a GitHub issue",
|
|
8
|
+
or similar. This skill mirrors lisa:notion-to-tracker / lisa:confluence-to-tracker /
|
|
9
|
+
lisa:linear-to-tracker for projects whose PRDs live in GitHub Issues — the workflow, gates, dry-run
|
|
10
|
+
mode, and validation rules are identical; only the source-of-truth tool surface differs (the `gh` CLI
|
|
11
|
+
instead of Notion / Confluence / Linear MCP).
|
|
12
|
+
allowed-tools: ["Skill", "Bash", "Read"]
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# GitHub PRD to Tracker Breakdown
|
|
16
|
+
|
|
17
|
+
Convert a GitHub Issue PRD into a structured ticket hierarchy in the configured destination tracker: Epics > Stories > Sub-tasks. Each Sub-task is scoped to exactly one repo and includes an empirical verification plan.
|
|
18
|
+
|
|
19
|
+
This skill is the GitHub counterpart of `lisa:notion-to-tracker` / `lisa:confluence-to-tracker` / `lisa:linear-to-tracker`. The four skills share the same phases, gates, dry-run contract, and per-ticket validation logic. Only the PRD-side fetch tools differ. When changing workflow logic, change ALL FOUR skills together so the PRD vendors stay behaviorally identical.
|
|
20
|
+
|
|
21
|
+
## What "PRD" means in GitHub Issues
|
|
22
|
+
|
|
23
|
+
GitHub Issues has no native "PRD" entity. This skill treats a single GitHub Issue (carrying the `prd-ready` label) as the PRD container:
|
|
24
|
+
|
|
25
|
+
- **Issue body** (markdown) is the PRD body — equivalent to a Notion page body, a Confluence page body, or a Linear project description.
|
|
26
|
+
- **Sub-issues** (native GitHub sub-issues, traversable via `gh api graphql`) act as the candidate set for Epics or User Stories — the same role child Epic pages play in a Notion/Confluence PRD.
|
|
27
|
+
- **Issue comments** capture decisions, engineering notes, product clarifications.
|
|
28
|
+
- **Linked PRs** (parsed from `Resolves #<n>` lines and from native cross-references) provide implementation context.
|
|
29
|
+
|
|
30
|
+
A multi-Epic PRD is encoded as a parent Issue with several child sub-issues. A simple PRD is a single Issue with body content only.
|
|
31
|
+
|
|
32
|
+
## Modes
|
|
33
|
+
|
|
34
|
+
This skill supports two modes, controlled by a `dry_run` flag in `$ARGUMENTS`:
|
|
35
|
+
|
|
36
|
+
- **`dry_run: false`** (default — full mode): run all phases, write tickets via `lisa:tracker-write`, run the preservation gate, report.
|
|
37
|
+
- **`dry_run: true`** (planning + validation only — no writes): run Phases 1, 1.5, 1.6, 2, 3, 4 to plan the hierarchy and draft each ticket spec, then call `lisa:tracker-validate` (with `--spec-only`) on every drafted ticket. Aggregate the per-ticket validator reports into a single dry-run report. **Skip Phase 5 (sub-task creation), Phase 5.5 (preservation gate), and Phase 6 (results report)** — none of those make sense without writes. Return the dry-run report so the caller (e.g. `lisa:github-prd-intake`) can decide whether to proceed.
|
|
38
|
+
|
|
39
|
+
Dry-run output format is identical to `lisa:notion-to-tracker` / `lisa:confluence-to-tracker` / `lisa:linear-to-tracker`. Reuse the same fields, including `prd_anchor` and `prd_section`. For GitHub, `prd_anchor` is a section heading from the PRD body when the failure traces to a specific section; otherwise `null` (the caller posts unanchored failures as a rollup comment on the PRD issue).
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
## github-to-tracker dry-run: <PRD title>
|
|
43
|
+
|
|
44
|
+
### Planned hierarchy
|
|
45
|
+
- Epic: <summary>
|
|
46
|
+
prd_section: "<heading text from the PRD body or sub-issue title that produced this epic>"
|
|
47
|
+
prd_anchor: "<heading text or sub-issue ref or null>"
|
|
48
|
+
- Story 1.1: <summary>
|
|
49
|
+
prd_section: "<heading or user-story line>"
|
|
50
|
+
prd_anchor: "<heading or sub-issue ref or null>"
|
|
51
|
+
- Sub-task [<repo>]: <summary>
|
|
52
|
+
prd_section: "<heading or AC bullet>"
|
|
53
|
+
prd_anchor: "<heading or sub-issue ref or null>"
|
|
54
|
+
- ...
|
|
55
|
+
- Story 1.2: ...
|
|
56
|
+
|
|
57
|
+
### Per-ticket validation
|
|
58
|
+
- <ticket-ref>: PASS | FAIL — <count> failures
|
|
59
|
+
prd_section: "<heading text>"
|
|
60
|
+
prd_anchor: "<heading or sub-issue ref or null>"
|
|
61
|
+
failures:
|
|
62
|
+
- gate: <gate-id>
|
|
63
|
+
category: <category from validator>
|
|
64
|
+
product_relevant: <true|false>
|
|
65
|
+
what: <plain-language description from validator>
|
|
66
|
+
recommendation: <1–3 candidate resolutions from validator>
|
|
67
|
+
|
|
68
|
+
### Verdict: PASS | FAIL
|
|
69
|
+
### Total failures: <n>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
The dry-run mode never writes to the destination tracker. It also never modifies the source PRD issue, never adds/removes labels, never edits sub-issues, and never posts comments — that is the orchestrating skill's responsibility (`lisa:github-prd-intake`).
|
|
73
|
+
|
|
74
|
+
## Hard Rule: All Writes Go Through `lisa:tracker-write`
|
|
75
|
+
|
|
76
|
+
**Every ticket created by this skill — every Epic, Story, and Sub-task — MUST be created by invoking the `lisa:tracker-write` shim. Never call `lisa:jira-write-ticket`, `lisa:github-write-issue`, `mcp__atlassian__createJiraIssue`, or `gh issue create` directly from this skill or from any sub-agent it spawns.**
|
|
77
|
+
|
|
78
|
+
`lisa:tracker-write` enforces:
|
|
79
|
+
- Vendor-agnostic dispatch (so a project's destination is one config edit away).
|
|
80
|
+
- The vendor writer's pre-write gate (`lisa:tracker-validate` Phase 5.5).
|
|
81
|
+
- Post-write verify (`lisa:tracker-verify`).
|
|
82
|
+
- 3-audience description, Gherkin acceptance criteria, parent / Epic validation, link discovery, single-repo scope, sign-in / target environment fields, source-artifact preservation.
|
|
83
|
+
|
|
84
|
+
Bypassing the shim layer produces tickets that the rest of the lifecycle (triage, verify, journey, evidence) treats as broken.
|
|
85
|
+
|
|
86
|
+
The `gh` reads in this skill are limited to reading the source PRD issue, its sub-issues, and its comments. They never write.
|
|
87
|
+
|
|
88
|
+
## Input
|
|
89
|
+
|
|
90
|
+
A GitHub issue ref. The PRD is expected to have:
|
|
91
|
+
|
|
92
|
+
- An issue body containing context, problems, and (optionally) a list of user stories.
|
|
93
|
+
- One or more sub-issues that act as candidate Epics or user stories (optional — single-issue PRDs are valid).
|
|
94
|
+
- Issue comments capturing engineering notes and product decisions.
|
|
95
|
+
- The `prd-ready` label (if invoked from `lisa:github-prd-intake`; for ad-hoc / direct invocation the label is informational, not gating).
|
|
96
|
+
|
|
97
|
+
URL parsing — accept either:
|
|
98
|
+
|
|
99
|
+
- `org/repo#<number>`
|
|
100
|
+
- `https://github.com/<org>/<repo>/issues/<number>`
|
|
101
|
+
|
|
102
|
+
Resolve `<org>/<repo>` from `.lisa.config.json` if `$ARGUMENTS` is just `#<n>` or a bare number.
|
|
103
|
+
|
|
104
|
+
## Configuration
|
|
105
|
+
|
|
106
|
+
This skill reads project-specific configuration from environment variables and from `.lisa.config.json`. If these are not set, ask the user before proceeding — never invent values.
|
|
107
|
+
|
|
108
|
+
| Variable / config | Purpose | Example |
|
|
109
|
+
|-------------------|---------|---------|
|
|
110
|
+
| `.lisa.config.json` `tracker` | Destination tracker (jira / github) | `github` |
|
|
111
|
+
| `.lisa.config.json` `github.org` / `github.repo` | GitHub org/repo when tracker=github (and the source repo) | `acme` / `frontend-v2` |
|
|
112
|
+
| `JIRA_PROJECT` | Destination JIRA project key when tracker=jira | `SE` |
|
|
113
|
+
| `JIRA_SERVER` | Atlassian instance URL | `mycompany.atlassian.net` |
|
|
114
|
+
| `E2E_TEST_PHONE` | Test user phone for verification plans | `0000000099` |
|
|
115
|
+
| `E2E_TEST_OTP` | Test user OTP code | `555555` |
|
|
116
|
+
| `E2E_TEST_ORG` | Test organization name | `Arsenal` |
|
|
117
|
+
| `E2E_BASE_URL` | Frontend base URL for Playwright tests | `https://dev.example.io/` |
|
|
118
|
+
| `E2E_GRAPHQL_URL` | GraphQL API URL for curl verification | `https://gql.dev.example.io/graphql` |
|
|
119
|
+
|
|
120
|
+
## Workflow
|
|
121
|
+
|
|
122
|
+
### Phase 1: Fetch & Analyze the PRD
|
|
123
|
+
|
|
124
|
+
1. **Confirm `gh auth status` succeeds.**
|
|
125
|
+
2. **Fetch the PRD issue** via `gh issue view <num> --repo <org>/<repo> --json number,title,body,labels,milestone,assignees,author,createdAt,comments,url`. Capture title, body, labels, author, assignees, dates, comments.
|
|
126
|
+
3. **Fetch native sub-issues** via the GraphQL `subIssues` traversal (see `lisa:github-read-issue` Phase 3). Each sub-issue's `{number, title, body, labels, state, url}` becomes a candidate epic / story node.
|
|
127
|
+
4. **Recursively fetch grandchild sub-issues** (one more level — typical PRD depth is 2: PRD → Epic candidate → maybe a Story candidate). Stop after depth 3 unless the user explicitly requested deeper.
|
|
128
|
+
5. **Fetch full comments per sub-issue** via `gh issue view <num> --repo <org>/<repo> --json comments` for every sub-issue surfaced in step 3. Capture body, author, timestamp.
|
|
129
|
+
6. **Synthesize decisions and blockers** from the PRD body + every sub-issue body + every comment thread:
|
|
130
|
+
- Decisions already confirmed by the team (look for agreement in comments).
|
|
131
|
+
- Open questions that need product/engineering input.
|
|
132
|
+
- Engineering comments (prefixed with "Engineering:" or 🔧) that identify technical constraints.
|
|
133
|
+
- Cross-PRD dependencies (references to other GitHub issues, Notion / Confluence / Linear PRDs, shared infrastructure).
|
|
134
|
+
|
|
135
|
+
### Phase 1.5: Extract Source Artifacts
|
|
136
|
+
|
|
137
|
+
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.
|
|
138
|
+
|
|
139
|
+
1. **Scan the PRD body, every sub-issue body, and every comment** for:
|
|
140
|
+
- URLs to design/prototype tools (Figma, FigJam, Figma Make, Lovable, Framer, Penpot)
|
|
141
|
+
- URLs to recording/walkthrough tools (Loom, YouTube, Vimeo, Descript)
|
|
142
|
+
- URLs to collaborative docs (Google Docs/Slides/Sheets, peer Confluence pages, Notion peer pages, peer Linear documents)
|
|
143
|
+
- URLs to code sandboxes (CodeSandbox, StackBlitz, Replit, GitHub permalinks/gists)
|
|
144
|
+
- URLs to diagramming tools (Miro, Mural, Excalidraw, Mermaid Live, draw.io, Lucid)
|
|
145
|
+
- URLs to data/observability tools (Grafana, Datadog, Sentry, Metabase, Looker)
|
|
146
|
+
- Embedded images and file attachments referenced in the body
|
|
147
|
+
- Fenced code blocks with example data (JSON, SQL, GraphQL, cURL request/response)
|
|
148
|
+
|
|
149
|
+
2. **Classify each artifact and apply taxonomy rules** by invoking the `lisa:jira-source-artifacts` skill. That skill is the single source of truth for: domains (`ui-design` / `ux-flow` / `data` / `ops` / `reference`), per-tool classification rules, and coverage smells.
|
|
150
|
+
|
|
151
|
+
3. **Build an `artifacts` map** keyed by domain. Each entry: `{ url, title, domain, source_page, source_page_url, classification_reason }`. `source_page` lets you trace each reference back to where it appeared (PRD body vs a specific sub-issue vs a specific comment).
|
|
152
|
+
|
|
153
|
+
4. **Surface coverage smells** as defined in `lisa:jira-source-artifacts` §5. Record on the Epic.
|
|
154
|
+
|
|
155
|
+
### Phase 1.6: Source Precedence & Conflict Resolution
|
|
156
|
+
|
|
157
|
+
Source precedence rules and cross-axis conflict handling are defined in `lisa:jira-source-artifacts` §3 and §4. Apply them during ticket synthesis: every conflict between artifacts must be recorded under `## Open Questions` on the affected ticket, never silently reconciled.
|
|
158
|
+
|
|
159
|
+
The existing-component reuse expectation is defined in `lisa:jira-source-artifacts` §7. Encode it on every UI-touching story.
|
|
160
|
+
|
|
161
|
+
### Phase 2: Codebase + Live Product Research
|
|
162
|
+
|
|
163
|
+
Identical to `lisa:notion-to-tracker` Phase 2 / `lisa:confluence-to-tracker` / `lisa:linear-to-tracker`. Two complementary inputs ground PRD analysis: the **code** and the **live product**.
|
|
164
|
+
|
|
165
|
+
**2a. Codebase research.** If the session doesn't already have codebase context, explore the repos. Use Explore agents for repos not yet examined.
|
|
166
|
+
|
|
167
|
+
**2b. Live product walkthrough.** If the PRD touches existing user-facing surfaces, invoke `lisa:product-walkthrough` against `E2E_BASE_URL` using the test user from config.
|
|
168
|
+
|
|
169
|
+
Skip 2b only when the work is purely backend with no user-visible surface, or affects a screen that does not yet exist.
|
|
170
|
+
|
|
171
|
+
Walkthrough findings are surfaced back to product via the orchestrating intake skill (`lisa:github-prd-intake`), which posts them as a comment on the PRD issue. This skill itself does NOT post to GitHub — it only reads. The walkthrough section is also inherited onto the resulting Epic / Stories under a `## Current Product` subsection.
|
|
172
|
+
|
|
173
|
+
### Phase 3: Create Epics
|
|
174
|
+
|
|
175
|
+
> **Mode guard**: In `dry_run: true` mode, do not invoke `lisa:tracker-write` in this phase. Instead, draft the epic spec (summary, body, artifacts) and validate it with `lisa:tracker-validate --spec-only`. Record the drafted spec (with a placeholder ref like `DRY-RUN-EPIC-1`) for Phase 4 to use as parent references. In `dry_run: false` mode, proceed as described below.
|
|
176
|
+
|
|
177
|
+
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:
|
|
178
|
+
|
|
179
|
+
- `issue_type`: `Epic`
|
|
180
|
+
- `summary`: epic title from the PRD
|
|
181
|
+
- `body`: a draft of the multi-section description containing:
|
|
182
|
+
- **Context / Business Value**: epic summary from the PRD, originating GitHub PRD URL, business outcome
|
|
183
|
+
- **Technical Approach**: cross-cutting integration points and constraints surfaced in Phase 2 codebase research
|
|
184
|
+
- List of user stories the epic contains
|
|
185
|
+
- Key decisions from comments (with attribution)
|
|
186
|
+
- Blockers and open questions
|
|
187
|
+
- Dependencies on other epics or PRDs
|
|
188
|
+
- A **Source Artifacts** section listing every artifact extracted in Phase 1.5 (grouped by domain)
|
|
189
|
+
- `artifacts`: the full Phase 1.5 artifact list — every artifact, regardless of domain. The Epic is the canonical hub.
|
|
190
|
+
- `priority`, `labels`, `components`, `fix_version`: as appropriate
|
|
191
|
+
|
|
192
|
+
Capture the returned epic ref — Phase 4 needs it as the parent for Stories.
|
|
193
|
+
|
|
194
|
+
### Phase 4: Create Stories
|
|
195
|
+
|
|
196
|
+
> **Mode guard**: In `dry_run: true` mode, do not invoke `lisa:tracker-write`. Draft each story spec and validate it with `lisa:tracker-validate --spec-only`. Use placeholder refs (e.g. `DRY-RUN-STORY-1.1`).
|
|
197
|
+
|
|
198
|
+
For each Epic, plan two kinds of Stories:
|
|
199
|
+
- **One "X.0 Setup" story** for data model and infrastructure prerequisites
|
|
200
|
+
- **One story per user story** from the PRD (numbered to match the PRD's structure or the source sub-issues)
|
|
201
|
+
|
|
202
|
+
**Story naming convention**: Prefix the summary with a short code derived from the PRD title (e.g., `[CU-1.1]` for "Contract Upload").
|
|
203
|
+
|
|
204
|
+
For each Story, **invoke `lisa:tracker-write`** with:
|
|
205
|
+
|
|
206
|
+
- `issue_type`: `Story`
|
|
207
|
+
- `parent_ref` / `epic_parent`: the Epic ref captured in Phase 3 (mandatory)
|
|
208
|
+
- `summary`: prefixed per the naming convention above
|
|
209
|
+
- `body`: multi-section description as in `lisa:notion-to-tracker` Phase 4
|
|
210
|
+
- `artifacts`: the Phase 1.5 artifacts filtered by domain per the inheritance table:
|
|
211
|
+
|
|
212
|
+
| Story type | Inherits domains |
|
|
213
|
+
|------------|------------------|
|
|
214
|
+
| Frontend / UI | `ui-design`, `ux-flow`, `reference` |
|
|
215
|
+
| Backend / API / data model | `data`, `reference` |
|
|
216
|
+
| Infrastructure | `ops`, `reference` |
|
|
217
|
+
| Mixed / setup ("X.0") | All domains |
|
|
218
|
+
|
|
219
|
+
Capture each returned story ref — Phase 5 needs it.
|
|
220
|
+
|
|
221
|
+
### Phase 5: Create Sub-tasks
|
|
222
|
+
|
|
223
|
+
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 `lisa:jira-write-ticket` / `lisa:github-write-issue` / `gh issue create` directly.**
|
|
224
|
+
|
|
225
|
+
Each sub-task MUST:
|
|
226
|
+
1. **Be scoped to exactly ONE repo** — indicated in brackets in the summary: `[repo-name]`.
|
|
227
|
+
2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking.
|
|
228
|
+
|
|
229
|
+
Sub-tasks inherit their parent Story's artifacts by reference (the parent link). Do not pass the same artifact list to every sub-task.
|
|
230
|
+
|
|
231
|
+
### Phase 5.5: Artifact Preservation Gate (mandatory)
|
|
232
|
+
|
|
233
|
+
Run the preservation gate defined in `lisa:jira-source-artifacts` §8 against the artifacts extracted in Phase 1.5 and the tickets just created. Do NOT restate or modify the gate logic here — invoke the rules from `lisa:jira-source-artifacts`.
|
|
234
|
+
|
|
235
|
+
To run the gate, this skill must:
|
|
236
|
+
|
|
237
|
+
1. Pull the remote links / `## Source Artifacts` section / `## Links` section of every Epic and Story created in this run via `lisa:tracker-read`.
|
|
238
|
+
2. Apply the §8 preservation matrix and verdict rules.
|
|
239
|
+
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.
|
|
240
|
+
4. If the gate passes: print the matrix compactly and proceed to Phase 6.
|
|
241
|
+
|
|
242
|
+
This gate is not optional.
|
|
243
|
+
|
|
244
|
+
### Phase 6: Report Results
|
|
245
|
+
|
|
246
|
+
After all tickets are created, present a summary table to the user:
|
|
247
|
+
- All Epics with refs and URLs
|
|
248
|
+
- All Stories grouped by Epic
|
|
249
|
+
- All Sub-tasks grouped by Story with repo tags
|
|
250
|
+
- Repo distribution
|
|
251
|
+
- **Artifact Preservation Matrix**
|
|
252
|
+
- Blockers list with recommendations and alternatives
|
|
253
|
+
- Cross-PRD dependencies
|
|
254
|
+
|
|
255
|
+
## Handling Ambiguities and Blockers
|
|
256
|
+
|
|
257
|
+
When you encounter something the PRD + comments + codebase can't resolve:
|
|
258
|
+
|
|
259
|
+
1. **Don't guess** — mark the ticket with a BLOCKER section.
|
|
260
|
+
2. **Include your recommendation** with rationale.
|
|
261
|
+
3. **List 2-3 alternatives** so the user/product can choose.
|
|
262
|
+
4. **State what's needed to unblock.**
|
|
263
|
+
|
|
264
|
+
## Agent Prompt Template for Sub-task Creation
|
|
265
|
+
|
|
266
|
+
When delegating to agents, provide this context. **The "MUST invoke tracker-write" instruction is load-bearing — do not edit it out when adapting this template.**
|
|
267
|
+
|
|
268
|
+
```text
|
|
269
|
+
Create Sub-tasks via the configured destination tracker.
|
|
270
|
+
|
|
271
|
+
CRITICAL: For each sub-task, invoke the `lisa:tracker-write` skill via the Skill tool.
|
|
272
|
+
Do NOT call `lisa:jira-write-ticket`, `lisa:github-write-issue`, or `gh issue create` directly.
|
|
273
|
+
The `lisa:tracker-write` shim dispatches to the configured destination AND enforces required
|
|
274
|
+
quality gates (Gherkin acceptance criteria, multi-section description, single-repo scope,
|
|
275
|
+
sign-in/environment fields, post-create verification). Bypassing it produces broken tickets
|
|
276
|
+
that downstream skills (triage, journey, evidence) cannot use.
|
|
277
|
+
|
|
278
|
+
For each sub-task, invoke `lisa:tracker-write` with:
|
|
279
|
+
- issue_type: "Sub-task"
|
|
280
|
+
- parent_ref: the parent story ref
|
|
281
|
+
- summary: prefixed with the repo in brackets, e.g. "[backend-api] Add audit log table"
|
|
282
|
+
- body: a multi-section draft (Context / Technical Approach / Acceptance Criteria / etc.)
|
|
283
|
+
- gherkin_acceptance_criteria: derived from the story's functional requirements
|
|
284
|
+
- sign_in_account: [test user credentials from config]
|
|
285
|
+
- target_environment: "dev"
|
|
286
|
+
- empirical_verification_plan: real user-like verification (curl + auth token, Playwright
|
|
287
|
+
browser flow, CLI check after deploy) using the test credentials. NOT unit tests.
|
|
288
|
+
|
|
289
|
+
Each sub-task must:
|
|
290
|
+
1. Be scoped to ONE repo only — repo named in brackets in the summary.
|
|
291
|
+
2. Include the Empirical Verification Plan in the body.
|
|
292
|
+
3. Be created via `lisa:tracker-write`, not via direct calls.
|
|
293
|
+
|
|
294
|
+
If `lisa:tracker-write` rejects a sub-task, fix the input and re-invoke. Do NOT fall back
|
|
295
|
+
to a direct vendor-write call to bypass the gate.
|
|
296
|
+
|
|
297
|
+
Test user info: [credentials from config]
|
|
298
|
+
|
|
299
|
+
[Then list all sub-tasks grouped by parent story with details]
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## Cross-PRD Shared Infrastructure
|
|
303
|
+
|
|
304
|
+
Track tickets that are shared across PRDs to avoid duplication. When a sub-task overlaps with an existing ticket, reference it instead of creating a duplicate. Use `lisa:tracker-read` to search the destination for existing tickets in the same area before creating new ones for shared infrastructure.
|
|
305
|
+
|
|
306
|
+
## GitHub-specific notes
|
|
307
|
+
|
|
308
|
+
- **Body format**: GitHub Issues bodies are markdown. Treat headings (`#`, `##`, `###`) as section markers for `prd_section`.
|
|
309
|
+
- **Native sub-issues**: GitHub native sub-issues (the `addSubIssue` GraphQL mutation) are how Epic→Story→Sub-task is encoded when the destination is also GitHub Issues. The PRD-side reads them via the `subIssues` GraphQL field.
|
|
310
|
+
- **Comment threading**: GitHub Issues comments are flat — there's no `parentId` (unlike Linear). Decision context is captured by chronological position; quote the comment author + timestamp when surfacing it.
|
|
311
|
+
- **Anchoring on PRD comments**: GitHub Issues do not have a Confluence-style selection-anchored inline-comment primitive. The orchestrating skill (`lisa:github-prd-intake`) approximates by quoting the relevant body excerpt at the top of each comment. The dry-run report's `prd_anchor` is the section heading the failure traces to (or `null` for body-wide failures).
|
|
312
|
+
- **Self-host edge case**: when `tracker = "github"` AND the source PRD repo is the same as the destination repo, both reads and writes hit one place. The PRD carries `prd-*` labels; built tickets carry `type:*` + `status:*` labels. The two namespaces never overlap. `lisa:prd-ticket-coverage` filters out the source PRD itself when listing destination tickets.
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: github-validate-issue
|
|
3
|
+
description: "Validates a proposed GitHub Issue spec (or an existing issue) against the organizational quality gates without writing anything. Returns a structured PASS/FAIL report per gate with concrete remediation. The GitHub counterpart of lisa:jira-validate-ticket — same gate definitions, translated to the GitHub Issues data model. Single source of truth for what makes a valid GitHub Issue. Both the write path (github-write-issue runs it pre-write) and the dry-run path (github-to-tracker runs it during PRD intake) call this skill."
|
|
4
|
+
allowed-tools: ["Bash", "Read"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Validate GitHub Issue: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
Run all organizational quality gates against an issue spec OR an existing issue. **This skill is read-only — it never writes to GitHub.** The output is a structured report consumed by callers (`lisa:github-write-issue` for pre-write gating, `lisa:github-to-tracker` for PRD dry-run, `lisa:github-verify` for post-write checks).
|
|
10
|
+
|
|
11
|
+
## Input
|
|
12
|
+
|
|
13
|
+
`$ARGUMENTS` is one of:
|
|
14
|
+
|
|
15
|
+
1. **An existing issue ref** (`org/repo#<number>` or `https://github.com/<org>/<repo>/issues/<number>`): fetch it and validate the live state. Use this for post-write checks.
|
|
16
|
+
2. **A proposed issue spec** (YAML block, see schema below): validate as-is without touching GitHub. Use this for pre-write and dry-run checks.
|
|
17
|
+
|
|
18
|
+
### Spec schema
|
|
19
|
+
|
|
20
|
+
Specs are passed as a fenced YAML block. Required keys depend on `issue_type`.
|
|
21
|
+
|
|
22
|
+
```yaml
|
|
23
|
+
issue_type: Story # Story | Task | Bug | Epic | Spike | Sub-task | Improvement
|
|
24
|
+
org: my-org
|
|
25
|
+
repo: my-repo
|
|
26
|
+
summary: "[CU-1.2] Upload contract PDF from settings"
|
|
27
|
+
priority: medium
|
|
28
|
+
parent_ref: "my-org/my-repo#1234" # Parent Epic for non-Bug/non-Epic; Story for Sub-task
|
|
29
|
+
body: |
|
|
30
|
+
## Context / Business Value
|
|
31
|
+
...
|
|
32
|
+
|
|
33
|
+
## Technical Approach
|
|
34
|
+
...
|
|
35
|
+
|
|
36
|
+
## Acceptance Criteria
|
|
37
|
+
```gherkin
|
|
38
|
+
Scenario: <name>
|
|
39
|
+
Given <precondition>
|
|
40
|
+
When <action>
|
|
41
|
+
Then <observable outcome>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Out of Scope
|
|
45
|
+
...
|
|
46
|
+
|
|
47
|
+
## Target Backend Environment
|
|
48
|
+
dev
|
|
49
|
+
|
|
50
|
+
## Sign-in Required
|
|
51
|
+
Account: ...
|
|
52
|
+
|
|
53
|
+
## Repository
|
|
54
|
+
backend-api
|
|
55
|
+
|
|
56
|
+
## Validation Journey
|
|
57
|
+
...
|
|
58
|
+
|
|
59
|
+
# Behavioral flags — caller asserts these so the validator can pick the right gates
|
|
60
|
+
runtime_behavior_change: true # → requires Target Backend Environment + Validation Journey
|
|
61
|
+
authenticated_surface: true # → requires Sign-in Required
|
|
62
|
+
artifacts_attached: true # → requires Source Precedence section
|
|
63
|
+
links: [{ ref: "my-org/my-repo#99", type: "is blocked by" }] # known issue links (may be empty)
|
|
64
|
+
remote_links: [{ url: "https://github.com/.../pull/42", title: "PR #42" }]
|
|
65
|
+
journey_followup: auto # auto | none — see S11
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
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).
|
|
69
|
+
|
|
70
|
+
## Gates
|
|
71
|
+
|
|
72
|
+
Gates are grouped into **Specification** (spec-only checks, no GitHub lookups) and **Feasibility** (requires GitHub lookups). The dry-run path may opt to run Specification gates only via `--spec-only`; the write path runs both.
|
|
73
|
+
|
|
74
|
+
Each gate is tagged with a fixed `category` and a `product_relevant` boolean. Categories are the same fixed set used by `lisa:jira-validate-ticket` so downstream PRD-intake comment-formatting policy is shared across vendors.
|
|
75
|
+
|
|
76
|
+
| Gate | Category | Product-relevant |
|
|
77
|
+
|------|----------|------------------|
|
|
78
|
+
| S1 Required core fields | `structural` | false |
|
|
79
|
+
| S2 Summary format | `structural` | false |
|
|
80
|
+
| S3 Description three audiences | `product-clarity` | true |
|
|
81
|
+
| S4 Acceptance criteria in Gherkin | `acceptance-criteria` | true |
|
|
82
|
+
| S5 Bug-specific content | `product-clarity` | true |
|
|
83
|
+
| S6 Spike-specific content | `scope` | true |
|
|
84
|
+
| S7 Parent sub-issue declared | `structural` | false |
|
|
85
|
+
| S8 Target Backend Environment | `technical` | false |
|
|
86
|
+
| S9 Sign-in Required | `technical` | false |
|
|
87
|
+
| S10 Single-repo scope | `scope` | true |
|
|
88
|
+
| S11 Validation Journey | `acceptance-criteria` | true |
|
|
89
|
+
| S12 Source Precedence | `design-ux` | true |
|
|
90
|
+
| S13 Relationship Search | `dependency` | true |
|
|
91
|
+
| F1 Issue type label exists in repo | `structural` | false |
|
|
92
|
+
| F2 Parent sub-issue exists and is the right type | `structural` | false |
|
|
93
|
+
| F3 Linked issues exist | `structural` | false |
|
|
94
|
+
| F4 Required labels populated | `structural` | false |
|
|
95
|
+
|
|
96
|
+
Category values are the same fixed set as `lisa:jira-validate-ticket`:
|
|
97
|
+
|
|
98
|
+
- `product-clarity`, `acceptance-criteria`, `design-ux`, `scope`, `dependency`, `data`, `technical`, `structural`.
|
|
99
|
+
|
|
100
|
+
### Specification Gates
|
|
101
|
+
|
|
102
|
+
#### S1 — Required core fields
|
|
103
|
+
|
|
104
|
+
`org`, `repo`, `issue_type`, `summary`, `priority`, `body` must all be present and non-empty.
|
|
105
|
+
|
|
106
|
+
#### S2 — Summary format
|
|
107
|
+
|
|
108
|
+
- Single line, ≤ 100 characters.
|
|
109
|
+
- Imperative voice ("Add X", "Fix Y", not "Adding X" or "X is broken").
|
|
110
|
+
- Bug / Task / Sub-task summaries SHOULD start with a `[repo-name]` prefix when the project convention uses one.
|
|
111
|
+
|
|
112
|
+
#### S3 — Description has all three audiences
|
|
113
|
+
|
|
114
|
+
Body must include all of these sections (case-insensitive `## ` headings):
|
|
115
|
+
|
|
116
|
+
- `Context / Business Value` — stakeholder-facing
|
|
117
|
+
- `Technical Approach` — developer-facing
|
|
118
|
+
- `Acceptance Criteria` — coding-assistant-facing
|
|
119
|
+
- `Out of Scope` — explicit non-coverage list
|
|
120
|
+
|
|
121
|
+
Missing any → FAIL with name of missing section.
|
|
122
|
+
|
|
123
|
+
#### S4 — Acceptance criteria in Gherkin
|
|
124
|
+
|
|
125
|
+
Applies when `issue_type ∈ {Story, Task, Bug, Sub-task, Improvement}`.
|
|
126
|
+
|
|
127
|
+
The `## Acceptance Criteria` section must contain at least one `Scenario:` block with `Given / When / Then` form, ideally inside a ` ```gherkin ` code fence. Reject prose-only criteria, "should work" language, or numbered lists without Given/When/Then verbs.
|
|
128
|
+
|
|
129
|
+
#### S5 — Bug-specific content
|
|
130
|
+
|
|
131
|
+
When `issue_type = Bug`, body must additionally include:
|
|
132
|
+
|
|
133
|
+
- Reproduction steps
|
|
134
|
+
- Expected vs. actual behavior
|
|
135
|
+
- Environment where reproduced
|
|
136
|
+
|
|
137
|
+
#### S6 — Spike-specific content
|
|
138
|
+
|
|
139
|
+
When `issue_type = Spike`, body must include:
|
|
140
|
+
|
|
141
|
+
- The question being answered
|
|
142
|
+
- Definition of done (decision doc / prototype / findings deliverable)
|
|
143
|
+
|
|
144
|
+
#### S7 — Parent sub-issue declared
|
|
145
|
+
|
|
146
|
+
When `issue_type ∉ {Bug, Epic}`, `parent_ref` must be set. The native sub-issue link is set by `lisa:github-write-issue` Phase 6 step 3. (Validity of the parent is checked in feasibility gate F2.)
|
|
147
|
+
|
|
148
|
+
#### S8 — Target Backend Environment
|
|
149
|
+
|
|
150
|
+
When `runtime_behavior_change = true`, body must contain `## Target Backend Environment` with one of `dev`, `staging`, `prod`. Skipped for doc-only / config-only / type-only / Epic.
|
|
151
|
+
|
|
152
|
+
#### S9 — Sign-in Required
|
|
153
|
+
|
|
154
|
+
When `authenticated_surface = true`, body must contain `## Sign-in Required` naming the account/role and credential source.
|
|
155
|
+
|
|
156
|
+
If the spec doesn't set `authenticated_surface`, infer it: scan the body and AC for sign-in / login / "as a {role} user" / authenticated route signals. If signals present and no `Sign-in Required` section: FAIL.
|
|
157
|
+
|
|
158
|
+
#### S10 — Repository section, single-repo scope
|
|
159
|
+
|
|
160
|
+
When `issue_type ∈ {Bug, Task, Sub-task}`, body must contain `## Repository` naming exactly one repo. Multiple repos OR cross-repo references in AC: FAIL with recommendation to split into per-repo issues under a shared Epic.
|
|
161
|
+
|
|
162
|
+
(GitHub Issues live in one repo by definition, so the `## Repository` section is technically redundant — keep it for parity with the JIRA path so downstream tooling sees the same shape.)
|
|
163
|
+
|
|
164
|
+
Story / Epic / Spike / Improvement: skipped (may span repos).
|
|
165
|
+
|
|
166
|
+
#### S11 — Validation Journey present
|
|
167
|
+
|
|
168
|
+
When `runtime_behavior_change = true`, body must contain `## Validation Journey`. Skipped for doc-only / config-only / type-only / Epic.
|
|
169
|
+
|
|
170
|
+
The caller controls strictness via `journey_followup`:
|
|
171
|
+
- `auto` (default): missing section is FAIL with remediation `"Invoke lisa:github-add-journey to append the section after create"`. Callers like `lisa:github-write-issue` know to chain the followup automatically.
|
|
172
|
+
- `none`: missing section is FAIL the caller will not auto-fix (used by dry-run paths).
|
|
173
|
+
|
|
174
|
+
#### S12 — Source Precedence (when artifacts attached)
|
|
175
|
+
|
|
176
|
+
When `artifacts_attached = true`, body must include source-precedence guidance covering: business rules → PRD body, visual treatment → mocks, flow → prototypes, API/data → data artifacts. Cross-axis conflicts surfaced under `## Open Questions`.
|
|
177
|
+
|
|
178
|
+
Accept either placement:
|
|
179
|
+
- A dedicated `## Source Precedence` subsection, OR
|
|
180
|
+
- A "Source Precedence" / "authoritative source" paragraph under `## Technical Approach`.
|
|
181
|
+
|
|
182
|
+
Detect by scanning for the phrase `Source Precedence` (case-insensitive) AND verifying the four axes (business rules, visual, flow, data) are each named.
|
|
183
|
+
|
|
184
|
+
#### S13 — Relationship Search documented
|
|
185
|
+
|
|
186
|
+
The issue must EITHER have at least one entry in `links`, OR the body must contain a `## Relationship Search` block listing the git history queries and `gh issue list` queries that were run with their outcomes. ("Searched git history for `<keywords>` and `gh issue list` for label `component:X`; no related work found.")
|
|
187
|
+
|
|
188
|
+
An issue with zero links and no documented search: FAIL.
|
|
189
|
+
|
|
190
|
+
### Feasibility Gates (require GitHub lookups; skip in `--spec-only`)
|
|
191
|
+
|
|
192
|
+
#### F1 — Issue type label exists in repo
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
gh label list --repo <org>/<repo> --json name --jq '.[].name'
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Confirm `type:<issue_type>` exists. Missing labels can be auto-created by `lisa:github-write-issue` Phase 5 — flag the absence as a structural FAIL with remediation "Run `gh label create type:<issue_type>` or let the write path auto-create."
|
|
199
|
+
|
|
200
|
+
#### F2 — Parent sub-issue exists and is the right type
|
|
201
|
+
|
|
202
|
+
When `parent_ref` is set:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
gh issue view <number> --repo <org>/<repo> --json number,labels,state
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Confirm the parent issue exists and:
|
|
209
|
+
- For non-Sub-task children: parent has `type:Epic` label.
|
|
210
|
+
- For Sub-task children: parent has `type:Story`, `type:Task`, `type:Bug`, or `type:Improvement` (anything that can host sub-tasks).
|
|
211
|
+
|
|
212
|
+
#### F3 — Linked issues exist
|
|
213
|
+
|
|
214
|
+
For each entry in `links`, run `gh issue view <number> --repo <link-org>/<link-repo>` to confirm the ref resolves. Flag broken refs.
|
|
215
|
+
|
|
216
|
+
#### F4 — Required labels populated
|
|
217
|
+
|
|
218
|
+
Per `Phase 5` of `lisa:github-write-issue`, every issue MUST carry: `type:<issue_type>`, `status:<status>`, `priority:<priority>`. If any are missing from the spec / live issue, FAIL with the missing label name.
|
|
219
|
+
|
|
220
|
+
## Execution
|
|
221
|
+
|
|
222
|
+
1. Parse `$ARGUMENTS`. If it's an issue ref, fetch via `gh issue view --json` and derive the spec fields. Otherwise parse the YAML spec.
|
|
223
|
+
2. Confirm `gh auth status` succeeds before any feasibility gate runs.
|
|
224
|
+
3. Run every Specification gate in order. Collect PASS / FAIL / N/A with a one-line reason.
|
|
225
|
+
4. Unless the caller passed `--spec-only`, run every Feasibility gate.
|
|
226
|
+
5. Emit the report below.
|
|
227
|
+
|
|
228
|
+
## Output
|
|
229
|
+
|
|
230
|
+
Output is a single fenced text block. Callers parse it; do not add free-form prose around it.
|
|
231
|
+
|
|
232
|
+
```text
|
|
233
|
+
## github-validate-issue: <ISSUE-REF-or-SUMMARY>
|
|
234
|
+
|
|
235
|
+
### Specification Gates
|
|
236
|
+
- [PASS|FAIL|N/A] S1 Required core fields — <one-line reason>
|
|
237
|
+
- [PASS|FAIL|N/A] S2 Summary format — <one-line reason>
|
|
238
|
+
- [PASS|FAIL|N/A] S3 Description three audiences — <one-line reason>
|
|
239
|
+
- [PASS|FAIL|N/A] S4 Acceptance criteria in Gherkin — <one-line reason>
|
|
240
|
+
- [PASS|FAIL|N/A] S5 Bug-specific content — <one-line reason>
|
|
241
|
+
- [PASS|FAIL|N/A] S6 Spike-specific content — <one-line reason>
|
|
242
|
+
- [PASS|FAIL|N/A] S7 Parent sub-issue declared — <one-line reason>
|
|
243
|
+
- [PASS|FAIL|N/A] S8 Target Backend Environment — <one-line reason>
|
|
244
|
+
- [PASS|FAIL|N/A] S9 Sign-in Required — <one-line reason>
|
|
245
|
+
- [PASS|FAIL|N/A] S10 Single-repo scope — <one-line reason>
|
|
246
|
+
- [PASS|FAIL|N/A] S11 Validation Journey — <one-line reason>
|
|
247
|
+
- [PASS|FAIL|N/A] S12 Source Precedence — <one-line reason>
|
|
248
|
+
- [PASS|FAIL|N/A] S13 Relationship Search — <one-line reason>
|
|
249
|
+
|
|
250
|
+
### Feasibility Gates (omit this section when --spec-only)
|
|
251
|
+
- [PASS|FAIL|N/A] F1 Issue type label exists in repo — <one-line reason>
|
|
252
|
+
- [PASS|FAIL|N/A] F2 Parent sub-issue exists and is the right type — <one-line reason>
|
|
253
|
+
- [PASS|FAIL|N/A] F3 Linked issues exist — <one-line reason>
|
|
254
|
+
- [PASS|FAIL|N/A] F4 Required labels populated — <one-line reason>
|
|
255
|
+
|
|
256
|
+
### Verdict: PASS | FAIL
|
|
257
|
+
### Failures: <count>
|
|
258
|
+
### Failure details
|
|
259
|
+
- gate: <gate-id>
|
|
260
|
+
category: <product-clarity|acceptance-criteria|design-ux|scope|dependency|data|technical|structural>
|
|
261
|
+
product_relevant: <true|false>
|
|
262
|
+
what: <plain-language description, no gate IDs, no GitHub jargon — written for a non-engineer product owner>
|
|
263
|
+
recommendation: <1–3 concrete options the caller (or downstream product team) can pick from. Never "clarify this".>
|
|
264
|
+
- gate: <gate-id>
|
|
265
|
+
...
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
The verdict is `PASS` if every applicable gate is `PASS`. Any `FAIL` makes the verdict `FAIL`. `N/A` does not affect the verdict.
|
|
269
|
+
|
|
270
|
+
### Failure-detail fields
|
|
271
|
+
|
|
272
|
+
Same shape and meaning as `lisa:jira-validate-ticket` so downstream PRD-intake skills (Notion, Confluence, Linear, GitHub) can format comments uniformly:
|
|
273
|
+
|
|
274
|
+
- **gate**: the gate ID (`S1`–`S13`, `F1`–`F4`).
|
|
275
|
+
- **category**: the gate's fixed category from the table.
|
|
276
|
+
- **product_relevant**: matches the gate's table entry. `false` means the failure is an internal data-quality problem the caller should fix without bothering product.
|
|
277
|
+
- **what**: plain-language, product-readable.
|
|
278
|
+
- **recommendation**: 1–3 concrete options.
|
|
279
|
+
|
|
280
|
+
## Rules
|
|
281
|
+
|
|
282
|
+
- Never write to GitHub. The `allowed-tools` list intentionally excludes any `gh issue create / edit / comment / close` invocation.
|
|
283
|
+
- Never auto-fix the spec. This skill reports gaps; callers decide what to do.
|
|
284
|
+
- Never silently skip a gate. Return `N/A` with the reason if a gate genuinely doesn't apply; never omit it.
|
|
285
|
+
- The `what` and `recommendation` must be concrete and product-readable — vague guidance ("clarify this") is useless.
|
|
286
|
+
- Never emit a category outside the fixed set.
|
|
287
|
+
- `product_relevant` is determined by the gate, not by the failure context.
|
|
288
|
+
- When validating an existing issue ref, parse the body via the same logic as `lisa:github-read-issue` so the two skills agree on what they see.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: github-verify
|
|
3
|
+
description: This skill should be used when verifying that a GitHub Issue meets organizational standards for parent-sub-issue relationships and description quality. It fetches the live issue and delegates the gate checks to github-validate-issue so the bar matches what github-write-issue enforces pre-write. The GitHub counterpart of lisa:jira-verify.
|
|
4
|
+
allowed-tools: ["Skill", "Bash"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Verify GitHub Issue: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
Verify that the existing GitHub Issue `$ARGUMENTS` (`org/repo#<number>` or full URL) meets organizational standards. This skill is a thin post-write wrapper around `lisa:github-validate-issue`: it fetches the live issue and asks the validator to run the gates against the fetched state.
|
|
10
|
+
|
|
11
|
+
This indirection exists so the gate definitions live in exactly one place (`lisa:github-validate-issue`). When the bar changes, change it there — `lisa:github-verify`, `lisa:github-write-issue` (Phase 5.5 pre-write), and `lisa:github-to-tracker` (PRD dry-run) all pick it up.
|
|
12
|
+
|
|
13
|
+
## Process
|
|
14
|
+
|
|
15
|
+
1. Confirm `gh auth status` succeeds.
|
|
16
|
+
2. Parse `$ARGUMENTS`. Resolve `<org>`, `<repo>`, `<number>`.
|
|
17
|
+
3. Fetch the issue via `gh issue view <number> --repo <org>/<repo> --json number,title,body,labels,state,milestone,assignees,author,createdAt,updatedAt,closed,closedAt,url`.
|
|
18
|
+
4. Invoke `lisa:github-validate-issue` and pass the issue ref. The validator fetches its own copy and runs every gate (Specification + Feasibility) against the live state.
|
|
19
|
+
5. Surface the validator's report verbatim to the caller.
|
|
20
|
+
|
|
21
|
+
## Output
|
|
22
|
+
|
|
23
|
+
Pass through `lisa:github-validate-issue`'s structured output unchanged. Do not summarize or paraphrase — downstream callers (e.g. `lisa:github-agent`'s pre-flight gate) parse the gate lines.
|
|
24
|
+
|
|
25
|
+
## Notes
|
|
26
|
+
|
|
27
|
+
- This skill is read-only. It never edits the issue, posts comments, or changes labels.
|
|
28
|
+
- If a gate fails, the recommendation is part of the validator's report; surface it as-is.
|
|
29
|
+
- The Validation Journey check (S11) parses the `## Validation Journey` markdown section — same parser logic as `lisa:github-add-journey` and `lisa:github-journey`.
|