@codyswann/lisa 2.2.0 → 2.4.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/dist/utils/postinstall-trampoline.d.ts +3 -1
- package/dist/utils/postinstall-trampoline.d.ts.map +1 -1
- package/dist/utils/postinstall-trampoline.js +9 -2
- package/dist/utils/postinstall-trampoline.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/agents/confluence-prd-intake.md +63 -0
- package/plugins/lisa/commands/intake.md +3 -3
- package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +259 -0
- package/plugins/lisa/skills/confluence-to-jira/SKILL.md +318 -0
- package/plugins/lisa/skills/intake/SKILL.md +16 -4
- package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +53 -4
- package/plugins/lisa/skills/notion-prd-intake/SKILL.md +56 -13
- package/plugins/lisa/skills/notion-to-jira/SKILL.md +18 -1
- package/plugins/lisa/skills/plan/SKILL.md +3 -1
- package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +31 -11
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +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-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/confluence-prd-intake.md +63 -0
- package/plugins/src/base/commands/intake.md +3 -3
- package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +259 -0
- package/plugins/src/base/skills/confluence-to-jira/SKILL.md +318 -0
- package/plugins/src/base/skills/intake/SKILL.md +16 -4
- package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +53 -4
- package/plugins/src/base/skills/notion-prd-intake/SKILL.md +56 -13
- package/plugins/src/base/skills/notion-to-jira/SKILL.md +18 -1
- package/plugins/src/base/skills/plan/SKILL.md +3 -1
- package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +31 -11
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: confluence-to-jira
|
|
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 —
|
|
8
|
+
the workflow, gates, dry-run mode, and validation rules are identical; only the source-of-truth tool
|
|
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"]
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Confluence PRD to JIRA Breakdown
|
|
14
|
+
|
|
15
|
+
Convert a Confluence PRD into a structured JIRA ticket hierarchy: Epics > Stories > Sub-tasks.
|
|
16
|
+
Each sub-task is scoped to exactly one repo and includes an empirical verification plan.
|
|
17
|
+
|
|
18
|
+
This skill is the Confluence counterpart of `lisa:notion-to-jira`. The two skills share the same
|
|
19
|
+
phases, gates, dry-run contract, and per-ticket validation logic. Only the PRD-side fetch / comment
|
|
20
|
+
tools differ. When changing workflow logic, change BOTH skills together so the two source vendors
|
|
21
|
+
stay behaviorally identical.
|
|
22
|
+
|
|
23
|
+
## Modes
|
|
24
|
+
|
|
25
|
+
This skill supports two modes, controlled by a `dry_run` flag in `$ARGUMENTS`:
|
|
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.
|
|
29
|
+
|
|
30
|
+
Dry-run output format is identical to `lisa:notion-to-jira`'s. Reuse the same fields, including
|
|
31
|
+
`prd_anchor` and `prd_section`. The only difference: `prd_anchor` is the inline-comment anchor text
|
|
32
|
+
that `createConfluenceInlineComment` accepts (typically the full selected substring; truncate if it
|
|
33
|
+
exceeds the tool's max anchor length and emit `null` if no resolvable anchor exists).
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
## confluence-to-jira dry-run: <PRD title>
|
|
37
|
+
|
|
38
|
+
### Planned hierarchy
|
|
39
|
+
- Epic: <summary>
|
|
40
|
+
prd_section: "<heading text from the PRD that produced this epic>"
|
|
41
|
+
prd_anchor: "<inline-comment anchor text>" # null if no specific section
|
|
42
|
+
- Story 1.1: <summary>
|
|
43
|
+
prd_section: "<heading or user-story line>"
|
|
44
|
+
prd_anchor: "<anchor>"
|
|
45
|
+
- Sub-task [<repo>]: <summary>
|
|
46
|
+
prd_section: "<heading or AC bullet>"
|
|
47
|
+
prd_anchor: "<anchor>"
|
|
48
|
+
- ...
|
|
49
|
+
- Story 1.2: ...
|
|
50
|
+
|
|
51
|
+
### Per-ticket validation
|
|
52
|
+
- <ticket-id>: PASS | FAIL — <count> failures
|
|
53
|
+
prd_section: "<heading text>"
|
|
54
|
+
prd_anchor: "<anchor>"
|
|
55
|
+
failures:
|
|
56
|
+
- gate: <gate-id>
|
|
57
|
+
category: <category from validator>
|
|
58
|
+
product_relevant: <true|false>
|
|
59
|
+
what: <plain-language description from validator>
|
|
60
|
+
recommendation: <1–3 candidate resolutions from validator>
|
|
61
|
+
|
|
62
|
+
### Verdict: PASS | FAIL
|
|
63
|
+
### Total failures: <n>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The dry-run mode never writes to JIRA and never calls `mcp__atlassian__createJiraIssue`. It also never
|
|
67
|
+
modifies the source Confluence page, never adds/removes labels, and never posts comments — that is the
|
|
68
|
+
orchestrating skill's responsibility (`lisa:confluence-prd-intake`).
|
|
69
|
+
|
|
70
|
+
## Hard Rule: All Writes Go Through `lisa:jira-write-ticket`
|
|
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.**
|
|
73
|
+
|
|
74
|
+
`lisa:jira-write-ticket` enforces gates this skill does not:
|
|
75
|
+
- 3-audience description (Context / Technical Approach / Acceptance Criteria)
|
|
76
|
+
- Gherkin acceptance criteria
|
|
77
|
+
- Epic parent validation
|
|
78
|
+
- Explicit issue-link discovery (`blocks` / `is blocked by` / `relates to` / `duplicates` / `clones`)
|
|
79
|
+
- Single-repo scope check on Bug / Task / Sub-task
|
|
80
|
+
- Sign-in account and target environment recorded in description
|
|
81
|
+
- Post-create verification
|
|
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.
|
|
84
|
+
|
|
85
|
+
## Input
|
|
86
|
+
|
|
87
|
+
A Confluence PRD page URL or page ID. The PRD is expected to have:
|
|
88
|
+
- A main page with context, problems, and child pages for each Epic
|
|
89
|
+
- Epic child pages with User Stories and functional/non-functional requirements
|
|
90
|
+
- Page comments (footer + inline) with engineering notes and product decisions
|
|
91
|
+
|
|
92
|
+
URL parsing — Confluence URLs come in two common shapes:
|
|
93
|
+
|
|
94
|
+
```text
|
|
95
|
+
https://<host>/wiki/spaces/<SPACE>/pages/<PAGE-ID>/<slug>
|
|
96
|
+
https://<host>/wiki/spaces/<SPACE>/pages/<PAGE-ID>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Extract `<PAGE-ID>` (the numeric segment after `/pages/`). If only a space URL is provided
|
|
100
|
+
(`/wiki/spaces/<SPACE>` with no `/pages/...`), stop and report — single-PRD mode requires a specific
|
|
101
|
+
page. The caller wanted `lisa:confluence-prd-intake` (batch mode).
|
|
102
|
+
|
|
103
|
+
## Configuration
|
|
104
|
+
|
|
105
|
+
This skill reads project-specific configuration from environment variables. If these are not set,
|
|
106
|
+
ask the user for the values before proceeding.
|
|
107
|
+
|
|
108
|
+
| Variable | Purpose | Example |
|
|
109
|
+
|----------|---------|---------|
|
|
110
|
+
| `JIRA_PROJECT` | JIRA project key for ticket creation | `SE` |
|
|
111
|
+
| `JIRA_SERVER` | Atlassian instance URL (site host) | `mycompany.atlassian.net` |
|
|
112
|
+
| `CONFLUENCE_HOST` | Confluence host (often same as `JIRA_SERVER`) | `mycompany.atlassian.net` |
|
|
113
|
+
| `E2E_TEST_PHONE` | Test user phone number for verification plans | `0000000099` |
|
|
114
|
+
| `E2E_TEST_OTP` | Test user OTP code | `555555` |
|
|
115
|
+
| `E2E_TEST_ORG` | Test organization name | `Arsenal` |
|
|
116
|
+
| `E2E_BASE_URL` | Frontend base URL for Playwright tests | `https://dev.example.io/` |
|
|
117
|
+
| `E2E_GRAPHQL_URL` | GraphQL API URL for curl verification | `https://gql.dev.example.io/graphql` |
|
|
118
|
+
|
|
119
|
+
If env vars are not available, ask the user to provide them explicitly before proceeding.
|
|
120
|
+
Do not retrieve credentials from repository files or local agent settings.
|
|
121
|
+
|
|
122
|
+
## Workflow
|
|
123
|
+
|
|
124
|
+
### Phase 1: Fetch & Analyze the PRD
|
|
125
|
+
|
|
126
|
+
1. **Resolve the Atlassian cloud ID** via `mcp__atlassian__getAccessibleAtlassianResources`. Confluence MCP calls require it.
|
|
127
|
+
2. **Fetch the main PRD page** via `mcp__atlassian__getConfluencePage` with the page ID. Capture body, labels, and child page references.
|
|
128
|
+
3. **Identify all Epic child pages** via `mcp__atlassian__getConfluencePageDescendants` (one level deep first; recurse if the PRD nests epics under a "Specs" parent).
|
|
129
|
+
4. **Fetch all Epic pages** in parallel via `getConfluencePage`.
|
|
130
|
+
5. **Fetch full comments** for the main page and every epic page in parallel:
|
|
131
|
+
- `mcp__atlassian__getConfluencePageFooterComments` — page-level threaded comments (equivalent to Notion's page-level discussions)
|
|
132
|
+
- `mcp__atlassian__getConfluencePageInlineComments` — block-anchored comments tied to specific text spans
|
|
133
|
+
- For any comment with replies, walk the tree via `mcp__atlassian__getConfluenceCommentChildren` until exhausted
|
|
134
|
+
6. **Synthesize decisions and blockers** from the PRD content + all comments:
|
|
135
|
+
- Decisions already confirmed by the team (look for agreement in comment threads)
|
|
136
|
+
- Open questions that need product/engineering input
|
|
137
|
+
- Engineering comments (prefixed with "Engineering:" or wrench emoji) that identify technical constraints
|
|
138
|
+
- Cross-PRD dependencies (references to other features or shared infrastructure)
|
|
139
|
+
|
|
140
|
+
### Phase 1.5: Extract Source Artifacts
|
|
141
|
+
|
|
142
|
+
PRDs typically reference external design, UX, and data artifacts (Figma files, Lovable prototypes, Loom walkthroughs, screenshots, example payloads, peer Confluence pages). These MUST be preserved onto the resulting tickets — otherwise developers picking up a ticket lose the source of truth. This is the failure mode this step exists to prevent.
|
|
143
|
+
|
|
144
|
+
1. **Scan the PRD main page, all Epic child pages, and every fetched comment thread** for:
|
|
145
|
+
- URLs to design/prototype tools (Figma, FigJam, Figma Make, Lovable, Framer, Penpot)
|
|
146
|
+
- URLs to recording/walkthrough tools (Loom, YouTube, Vimeo, Descript)
|
|
147
|
+
- URLs to collaborative docs (Google Docs/Slides/Sheets, peer Confluence pages, Notion peer pages)
|
|
148
|
+
- URLs to code sandboxes (CodeSandbox, StackBlitz, Replit, GitHub permalinks/gists)
|
|
149
|
+
- URLs to diagramming tools (Miro, Mural, Excalidraw, Mermaid Live, draw.io, Lucid)
|
|
150
|
+
- URLs to data/observability tools (Grafana, Datadog, Sentry, Metabase, Looker)
|
|
151
|
+
- Embedded images and file attachments on the page itself
|
|
152
|
+
- Fenced code blocks with example data (JSON, SQL, GraphQL, cURL request/response)
|
|
153
|
+
|
|
154
|
+
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 (Figma `/proto/` vs design, Lovable as `ux-flow`, Loom, screenshots), and coverage smells. Do not restate the rules here — invoke the skill so any drift in the rules propagates uniformly.
|
|
155
|
+
|
|
156
|
+
3. **Build an `artifacts` map** keyed by domain. Each entry: `{ url, title, domain, source_page, source_page_url, classification_reason }`. The `classification_reason` makes disambiguation auditable. The `source_page` lets you trace each reference back to where it appeared in the PRD.
|
|
157
|
+
|
|
158
|
+
4. **Surface coverage smells** as defined in `lisa:jira-source-artifacts` §5. Record any detected smells on the epic.
|
|
159
|
+
|
|
160
|
+
### Phase 1.6: Source Precedence & Conflict Resolution
|
|
161
|
+
|
|
162
|
+
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.
|
|
163
|
+
|
|
164
|
+
The existing-component reuse expectation is defined in `lisa:jira-source-artifacts` §7. Encode it on every UI-touching story.
|
|
165
|
+
|
|
166
|
+
### Phase 2: Codebase + Live Product Research
|
|
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.
|
|
169
|
+
|
|
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
|
+
|
|
172
|
+
**2b. Live product walkthrough.** If the PRD touches existing user-facing surfaces, invoke the `lisa:product-walkthrough` skill against `E2E_BASE_URL` using the test user from config.
|
|
173
|
+
|
|
174
|
+
Skip 2b only when the work is purely backend with no user-visible surface, or affects a screen that does not yet exist in dev/prod.
|
|
175
|
+
|
|
176
|
+
Walkthrough findings are attached to the originating Confluence PRD as a **footer comment** (Confluence has no general "page-level discussion attached to a heading" — footer comments are the page-level equivalent), via `mcp__atlassian__createConfluenceFooterComment`. Title the comment "Current product walkthrough — `<route>`". Inherited onto the resulting epic / stories under a `## Current Product` subsection.
|
|
177
|
+
|
|
178
|
+
### Phase 3: Create Epics
|
|
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.
|
|
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:
|
|
183
|
+
|
|
184
|
+
- `project_key`: from `JIRA_PROJECT` config
|
|
185
|
+
- `issue_type`: `Epic`
|
|
186
|
+
- `summary`: epic title from the PRD
|
|
187
|
+
- `description_body`: a draft of the 3-audience description containing:
|
|
188
|
+
- **Context / Business Value**: epic summary from the PRD, originating Confluence URL, business outcome
|
|
189
|
+
- **Technical Approach**: cross-cutting integration points and constraints surfaced in Phase 2 codebase research
|
|
190
|
+
- List of user stories the epic contains
|
|
191
|
+
- Key decisions from comments (with attribution)
|
|
192
|
+
- Blockers and open questions
|
|
193
|
+
- Dependencies on other epics or PRDs
|
|
194
|
+
- A **Source Artifacts** section listing every artifact extracted in Phase 1.5 (grouped by domain)
|
|
195
|
+
- `artifacts`: the full Phase 1.5 artifact list — every artifact, regardless of domain. The epic is the canonical hub. No filtering at the epic level.
|
|
196
|
+
- `priority`, `labels`, `components`, `fix_version`: as appropriate
|
|
197
|
+
|
|
198
|
+
Capture the returned epic key — Phase 4 needs it as the parent for stories.
|
|
199
|
+
|
|
200
|
+
### Phase 4: Create Stories
|
|
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.
|
|
203
|
+
|
|
204
|
+
For each Epic, plan two kinds of stories:
|
|
205
|
+
- **One "X.0 Setup" story** for data model and infrastructure prerequisites
|
|
206
|
+
- **One story per user story** from the PRD (numbered to match the PRD)
|
|
207
|
+
|
|
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
|
+
|
|
210
|
+
For each story, **invoke `lisa:jira-write-ticket`** with:
|
|
211
|
+
|
|
212
|
+
- `project_key`: from `JIRA_PROJECT` config
|
|
213
|
+
- `issue_type`: `Story`
|
|
214
|
+
- `epic_parent`: the Epic key captured in Phase 3 (mandatory)
|
|
215
|
+
- `summary`: prefixed per the naming convention above
|
|
216
|
+
- `description_body`: 3-audience description as in `lisa:notion-to-jira` Phase 4
|
|
217
|
+
- `artifacts`: the Phase 1.5 artifacts filtered by domain per the inheritance table below
|
|
218
|
+
|
|
219
|
+
| Story type | Inherits domains |
|
|
220
|
+
|------------|------------------|
|
|
221
|
+
| Frontend / UI | `ui-design`, `ux-flow`, `reference` |
|
|
222
|
+
| Backend / API / data model | `data`, `reference` |
|
|
223
|
+
| Infrastructure | `ops`, `reference` |
|
|
224
|
+
| Mixed / setup ("X.0") | All domains |
|
|
225
|
+
|
|
226
|
+
Capture each returned story key — Phase 5 needs it as the parent for sub-tasks.
|
|
227
|
+
|
|
228
|
+
### Phase 5: Create Sub-tasks
|
|
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.**
|
|
231
|
+
|
|
232
|
+
Each sub-task MUST:
|
|
233
|
+
1. **Be scoped to exactly ONE repo** — indicated in brackets in the summary: `[repo-name]`
|
|
234
|
+
2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking
|
|
235
|
+
|
|
236
|
+
Sub-tasks inherit their parent story's artifacts by reference (the parent link). Do not pass the same artifact list to every sub-task.
|
|
237
|
+
|
|
238
|
+
### Phase 5.5: Artifact Preservation Gate (mandatory)
|
|
239
|
+
|
|
240
|
+
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`.
|
|
241
|
+
|
|
242
|
+
To run the gate, this skill must:
|
|
243
|
+
|
|
244
|
+
1. Pull the remote links of every epic and story created in this run via `mcp__atlassian__getJiraIssueRemoteIssueLinks`.
|
|
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.
|
|
247
|
+
4. If the gate passes: print the matrix compactly and proceed to Phase 6.
|
|
248
|
+
|
|
249
|
+
This gate is not optional.
|
|
250
|
+
|
|
251
|
+
### Phase 6: Report Results
|
|
252
|
+
|
|
253
|
+
After all tickets are created, present a summary table to the user:
|
|
254
|
+
- All Epics with keys and URLs
|
|
255
|
+
- All Stories grouped by Epic
|
|
256
|
+
- All Sub-tasks grouped by Story with repo tags
|
|
257
|
+
- Repo distribution
|
|
258
|
+
- **Artifact Preservation Matrix**
|
|
259
|
+
- Blockers list with recommendations and alternatives
|
|
260
|
+
- Cross-PRD dependencies
|
|
261
|
+
|
|
262
|
+
## Handling Ambiguities and Blockers
|
|
263
|
+
|
|
264
|
+
When you encounter something the PRD + comments + codebase can't resolve:
|
|
265
|
+
|
|
266
|
+
1. **Don't guess** — mark the ticket with a BLOCKER section
|
|
267
|
+
2. **Include your recommendation** with rationale
|
|
268
|
+
3. **List 2-3 alternatives** so the user/product can choose
|
|
269
|
+
4. **State what's needed to unblock**
|
|
270
|
+
|
|
271
|
+
## Agent Prompt Template for Sub-task Creation
|
|
272
|
+
|
|
273
|
+
When delegating to agents, provide this context. **The "MUST invoke jira-write-ticket" instruction is load-bearing — do not edit it out when adapting this template.**
|
|
274
|
+
|
|
275
|
+
```text
|
|
276
|
+
Create JIRA sub-tasks in the [PROJECT] project at [CLOUD_ID].
|
|
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
|
|
280
|
+
enforces required quality gates (Gherkin acceptance criteria, 3-audience description,
|
|
281
|
+
single-repo scope, sign-in/environment fields, post-create verification). Bypassing it
|
|
282
|
+
produces broken tickets that downstream skills (triage, journey, evidence) cannot use.
|
|
283
|
+
|
|
284
|
+
For each sub-task, invoke `lisa:jira-write-ticket` with:
|
|
285
|
+
- issue_type: "Sub-task"
|
|
286
|
+
- parent: the parent story key
|
|
287
|
+
- project_key: [PROJECT]
|
|
288
|
+
- summary: prefixed with the repo in brackets, e.g. "[backend-api] Add audit log table"
|
|
289
|
+
- description_body: a 3-section draft (Context / Technical Approach / Acceptance Criteria)
|
|
290
|
+
- gherkin_acceptance_criteria: derived from the story's functional requirements
|
|
291
|
+
- sign_in_account: [test user credentials from config — name + role + how to obtain]
|
|
292
|
+
- target_environment: "dev"
|
|
293
|
+
- empirical_verification_plan: real user-like verification (curl + auth token,
|
|
294
|
+
Playwright browser flow, CLI check after deploy) using the test credentials.
|
|
295
|
+
NOT unit tests, linting, or typechecking.
|
|
296
|
+
|
|
297
|
+
Each sub-task must:
|
|
298
|
+
1. Be scoped to ONE repo only — repo named in brackets in the summary
|
|
299
|
+
2. Include the Empirical Verification Plan in the description
|
|
300
|
+
3. Be created via `lisa:jira-write-ticket`, not via direct MCP calls
|
|
301
|
+
|
|
302
|
+
If `lisa:jira-write-ticket` rejects a sub-task, fix the input and re-invoke. Do NOT fall back
|
|
303
|
+
to a direct `createJiraIssue` call to bypass the gate.
|
|
304
|
+
|
|
305
|
+
Test user info: [credentials from config]
|
|
306
|
+
|
|
307
|
+
[Then list all sub-tasks grouped by parent story with details]
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
## Cross-PRD Shared Infrastructure
|
|
311
|
+
|
|
312
|
+
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. Search JIRA for existing tickets in the project before creating new ones for shared infrastructure.
|
|
313
|
+
|
|
314
|
+
## Confluence-specific notes
|
|
315
|
+
|
|
316
|
+
- **Page bodies** come back from `getConfluencePage` as either Atlassian Document Format (ADF / storage format) or rendered HTML depending on flags. Treat headings (`<h1>`–`<h3>`) as section markers for `prd_section`. For ADF, walk the document tree.
|
|
317
|
+
- **Inline comment anchors**: `prd_anchor` is the inline-comment selection text (the exact substring `createConfluenceInlineComment` will match). If the section is too long for an inline anchor (Confluence has a practical upper bound on selection length), pick the first sentence of the section. If the section has no stable anchor (e.g., a generated table cell), set `prd_anchor: null` and the caller will fall back to a footer comment.
|
|
318
|
+
- **Comment threading**: Confluence has separate footer and inline comment streams. When fetching comments in Phase 1, merge both into the analysis — they are equally authoritative for capturing decisions and engineering notes.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: intake
|
|
3
|
-
description: "Vendor-agnostic batch scanner for
|
|
4
|
-
allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-search", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getJiraIssue"]
|
|
3
|
+
description: "Vendor-agnostic batch scanner for Ready queues. Given a Notion PRD database URL → finds Ready PRDs and runs lisa:plan per item. Given a Confluence space or parent page URL → finds prd-ready PRDs and runs lisa:plan per item. Given a JIRA project key or JQL filter → finds Ready tickets and runs lisa:implement per item. Designed as the cron target for /schedule — one cycle per invocation, processes everything currently Ready, exits cleanly on empty. Symmetric counterpart to the single-item lisa:plan and lisa:implement skills."
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-search", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluenceSpaces", "mcp__atlassian__searchConfluenceUsingCql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getJiraIssue"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Intake: $ARGUMENTS
|
|
@@ -40,11 +40,21 @@ Detect the queue type from `$ARGUMENTS` and route:
|
|
|
40
40
|
| If `$ARGUMENTS` is... | Queue type | Per-item dispatch |
|
|
41
41
|
|------------------------|------------|---------------------|
|
|
42
42
|
| A Notion **database** URL or database ID | PRD queue (Notion) | Invoke `lisa:notion-prd-intake` (which scans the DB for Status=Ready, claims each, runs `lisa:plan` per PRD via the dry-run validate → branch → write pipeline) |
|
|
43
|
+
| A Confluence **space** URL or space key (e.g. `https://acme.atlassian.net/wiki/spaces/PRD` or `PRD`) | PRD queue (Confluence) | Invoke `lisa:confluence-prd-intake` (which CQL-queries the space for `label = "prd-ready"`, claims each by relabeling to `prd-in-review`, runs the dry-run validate → branch → write pipeline) |
|
|
44
|
+
| A Confluence **parent page** URL or page ID (the page whose descendants are PRDs) | PRD queue (Confluence, narrowed) | Invoke `lisa:confluence-prd-intake` with the parent ID (CQL: `ancestor = <id> AND label = "prd-ready"`) |
|
|
43
45
|
| A JIRA project key (e.g. `SE`) | Work queue (JIRA) | Invoke `lisa:jira-build-intake` (which scans the project for Status=Ready, claims each via In Progress, runs `lisa:implement` per ticket, transitions to On Dev on success) |
|
|
44
46
|
| A full JQL filter (e.g. `project = SE AND component = "frontend"`) | Work queue (JIRA, narrowed) | Invoke `lisa:jira-build-intake` with the JQL |
|
|
45
47
|
| A Linear / GitHub Issues queue | Not yet implemented | Stop and report — no `linear-tracker` or `github-tracker` adapter has been built. Don't fall back. |
|
|
46
48
|
|
|
47
|
-
|
|
49
|
+
Disambiguation rules:
|
|
50
|
+
|
|
51
|
+
- A `notion.so` / `notion.site` URL → Notion queue.
|
|
52
|
+
- An Atlassian Confluence URL containing `/wiki/spaces/<KEY>` with no `/pages/...` segment → Confluence space queue.
|
|
53
|
+
- An Atlassian Confluence URL containing `/wiki/spaces/<KEY>/pages/<ID>/...` → Confluence parent-page queue (the page is the parent whose descendants are PRDs). If the user actually meant "this single page is a PRD, plan it", route to `lisa:plan` instead — this skill is batch-only.
|
|
54
|
+
- A bare alphanumeric token that matches the configured `JIRA_PROJECT` regex (uppercase letters / digits / hyphen, ≤10 chars) is treated as a JIRA project key by default. A token that does not match the regex is treated as a Confluence space key. The only time to stop and ask is when the token matches the JIRA_PROJECT regex AND is also a confirmed reachable Confluence space key (verified via Atlassian API) — in that specific overlap the user must disambiguate which queue to scan.
|
|
55
|
+
- A string starting with `project = ` or containing JQL operators (`AND`, `OR`, `=`, `!=`, `~`, etc.) → JQL filter.
|
|
56
|
+
|
|
57
|
+
The single-item skills (`lisa:plan`, `lisa:implement`) and the per-vendor batch skills (`lisa:notion-prd-intake`, `lisa:confluence-prd-intake`, `lisa:jira-build-intake`) are internal — Intake is the public entry point. Developers schedule `/lisa:intake <queue>`; the rest is composition.
|
|
48
58
|
|
|
49
59
|
## Cycle behavior
|
|
50
60
|
|
|
@@ -52,7 +62,8 @@ The single-item skills (`lisa:plan`, `lisa:implement`) and the per-vendor batch
|
|
|
52
62
|
2. **Pre-flight check** — for JIRA, confirm `In Progress` and `On Dev` are reachable transitions before doing any per-ticket work. Stop with a clear error if the workflow is misconfigured.
|
|
53
63
|
3. **Find Ready items** — query the queue. Empty → exit cleanly with `"No items with Status=Ready. Nothing to do."` This is the common idle case for a scheduled run.
|
|
54
64
|
4. **Process each Ready item serially** (claim-first ordering for idempotency):
|
|
55
|
-
- Notion PRDs → `lisa:notion-prd-intake` handles per-item: claim, dry-run validate, branch to Blocked or Ticketed, coverage audit
|
|
65
|
+
- Notion PRDs → `lisa:notion-prd-intake` handles per-item: claim (Status=In Review), dry-run validate, branch to Blocked or Ticketed, coverage audit
|
|
66
|
+
- Confluence PRDs → `lisa:confluence-prd-intake` handles per-item: claim (relabel to `prd-in-review`), dry-run validate, branch to `prd-blocked` or `prd-ticketed`, coverage audit
|
|
56
67
|
- JIRA tickets → `lisa:jira-build-intake` handles per-item: claim, dispatch to `lisa:jira-agent`, transition to On Dev on success
|
|
57
68
|
5. **Failure isolation** — one item failing does not stop the cycle; record under "Errors" and continue.
|
|
58
69
|
6. **Summary report** — per-item outcomes, total processed, total errors.
|
|
@@ -61,6 +72,7 @@ The single-item skills (`lisa:plan`, `lisa:implement`) and the per-vendor batch
|
|
|
61
72
|
|
|
62
73
|
```text
|
|
63
74
|
/schedule "every 30 minutes" /lisa:intake https://www.notion.so/<workspace>/<database-id>
|
|
75
|
+
/schedule "every 30 minutes" /lisa:intake https://acme.atlassian.net/wiki/spaces/PRD
|
|
64
76
|
/schedule "every 30 minutes" /lisa:intake SE
|
|
65
77
|
/schedule "every hour" /lisa:intake "project = SE AND component = 'frontend'"
|
|
66
78
|
```
|
|
@@ -66,6 +66,39 @@ If the caller passes only a ticket key, fetch the ticket via `mcp__atlassian__ge
|
|
|
66
66
|
|
|
67
67
|
Gates are grouped into **Specification** (spec-only checks, no JIRA lookups) and **Feasibility** (requires JIRA lookups). The dry-run path may opt to run Specification gates only; the write path runs both.
|
|
68
68
|
|
|
69
|
+
Each gate is tagged with a fixed `category` and a `product_relevant` boolean. Categories drive how downstream callers (notably `lisa:notion-prd-intake`) translate failures into product-facing comments; `product_relevant=false` failures indicate internal data-quality problems (broken parent links, missing core fields) that the agent should fix itself rather than ask product to clarify.
|
|
70
|
+
|
|
71
|
+
| Gate | Category | Product-relevant |
|
|
72
|
+
|------|----------|------------------|
|
|
73
|
+
| S1 Required core fields | `structural` | false |
|
|
74
|
+
| S2 Summary format | `structural` | false |
|
|
75
|
+
| S3 Description three audiences | `product-clarity` | true |
|
|
76
|
+
| S4 Acceptance criteria in Gherkin | `acceptance-criteria` | true |
|
|
77
|
+
| S5 Bug-specific content | `product-clarity` | true |
|
|
78
|
+
| S6 Spike-specific content | `scope` | true |
|
|
79
|
+
| S7 Epic parent declared | `structural` | false |
|
|
80
|
+
| S8 Target Backend Environment | `technical` | false |
|
|
81
|
+
| S9 Sign-in Required | `technical` | false |
|
|
82
|
+
| S10 Single-repo scope | `scope` | true |
|
|
83
|
+
| S11 Validation Journey | `acceptance-criteria` | true |
|
|
84
|
+
| S12 Source Precedence | `design-ux` | true |
|
|
85
|
+
| S13 Relationship Search | `dependency` | true |
|
|
86
|
+
| F1 Issue type valid in project | `structural` | false |
|
|
87
|
+
| F2 Epic parent exists and is an Epic | `structural` | false |
|
|
88
|
+
| F3 Linked tickets exist | `structural` | false |
|
|
89
|
+
| F4 Required custom fields populated | `structural` | false |
|
|
90
|
+
|
|
91
|
+
Category values are drawn from this fixed set:
|
|
92
|
+
|
|
93
|
+
- `product-clarity` — feature behavior or user intent unclear in the PRD
|
|
94
|
+
- `acceptance-criteria` — pass/fail conditions missing or ambiguous
|
|
95
|
+
- `design-ux` — visual or interaction spec missing
|
|
96
|
+
- `scope` — boundary unclear, items overlap, split needed
|
|
97
|
+
- `dependency` — blocked by another team / system / decision
|
|
98
|
+
- `data` — data source / shape / volume unspecified
|
|
99
|
+
- `technical` — engineering decision required (rare from PRD path; mostly internal)
|
|
100
|
+
- `structural` — internal data-quality problem the agent must fix itself, not surface to product
|
|
101
|
+
|
|
69
102
|
### Specification Gates
|
|
70
103
|
|
|
71
104
|
#### S1 — Required core fields
|
|
@@ -209,16 +242,32 @@ Output is a single fenced text block. Callers parse it; do not add free-form pro
|
|
|
209
242
|
|
|
210
243
|
### Verdict: PASS | FAIL
|
|
211
244
|
### Failures: <count>
|
|
212
|
-
###
|
|
213
|
-
- <gate-id
|
|
214
|
-
|
|
245
|
+
### Failure details
|
|
246
|
+
- gate: <gate-id>
|
|
247
|
+
category: <product-clarity|acceptance-criteria|design-ux|scope|dependency|data|technical|structural>
|
|
248
|
+
product_relevant: <true|false>
|
|
249
|
+
what: <plain-language description of what is missing or wrong, no gate-IDs, no JIRA terminology — written so a non-engineer product owner understands the issue>
|
|
250
|
+
recommendation: <1–3 concrete options the caller (or downstream product team) can pick from. Never "clarify this" — always a specific suggested resolution.>
|
|
251
|
+
- gate: <gate-id>
|
|
252
|
+
category: ...
|
|
253
|
+
...
|
|
215
254
|
```
|
|
216
255
|
|
|
217
256
|
The verdict is `PASS` if and only if every applicable gate is `PASS`. Any `FAIL` makes the verdict `FAIL`. `N/A` does not affect the verdict.
|
|
218
257
|
|
|
258
|
+
### Failure-detail fields
|
|
259
|
+
|
|
260
|
+
- **gate**: the gate ID (`S1`–`S13`, `F1`–`F4`).
|
|
261
|
+
- **category**: the gate's fixed category from the table above. Callers use this to label or filter comments — `product-clarity`, `acceptance-criteria`, `design-ux`, `scope`, `dependency`, `data`, `technical`, or `structural`.
|
|
262
|
+
- **product_relevant**: matches the gate's table entry. `false` means the failure is an internal data-quality problem (e.g., the agent built a malformed spec, an issue type is invalid in the project) and the caller should fix it without bothering the product team. `true` means the PRD needs product input to resolve.
|
|
263
|
+
- **what**: plain-language description of the issue. No gate IDs, no JIRA jargon, no engineering shorthand. A product owner reading this on a Notion comment should understand what is unclear and why.
|
|
264
|
+
- **recommendation**: 1–3 concrete options the reader can pick from, not a generic "please clarify." If the answer is genuinely open-ended, list the most plausible candidate resolutions you considered, even if speculative.
|
|
265
|
+
|
|
219
266
|
## Rules
|
|
220
267
|
|
|
221
268
|
- Never write to JIRA. The `allowed-tools` list intentionally excludes `createJiraIssue`, `editJiraIssue`, `createIssueLink`, `addCommentToJiraIssue`.
|
|
222
269
|
- Never auto-fix the spec. This skill reports gaps; callers decide what to do (block, ask the human, regenerate the spec).
|
|
223
270
|
- Never silently skip a gate. If a gate genuinely doesn't apply, return `N/A` with the reason; never omit it.
|
|
224
|
-
- The
|
|
271
|
+
- The `what` and `recommendation` fields must be concrete and product-readable — the dry-run path turns each failure into a Notion comment, and the audience for those comments is the product team, not engineers. Vague guidance ("clarify this", "decide how to handle X") is useless; always give 1–3 candidate resolutions.
|
|
272
|
+
- Never emit a category outside the fixed set. If a new gate doesn't fit, propose adding the category to the taxonomy in this skill rather than inventing one inline.
|
|
273
|
+
- `product_relevant` is determined by the gate, not by the failure context. Do not flip it per-failure.
|
|
@@ -101,7 +101,7 @@ Per-ticket gates prove each ticket is well-formed; they do NOT prove the *set* o
|
|
|
101
101
|
|---------|--------|
|
|
102
102
|
| `COMPLETE` | Done. Leave `Status = Ticketed`. Move to next PRD. |
|
|
103
103
|
| `COMPLETE_WITH_SCOPE_CREEP` | Post an advisory Notion comment naming the scope-creep tickets (so product can decide whether to close them as out-of-scope). Leave `Status = Ticketed`. |
|
|
104
|
-
| `GAPS_FOUND` | The created ticket set is incomplete. (a) For each gap, post a Notion comment
|
|
104
|
+
| `GAPS_FOUND` | The created ticket set is incomplete. (a) For each gap, post a Notion comment using the same product-facing template as Phase 3c.3 — block-anchored via `selection_with_ellipsis` when `prd_anchor` is non-null, page-level 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 summary comment listing the tickets that *were* successfully created (so product knows what to keep vs. what to extend). (c) Transition `Status` from `Ticketed` back to `Blocked` via `notion-update-page`. |
|
|
105
105
|
| `NO_TICKETS_FOUND` | Should not happen if step 2 succeeded. If it does, log it as an Error in the cycle summary and leave `Status = Ticketed` with a comment flagging the audit failure for human review. |
|
|
106
106
|
|
|
107
107
|
3. The created tickets remain in JIRA regardless of the verdict — they are valid in their own right (they passed `lisa:jira-validate-ticket`). The audit only tells us whether *more* are needed.
|
|
@@ -110,24 +110,65 @@ The audit's report should be summarized in the cycle summary alongside the per-P
|
|
|
110
110
|
|
|
111
111
|
**If `FAIL`** (one or more planned tickets failed one or more gates):
|
|
112
112
|
|
|
113
|
-
|
|
114
|
-
2. For each failed ticket, post a Notion comment via `notion-create-comment` with this format:
|
|
113
|
+
The audience for these comments is the **product team**, not engineers. They are not familiar with JIRA gate IDs, validator vocabulary, or skill internals. Follow the rules below strictly — the goal is for a non-engineer product owner to read a comment, understand what is unclear, and know what to do next.
|
|
115
114
|
|
|
116
|
-
|
|
117
|
-
**Blocker — planned ticket: <ticket-summary>**
|
|
115
|
+
##### 3c.1 Partition failures
|
|
118
116
|
|
|
119
|
-
|
|
117
|
+
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.
|
|
118
|
+
2. Group the remaining product-relevant failures by `prd_anchor` (the snippet from `notion-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 page-level summary comment, since they have no source section to attach to.
|
|
120
119
|
|
|
121
|
-
|
|
122
|
-
- **<gate-id> (<gate-name>)**: <reason>. *Fix:* <concrete remediation>.
|
|
120
|
+
##### 3c.2 Render each comment
|
|
123
121
|
|
|
124
|
-
|
|
125
|
-
|
|
122
|
+
For each anchored group, post via `mcp__claude_ai_Notion__notion-create-comment` with:
|
|
123
|
+
- `page_id`: the PRD page ID
|
|
124
|
+
- `selection_with_ellipsis`: the `prd_anchor` value (e.g. `"# User taps Fol...esume action"`)
|
|
125
|
+
- `rich_text`: the body, formatted using the template below
|
|
126
126
|
|
|
127
|
-
|
|
128
|
-
4. Do NOT write any JIRA tickets.
|
|
127
|
+
For the unanchored group, post a single page-level comment (omit `selection_with_ellipsis`) using the same template, prefixed with `Issues without a specific section anchor:` and one block per failure.
|
|
129
128
|
|
|
130
|
-
|
|
129
|
+
##### 3c.3 Comment template
|
|
130
|
+
|
|
131
|
+
Each comment body MUST contain these four parts, in this order, no exceptions:
|
|
132
|
+
|
|
133
|
+
```text
|
|
134
|
+
[<Category badge>] <prd_section heading text>
|
|
135
|
+
|
|
136
|
+
**What's unclear:** <validator's `what` field, verbatim — already product-readable>
|
|
137
|
+
|
|
138
|
+
**Recommendation:** <validator's `recommendation` field, verbatim — must contain 1–3 concrete options, never a generic "please clarify">
|
|
139
|
+
|
|
140
|
+
**Action:** Update this section in the PRD, then set Status back to `Ready` and Claude will re-run intake.
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
If multiple failures share an anchor, render each as its own `**What's unclear:** ... **Recommendation:** ...` block within the same comment, separated by horizontal lines (`---`). Keep the single `[Category badge]` heading at the top using the most-severe / most-blocking category from the group.
|
|
144
|
+
|
|
145
|
+
##### 3c.4 Category badges
|
|
146
|
+
|
|
147
|
+
Use these exact badge labels — they are the validator's category values translated for product readers:
|
|
148
|
+
|
|
149
|
+
| Validator category | Badge label |
|
|
150
|
+
|---------------------|-------------|
|
|
151
|
+
| `product-clarity` | `[Product clarity]` |
|
|
152
|
+
| `acceptance-criteria` | `[Acceptance criteria]` |
|
|
153
|
+
| `design-ux` | `[Design / UX]` |
|
|
154
|
+
| `scope` | `[Scope]` |
|
|
155
|
+
| `dependency` | `[Dependency]` |
|
|
156
|
+
| `data` | `[Data]` |
|
|
157
|
+
| `technical` | `[Technical]` |
|
|
158
|
+
|
|
159
|
+
`structural` failures must never reach this step (filtered in 3c.1). If you see one here, treat it as an Error and surface internally.
|
|
160
|
+
|
|
161
|
+
##### 3c.5 Forbidden in product comments
|
|
162
|
+
|
|
163
|
+
- Gate IDs (`S4`, `F2`, etc.). Never appear in a comment body.
|
|
164
|
+
- JIRA terminology that has no product meaning (e.g. "Gherkin", "epic parent", "issue link", "validation journey", "sub-task hierarchy"). If the validator's `what` field uses one of these terms, paraphrase before posting; do not pass through verbatim.
|
|
165
|
+
- Internal skill names (`lisa:jira-validate-ticket`, `notion-to-jira`).
|
|
166
|
+
- Engineering shorthand (`AC`, `OOS`, `repo`, `env var`).
|
|
167
|
+
- "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.
|
|
168
|
+
|
|
169
|
+
##### 3c.6 Status transition
|
|
170
|
+
|
|
171
|
+
After all comments are posted (anchored groups + the optional page-level summary), set `Status = Blocked` via `notion-update-page`. Do NOT write any JIRA tickets.
|
|
131
172
|
|
|
132
173
|
#### 3d. Continue
|
|
133
174
|
|
|
@@ -182,5 +223,7 @@ This skill reads project configuration from environment variables (or `$ARGUMENT
|
|
|
182
223
|
- Never write to JIRA outside of `lisa:notion-to-jira` → `lisa:jira-write-ticket`. The validator's verdict gates progress; bypassing it produces broken tickets.
|
|
183
224
|
- Never set Notion `Status` to a value this skill doesn't own (`In Review`, `Blocked`, `Ticketed`). Product owns `Draft`, `Ready`, `Shipped`.
|
|
184
225
|
- Never edit the PRD's body. Communication with product happens only through Notion comments.
|
|
226
|
+
- Never post a single page-level dump of all gate failures. One comment per `prd_anchor` group (or one page-level summary for unanchored failures only). The audience is product, not engineers — comments must be block-anchored, categorized, plain-language, and contain a concrete recommendation. See Phase 3c.3 for the required template and Phase 3c.5 for forbidden language.
|
|
227
|
+
- Never include a gate ID, internal skill name, or engineering shorthand in a Notion comment body. If the validator's `what` or `recommendation` field uses one, paraphrase before posting.
|
|
185
228
|
- Never run more than one intake cycle concurrently against the same database. This skill assumes serial execution. (Scheduling is a separate concern; the runtime should not start a new cycle if a previous one is still in flight.)
|
|
186
229
|
- If `lisa:notion-to-jira` returns errors (e.g. unreachable artifact, malformed PRD structure), treat them as gate failures: comment + Blocked. Don't silently fail.
|
|
@@ -28,19 +28,36 @@ Dry-run output format:
|
|
|
28
28
|
|
|
29
29
|
### Planned hierarchy
|
|
30
30
|
- Epic: <summary>
|
|
31
|
+
prd_section: "<heading text from the PRD that produced this epic>"
|
|
32
|
+
prd_anchor: "<first ~10 chars>...<last ~10 chars>" # for selection_with_ellipsis; null if no specific section
|
|
31
33
|
- Story 1.1: <summary>
|
|
34
|
+
prd_section: "<heading or user-story line>"
|
|
35
|
+
prd_anchor: "<start>...<end>"
|
|
32
36
|
- Sub-task [<repo>]: <summary>
|
|
37
|
+
prd_section: "<heading or AC bullet>"
|
|
38
|
+
prd_anchor: "<start>...<end>"
|
|
33
39
|
- ...
|
|
34
40
|
- Story 1.2: ...
|
|
35
41
|
|
|
36
42
|
### Per-ticket validation
|
|
37
43
|
- <ticket-id>: PASS | FAIL — <count> failures
|
|
38
|
-
|
|
44
|
+
prd_section: "<heading text>"
|
|
45
|
+
prd_anchor: "<start>...<end>" # mirrored from Planned hierarchy for caller convenience
|
|
46
|
+
failures:
|
|
47
|
+
- gate: <gate-id>
|
|
48
|
+
category: <category from validator>
|
|
49
|
+
product_relevant: <true|false>
|
|
50
|
+
what: <plain-language description from validator>
|
|
51
|
+
recommendation: <1–3 candidate resolutions from validator>
|
|
39
52
|
|
|
40
53
|
### Verdict: PASS | FAIL
|
|
41
54
|
### Total failures: <n>
|
|
42
55
|
```
|
|
43
56
|
|
|
57
|
+
`prd_anchor` and `prd_section` exist so downstream callers (notably `lisa:notion-prd-intake`) can post block-anchored Notion comments via `notion-create-comment` with `selection_with_ellipsis`. Build them as you parse the PRD: when you assign a planned ticket to a heading, user-story line, or AC bullet, capture the first ~10 and last ~10 characters of that section's text and emit them in the report. If a planned ticket genuinely doesn't trace to a specific section (cross-cutting infrastructure, derived sub-tasks), set both fields to `null` — the caller will fall back to a page-level comment.
|
|
58
|
+
|
|
59
|
+
The `failures` array passes the validator's `Failure details` block through verbatim. Do not re-format `what` or `recommendation` here — those fields are already product-readable per the validator's contract, and re-summarizing risks losing concrete recommendations.
|
|
60
|
+
|
|
44
61
|
The dry-run mode never writes to JIRA and never calls `mcp__atlassian__createJiraIssue`. It also never sets a Notion status — that is the orchestrating skill's responsibility.
|
|
45
62
|
|
|
46
63
|
## Hard Rule: All Writes Go Through `lisa:jira-write-ticket`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: plan
|
|
3
|
-
description: "Decompose a single PRD or specification into ordered work items in the configured tracker. Vendor-agnostic — the source can be a Notion PRD URL, an existing JIRA epic key, a markdown file, or a free-form description; the destination tracker is whatever the project is configured to use (JIRA today; Linear/GitHub Issues are pluggable). Single-PRD mode only — for batch scanning of all
|
|
3
|
+
description: "Decompose a single PRD or specification into ordered work items in the configured tracker. Vendor-agnostic — the source can be a Notion PRD URL, a Confluence PRD URL, an existing JIRA epic key, a markdown file, or a free-form description; the destination tracker is whatever the project is configured to use (JIRA today; Linear/GitHub Issues are pluggable). Single-PRD mode only — for batch scanning of all Ready PRDs in a queue, use the lisa:intake skill."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "Read", "Glob", "Grep"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -22,6 +22,8 @@ Detect the input type from `$ARGUMENTS` and route to the appropriate source skil
|
|
|
22
22
|
|------------------------|-------------|
|
|
23
23
|
| A Notion **page** URL or page ID (single PRD) | `lisa:notion-to-jira` (with the PRD URL; runs the full pipeline: extract artifacts → walk live product → validate → write tickets → coverage audit) |
|
|
24
24
|
| A Notion **database** URL or database ID | Stop and report — single-PRD mode only. Direct the caller to `lisa:intake` for batch scanning of a database. |
|
|
25
|
+
| A Confluence **page** URL containing `/wiki/spaces/<KEY>/pages/<ID>/...` (single PRD) | `lisa:confluence-to-jira` (with the PRD URL; same full pipeline as the Notion path) |
|
|
26
|
+
| A Confluence **space** URL (`/wiki/spaces/<KEY>` with no `/pages/...`) | Stop and report — single-PRD mode only. Direct the caller to `lisa:intake` for batch scanning of a space. |
|
|
25
27
|
| A JIRA ticket ID/URL of an Epic (existing epic *is* the spec) | `lisa:jira-agent` (read epic, decompose into stories/sub-tasks) |
|
|
26
28
|
| A Linear / GitHub Issues URL or key | Not yet implemented. Stop and tell the user the adapter doesn't exist yet — the architecture supports it, but no `linear-prd-source` / `github-prd-source` skill has been built. Don't fall back. |
|
|
27
29
|
| A file path (`@plan.md`, `./spec.md`) | Read the file as the spec; run the Plan flow's core decomposition with the file content as input. |
|