plugins/lisa/skills/notion-to-jira/SKILL.md
Break down a Notion PRD into JIRA epics, stories, and sub-tasks. Use this skill whenever the user shares a Notion PRD URL and wants it converted into JIRA tickets, or asks to "break down a PRD", "create tickets from a PRD", "turn this PRD into JIRA", or similar. Also trigger when the user mentions creating epics/stories/tasks from a Notion document. This skill handles the full pipeline: fetching the PRD, analyzing comments, researching the codebase, identifying blockers, and creating all tickets with empirical verification plans.
npx skillsauth add codyswanngt/lisa notion-to-jiraInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Convert a Notion PRD into a structured JIRA ticket hierarchy: Epics > Stories > Sub-tasks. Each sub-task is scoped to exactly one repo and includes an empirical verification plan.
This skill supports two modes, controlled by a dry_run flag in $ARGUMENTS:
dry_run: false (default — full mode): run all phases, write tickets via lisa:jira-write-ticket, run the preservation gate, report.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:notion-prd-intake) can decide whether to proceed.Dry-run output format:
## notion-to-jira dry-run: <PRD title>
### Planned hierarchy
- Epic: <summary>
- Story 1.1: <summary>
- Sub-task [<repo>]: <summary>
- ...
- Story 1.2: ...
### Per-ticket validation
- <ticket-id>: PASS | FAIL — <count> failures
- <gate-id>: <one-line reason and remediation>
### Verdict: PASS | FAIL
### Total failures: <n>
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.
lisa:jira-write-ticketEvery 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.
lisa:jira-write-ticket enforces gates this skill does not:
blocks / is blocked by / relates to / duplicates / clones)Bypassing lisa:jira-write-ticket produces thin tickets that the rest of the lifecycle (triage, ticket-verify, journey, evidence) treats as broken. This is the most common failure mode this skill has had — calling createJiraIssue directly is a regression, not an optimization. The Atlassian read tools (getJiraIssue, searchJiraIssuesUsingJql, getJiraIssueRemoteIssueLinks, getAccessibleAtlassianResources, getJiraProjectIssueTypesMetadata, getVisibleJiraProjects) ARE allowed for context gathering and the Phase 5.5 preservation gate.
A Notion PRD URL. The PRD is expected to have:
This skill reads project-specific configuration from environment variables. If these are not set, ask the user for the values before proceeding.
| Variable | Purpose | Example |
|----------|---------|---------|
| JIRA_PROJECT | JIRA project key for ticket creation | SE |
| JIRA_SERVER | Atlassian instance URL (site host) | mycompany.atlassian.net |
| E2E_TEST_PHONE | Test user phone number for verification plans | 0000000099 |
| E2E_TEST_OTP | Test user OTP code | 555555 |
| E2E_TEST_ORG | Test organization name | Arsenal |
| E2E_BASE_URL | Frontend base URL for Playwright tests | https://dev.example.io/ |
| E2E_GRAPHQL_URL | GraphQL API URL for curl verification | https://gql.dev.example.io/graphql |
If env vars are not available, ask the user to provide them explicitly before proceeding. Do not retrieve credentials from repository files or local agent settings.
include_discussions: trueinclude_discussions: truenotion-get-comments with include_all_blocks: truePRDs typically reference external design, UX, and data artifacts (Figma files, Lovable prototypes, Loom walkthroughs, screenshots, example payloads, 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.
Scan the PRD main page, all Epic sub-pages, and every fetched comment thread for:
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.
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 ("Figma URL contains /proto/ → ux-flow"). The source_page lets you trace each reference back to where it appeared in the PRD.
Surface coverage smells as defined in lisa:jira-source-artifacts §5 (zero artifacts, prototype-without-mock, mock-without-prototype, Lovable-without-business-rules). Record any detected smells on the epic.
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.
The existing-component reuse expectation (mocks define visual intent, not implementation shortcut) is defined in lisa:jira-source-artifacts §7. Encode it on every UI-touching story.
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.
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. Skip repos already explored in the current session.
Key things to look for:
2b. Live product walkthrough. If the PRD touches existing user-facing surfaces (modifies a screen, adds something next to existing functionality, fixes current behavior, re-styles an existing flow), invoke the lisa:product-walkthrough skill against E2E_BASE_URL using the test user from config. This grounds the ticket plan in what's actually shipped — design-vs-current-product divergence, reuse candidates, and behavioral surprises that the PRD didn't anticipate become inputs to ticket creation rather than discoveries during implementation.
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.
Walkthrough findings are attached to the originating Notion PRD as a comment ("Current product walkthrough — <route>") and inherited onto the resulting epic / stories under a ## Current Product subsection.
Mode guard: In
dry_run: truemode, do not invokelisa:jira-write-ticketin this phase. Instead, draft the epic spec (summary, description_body, artifacts) and validate it withlisa:jira-validate-ticket --spec-only. Record the drafted spec (including a placeholder epic key likeDRY-RUN-EPIC-1) for Phase 4 to use as parent references. Indry_run: falsemode (default), proceed as described below.
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:
project_key: from JIRA_PROJECT configissue_type: Epicsummary: epic title from the PRDdescription_body: a draft of the 3-audience description containing:
artifacts: the full Phase 1.5 artifact list — every artifact, regardless of domain. The epic is the canonical hub, and anyone working on the epic or its descendants must be able to reach the full set from one place. No filtering at the epic level. lisa:jira-write-ticket Phase 4c attaches them as remote links.priority, labels, components, fix_version: as appropriateCapture the returned epic key — Phase 4 needs it as the parent for stories.
Mode guard: In
dry_run: truemode, do not invokelisa:jira-write-ticketin this phase. Instead, draft each story spec and validate it withlisa:jira-validate-ticket --spec-only. Use placeholder keys (e.g.DRY-RUN-STORY-1.1) for any downstream references. Indry_run: falsemode (default), proceed as described below.
For each Epic, plan two kinds of stories:
Story naming convention: Prefix the summary with a short code derived from the PRD title:
[CU-1.1][SP-1.1]For each story, invoke lisa:jira-write-ticket with:
project_key: from JIRA_PROJECT configissue_type: Storyepic_parent: the Epic key captured in Phase 3 (mandatory — lisa:jira-write-ticket rejects non-bug, non-epic tickets without an epic parent)summary: prefixed per the naming convention abovedescription_body: a draft of the 3-audience description containing:
lisa:jira-write-ticket will reject prose-only acceptance criteria## Open Questionsartifacts: the Phase 1.5 artifacts filtered by domain per the inheritance table below — lisa:jira-write-ticket Phase 4c attaches them as remote linkspriority, labels, components, fix_version: as appropriateCapture each returned story key — Phase 5 needs it as the parent for sub-tasks.
Inherit domain-matching artifacts as story remote links. For each story, the artifact set passed to lisa:jira-write-ticket should be the Phase 1.5 artifacts whose domain matches the story's scope:
| Story type | Inherits domains |
|------------|------------------|
| Frontend / UI | ui-design, ux-flow, reference |
| Backend / API / data model | data, reference |
| Infrastructure | ops, reference |
| Mixed / setup ("X.0") | All domains |
When classification is ambiguous, err on the side of inclusion — a developer can ignore a link, but they can't inherit one that wasn't attached. Classification mistakes are caught by the preservation gate in Phase 5.5 and by the human reviewing the final report.
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. This is non-negotiable; see the Agent Prompt Template at the bottom of this skill for the exact instructions to pass.
Each sub-task MUST:
[repo-name]. lisa:jira-write-ticket enforces single-repo scope on Sub-task; cross-repo sub-tasks will be rejected and must be split before delegation.Verification plan examples by stack:
cdk synth / terraform plan verification, CLI checks after deployUse the test user credentials from config for all verification plans. The credentials are passed to lisa:jira-write-ticket as the sign-in account so it can record them in the description per its own rules.
For each sub-task, the spawned agent invokes lisa:jira-write-ticket with issue_type: "Sub-task" and parent set to the Story key. The Story key is the parent — the epic relationship is inherited transitively.
Sub-tasks inherit their parent story's artifacts by reference (the parent link). Do not pass the same artifact list to every sub-task — that creates noise. The only exception is when a sub-task depends on an artifact that the parent story doesn't (e.g., a sub-task spec'd from a specific Figma frame that the broader story doesn't cite) — in that case, pass the specific artifact in the artifacts parameter to lisa:jira-write-ticket.
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 so any rule change propagates uniformly.
To run the gate, this skill must:
mcp__atlassian__getJiraIssueRemoteIssueLinks.lisa:jira-write-ticket (UPDATE mode) or stop and ask the human. Never silently proceed past a gate failure.This gate is not optional. Skipping it is the failure mode the architecture exists to prevent.
After all tickets are created, present a summary table to the user:
When you encounter something the PRD + comments + codebase can't resolve:
Common blocker categories:
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.
Create JIRA sub-tasks in the [PROJECT] project at [CLOUD_ID].
CRITICAL: For each sub-task, invoke the `lisa:jira-write-ticket` skill via the Skill tool.
Do NOT call `mcp__atlassian__createJiraIssue` directly. The `lisa:jira-write-ticket` skill
enforces required quality gates (Gherkin acceptance criteria, 3-audience description,
single-repo scope, sign-in/environment fields, post-create verification). Bypassing it
produces broken tickets that downstream skills (triage, journey, evidence) cannot use.
For each sub-task, invoke `lisa:jira-write-ticket` with:
- issue_type: "Sub-task"
- parent: the parent story key
- project_key: [PROJECT]
- summary: prefixed with the repo in brackets, e.g. "[backend-api] Add audit log table"
- description_body: a 3-section draft (Context / Technical Approach / Acceptance Criteria)
- gherkin_acceptance_criteria: derived from the story's functional requirements
- sign_in_account: [test user credentials from config — name + role + how to obtain]
- target_environment: "dev"
- empirical_verification_plan: real user-like verification (curl + auth token,
Playwright browser flow, CLI check after deploy) using the test credentials.
NOT unit tests, linting, or typechecking.
Each sub-task must:
1. Be scoped to ONE repo only — repo named in brackets in the summary
2. Include the Empirical Verification Plan in the description
3. Be created via `lisa:jira-write-ticket`, not via direct MCP calls
If `lisa:jira-write-ticket` rejects a sub-task (cross-repo scope, missing Gherkin, missing
sign-in, etc.), fix the input and re-invoke. Do NOT fall back to a direct
`createJiraIssue` call to bypass the gate.
Test user info: [credentials from config]
[Then list all sub-tasks grouped by parent story with details]
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.
development
Use Expo DOM components to run web code in a webview on native and as-is on web. Migrate web code to native incrementally.
development
Guidelines for upgrading Expo SDK versions and fixing dependency issues
development
Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, and Expo Router data loaders (`useLoaderData`).
tools
`@expo/ui/swift-ui` package lets you use SwiftUI Views and modifiers in your app.