{"id":"dab79284-a1fc-43fe-aea9-1984414cfa13","shortId":"264CmX","kind":"skill","title":"decompose","tagline":"Decompose a feature spec into work items for orchestration via `nw`.\nTakes a PRD, phase doc, or verbal description and breaks it into human-reviewable\nPR-sized work items with dependencies mapped into batches.\nUse when asked to \"decompose\", \"break down this feature\", \"create work","description":"## Interactive Questions (CRITICAL)\n\nThis skill is highly interactive. You MUST use your interactive question tool to ask the user questions -- do NOT simply print a question as text and wait for a response.\n\n**Tool names by platform:** `AskUserQuestion` (Claude Code), `question` (OpenCode), `request_user_input` (Codex), `ask_user` (Copilot CLI, Gemini CLI). Use whichever is available in your environment.\n\n**Every question must follow this structure:**\n\n1. **Re-ground:** State the project, the current branch, and what phase you're in. Assume the user hasn't looked at this window in 20 minutes.\n2. **Explain simply:** Describe the situation in plain English. Say what it does, not what it's called.\n3. **Recommend:** State which option you'd pick and why. Include a one-line reason.\n4. **Options:** Lettered options: A), B), C). When an option involves effort, indicate the scale.\n\n---\n\n## Instructions\n\nThis skill decomposes a feature spec into work items sized for individual human-reviewable PRs. Each item is written as an individual file in `.ninthwave/work/`, ready for orchestration via `nw`.\n\nTreat `.ninthwave/work/` as the live queue of open work: `/decompose` populates it, `nw` works through it, and completed work is intentionally looked up through merged PRs, `nw history`, `nw logs`, and git history rather than retained in a `done` lane.\n\n**Prerequisites:** `ninthwave` (or `nw`) must be in PATH. `.ninthwave/work/` directory must exist.\n\n---\n\n### Phase 1: INTAKE\n\n**Goal:** Identify and understand the feature to decompose.\n\n1. The user may provide:\n   - A file path to a spec/PRD/phase doc\n   - A reference to a project doc\n   - A verbal description of the feature\n\n2. If a file path or doc reference is provided, read it.\n\n3. If the description is verbal/ambiguous, AskUserQuestion to clarify scope.\n\n4. Summarize the feature scope in 3-5 bullet points and confirm with the user.\n\n5. **Internalize external specs.** If the spec or plan doc lives outside the repo (absolute path, home directory, `~/.claude/`, etc.), it must be brought into the repo so workers can access it. Workers clone from remote into isolated worktrees -- they cannot read files outside the repo.\n\n   Discover the project's documentation convention:\n   - Check for existing doc directories (`docs/`, `documentation/`, `doc/`, `specs/`, etc.)\n   - AskUserQuestion: show what you found (or that nothing exists), suggest a location, and ask where they'd like the plan doc stored. If no convention exists, recommend `docs/` as a standard default.\n\n   ```bash\n   mkdir -p <chosen-directory>\n   cp <external-path> <chosen-directory>/<descriptive-name>.md\n   git add <chosen-directory>/\n   git commit -m \"docs: add <feature> plan document\"\n   ```\n\n   Use the in-repo path for all subsequent references in work items.\n\n6. Assign a **feature code** for work item IDs. Derive from the feature name (e.g., \"User Onboarding\" -> `UO`, \"Search & Filters\" -> `SF`). Keep it 2-4 uppercase alphanumeric characters.\n\n---\n\n### Phase 2: EXPLORE\n\n**Goal:** Understand what exists vs what needs to be built.\n\n1. Launch 1-3 Explore agents to investigate:\n   - Existing implementations\n   - Adjacent patterns\n   - Schema/data state\n\n2. Compile a **delta summary**:\n   - \"Exists:\" -- what's already built\n   - \"Needs:\" -- what must be added/changed\n   - \"Patterns to follow:\" -- existing code to model after\n\n3. Assess rollout sensitivity. Only AskUserQuestion about feature flags or kill switches when the work is rollout-sensitive, for example:\n   - risky user-facing behavior\n   - external integrations or third-party dependencies\n   - migrations or behavior switches that may need a fast rollback path\n   - specs that explicitly mention staged rollout, canaries, or kill switches\n   - repos that already show a local flag-like pattern\n\n   Do **not** ask this for routine refactors, isolated bug fixes, or straightforward additions with low rollout risk.\n\n   When you do ask:\n   - recommend **no flag** by default unless staged rollout or fast disablement would materially reduce risk\n   - offer options to ship unflagged, add a narrow feature flag / kill switch for this feature, or defer the decision\n   - if the user chooses a flag, decompose only the minimum feature-local flag work; do not invent a repo-wide flag framework\n\n4. Present the delta summary to the user.\n\n---\n\n### Phase 3: ARCHITECT (Optional)\n\n**Goal:** Validate architecture before decomposing.\n\nAskUserQuestion -- run an architecture review first?\n\nIf yes and the project has an eng review skill, run it with the spec and delta summary.\n\n---\n\n### Phase 4: DECOMPOSE\n\n**Goal:** Break the feature into work items.\n\n#### Sizing guidelines\n\nEach work item should target one human-reviewable PR:\n- **~200-400 lines** of meaningful change\n- **Independently testable**\n- **Single concern**\n- **Clear file scope**\n- **Clear acceptance criteria**\n\n#### Decomposition strategy\n\nWork from the bottom of the stack up:\n\n1. **Migrations/Schema** -- database changes first\n2. **Backend context functions** -- business logic\n3. **Backend controllers/routes** -- API endpoints\n4. **Service integrations** -- external services, AI tools, etc.\n5. **Frontend hooks** -- data layer\n6. **Frontend components** -- UI\n7. **Integration/polish** -- wiring and final touches\n\n#### Validate factual claims against the actual codebase\n\nWhen a work item description, sketch, or acceptance criterion makes a concrete claim about the existing codebase -- a schema column, a package version's runtime behaviour, a duplicated pipeline, a route handler, a function signature -- read the code to confirm the claim before writing the work item. Do not rely on documentation, your own training data, or reasonable-looking guesses.\n\nExamples of failures this catches:\n- Acceptance criteria reference a column (e.g., `excluded_from_net_worth`) that does not exist on the schema, so the test plan is unverifiable.\n- Implementation sketch (\"delete `config.headers['Content-Type']` in a request interceptor\") is wrong because the installed library re-sets the header later in the pipeline. Read `node_modules/<package>/` (or the installed source for other languages) for libraries with non-trivial middleware behaviour.\n- Spec asserts \"6 pages duplicate this pipeline\" but a code walk shows only 1 does.\n\nFor schema-dependent items: check the actual `*.ex` / `models.py` / type definitions. For package-integration items: read the installed source, not the docs. For \"duplicated code\" claims: confirm with grep or a code walk before quantifying.\n\nThis validation is intentionally bounded: chase a claim down when a cheap `rg` or schema read would catch it, but do not try to validate every call site or every behavioral contract up front. When an inconsistency slips through and the implementer hits it at code-writing time, the catch-net is the \"Scope Correction\" section in `agents/implementer.md`, which prescribes per-pattern recovery (reword + decision log; rename instead of delete; ship-observable + `test.fixme` for unobservable; narrow + decision log on freshness drift).\n\n#### Refactor work items: prefer qualitative acceptance over numeric LOC\n\nNumeric line-reduction targets (`>= 150 lines net reduction`) on refactor-style items are a recurring pitfall. Refactor items typically ship with guardrails (`do not touch field bodies`, `parity preserving`); those guardrails cap the extractable surface. When the LOC target is unreachable under the item's own guardrails, every implementer faces the same false choice -- violate guardrails to hit the number, or burn cycles arguing the target was aspirational -- and reviewers re-litigate the trade-off on every PR in the wave.\n\nDefault to qualitative acceptance: \"no direct `EntityCreateModal` import; identity state flows via shared hook; shell forwards `ai=` prop\". State the structural property the refactor must achieve, not the byte count it should produce.\n\nIf a numeric target is genuinely useful as a sanity check, label it aspirational (\"target ~150 lines reduction; verify reachability under the item's guardrails before relying on the number\") rather than as an acceptance gate.\n\n#### Cutover-style risk signal\n\nIf a draft work item is scoped as a single-PR cutover that spans frontend + backend + docs + e2e, or that requires deleting and re-wiring components in the same pass, treat it as a sizing failure and split. A single implementer session cannot reliably finish 4-8+ hours of coordinated cross-layer change in one shot without sacrificing test coverage or scope fidelity.\n\nDecompose into adjacent items with explicit milestones, e.g.:\n- backend dispatch refactor + tests (independently mergeable)\n- frontend cutover that depends on the backend\n- docs + e2e validation that depend on both\n\nEach adjacent item should remain independently testable and PR-sized per the sizing guidelines above.\n\n#### Manual review override\n\nWhen a work item is unusually sensitive or risky, include:\n\n```markdown\n**Requires manual review:** true\n```\n\nUse this for auth and permission-boundary changes, secrets handling, destructive production operations, or high-risk data migrations. Omit the field for normal items. Do not write `false`.\n\n#### Test plan (REQUIRED)\n\nEvery work item MUST include a `**Test plan:**` field. This is not optional -- workers use it as a testing checklist during implementation.\n\nEach test plan specifies:\n- **What tests** to write or verify (new tests vs. existing coverage)\n- **Key code paths** that must be covered\n- **Edge cases** specific to this item\n\n**Specificity rule:** Test plans must be specific to each item's implementation, not generic boilerplate. Reference the actual functions, modules, or behaviors the item touches. A good test plan reads like instructions a developer could follow without re-reading the description.\n\n**Non-testable items** (docs-only, config changes): Use `**Test plan:**\\n- Manual review` instead of omitting the field.\n\nKeep test plans concise -- 2-4 bullet points per item.\n\n#### Sequence so every item is CI green\n\nOrder items so each one leaves CI green at merge. If landing item A would break tests owned by item B, those test changes belong in A, not B. Treat broken-by-A tests as A's scope, not deferred follow-up.\n\n#### Dependency mapping\n\nGroup work items into **batches**. Items within a batch can run in parallel. Batches run sequentially. **Stacking:** items with **exactly one** in-flight dependency can launch early -- the orchestrator creates their worktree from the dependency's branch and rebases automatically after merge. Items with multiple in-flight deps (fan-in) cannot stack and must wait for all deps to merge. This means dependency chains execute faster than strict batch ordering suggests, so prefer clear dependency declarations over artificially flattening items into a single batch.\n\n#### Dependency shape trade-offs\n\nThe orchestrator stacks launches when a queued item has **exactly one** in-flight dependency. It cannot stack on multiple in-flight deps. This shapes how you should decompose:\n\n- **Linear chain** (A -> B -> C, each depending on the previous): best for autonomous delivery. Each item stacks on the previous one's branch and launches immediately, even before review. A batch decomposed as a chain runs hands-off end-to-end in manual-merge mode.\n- **Batch-parallel** (A, B, C all depending on nothing, or on the same merged prerequisite): also fine. All items launch simultaneously; no stacking needed.\n- **Diamond / fan-in** (C depends on A *and* B, both in-flight): **avoid in manual-merge mode.** C will not launch until both A and B merge, which requires human review. The tail of the batch stalls in the queue.\n\n**Decomposition preference (manual-merge mode):** when you have a choice between \"three items in parallel, then one fan-in\" vs \"four items in a linear chain,\" prefer the chain. You trade a bit of wall-clock parallelism for full autonomous execution. Only introduce a fan-in when the work truly cannot be linearized (e.g., the fan-in item inspects behavior that only emerges when all branches are combined).\n\n**If a diamond is unavoidable:** call it out explicitly in the decomposition output, e.g. `H-X-3: depends on [H-X-1, H-X-2] (fan-in -- will wait for manual merge)`, so the operator knows the tail will need their attention.\n\n#### ID assignment\n\nFormat: `[CHML]-<feature_code>-<seq>`\n\n- **C** (Critical), **H** (High), **M** (Medium), **L** (Low)\n- Feature code from Phase 1\n- Incrementing sequence\n\n**Reserved IDs -- check git history of `.ninthwave/work/` BEFORE assigning numbers.** Work item IDs become git branch names (`ninthwave/<ID>`). If you mint an ID that any prior work item already used, `nw` will refuse to launch the new item because the lineage tokens don't match the existing branch, and the entire dependency chain behind it stalls. Re-decomposing a feature after a previous pass has shipped or abandoned items is the common trigger -- the open `.ninthwave/work/` queue looks empty, but git history still records every ID ever used.\n\nUse git history of the work dir (not `gh pr list`): work item filenames follow the convention `{priority_num}-{domain_slug}--{ID}.md`, so the ID is always present in the filename. PR titles are free prose and drift. Git history also catches decomposed-then-abandoned items that never got a PR.\n\nBefore assigning any new sequence numbers:\n\n1. List every ID ever added, modified, renamed, or deleted under `.ninthwave/work/` across all branches:\n   ```bash\n   git log --all --name-only --pretty=format: -- .ninthwave/work/ \\\n     | grep -oE '[CHML]-[A-Z]+-[0-9]+\\.md' \\\n     | sed 's/\\.md$//' \\\n     | sort -u\n   ```\n   Filter to the feature code you're assigning. No `--diff-filter=A` -- renames only show the new name with `A`, so filtering that way would miss half of a `git mv` pair.\n2. Union that set with the IDs already in `.ninthwave/work/` (current queue).\n3. Assign new numbers from the first integer strictly greater than the maximum in the union. Do not reclaim gaps -- the branch names for abandoned IDs may still exist on origin or in local clones, and reusing a gap is as risky as reusing the tail.\n4. If the repo is a shallow clone (`git rev-parse --is-shallow-repository` returns `true`), STOP and run `git fetch --unshallow` first. The check is only sound against full history.\n\n---\n\n### Phase 5: REVIEW\n\n**Goal:** Get user approval.\n\nPresent the decomposition as a table:\n\n| Batch | ID | Title | Scope | Test Plan | Key Files | Depends On |\n|-------|-----|-------|-------|-----------|-----------|------------|\n\nShow totals and ask for approval. Options: looks good, adjust, re-decompose.\n\n---\n\n### Phase 6: WRITE\n\n**Goal:** Write each work item as an individual file in `.ninthwave/work/`.\n\n1. Ensure the directory exists: `mkdir -p .ninthwave/work`\n2. Read the canonical format guide: `cat .ninthwave/work-item-format.md`. If the file is missing, tell the user to run `nw init` before continuing -- that command copies the guide into the repo.\n3. For each new work item, run `nw lineage-token` exactly once and store the result in that item's `**Lineage:**` field. Never invent, derive, or freeform-generate the token.\n4. Write each work item as a separate file. The filename convention is:\n\n   ```\n   {priority_num}-{domain_slug}--{ID}.md\n   ```\n\n   Where `priority_num` is: Critical=1, High=2, Medium=3, Low=4.\n   And `domain_slug` is the domain name in kebab-case (e.g., `worker-reliability`, `cli-ux`).\n\n   Example: `2-worker-reliability--H-WRK-3.md`\n\n5. Each file uses this template:\n\n```markdown\n# <Type>: <Title> (<ID>)\n\n**Priority:** <Critical|High|Medium|Low>\n**Source:** <origin>\n**Depends on:** <IDs or None>\n**Domain:** <domain name>\n**Lineage:** <token from `nw lineage-token`>\n**Requires manual review:** true   <!-- optional; include only for sensitive/high-risk items -->\n\n<Description -- 2-4 sentences.>\n\n**Test plan:**\n- <what tests to write or verify for this specific item>\n- <key code paths to cover>\n- <edge cases specific to this item>\n\nAcceptance: <concrete, verifiable conditions>\n\nKey files: `path/to/file.ts`, `path/to/other.ex`\n```\n\n   Note: The heading uses `# ` (not `### `). The `**Domain:**` field is required and must be explicit in each file.\n\n6. Verify every item has both a `**Lineage:**` field and a `**Test plan:**` section\n7. Verify parseable: `ls .ninthwave/work/` to confirm files were written, then `ninthwave list | grep <feature_code>`\n8. Commit and push the new work files so they are available to workers (which clone from remote):\n\n   ```bash\n   git add .ninthwave/work/\n   if ! git diff --cached --quiet; then\n     git commit -m \"chore: add <feature_code> work items from decompose\"\n     git push\n   fi\n   ```\n\n---\n\n### Phase 7: HANDOFF\n\nPresent summary and connect to `nw` for orchestration.\n\nExplicitly remind the user that the files you just wrote are now the live queue. The next step is to run `nw`, which works through `.ninthwave/work/`. When items finish, their files disappear from that directory on purpose; use merged PRs, `nw history`, `nw logs`, and git history for retrospective lookup.\n\n---\n\n## Important Rules\n\n- **ASCII only:** work files must use only ASCII characters. Use `--` instead of em dashes, `-` instead of en dashes, `\"` instead of smart quotes, `...` instead of ellipsis. Non-ASCII characters break `$'...'` shell quoting when the prompt is sent to workers via multiplexers (tmux/zellij).\n- **Spec fidelity:** Every requirement must map to at least one work item\n- **No implementation:** This skill only plans and writes work items\n- **PR size discipline:** Split work items > ~500 LOC, combine < ~50 LOC\n- **File conflict awareness:** Items in the same batch should not modify the same files\n- **No VERSION/CHANGELOG:** work items should not mention modifying these files\n- **Portable references:** All paths in work items (Source, description, Key files) must be repo-relative. Workers clone from remote into isolated worktrees -- absolute paths and external files (home directories, tool config directories) are inaccessible. Referencing plan documentation for context is encouraged, but referenced files must be committed to the repo. If the source spec is external, internalize it during INTAKE.\n- **Idempotent:** Before writing any work item, verify its ID is unused in BOTH `.ninthwave/work/` (current queue) AND the git history of that directory (`git log --all --name-only -- .ninthwave/work/`). Reusing an ID that any prior work item already owned will stall launch with a `launch-blocked` lineage-mismatch error -- see the \"Reserved IDs\" step in Phase 4.","tags":["decompose","ninthwave","ninthwave-io","agent-skills","ai-agents","ai-coding","claude-code","continuous-delivery","copilot-cli","multi-agent","opencode","orchestrator"],"capabilities":["skill","source-ninthwave-io","skill-decompose","topic-agent-skills","topic-ai-agents","topic-ai-coding","topic-claude-code","topic-continuous-delivery","topic-copilot-cli","topic-multi-agent","topic-opencode","topic-orchestrator","topic-pull-requests","topic-worktrees"],"categories":["ninthwave"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/ninthwave-io/ninthwave/decompose","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add ninthwave-io/ninthwave","source_repo":"https://github.com/ninthwave-io/ninthwave","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 8 github stars · SKILL.md body (18,609 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:09:06.303Z","embedding":null,"createdAt":"2026-05-18T13:14:45.852Z","updatedAt":"2026-05-18T19:09:06.303Z","lastSeenAt":"2026-05-18T19:09:06.303Z","tsv":"'-3':512 '-4':492,1540 '-400':753 '-5':339 '-8':1310 '-9':2154 '/.claude':365 '/decompose':232 '0':2153 '1':114,276,286,509,511,778,970,1932,1971,2122,2335,2429 '150':1108,1236 '2':142,310,491,497,523,783,1539,1936,2194,2343,2431,2455 '20':140 '200':752 '3':160,322,338,546,698,789,1926,2206,2373,2433 '4':176,332,689,731,794,1309,2252,2405,2435,2864 '5':347,802,2286,2460 '50':2718 '500':2715 '6':468,807,959,2322,2514 '7':811,2528,2583 '8':2542 'a-z':2150 'abandon':2042,2109,2230 'absolut':361,2767 'accept':766,831,890,1099,1191,1255,2489 'access':377 'achiev':1213 'across':2134 'actual':822,979,1490 'ad':2127 'add':447,452,651,2562,2574 'added/changed':537 'addit':622 'adjac':519,1330,1357 'adjust':2317 'agent':514 'agents/implementer.md':1068 'ai':799,1204 'alphanumer':494 'alreadi':531,602,2002,2201,2843 'also':1784,2104 'alway':2090 'api':792 'approv':2291,2313 'architect':699 'architectur':703,709 'argu':1168 'artifici':1678 'ascii':2645,2652,2672 'ask':40,65,95,422,612,630,2311 'askuserquest':86,328,409,551,706 'aspir':1172,1234 'assert':958 'assess':547 'assign':469,1956,1982,2117,2168,2207 'assum':130 'attent':1954 'auth':1393 'automat':1638 'autonom':1732,1878 'avail':104,2553 'avoid':1807 'awar':2722 'b':181,1572,1580,1723,1772,1802,1821 'backend':784,790,1278,1336,1348 'bash':441,2137,2560 'batch':37,1602,1606,1611,1669,1684,1750,1769,1831,2298,2727 'batch-parallel':1768 'becom':1987 'behavior':571,581,1039,1494,1900 'behaviour':849,956 'behind':2027 'belong':1576 'best':1730 'bit':1870 'block':2852 'bodi':1131 'boilerpl':1487 'bottom':773 'bound':1013 'boundari':1397 'branch':123,1635,1742,1906,1989,2021,2136,2227 'break':22,43,734,1567,2674 'broken':1583 'broken-by-a':1582 'brought':370 'bug':618 'built':508,532 'bullet':340,1541 'burn':1166 'busi':787 'byte':1216 'c':182,1724,1773,1797,1813,1959 'cach':2567 'call':159,1035,1914 'canari':596 'cannot':387,1306,1651,1706,1890 'canon':2346 'cap':1136 'case':1468,2446 'cat':2349 'catch':889,1026,1060,2105 'catch-net':1059 'chain':1664,1721,1754,1863,1866,2026 'chang':757,781,1317,1398,1523,1575 'charact':495,2653,2673 'chase':1014 'cheap':1020 'check':399,977,1231,1976,2278 'checklist':1442 'chml':1958,2149 'choic':1158,1846 'choos':668 'chore':2573 'ci':1550,1558 'claim':819,836,865,999,1016 'clarifi':330 'claud':87 'clear':762,765,1674 'cli':98,100,2452 'cli-ux':2451 'clock':1874 'clone':380,2240,2259,2557,2761 'code':88,472,542,861,966,998,1005,1055,1461,1968,2165 'code-writ':1054 'codebas':823,840 'codex':94 'column':843,894 'combin':1908,2717 'command':2366 'commit':449,2543,2571,2791 'common':2046 'compil':524 'complet':240 'compon':809,1289 'concern':761 'concis':1538 'concret':835,2490 'condit':2492 'config':1522,2775 'config.headers':916 'confirm':343,863,1000,2534 'conflict':2721 'connect':2588 'content':918 'content-typ':917 'context':785,2783 'continu':2364 'contract':1040 'controllers/routes':791 'convent':398,433,2079,2416 'coordin':1313 'copi':2367 'copilot':97 'correct':1065 'could':1507 'count':1217 'cover':1466 'coverag':1324,1459 'cp':444 'creat':47,1628 'criteria':767,891 'criterion':832 'critic':51,1960,2428,2468 'cross':1315 'cross-lay':1314 'current':122,2204,2819 'cutov':1258,1274,1343 'cutover-styl':1257 'cycl':1167 'd':166,425 'dash':2658,2662 'data':805,879,1408 'databas':780 'decis':664,1076,1089 'declar':1676 'decompos':1,2,42,194,285,671,705,732,1328,1719,1751,2032,2107,2320,2578 'decomposed-then-abandon':2106 'decomposit':768,1836,1920,2294 'default':440,635,1188 'defer':662,1592 'definit':983 'delet':915,1081,1284,2131 'deliveri':1733 'delta':526,692,728 'dep':1647,1658,1713 'depend':34,578,975,1345,1353,1596,1622,1633,1663,1675,1685,1704,1726,1775,1798,1927,2025,2306,2473 'deriv':477,2398 'describ':145 'descript':20,306,325,828,1514,2752 'destruct':1401 'develop':1506 'diamond':1793,1911 'diff':2171,2566 'diff-filt':2170 'dir':2069 'direct':1193 'directori':272,364,403,2338,2627,2773,2776,2827 'disabl':641 'disappear':2624 'disciplin':2711 'discov':393 'dispatch':1337 'doc':17,297,303,316,356,402,404,406,429,436,451,995,1279,1349,1520 'docs-on':1519 'document':397,405,454,875,2781 'domain':2082,2420,2437,2441,2475,2503 'done':261 'draft':1264 'drift':1093,2101 'duplic':851,961,997 'e.g':482,895,1335,1893,1922,2447 'e2e':1280,1350 'earli':1625 'edg':1467 'effort':187 'ellipsi':2669 'em':2657 'emerg':1903 'empti':2053 'en':2661 'encourag':2785 'end':1760,1762 'end-to-end':1759 'endpoint':793 'eng':719 'english':150 'ensur':2336 'entir':2024 'entitycreatemod':1194 'environ':107 'error':2856 'etc':366,408,801 'even':1746 'ever':2061,2126 'everi':108,1034,1038,1152,1183,1423,1547,2059,2124,2516,2689 'ex':980 'exact':1617,1699,2384 'exampl':566,885,2454 'exclud':896 'execut':1665,1879 'exist':274,401,417,434,502,517,528,541,839,903,1458,2020,2234,2339 'explain':143 'explicit':592,1333,1917,2510,2593 'explor':498,513 'extern':349,572,797,2770,2800 'extract':1138 'face':570,1154 'factual':818 'failur':887,1299 'fals':1157,1419 'fan':1649,1795,1855,1884,1896,1938 'fan-in':1648,1794,1854,1883,1895,1937 'fast':587,640 'faster':1666 'featur':4,46,196,283,309,335,471,480,553,654,660,676,736,1967,2034,2164 'feature-loc':675 'fetch':2274 'fi':2581 'fidel':1327,2688 'field':1130,1412,1431,1534,2395,2504,2522 'file':215,292,313,389,763,2305,2332,2353,2413,2462,2494,2513,2535,2549,2599,2623,2648,2720,2733,2743,2754,2771,2788 'filenam':2076,2094,2415 'filter':487,2161,2172,2183 'final':815 'fine':1785 'finish':1308,2621 'first':711,782,2212,2276 'fix':619 'flag':554,607,633,655,670,678,687 'flag-lik':606 'flatten':1679 'flight':1621,1646,1703,1712,1806 'flow':1198 'follow':111,540,1508,1594,2077 'follow-up':1593 'format':1957,2145,2347 'forward':1203 'found':413 'four':1858 'framework':688 'free':2098 'freeform':2401 'freeform-gener':2400 'fresh':1092 'front':1042 'frontend':803,808,1277,1342 'full':1877,2283 'function':786,857,1491 'gap':2225,2244 'gate':1256 'gemini':99 'generat':2402 'generic':1486 'genuin':1226 'get':2289 'gh':2071 'git':254,446,448,1977,1988,2055,2064,2102,2138,2191,2260,2273,2561,2565,2570,2579,2638,2823,2828 'goal':278,499,701,733,2288,2324 'good':1499,2316 'got':2113 'greater':2215 'green':1551,1559 'grep':1002,2147,2541 'ground':117 'group':1598 'guardrail':1126,1135,1151,1160,1245 'guess':884 'guid':2348,2369 'guidelin':741,1370 'h':1924,1930,1934,1961 'h-wrk-3.md':2459 'h-x':1923,1929,1933 'half':2188 'hand':1757 'handl':1400 'handler':855 'handoff':2584 'hands-off':1756 'hasn':133 'head':2499 'header':934 'high':55,1406,1962,2430,2469 'high-risk':1405 'histori':250,255,1978,2056,2065,2103,2284,2634,2639,2824 'hit':1051,1162 'home':363,2772 'hook':804,1201 'hour':1311 'human':26,205,749,1825 'human-review':25,204,748 'id':476,1955,1975,1986,1996,2060,2084,2088,2125,2200,2231,2299,2422,2813,2837,2860 'idempot':2805 'ident':1196 'identifi':279 'immedi':1745 'implement':518,913,1050,1153,1304,1444,1484,2700 'import':1195,2643 'in-flight':1619,1644,1701,1710,1804 'in-repo':457 'inaccess':2778 'includ':170,1384,1427 'inconsist':1045 'increment':1972 'independ':758,1340,1361 'indic':188 'individu':203,214,2331 'init':2362 'input':93 'inspect':1899 'instal':928,944,991 'instead':1079,1530,2655,2659,2663,2667 'instruct':191,1504 'intak':277,2804 'integ':2213 'integr':573,796,987 'integration/polish':812 'intent':243,1012 'interact':49,56,61 'interceptor':923 'intern':348,2801 'introduc':1881 'invent':682,2397 'investig':516 'involv':186 'is-shallow-repositori':2264 'isol':384,617,2765 'item':8,32,200,209,467,475,739,744,827,870,976,988,1096,1116,1122,1148,1243,1266,1331,1358,1378,1415,1425,1472,1482,1496,1518,1544,1548,1553,1564,1571,1600,1603,1615,1641,1680,1697,1735,1787,1849,1859,1898,1985,2001,2011,2043,2075,2110,2328,2378,2392,2409,2517,2576,2620,2698,2708,2714,2723,2737,2750,2810,2842 'kebab':2445 'kebab-cas':2444 'keep':489,1535 'key':1460,2304,2493,2753 'kill':556,598,656 'know':1948 'l':1965 'label':1232 'land':1563 'lane':262 'languag':948 'later':935 'launch':510,1624,1693,1744,1788,1816,2008,2847,2851 'launch-block':2850 'layer':806,1316 'least':2695 'leav':1557 'letter':178 'librari':929,950 'like':426,608,1503 'line':174,754,1105,1109,1237 'line-reduct':1104 'lineag':2014,2382,2394,2476,2481,2521,2854 'lineage-mismatch':2853 'lineage-token':2381,2480 'linear':1720,1862,1892 'list':2073,2123,2540 'litig':1177 'live':227,357,2606 'loc':1102,1142,2716,2719 'local':605,677,2239 'locat':420 'log':252,1077,1090,2139,2636,2829 'logic':788 'look':135,244,883,2052,2315 'lookup':2642 'low':624,1966,2434,2471 'ls':2531 'm':450,1963,2572 'make':833 'manual':1372,1387,1528,1765,1810,1839,1943,2484 'manual-merg':1764,1809,1838 'map':35,1597,2692 'markdown':1385,2466 'match':2018 'materi':643 'maximum':2218 'may':289,584,2232 'md':445,2085,2155,2158,2423 'mean':1662 'meaning':756 'medium':1964,2432,2470 'mention':593,2740 'merg':247,1561,1640,1660,1766,1782,1811,1822,1840,1944,2631 'mergeabl':1341 'middlewar':955 'migrat':579,1409 'migrations/schema':779 'mileston':1334 'minimum':674 'mint':1994 'minut':141 'mismatch':2855 'miss':2187,2355 'mkdir':442,2340 'mode':1767,1812,1841 'model':544 'models.py':981 'modifi':2128,2730,2741 'modul':941,1492 'multipl':1643,1709 'multiplex':2685 'must':58,110,267,273,368,535,1212,1426,1464,1477,1654,2508,2649,2691,2755,2789 'mv':2192 'n':1527 'name':83,481,1990,2142,2179,2228,2442,2832 'name-on':2141,2831 'narrow':653,1088 'need':505,533,585,1792,1952 'net':898,1061,1110 'never':2112,2396 'new':1455,2010,2119,2178,2208,2376,2547 'next':2609 'ninthwav':264,1991,2539 'ninthwave/work':217,224,271,1980,2050,2133,2146,2203,2334,2342,2532,2563,2618,2818,2834 'ninthwave/work-item-format.md':2350 'node':940 'non':953,1516,2671 'non-ascii':2670 'non-test':1515 'non-trivi':952 'normal':1414 'note':2497 'noth':416,1777 'num':2081,2419,2426 'number':1164,1250,1983,2121,2209 'numer':1101,1103,1223 'nw':12,222,235,249,251,266,2004,2361,2380,2479,2590,2614,2633,2635 'observ':1084 'oe':2148 'off':1689 'offer':646 'omit':1410,1532 'onboard':484 'one':173,747,1319,1556,1618,1700,1740,1853,2696 'one-lin':172 'open':230,2049 'opencod':90 'oper':1403,1947 'option':164,177,179,185,647,700,1435,2314 'orchestr':10,220,1627,1691,2592 'order':1552,1670 'origin':2236 'output':1921 'outsid':358,390 'overrid':1374 'own':1569,2844 'p':443,2341 'packag':845,986 'package-integr':985 'page':960 'pair':2193 'parallel':1610,1770,1851,1875 'pariti':1132 'pars':2263 'parseabl':2530 'parti':577 'pass':1293,2038 'path':270,293,314,362,460,589,1462,2747,2768 'path/to/file.ts':2495 'path/to/other.ex':2496 'pattern':520,538,609,1073 'per':1072,1367,1543 'per-pattern':1071 'permiss':1396 'permission-boundari':1395 'phase':16,126,275,496,697,730,1970,2285,2321,2582,2863 'pick':167 'pipelin':852,938,963 'pitfal':1120 'plain':149 'plan':355,428,453,910,1421,1430,1447,1476,1501,1526,1537,2303,2488,2526,2704,2780 'platform':85 'point':341,1542 'popul':233 'portabl':2744 'pr':29,751,1184,1273,1365,2072,2095,2115,2709 'pr-size':28,1364 'prd':15 'prefer':1097,1673,1837,1864 'prerequisit':263,1783 'prescrib':1070 'present':690,2091,2292,2585 'preserv':1133 'pretti':2144 'previous':1729,1739,2037 'print':72 'prior':1999,2840 'prioriti':2080,2418,2425,2467 'produc':1220 'product':1402 'project':120,302,395,716 'prompt':2679 'prop':1205 'properti':1209 'prose':2099 'provid':290,319 'prs':207,248,2632 'purpos':2629 'push':2545,2580 'qualit':1098,1190 'quantifi':1008 'question':50,62,68,74,89,109 'queu':1696 'queue':228,1835,2051,2205,2607,2820 'quiet':2568 'quot':2666,2676 'rather':256,1251 're':116,128,931,1176,1287,1511,2031,2167,2319 're-decompos':2030,2318 're-ground':115 're-litig':1175 're-read':1510 're-set':930 're-wir':1286 'reachabl':1240 'read':320,388,859,939,989,1024,1502,1512,2344 'readi':218 'reason':175,882 'reasonable-look':881 'rebas':1637 'reclaim':2224 'recommend':161,435,631 'record':2058 'recoveri':1074 'recur':1119 'reduc':644 'reduct':1106,1111,1238 'refactor':616,1094,1114,1121,1211,1338 'refactor-styl':1113 'refer':299,317,464,892,1488,2745 'referenc':2779,2787 'refus':2006 'relat':2759 'reli':873,1247 'reliabl':1307,2450,2458 'remain':1360 'remind':2594 'remot':382,2559,2763 'renam':1078,2129,2174 'repo':360,373,392,459,600,685,2255,2372,2758,2794 'repo-rel':2757 'repo-wid':684 'repositori':2267 'request':91,922 'requir':1283,1386,1422,1824,2483,2506,2690 'reserv':1974,2859 'respons':81 'result':2389 'retain':258 'retrospect':2641 'return':2268 'reus':2242,2249,2835 'rev':2262 'rev-pars':2261 'review':27,206,710,720,750,1174,1373,1388,1529,1748,1826,2287,2485 'reword':1075 'rg':1021 'risk':626,645,1260,1407 'riski':567,1383,2247 'rollback':588 'rollout':548,563,595,625,638 'rollout-sensit':562 'rout':854 'routin':615 'rule':1474,2644 'run':707,722,1608,1612,1755,2272,2360,2379,2613 'runtim':848 'sacrif':1322 'saniti':1230 'say':151 'scale':190 'schema':842,906,974,1023 'schema-depend':973 'schema/data':521 'scope':331,336,764,1064,1268,1326,1590,2301 'search':486 'secret':1399 'section':1066,2527 'sed':2156 'see':2857 'sensit':549,564,1381 'sent':2681 'separ':2412 'sequenc':1545,1973,2120 'sequenti':1613 'servic':795,798 'session':1305 'set':932,2197 'sf':488 'shallow':2258,2266 'shape':1686,1715 'share':1200 'shell':1202,2675 'ship':649,1083,1124,2040 'ship-observ':1082 'shot':1320 'show':410,603,968,2176,2308 'signal':1261 'signatur':858 'simpli':71,144 'simultan':1789 'singl':760,1272,1303,1683 'single-pr':1271 'site':1036 'situat':147 'size':30,201,740,1298,1366,1369,2710 'sketch':829,914 'skill':53,193,721,2702 'skill-decompose' 'slip':1046 'slug':2083,2421,2438 'smart':2665 'sort':2159 'sound':2281 'sourc':945,992,2472,2751,2797 'source-ninthwave-io' 'span':1276 'spec':5,197,350,353,407,590,726,957,2687,2798 'spec/prd/phase':296 'specif':1469,1473,1479 'specifi':1448 'split':1301,2712 'stack':776,1614,1652,1692,1707,1736,1791 'stage':594,637 'stall':1832,2029,2846 'standard':439 'state':118,162,522,1197,1206 'step':2610,2861 'still':2057,2233 'stop':2270 'store':430,2387 'straightforward':621 'strategi':769 'strict':1668,2214 'structur':113,1208 'style':1115,1259 'subsequ':463 'suggest':418,1671 'summar':333 'summari':527,693,729,2586 'surfac':1139 'switch':557,582,599,657 'tabl':2297 'tail':1828,1950,2251 'take':13 'target':746,1107,1143,1170,1224,1235 'tell':2356 'templat':2465 'test':909,1323,1339,1420,1429,1441,1446,1450,1456,1475,1500,1525,1536,1568,1574,1586,2302,2487,2525 'test.fixme':1085 'testabl':759,1362,1517 'text':76 'third':576 'third-parti':575 'three':1848 'time':1057 'titl':2096,2300 'tmux/zellij':2686 'token':2015,2383,2404,2477,2482 'tool':63,82,800,2774 'topic-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-claude-code' 'topic-continuous-delivery' 'topic-copilot-cli' 'topic-multi-agent' 'topic-opencode' 'topic-orchestrator' 'topic-pull-requests' 'topic-worktrees' 'total':2309 'touch':816,1129,1497 'trade':1180,1688,1868 'trade-off':1179,1687 'train':878 'treat':223,1294,1581 'tri':1031 'trigger':2047 'trivial':954 'true':1389,2269,2486 'truli':1889 'type':919,982 'typic':1123 'u':2160 'ui':810 'unavoid':1913 'understand':281,500 'unflag':650 'union':2195,2221 'unless':636 'unobserv':1087 'unreach':1145 'unshallow':2275 'unus':2815 'unusu':1380 'unverifi':912 'uo':485 'uppercas':493 'use':38,59,101,455,1227,1390,1437,1524,2003,2062,2063,2463,2500,2630,2650,2654 'user':67,92,96,132,288,346,483,569,667,696,2290,2358,2596 'user-fac':568 'ux':2453 'valid':702,817,1010,1033,1351 'verbal':19,305 'verbal/ambiguous':327 'verifi':1239,1454,2491,2515,2529,2811 'version':846 'version/changelog':2735 'via':11,221,1199,2684 'violat':1159 'vs':503,1457,1857 'wait':78,1655,1941 'walk':967,1006 'wall':1873 'wall-clock':1872 'wave':1187 'way':2185 'whichev':102 'wide':686 'window':138 'wire':813,1288 'within':1604 'without':1321,1509 'work':7,31,48,199,231,236,241,466,474,560,679,738,743,770,826,869,1095,1265,1377,1424,1599,1888,1984,2000,2068,2074,2327,2377,2408,2548,2575,2616,2647,2697,2707,2713,2736,2749,2809,2841 'worker':375,379,1436,2449,2457,2555,2683,2760 'worker-reli':2448,2456 'worktre':385,1630,2766 'worth':899 'would':642,1025,1566,2186 'write':867,1056,1418,1452,2323,2325,2406,2706,2807 'written':211,2537 'wrong':925 'wrote':2602 'x':1925,1931,1935 'yes':713 'z':2152","prices":[{"id":"6f1cf359-1fd8-4201-90cd-ee09c7768f81","listingId":"dab79284-a1fc-43fe-aea9-1984414cfa13","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"ninthwave-io","category":"ninthwave","install_from":"skills.sh"},"createdAt":"2026-05-18T13:14:45.852Z"}],"sources":[{"listingId":"dab79284-a1fc-43fe-aea9-1984414cfa13","source":"github","sourceId":"ninthwave-io/ninthwave/decompose","sourceUrl":"https://github.com/ninthwave-io/ninthwave/tree/main/skills/decompose","isPrimary":false,"firstSeenAt":"2026-05-18T13:14:45.852Z","lastSeenAt":"2026-05-18T19:09:06.303Z"}],"details":{"listingId":"dab79284-a1fc-43fe-aea9-1984414cfa13","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"ninthwave-io","slug":"decompose","github":{"repo":"ninthwave-io/ninthwave","stars":8,"topics":["agent-skills","ai-agents","ai-coding","claude-code","continuous-delivery","copilot-cli","multi-agent","opencode","orchestrator","pull-requests","worktrees"],"license":"apache-2.0","html_url":"https://github.com/ninthwave-io/ninthwave","pushed_at":"2026-05-17T16:00:56Z","description":"Orchestrate parallel AI coding into reviewable PRs.","skill_md_sha":"b46c938b56ec008ad7111b489e3b67dc4ec81202","skill_md_path":"skills/decompose/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/ninthwave-io/ninthwave/tree/main/skills/decompose"},"layout":"multi","source":"github","category":"ninthwave","frontmatter":{"name":"decompose","description":"Decompose a feature spec into work items for orchestration via `nw`.\nTakes a PRD, phase doc, or verbal description and breaks it into human-reviewable\nPR-sized work items with dependencies mapped into batches.\nUse when asked to \"decompose\", \"break down this feature\", \"create work items for\",\nor \"plan the work items\"."},"skills_sh_url":"https://skills.sh/ninthwave-io/ninthwave/decompose"},"updatedAt":"2026-05-18T19:09:06.303Z"}}