plugins/src/base/skills/lisa-task-decomposition/SKILL.md
Methodology for breaking work into ordered tasks. Cross-repo source PRDs and coordination containers stay cross-repo; each buildable leaf task gets a single-repo scope, acceptance criteria, verification type, dependencies, and skills required.
npx skillsauth add codyswanngt/lisa lisa-task-decompositionInstall 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.
Break work into ordered, well-scoped tasks that can be independently implemented and verified.
Start from the right shape:
That last point is a hard invariant — downstream validators (jira-validate-ticket, github-validate-issue, linear-validate-issue) gate writes on it, so a cross-repo leaf will fail to be created.
Apply this rule by layer:
| Layer | Repo scope | |-------|------------| | PRD / source initiative | MAY span repos — it describes the full initiative | | Epic, Story, Spike | MAY span repos — these are coordination containers | | Task, Bug, Sub-task, Improvement | MUST name exactly one repo — these are buildable leaf work units |
If a candidate work unit naturally touches multiple repos (e.g., "add field to backend API and consume it in mobile app"), do not write it as one ticket. Instead:
[backend-api] Add field to /users endpoint, [mobile-app] Display new field on profile screen).Dependencies in step 4 — typically the producing repo (backend) blocks the consuming repo (frontend/mobile).[repo-name] as a summary prefix so the repo is visible in tracker lists at a glance.Reject any work unit whose acceptance criteria reference behavior in a different repo from the one it's scoped to. If you find yourself writing "and the frontend should also...", that's a signal to split.
This is the decomposition-time strategy (greenfield — you are creating the tickets now, so a cross-repo PRD can stay whole, its Epic/Story/Spike containers can stay cross-repo, and a parent Story + per-repo children is the natural shape). It is distinct from the work-time strategy in the repo-scope-split rule, which applies when an agent picks up an already-existing leaf ticket to implement and discovers it spans repos: there it narrows the original in place and spins off sibling work units rather than introducing a new parent. Use the phase-appropriate one; do not mix them.
For each task, define what "done" looks like:
Each task must have a verification method. Choose the most appropriate:
| Verification Type | When to Use | |-------------------|-------------| | Unit test | Pure logic, data transformations, utility functions | | Integration test | Cross-module interactions, database operations, API contracts | | E2E test | User-facing workflows, multi-service interactions | | Manual verification | UI/UX behavior, visual correctness, one-time infrastructure changes | | Build verification | Compilation, type checking, linting, bundle size | | Deploy verification | Service health checks, smoke tests, monitoring dashboards |
Step 4 maps dependencies between tasks. This step covers third-party dependencies a task proposes to add.
A dependency is material if its failure, disappearance, or bad update would break something a user can see, or would cost real time to replace. If a work unit proposes adding one, the work unit must, before it is buildable:
dependency-trust-classes rule
for what each class means and why it is trusted..lisa/DEPENDENCY_DECISIONS.md in its acceptance
criteria, so the record entry lands in the same change as the dependency.If nobody can pick a class, that is the finding — resolve it before accepting the work unit, not after the package is installed.
Step 4.5 covers dependencies a task proposes to add. This step covers dependencies a task proposes to remove, replace, or internalize — vendor, fork-and-maintain, or reimplement ourselves.
When ownership moves in-house, the risk stops being "do we trust upstream" and
becomes "did we prove we rebuilt the capability." A work unit that moves a
material dependency in-house inherits all seven acceptance criteria of the
dependency-internalization-kit rule, each written as an acceptance criterion
of the work unit:
The only way out is an explicit non-material justification written into the work unit — one reviewable sentence saying why this dependency's failure or disappearance breaks nothing a user can see and costs no real time to replace. Silence is not a justification.
Do not over-apply the kit. A routine version bump of a trusted dependency within its existing trust class does not move ownership, so it does not inherit the kit — its bar is that trust class's own detection evidence and cadence. The same is true of swapping one third-party dependency for another, which moves trust to a different upstream rather than in-house. Add the kit only when ownership moves in-house; the exception is a bump taken as a fork or declined in favor of owning the code, which is an internalization regardless of how the ticket is titled.
Map each task to the skills needed to complete it. This enables delegation to specialized agents or helps identify what expertise is required.
## Task Breakdown
### Task 1: [[repo-name] imperative description]
- **Repository:** [single repo name, or N/A for Epic/Story/Spike]
- **Acceptance criteria:**
- [specific, measurable criterion]
- [specific, measurable criterion]
- **Verification:** [type] -- [how to verify]
- **Dependencies:** [none | task IDs that must complete first]
- **Skills:** [list of skills needed]
### Task 2: [[repo-name] imperative description]
- **Repository:** [single repo name, or N/A for Epic/Story/Spike]
- **Acceptance criteria:**
- [specific, measurable criterion]
- **Verification:** [type] -- [how to verify]
- **Dependencies:** [Task 1]
- **Skills:** [list of skills needed]
### Execution Order
1. [Task 1, Task 3] (parallel -- no dependencies)
2. [Task 2] (depends on Task 1)
3. [Task 4] (depends on Task 2, Task 3)
### External Dependencies
- [dependency] -- [who owns it] -- [current status]
.lisa/DEPENDENCY_DECISIONS.md in the same change (see step 4.5) -- a proposed material dependency with no named class is not ready to buildtools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.