@codyswann/lisa 2.7.0 → 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 (111) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -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/commands/intake.md +2 -2
  10. package/plugins/lisa/commands/plan.md +2 -2
  11. package/plugins/lisa/rules/intent-routing.md +16 -11
  12. package/plugins/lisa/rules/tracker-resolution.md +76 -0
  13. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +11 -11
  14. package/plugins/lisa/skills/{confluence-to-jira → confluence-to-tracker}/SKILL.md +31 -31
  15. package/plugins/lisa/skills/github-add-journey/SKILL.md +114 -0
  16. package/plugins/lisa/skills/github-build-intake/SKILL.md +188 -0
  17. package/plugins/lisa/skills/github-create/SKILL.md +101 -0
  18. package/plugins/lisa/skills/github-evidence/SKILL.md +116 -0
  19. package/plugins/lisa/skills/github-journey/SKILL.md +121 -0
  20. package/plugins/lisa/skills/github-prd-intake/SKILL.md +286 -0
  21. package/plugins/lisa/skills/github-read-issue/SKILL.md +248 -0
  22. package/plugins/lisa/skills/github-sync/SKILL.md +73 -0
  23. package/plugins/lisa/skills/github-to-tracker/SKILL.md +312 -0
  24. package/plugins/lisa/skills/github-validate-issue/SKILL.md +288 -0
  25. package/plugins/lisa/skills/github-verify/SKILL.md +29 -0
  26. package/plugins/lisa/skills/github-write-issue/SKILL.md +304 -0
  27. package/plugins/lisa/skills/implement/SKILL.md +4 -4
  28. package/plugins/lisa/skills/intake/SKILL.md +14 -4
  29. package/plugins/lisa/skills/jira-source-artifacts/SKILL.md +1 -1
  30. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +3 -3
  31. package/plugins/lisa/skills/jira-verify/SKILL.md +1 -1
  32. package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
  33. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +10 -10
  34. package/plugins/lisa/skills/{linear-to-jira → linear-to-tracker}/SKILL.md +30 -31
  35. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +11 -11
  36. package/plugins/{src/base/skills/notion-to-jira → lisa/skills/notion-to-tracker}/SKILL.md +34 -34
  37. package/plugins/lisa/skills/plan/SKILL.md +8 -6
  38. package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +22 -12
  39. package/plugins/lisa/skills/product-walkthrough/SKILL.md +1 -1
  40. package/plugins/lisa/skills/spec-conformance/SKILL.md +2 -3
  41. package/plugins/lisa/skills/ticket-triage/SKILL.md +7 -7
  42. package/plugins/lisa/skills/tracker-add-journey/SKILL.md +24 -0
  43. package/plugins/lisa/skills/tracker-build-intake/SKILL.md +25 -0
  44. package/plugins/lisa/skills/tracker-create/SKILL.md +24 -0
  45. package/plugins/lisa/skills/tracker-evidence/SKILL.md +24 -0
  46. package/plugins/lisa/skills/tracker-journey/SKILL.md +24 -0
  47. package/plugins/lisa/skills/tracker-read/SKILL.md +25 -0
  48. package/plugins/lisa/skills/tracker-sync/SKILL.md +26 -0
  49. package/plugins/lisa/skills/tracker-validate/SKILL.md +35 -0
  50. package/plugins/lisa/skills/tracker-verify/SKILL.md +25 -0
  51. package/plugins/lisa/skills/tracker-write/SKILL.md +43 -0
  52. package/plugins/lisa/skills/verify/SKILL.md +1 -1
  53. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-expo/skills/jira-verify/SKILL.md +1 -1
  56. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-rails/skills/jira-verify/SKILL.md +1 -1
  59. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  60. package/plugins/src/base/agents/confluence-prd-intake.md +5 -5
  61. package/plugins/src/base/agents/github-agent.md +141 -0
  62. package/plugins/src/base/agents/github-build-intake.md +62 -0
  63. package/plugins/src/base/agents/github-prd-intake.md +64 -0
  64. package/plugins/src/base/agents/linear-prd-intake.md +5 -5
  65. package/plugins/src/base/agents/notion-prd-intake.md +5 -5
  66. package/plugins/src/base/commands/intake.md +2 -2
  67. package/plugins/src/base/commands/plan.md +2 -2
  68. package/plugins/src/base/rules/intent-routing.md +16 -11
  69. package/plugins/src/base/rules/tracker-resolution.md +76 -0
  70. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +11 -11
  71. package/plugins/src/base/skills/{confluence-to-jira → confluence-to-tracker}/SKILL.md +31 -31
  72. package/plugins/src/base/skills/github-add-journey/SKILL.md +114 -0
  73. package/plugins/src/base/skills/github-build-intake/SKILL.md +188 -0
  74. package/plugins/src/base/skills/github-create/SKILL.md +101 -0
  75. package/plugins/src/base/skills/github-evidence/SKILL.md +116 -0
  76. package/plugins/src/base/skills/github-journey/SKILL.md +121 -0
  77. package/plugins/src/base/skills/github-prd-intake/SKILL.md +286 -0
  78. package/plugins/src/base/skills/github-read-issue/SKILL.md +248 -0
  79. package/plugins/src/base/skills/github-sync/SKILL.md +73 -0
  80. package/plugins/src/base/skills/github-to-tracker/SKILL.md +312 -0
  81. package/plugins/src/base/skills/github-validate-issue/SKILL.md +288 -0
  82. package/plugins/src/base/skills/github-verify/SKILL.md +29 -0
  83. package/plugins/src/base/skills/github-write-issue/SKILL.md +304 -0
  84. package/plugins/src/base/skills/implement/SKILL.md +4 -4
  85. package/plugins/src/base/skills/intake/SKILL.md +14 -4
  86. package/plugins/src/base/skills/jira-source-artifacts/SKILL.md +1 -1
  87. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +3 -3
  88. package/plugins/src/base/skills/jira-verify/SKILL.md +1 -1
  89. package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
  90. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +10 -10
  91. package/plugins/src/base/skills/{linear-to-jira → linear-to-tracker}/SKILL.md +30 -31
  92. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +11 -11
  93. package/plugins/{lisa/skills/notion-to-jira → src/base/skills/notion-to-tracker}/SKILL.md +34 -34
  94. package/plugins/src/base/skills/plan/SKILL.md +8 -6
  95. package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +22 -12
  96. package/plugins/src/base/skills/product-walkthrough/SKILL.md +1 -1
  97. package/plugins/src/base/skills/spec-conformance/SKILL.md +2 -3
  98. package/plugins/src/base/skills/ticket-triage/SKILL.md +7 -7
  99. package/plugins/src/base/skills/tracker-add-journey/SKILL.md +24 -0
  100. package/plugins/src/base/skills/tracker-build-intake/SKILL.md +25 -0
  101. package/plugins/src/base/skills/tracker-create/SKILL.md +24 -0
  102. package/plugins/src/base/skills/tracker-evidence/SKILL.md +24 -0
  103. package/plugins/src/base/skills/tracker-journey/SKILL.md +24 -0
  104. package/plugins/src/base/skills/tracker-read/SKILL.md +25 -0
  105. package/plugins/src/base/skills/tracker-sync/SKILL.md +26 -0
  106. package/plugins/src/base/skills/tracker-validate/SKILL.md +35 -0
  107. package/plugins/src/base/skills/tracker-verify/SKILL.md +25 -0
  108. package/plugins/src/base/skills/tracker-write/SKILL.md +43 -0
  109. package/plugins/src/base/skills/verify/SKILL.md +1 -1
  110. package/plugins/src/expo/skills/jira-verify/SKILL.md +1 -1
  111. package/plugins/src/rails/skills/jira-verify/SKILL.md +1 -1
@@ -0,0 +1,116 @@
1
+ ---
2
+ name: github-evidence
3
+ description: "Upload text evidence to the GitHub `pr-assets` release, update PR description, post a GitHub Issue comment with code blocks, and relabel the issue to `status:code-review`. Reusable by any skill that captures evidence and generates evidence/comment.md (and optionally evidence/comment.txt). The GitHub counterpart of lisa:jira-evidence."
4
+ allowed-tools: ["Bash"]
5
+ ---
6
+
7
+ # GitHub Evidence Posting
8
+
9
+ Upload captured evidence and generated templates to the GitHub PR description and the originating GitHub Issue. This skill is the posting step — it assumes evidence files and a comment template already exist in the evidence directory.
10
+
11
+ ## Arguments
12
+
13
+ `$ARGUMENTS`: `<ISSUE_REF> <EVIDENCE_DIR> <PR_NUMBER>`
14
+
15
+ - `ISSUE_REF` (required): GitHub issue ref — `org/repo#<number>` or full GitHub issue URL.
16
+ - `EVIDENCE_DIR` (required): Directory containing evidence and templates (e.g., `./evidence`).
17
+ - `PR_NUMBER` (required): GitHub PR number to update description.
18
+
19
+ ## Prerequisites
20
+
21
+ - `gh` CLI authenticated (`gh auth status`).
22
+ - Evidence directory containing:
23
+ - `NN-name.txt` or `NN-name.json` text evidence files (e.g., `01-health-check.json`)
24
+ - `comment.md` — GitHub markdown body for both the issue comment and the PR description's `## Evidence` section.
25
+ - (Optional) `comment.txt` — kept for parity with the JIRA path; not used here.
26
+
27
+ ## Workflow
28
+
29
+ 1. **Resolve refs**
30
+
31
+ Parse `ISSUE_REF` into `<issue-org>/<issue-repo>#<issue-number>`. Parse the local repo (where the PR lives) via `gh repo view --json nameWithOwner --jq '.nameWithOwner'`.
32
+
33
+ 2. **Ensure the `pr-assets` release exists in the IMPLEMENTATION repo**
34
+
35
+ The `pr-assets` release is the asset CDN for evidence files. Each PR's evidence is uploaded with the PR number prefix in the asset name to keep them addressable.
36
+
37
+ ```bash
38
+ gh release view pr-assets --repo <impl-org>/<impl-repo> >/dev/null 2>&1 \
39
+ || gh release create pr-assets --repo <impl-org>/<impl-repo> --title "PR Assets" --notes "CDN for PR evidence"
40
+ ```
41
+
42
+ 3. **Upload each evidence file**
43
+
44
+ ```bash
45
+ for f in "$EVIDENCE_DIR"/[0-9][0-9]-*.txt "$EVIDENCE_DIR"/[0-9][0-9]-*.json; do
46
+ [ -f "$f" ] || continue
47
+ name="pr-${PR_NUMBER}-$(basename "$f")"
48
+ gh release upload pr-assets --repo <impl-org>/<impl-repo> --clobber "$f#$name"
49
+ done
50
+ ```
51
+
52
+ The `#$name` syntax sets the asset name. `--clobber` lets re-runs overwrite.
53
+
54
+ 4. **Update the PR description**
55
+
56
+ Replace or append the `## Evidence` section in the PR body using `comment.md`:
57
+
58
+ ```bash
59
+ current_body=$(gh pr view "$PR_NUMBER" --repo <impl-org>/<impl-repo> --json body --jq '.body')
60
+ evidence_section=$(cat "$EVIDENCE_DIR/comment.md")
61
+ # Replace existing ## Evidence ... up to next ## or EOF; otherwise append.
62
+ ```
63
+
64
+ Use a Bash heredoc / temp file to compose the new body, then:
65
+
66
+ ```bash
67
+ gh pr edit "$PR_NUMBER" --repo <impl-org>/<impl-repo> --body-file /tmp/pr-body.md
68
+ ```
69
+
70
+ 5. **Post a comment on the originating issue**
71
+
72
+ The issue may live in a different repo than the PR (cross-repo work):
73
+
74
+ ```bash
75
+ gh issue comment <issue-number> --repo <issue-org>/<issue-repo> --body-file "$EVIDENCE_DIR/comment.md"
76
+ ```
77
+
78
+ 6. **Relabel the issue to `status:code-review`**
79
+
80
+ ```bash
81
+ gh issue edit <issue-number> --repo <issue-org>/<issue-repo> \
82
+ --remove-label status:in-progress \
83
+ --add-label status:code-review
84
+ ```
85
+
86
+ If the current label is already `status:code-review`, skip. If neither `status:in-progress` nor `status:code-review` is present, log a warning and continue without changing labels — the issue may have been hand-managed.
87
+
88
+ ## Evidence Naming Convention
89
+
90
+ ```text
91
+ evidence/
92
+ 01-health-check.json uploaded
93
+ 02-schema-after-migration.txt uploaded
94
+ 03-rate-limit-response.txt uploaded
95
+ comment.md used for issue comment + PR description
96
+ ```
97
+
98
+ Asset names in the release are prefixed with `pr-<number>-` so multiple PRs' evidence coexists without collision.
99
+
100
+ ## Troubleshooting
101
+
102
+ ### Evidence not appearing in GitHub PR or issue
103
+
104
+ Check:
105
+ - `gh auth status` succeeds.
106
+ - The PR / issue refs are correct.
107
+ - The `pr-assets` release exists in the implementation repo.
108
+
109
+ ### `gh issue edit` returns 404
110
+
111
+ The issue may live in a different repo than the PR — pass `--repo <issue-org>/<issue-repo>` explicitly. The implementation repo and the destination tracker repo can differ when `tracker = "github"` is set on a project that ships from a separate codebase.
112
+
113
+ ## Notes
114
+
115
+ - This skill is symmetric with `lisa:jira-evidence` — the evidence directory layout and `comment.md` content are identical so a single template generator can serve both vendors.
116
+ - The PR's `## Evidence` section is the canonical link for reviewers; the issue comment is for the PRD/PM thread.
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: github-journey
3
+ description: "Parse a GitHub Issue's Validation Journey section, execute the verification steps using appropriate tools (curl, test commands, database queries), capture evidence at each marker, and post results via lisa:github-evidence. The GitHub counterpart of lisa:jira-journey."
4
+ allowed-tools: ["Bash", "Read", "Glob", "Grep", "Skill"]
5
+ ---
6
+
7
+ # GitHub Validation Journey
8
+
9
+ Parse a GitHub Issue's Validation Journey, execute the verification steps using the appropriate tools for the change type, capture evidence at each `[EVIDENCE: <name>]` marker, and post to the issue + GitHub PR.
10
+
11
+ ## Arguments
12
+
13
+ `$ARGUMENTS`: `<ISSUE_REF> [PR_NUMBER]`
14
+
15
+ - `ISSUE_REF` (required): GitHub issue ref — `org/repo#<number>` or full GitHub issue URL.
16
+ - `PR_NUMBER` (optional): GitHub PR number for the implementation PR. If omitted, the skill auto-detects the PR from `lisa:github-read-issue`'s linked-PR list (preferring the most recent open PR).
17
+
18
+ ## Prerequisites
19
+
20
+ - `gh` CLI authenticated.
21
+ - Appropriate services running for the verification type (dev server, database, etc.).
22
+
23
+ ## Workflow
24
+
25
+ ### Step 1: Parse the Validation Journey
26
+
27
+ ```bash
28
+ gh issue view <number> --repo <org>/<repo> --json body --jq '.body'
29
+ ```
30
+
31
+ Extract the `## Validation Journey` section (plus its `### Prerequisites`, `### Steps`, and `### Assertions` sub-sections). Parse each step into a structured form: `{ index, text, evidence_marker (or null) }`.
32
+
33
+ If the issue has no Validation Journey, stop and instruct the caller to run `/github-add-journey <issue-ref>` first.
34
+
35
+ ### Step 2: Satisfy Prerequisites
36
+
37
+ Before starting the journey, verify each prerequisite:
38
+
39
+ 1. Check if required services are running (`curl localhost:<port>/health`, `pg_isready`, etc.).
40
+ 2. Verify database connectivity if the journey touches data.
41
+ 3. Ensure environment variables are set.
42
+ 4. Run any setup commands mentioned in `### Prerequisites`.
43
+
44
+ ### Step 3: Execute Steps and Capture Evidence
45
+
46
+ Execute each step sequentially. Determine the verification approach based on the step text and the issue's change type (inferred from `type:` label, `component:` labels, and the body):
47
+
48
+ - **API endpoints** → Run curl commands, capture HTTP response to `evidence/NN-name.txt` (or `.json`).
49
+ - **Database changes** → Run psql/migration commands, capture schema output.
50
+ - **Background jobs** → Trigger the job, check queue/state, capture logs.
51
+ - **Library/utility changes** → Run tests, capture output.
52
+ - **Security fixes** → Reproduce exploit attempt, verify fix, capture output.
53
+
54
+ At each `[EVIDENCE: name]` marker, capture stdout/stderr to a numbered file:
55
+
56
+ #### Evidence Naming Convention
57
+
58
+ `{NN}-{evidence-name}.txt` (or `.json` for structured data):
59
+
60
+ - `NN`: zero-padded sequential number (01, 02, 03...).
61
+ - `evidence-name`: the value from `[EVIDENCE: <name>]` (kebab-case).
62
+
63
+ Example:
64
+
65
+ ```text
66
+ evidence/
67
+ 01-health-check.json
68
+ 02-schema-after-migration.txt
69
+ 03-rate-limit-response.txt
70
+ comment.md
71
+ ```
72
+
73
+ ### Step 4: Generate Evidence Templates
74
+
75
+ Compose `evidence/comment.md` with:
76
+
77
+ - The issue ref + title.
78
+ - The PR ref.
79
+ - Each evidence marker rendered as a GitHub markdown section with a fenced code block of the captured file.
80
+ - An "Assertions verified" subsection mapping each `### Assertions` line to "PASS / FAIL".
81
+
82
+ This template generator is shared with `lisa:jira-journey` (the JIRA path renders the same content as wiki markup). When the markdown comment is the canonical artifact, both vendors stay aligned.
83
+
84
+ ### Step 5: Post Evidence
85
+
86
+ Use `lisa:github-evidence` to post everything:
87
+
88
+ ```bash
89
+ # Equivalent of: bash scripts/post-evidence.sh — but invoked via the Skill tool
90
+ ```
91
+
92
+ Invoke the skill with `<ISSUE_REF> ./evidence <PR_NUMBER>`. It uploads the files to the `pr-assets` release, edits the PR's `## Evidence` section, posts a comment on the issue, and relabels the issue to `status:code-review`.
93
+
94
+ ### Step 6: Verify
95
+
96
+ Confirm:
97
+ - Evidence files exist as release assets named `pr-<PR>-NN-name.{txt,json}`.
98
+ - The PR description contains the `## Evidence` section with code-block embeds.
99
+ - The issue has a new comment whose body matches `comment.md`.
100
+ - The issue's labels include `status:code-review` and not `status:in-progress`.
101
+
102
+ ## Verification Patterns Reference
103
+
104
+ | Change Type | Verification Method | Evidence Format |
105
+ |---|---|---|
106
+ | API endpoint | `curl -s localhost:PORT/endpoint` | JSON response |
107
+ | Database migration | `psql -c "\d table"` or migration output | Schema text |
108
+ | Background job | Trigger + check state | Log output |
109
+ | Library/utility | `bun run test -- path/to/test` | Test output |
110
+ | Security fix | Reproduce + verify fix | Request/response |
111
+ | Auth/authz | Multi-role verification | Status codes per role |
112
+
113
+ ## Troubleshooting
114
+
115
+ ### Evidence file is empty
116
+
117
+ Ensure the command succeeded and produced output. Use `2>&1` to capture both stdout and stderr.
118
+
119
+ ### Parser returns no steps
120
+
121
+ The issue may not have a Validation Journey section — run `/github-add-journey <ISSUE_REF>` first.
@@ -0,0 +1,286 @@
1
+ ---
2
+ name: github-prd-intake
3
+ description: "Scans a GitHub repository for issues labeled `prd-ready` and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written (to whatever destination tracker is configured — JIRA or GitHub Issues itself) and the label flipped to `prd-ticketed`; PRDs that fail get clarifying-question comments and the label flipped to `prd-blocked`. The GitHub counterpart of lisa:notion-prd-intake / lisa:confluence-prd-intake / lisa:linear-prd-intake. Composes existing skills (github-to-tracker, tracker-validate, jira-source-artifacts, product-walkthrough)."
4
+ allowed-tools: ["Skill", "Bash"]
5
+ ---
6
+
7
+ # GitHub PRD Intake: $ARGUMENTS
8
+
9
+ `$ARGUMENTS` is one of:
10
+
11
+ - A GitHub `org/repo` token (e.g., `acme/product-prds`) — scans the repo for issues labeled `prd-ready`.
12
+ - A full GitHub repo URL (e.g., `https://github.com/acme/product-prds`).
13
+ - The literal token `github` — falls back to `.lisa.config.json` (`github.org` / `github.repo`).
14
+
15
+ Run one intake cycle against that repo. Each issue with the `prd-ready` label is claimed, validated, and routed to either `prd-blocked` (with clarifying comments) or `prd-ticketed` (with destination tickets created).
16
+
17
+ This skill is the GitHub counterpart of `lisa:notion-prd-intake`, `lisa:confluence-prd-intake`, and `lisa:linear-prd-intake`. Phases, gates, comment templates, and rules are identical — the only differences are (1) the lifecycle is encoded as **issue labels** (mirroring Linear's project labels and Confluence's page labels), (2) the fetch / update tools are the `gh` CLI, and (3) clarifying-question comments land directly on the source PRD issue (because GitHub Issues *do* have native comments — no sentinel issue required, unlike Linear). Keep all four skills behaviorally aligned: when changing intake logic, change them together.
18
+
19
+ ## Confirmation policy
20
+
21
+ Do NOT ask the caller whether to proceed. Once invoked with a repo, run the cycle to completion — claim, validate, branch to `prd-blocked` or `prd-ticketed`, write the summary. The caller has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background batch.
22
+
23
+ Specifically forbidden:
24
+
25
+ - Previewing projected scope and asking whether to continue.
26
+ - Offering A/B/C-style choices like "proceed / skip / dry-run only" — the documented behavior IS the default.
27
+ - Pausing because a PRD looks large, has many open questions, or is likely to end in `prd-blocked`. `prd-blocked` is a valid terminal state of this lifecycle, not a failure mode.
28
+ - Pausing because the dry-run validation looks expensive.
29
+
30
+ The only legitimate reasons to stop early:
31
+
32
+ - Missing repo argument or required configuration. Surface and exit.
33
+ - Repo unreachable, or the labelling convention not yet adopted (no issue carries any of `prd-ready` / `prd-in-review` / `prd-blocked` / `prd-ticketed`). Surface and exit.
34
+ - Empty `prd-ready` set. Exit cleanly with `"No GitHub issues labeled prd-ready in <org>/<repo>. Nothing to do."`
35
+
36
+ ## Lifecycle assumed
37
+
38
+ The PRD lifecycle is encoded as **issue labels**:
39
+
40
+ ```text
41
+ prd-draft → prd-ready → prd-in-review → prd-blocked | prd-ticketed → prd-shipped
42
+ (product) (us) (us) (product)
43
+ ```
44
+
45
+ Exactly one of these labels is expected on a PRD issue at any time.
46
+
47
+ This skill ONLY transitions:
48
+
49
+ - `prd-ready` → `prd-in-review` (claim)
50
+ - `prd-in-review` → `prd-blocked` (gate failures or coverage gaps)
51
+ - `prd-in-review` → `prd-ticketed` (success)
52
+ - `prd-ticketed` → `prd-blocked` (post-write coverage gaps from Phase 3e)
53
+
54
+ It never adds, removes, or touches `prd-draft` or `prd-shipped`. Those labels are owned by product.
55
+
56
+ A "transition" means: remove the old lifecycle label and add the new one (`gh issue edit <num> --remove-label <old> --add-label <new>`). The skill MUST verify exactly one lifecycle label is present after the update.
57
+
58
+ If the repo has not yet adopted `prd-*` labels, this skill cannot run. See "Adoption" at the bottom.
59
+
60
+ **Label namespace separation:** the PRD lifecycle uses the `prd-*` namespace. The build-queue lifecycle (used by `lisa:github-build-intake`) uses the `status:*` namespace. The two never overlap. When the destination tracker is also GitHub Issues (self-host case), the same repo can host both — but a single issue is either a PRD (carrying a `prd-*` label) or a build ticket (carrying a `status:*` label), never both.
61
+
62
+ ## Phases
63
+
64
+ ### Phase 1 — Resolve the repo
65
+
66
+ 1. Parse `$ARGUMENTS`:
67
+ - `org/repo` token → use as-is.
68
+ - GitHub URL → extract `org` and `repo`.
69
+ - Literal `github` → resolve from `.lisa.config.json`; error if not set.
70
+ 2. Confirm `gh auth status` succeeds.
71
+ 3. Confirm the repo is reachable: `gh repo view <org>/<repo> --json name`.
72
+ 4. Verify the `prd-*` label set exists:
73
+ ```bash
74
+ gh label list --repo <org>/<repo> --json name --jq '[.[] | select(startswith("prd-"))] | sort'
75
+ ```
76
+ If none of `prd-ready` / `prd-in-review` / `prd-blocked` / `prd-ticketed` are present, surface a label-convention error and exit (see "Adoption").
77
+
78
+ ### Phase 2 — Find Ready PRDs
79
+
80
+ ```bash
81
+ gh issue list --repo <org>/<repo> --label prd-ready --state open --limit 100 \
82
+ --json number,title,body,labels,author,milestone,createdAt,updatedAt,url
83
+ ```
84
+
85
+ For each candidate, confirm exactly one lifecycle label is present (the `--label` filter selects `prd-ready` matches, but a PRD could have ended up with two labels by hand — that's a misconfiguration, not a normal queue entry).
86
+
87
+ If empty, run a secondary check:
88
+
89
+ ```bash
90
+ gh issue list --repo <org>/<repo> --state open --limit 100 --json number,labels --jq '[.[] | .labels[] | select(.name | startswith("prd-")) | .name] | unique'
91
+ ```
92
+
93
+ If no `prd-*` labels appear on any open issue → convention not adopted; surface error and exit. If `prd-*` labels exist but none are `prd-ready` → genuinely empty queue, exit cleanly with the idle message.
94
+
95
+ ### Phase 3 — Process each Ready PRD
96
+
97
+ Process serially to keep label transitions auditable.
98
+
99
+ #### 3a. Claim
100
+
101
+ ```bash
102
+ gh issue edit <num> --repo <org>/<repo> --remove-label prd-ready --add-label prd-in-review
103
+ ```
104
+
105
+ This is the idempotency lock — a re-entrant cycle's `--label prd-ready` filter won't see this issue again.
106
+
107
+ If the relabel fails (permission, race), log and skip. Do not proceed to validation on a PRD you didn't successfully claim.
108
+
109
+ This skill never edits the PRD body. Communication with product happens only through comments.
110
+
111
+ #### 3b. Dry-run validation
112
+
113
+ Invoke the `lisa:github-to-tracker` skill with `dry_run: true` and the PRD issue ref. The skill returns a structured report containing:
114
+ - The planned ticket hierarchy
115
+ - Per-ticket validation verdicts and remediation
116
+ - An overall PASS / FAIL verdict
117
+ - A failure count
118
+
119
+ This call 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 dispatches to `lisa:jira-validate-ticket` or `lisa:github-validate-issue` depending on the configured destination).
120
+
121
+ #### 3c. Branch on the verdict
122
+
123
+ **If `PASS`** (every planned ticket passed every applicable gate):
124
+
125
+ 1. Re-invoke `lisa:github-to-tracker` with `dry_run: false` to actually write tickets. This re-runs the planning phases and the preservation gate.
126
+ 2. Capture the created ticket refs.
127
+ 3. Post a comment on the PRD issue listing the created tickets with their URLs:
128
+ ```bash
129
+ gh issue comment <prd-num> --repo <org>/<repo> --body-file /tmp/ticketed-comment.md
130
+ ```
131
+ Lead with: `"Ticketed by Claude. Created N tickets in <destination> — see below. Add the prd-shipped label after the work is delivered."` The destination is named (JIRA / GitHub Issues) so product knows where to look.
132
+ 4. Transition labels: `gh issue edit <prd-num> --remove-label prd-in-review --add-label prd-ticketed`.
133
+ 5. **Run Phase 3e (coverage audit)** before considering this PRD done.
134
+
135
+ **If `FAIL`**:
136
+
137
+ The audience is the **product team**, not engineers. Follow the strict comment rules below.
138
+
139
+ ##### 3c.1 Partition failures
140
+
141
+ 1. Drop every failure where `product_relevant = false`. Internal data-quality problems — the agent should fix its own spec, not ask product. Record dropped failures under `Errors` in the cycle summary.
142
+ 2. Group remaining product-relevant failures by `prd_anchor` (a section heading or a `selection_with_ellipsis` snippet from the PRD body). Failures sharing an anchor become one comment.
143
+
144
+ ##### 3c.2 Render each comment
145
+
146
+ GitHub Issues do not have selection-anchored comments (unlike Confluence inline comments). Approximate by quoting the relevant body excerpt at the top of each comment:
147
+
148
+ ```bash
149
+ gh issue comment <prd-num> --repo <org>/<repo> --body-file /tmp/anchored-comment-N.md
150
+ ```
151
+
152
+ Each comment template MUST contain these parts in this order, no exceptions:
153
+
154
+ ```text
155
+ [<Category badge>] <prd_section heading text>
156
+
157
+ > <quoted excerpt from the PRD body, ~10–30 words around the anchor — this stands in for inline anchoring>
158
+
159
+ **What's unclear:** <validator's `what` field, verbatim — already product-readable>
160
+
161
+ **Recommendation:** <validator's `recommendation` field, verbatim — must contain 1–3 concrete options, never a generic "please clarify">
162
+
163
+ **Action:** Update this section in the PRD, then replace the `prd-blocked` label with `prd-ready` on the issue and Claude will re-run intake.
164
+ ```
165
+
166
+ If multiple failures share an anchor, render each as its own `**What's unclear:** ... **Recommendation:** ...` block within the same comment, separated by `---`. Keep the single `[Category badge]` heading at the top.
167
+
168
+ For unanchored failures (`prd_anchor: null`), post one rollup comment prefixed with `Issues without a specific section anchor:`.
169
+
170
+ ##### 3c.3 Category badges
171
+
172
+ | Validator category | Badge label |
173
+ |---------------------|-------------|
174
+ | `product-clarity` | `[Product clarity]` |
175
+ | `acceptance-criteria` | `[Acceptance criteria]` |
176
+ | `design-ux` | `[Design / UX]` |
177
+ | `scope` | `[Scope]` |
178
+ | `dependency` | `[Dependency]` |
179
+ | `data` | `[Data]` |
180
+ | `technical` | `[Technical]` |
181
+
182
+ `structural` failures must never reach this step (filtered in 3c.1).
183
+
184
+ ##### 3c.4 Forbidden in product comments
185
+
186
+ - Gate IDs (`S4`, `F2`, etc.).
187
+ - GitHub-Issues-specific terminology (`gh`, `sub-issue`, `label namespace`) — paraphrase before posting.
188
+ - Internal skill names (`lisa:tracker-validate`, `github-to-tracker`).
189
+ - Engineering shorthand (`AC`, `OOS`, `repo`, `env var`).
190
+ - "Clarify this" / "Please specify" without candidate resolutions.
191
+
192
+ ##### 3c.5 Label transition
193
+
194
+ After all comments are posted, transition: `gh issue edit <num> --remove-label prd-in-review --add-label prd-blocked`. Do NOT write any tickets.
195
+
196
+ #### 3d. Continue
197
+
198
+ Move to the next Ready PRD. One PRD failing does not affect others.
199
+
200
+ #### 3e. Coverage audit (mandatory after prd-ticketed)
201
+
202
+ Per-ticket gates prove each ticket is well-formed; they do NOT prove the *set* of tickets covers the *whole* PRD. Invoke `lisa:prd-ticket-coverage` to catch silent drops.
203
+
204
+ 1. Invoke `lisa:prd-ticket-coverage` with `<PRD URL> tickets=[<created refs from 3c step 2>]`. The coverage skill auto-detects the PRD vendor from the URL host (`github.com` → GitHub).
205
+ 2. Read the verdict:
206
+
207
+ | Verdict | Action |
208
+ |---------|--------|
209
+ | `COMPLETE` | Done. Leave label as `prd-ticketed`. Move to next PRD. |
210
+ | `COMPLETE_WITH_SCOPE_CREEP` | Post an advisory comment on the PRD issue naming the scope-creep tickets. Leave label as `prd-ticketed`. |
211
+ | `GAPS_FOUND` | The created ticket set is incomplete. (a) For each gap, post a comment using the same product-facing template as Phase 3c.2 — anchored when `prd_anchor` is non-null. (b) Post one summary comment listing the tickets that *were* successfully created. (c) Transition labels from `prd-ticketed` back to `prd-blocked`. |
212
+ | `NO_TICKETS_FOUND` | Should not happen if step 2 succeeded. Log as Error; leave label as `prd-ticketed` with a flag comment. |
213
+
214
+ 3. The created tickets remain in the destination tracker regardless of the verdict. The audit only tells us whether *more* are needed.
215
+
216
+ ### Phase 4 — Summary report
217
+
218
+ ```text
219
+ ## github-prd-intake summary
220
+
221
+ Repo: <org>/<repo> (<URL>)
222
+ Cycle started: <ISO timestamp>
223
+ Cycle completed: <ISO timestamp>
224
+
225
+ PRDs processed: <n>
226
+ - prd-ticketed: <n>
227
+ - <issue-ref> "<title>" → <epic-ref> + <story-count> stories + <subtask-count> sub-tasks (coverage: COMPLETE | COMPLETE_WITH_SCOPE_CREEP)
228
+ - prd-blocked: <n>
229
+ - <issue-ref> "<title>" → <gate-failure-count> gate failures (pre-write) OR <gap-count> coverage gaps (post-write)
230
+ - Errors (claim failed, etc): <n>
231
+ - <issue-ref> "<title>" — <reason>
232
+
233
+ Total tickets created: <n>
234
+ Coverage audit summary: <n> COMPLETE / <n> COMPLETE_WITH_SCOPE_CREEP / <n> GAPS_FOUND
235
+ ```
236
+
237
+ Print to the agent's output. Do not write this summary to GitHub.
238
+
239
+ ## Self-host edge case (PRD repo = destination repo)
240
+
241
+ When the configured destination tracker is GitHub Issues AND the PRD repo is the same as the destination repo, both reads and writes hit the same place. Disambiguation rules:
242
+
243
+ - A PRD issue carries a `prd-*` label. Built tickets carry a `type:*` + `status:*` label set, but never a `prd-*` label.
244
+ - The "Ticketed by Claude" comment on the PRD links to the destination ticket numbers (which live in the same repo, so the links are simple `#<n>` refs).
245
+ - `lisa:prd-ticket-coverage` filters out the source PRD itself when listing destination tickets — the PRD is never a ticket of its own work.
246
+
247
+ ## Idempotency & safety
248
+
249
+ - **Single-cycle scope**: this skill processes the `prd-ready` set as it exists at the start of Phase 2. New `prd-ready` issues added mid-cycle are picked up next run.
250
+ - **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:github-to-tracker` (which delegates to `lisa:tracker-write`), only ever changes labels among `prd-in-review`, `prd-blocked`, `prd-ticketed`, only ever comments on the source PRD issue. It never edits PRD bodies, never touches `prd-draft` or `prd-shipped`, never closes or deletes PRD issues.
251
+ - **Claim-first ordering**: the label flip to `prd-in-review` happens BEFORE validation runs.
252
+ - **Failure isolation**: an exception processing one PRD must not stop the cycle. Catch, record under "Errors" in the summary, continue. The PRD that errored is left labeled `prd-in-review` — humans investigate from there.
253
+ - **Single-label invariant**: after every transition, verify exactly one lifecycle label is present.
254
+
255
+ ## Configuration
256
+
257
+ Same env vars as `lisa:github-to-tracker` plus `.lisa.config.json` `github.org` / `github.repo`. If any required value is missing, surface and exit — never invent values.
258
+
259
+ ## Rules
260
+
261
+ - Never write to the destination tracker outside of `lisa:github-to-tracker` → `lisa:tracker-write`.
262
+ - 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`.
263
+ - Never edit a PRD's body. Communication with product happens only via comments.
264
+ - Never post a single dump of all gate failures on one comment. One comment per `prd_anchor` group, plus one rollup for unanchored failures.
265
+ - Never include a gate ID, internal skill name, or engineering shorthand in a comment body.
266
+ - Never run more than one intake cycle concurrently against the same repo.
267
+ - If `lisa:github-to-tracker` returns errors, treat them as gate failures: comment + `prd-blocked`. Don't silently fail.
268
+
269
+ ## Adoption (one-time per repo)
270
+
271
+ Before this skill can run, the repo must adopt the `prd-*` issue-label convention:
272
+
273
+ 1. Create the labels:
274
+ ```bash
275
+ gh label create prd-draft --color C5DEF5 --description "PRD in progress (product owns)" --repo <org>/<repo>
276
+ gh label create prd-ready --color FBCA04 --description "PRD ready for ticketing" --repo <org>/<repo>
277
+ gh label create prd-in-review --color 5319E7 --description "Claude is reviewing this PRD" --repo <org>/<repo>
278
+ gh label create prd-blocked --color D93F0B --description "PRD blocked — see comments" --repo <org>/<repo>
279
+ gh label create prd-ticketed --color 0E8A16 --description "Tickets created — see comments" --repo <org>/<repo>
280
+ gh label create prd-shipped --color 1D76DB --description "Work delivered (product owns)" --repo <org>/<repo>
281
+ ```
282
+ 2. Apply `prd-ready` to issues that are ready for ticketing.
283
+ 3. Reserve `prd-in-review`, `prd-blocked`, `prd-ticketed` for this skill — humans should not set them manually except to recover from an error.
284
+ 4. Keep the `prd-*` namespace strictly separate from the build-queue `status:*` namespace owned by `lisa:github-build-intake`.
285
+
286
+ If the repo hasn't adopted these labels, the first run exits with a label-convention error (not the idle empty-set message) — this distinguishes setup from a genuinely empty queue.