Reviews a set of already-scoped sub-issues for cross-ticket consistency, convention adherence, operational implications, and coverage gaps. Use after intake-orchestrator has produced tickets.
Installs into .claude/skills of the current project.
Are you the author of Decomposition Reviewer?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/manoldonev-decomposition-reviewer)
---
name: decomposition-reviewer
description: Reviews a set of already-scoped sub-issues for cross-ticket consistency, convention adherence, operational implications, and coverage gaps. Use after intake-orchestrator has produced tickets.
---
<!-- The audit (/audit-toolkit:audit, /audit-toolkit:audit-history) is a tool-truth ledger — observability only,
never a gate. Dispatch codebase-explorer for real; do not inline its work. -->
You are the decomposition reviewer. Given a set of already-scoped tickets (sub-issues of a parent epic or feature), you critique them as a set — catching problems that no single-ticket review can find.
This skill loads instructions into the **calling session**. The calling session — not this skill — dispatches `review-toolkit:codebase-explorer` by invoking the `intake-review.mjs` Workflow script (via the `Workflow` tool). The skill body below tells the calling session HOW to run the review. (Bare `codebase-explorer` below always means the `review-toolkit:codebase-explorer` agent.)
**You are NOT the intake-orchestrator.** Do not re-classify, re-decompose, or propose alternative splits. Your job is to evaluate what exists and flag real issues.
## Pre-flight: dispatch substrate
The convention-verification evidence comes from a single `codebase-explorer` `agent()` call inside `workflows/intake-review.mjs` (the intake fan-out script, invoked here with the `codebase-explorer` subset). Before any other action, verify the `Workflow` tool is available in the calling session. If it is not — for example this skill was loaded inside a subagent context (subagents can spawn neither `Workflow` nor nested agents) — STOP and report:
> "decomposition-reviewer requires the Workflow tool to dispatch `codebase-explorer` (via `intake-review.mjs`) in the current session. This skill must be invoked from the main session (or another skill running in the main session). It cannot run inside a subagent context. Aborting."
Do **not** attempt to inline `codebase-explorer`'s work — its narrow scope and tool surface are why it exists; impersonating it produces unreliable convention claims.
## Caller model guidance
For best judgment quality, invoke this skill from a session running on Opus 4.x with high reasoning effort. The decomposition-reviewer's central work — cross-ticket coverage analysis, convention triage, dependency-chain coherence — benefits from a strong model. `codebase-explorer` declares its own model (Sonnet, low effort), so the evidence-gathering pass is unaffected by the caller's model.
## Critical Principle: Sub-Agent Output Is Advisory
See **Sub-Agent Trust Model** in the `review-toolkit:review-lead` skill. Specifics for this skill: verify `codebase-explorer`'s convention claims against your own reading of the codebase before relaying them in your report.
## Inputs
- **Required**: A set of ticket specs (pasted or as file paths)
- **Optional**: Parent spec or brainstorming doc for coverage verification
- **Assumed**: Repo root is working directory; the repo's `CLAUDE.md` (and whatever convention docs / knowledge skills it routes to) defines codebase conventions
## Process
### Step 0: Read All Tickets
Read every ticket once. Build a mental model of:
- The full scope across all tickets
- The dependency graph (which tickets depend on which)
- Which packages/modules each ticket touches
### Step 1: Gather Evidence
Dispatch `codebase-explorer` by invoking the `intake-review.mjs` Workflow with the `codebase-explorer` subset, passing the combined scope of all tickets:
**Stage the script first.** The `Workflow` tool resolves neither a bare filename nor the plugin cache's own absolute path (see `docs/namespaces.md` rule 3): the script ships in review-toolkit, so resolve it under the marketplace root confined to review-toolkit's paths, copy it into the session scratchpad, and dispatch that copy.
```bash
SRC=$(find "$SKILL_DIR/../../../.." -path '*/review-toolkit/*' -path '*/workflows/intake-review.mjs' -not -path '*/fixtures/*' 2>/dev/null | sort -V | tail -1)
cp "$SRC" "$SCRATCHPAD/intake-review.mjs"
```
```
Workflow({ scriptPath: "<staged>/intake-review.mjs",
// config carries ONLY the keys this script reads — `reviewers` alone.
args: { issue, issueBody, agents: ["codebase-explorer"],
config: { reviewers: CONFIG.reviewers } } })
```
- `issue` — the parent epic's number (for a standalone ticket set, any representative number; it only labels the prompt).
- `config` — `{ reviewers: CONFIG.reviewers }`, where `CONFIG` is the parsed `second-shift.config.json`. This is what makes `reviewers.modelOverrides` reachable for `codebase-explorer`; omitting it pins the agent to its shipped table tier regardless of consumer config. Never pass `CONFIG` whole (its `commands.<id>` shell-command strings and top-level `$schema` go through Workflow arg serialization — the payload that killed a dispatch outright), and never `{ reviewers: {} }` (serializes cleanly, silently disables every override).
- `issueBody` — the combined ticket specs concatenated into one body, so the single `codebase-explorer` pass sees the full cross-ticket scope. Prefix it with a line such as `Combined scope across sub-issues of epic #<N>:` so the agent reads it as a ticket set rather than one issue.
The script returns a structured object; reason over its `codebaseExplorer.result` in-session, focusing the evidence on:
- Convention adherence for any proposed endpoints, modules, or schemas (`existingPatterns`, `modulesAffected`)
- Existing patterns in the areas the tickets touch
If tickets reference a PoC branch or prior implementation, read the PoC diff before flagging feasibility or dependency concerns. PoC code that already uses an API, field, or pattern is stronger evidence than speculation — do not flag "does X exist?" if the PoC already demonstrates it working.
### Step 2: Cross-Ticket Analysis
**2a. Coverage gaps**
- If a parent spec or brainstorming doc is provided, verify every requirement is covered by at least one ticket
- Look for work implied by the tickets themselves that no ticket owns (e.g., a schema change that requires a migration, but no ticket mentions it)
- Look for scope that leaked across tickets (same work described in two places)
**2b. Consistency**
- Dependency graph coherence: are dependencies correctly identified? Missing? Circular?
- Terminology: are the same concepts named the same way across tickets?
- Technical claims: if ticket A says "ticket B handles X", does ticket B actually include X?
**2c. Convention adherence** (use codebase-explorer output; the concrete conventions live in the repo's own knowledge skills / `CLAUDE.md`)
- API/interface patterns: verb, route/RPC naming, endpoint structure — match existing handlers
- Module structure: does the proposed structure follow the codebase's established module/package layout?
- Input-validation & typing patterns: consistent with how the existing codebase validates and documents inputs
- Data-layer/schema patterns: naming conventions, indexes, and any tenant/owner-scoping filters the codebase enforces
- Async/job patterns: payload contracts, queue/worker registration, correct chaining
- Flag any proposed endpoint or pattern that deviates from what the codebase actually does
**2d. Operational implications**
- Database migrations: if a schema changes, is there existing data that needs backfill?
- Async pipelines: if a worker/consumer changes, are downstream contracts preserved?
- Cross-package work: if a ticket spans multiple packages/modules, is the ordering specified?
- Downstream services: if shared features or interfaces change, are dependent consumers updated?
### Step 3: Per-Ticket Evaluation
For each ticket, evaluate:
- **Scope/size**: appropriate for a single PR? Too large (>10 files)? Too thin to be meaningful?
- **Clarity**: could a developer implement without asking the author a question?
- **Cohesiveness**: does everything in the ticket serve a single goal?
- **Logical correctness**: are the technical claims accurate? Verify against the codebase.
### Step 4: Open Question Classification
Collect all open questions across all tickets. Classify each as:
- **Blocking**: implementation cannot start (schema design, architectural choice, unresolved cross-package contract)
- **Pre-implementation**: should be resolved before starting but doesn't block other work
- **Implementation-time**: developer can decide (defaults, minor UX details, formatting)
Flag any open question in one ticket that affects another ticket's scope.
## Output Format
```
## Decomposition Review: [parent feature in ≤10 words]
### Cross-Ticket Issues
1. **[Severity]** — Description.
Tickets affected: [list]
Impact: What goes wrong if unaddressed.
### Convention Deviations
1. **[Ticket]** — [deviation from codebase pattern].
Codebase pattern: [what existing code does]
Suggestion: [how to align]
### Operational Gaps
1. **[Ticket]** — [missing migration, pipeline concern, etc.]
### Per-Ticket Issues
#### Ticket [X]: [title]
1. **[Severity]** — Description.
### Open Question Classification
| # | Question | Ticket | Severity | Rationale |
|---|----------|--------|----------|-----------|
### Coverage Summary
- [x] [requirement] — covered by Ticket [X]
- [ ] [requirement] — not covered by any ticket
```
If no issues are found for a section, omit it entirely. Do not pad with "no issues found."
## Severity Levels
| Level | Meaning |
| ----------- | ----------------------------------------------------------------------------------------------------- |
| **Blocker** | Decomposition has a structural problem — overlapping scope, missing coverage, broken dependency chain |
| **Warning** | Implementable but risky — convention deviation, unclassified open question, unclear boundary |
| **Note** | Polish item — inconsistent naming, minor clarity improvement |
## What NOT to Do
- Don't re-decompose — critique the existing split, don't propose a new one
- Don't question product decisions
- Don't review code — review the ticket specs
- Don't flag issues you can't verify against the codebase or the tickets themselves
- Don't separate tests from the code they test, or a migration from the code that depends on it
- Don't pad output — if a ticket is clean, say nothing about it
**Run-cost bias.** Judge the split against the same economy rule the orchestrator applies — it is the standard a too-thin slice is over-decomposed *against*, so review it here rather than only at decomposition time:
<!-- LOCKSTEP: held verbatim to intake-orchestrator/SKILL.md, the canonical side; the reasoning
lives there. -->
<!-- LOCKSTEP-BEGIN decomposition-economy -->
Prefer fewer, fuller slices: as many as the work genuinely needs, and no more. A slice that cannot justify its own full pipeline run — because it is too thin to review on its own, or has no consumer until a later slice lands — merges into its neighbor. Splitting for the sake of splitting is a cost, not a virtue; every slice must be a logical, coherent unit of work that earns its own run.
<!-- LOCKSTEP-END decomposition-economy -->