Decompose intent
Skill eugenelim/agent-ready-repo/packs/product-engineering/.apm/skills/decompose-intent
The complete AI operating model for software teams — from first idea to production. Three peer-supervised loops (discovery → build → release) over a catalogue of curated packs: skills, subagents, and hooks, each installed in one line. It's npm for your coding agent. Any agent, any stack — Claude Code, Codex, Cursor, Copilot, Gemini, Kiro.
npx -y skills add eugenelim/agent-ready-repo --skill decompose-intentAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 14 stars14 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when a de-risked intent needs breaking into the next level down — child intents, or a shippable spec/slice at the leaf — and optionally projecting onto a tracker. Triggers on "decompose this", "break this down", "slice this", "what specs come out of this", "push this to Linear/Jira". Recursive (one level at a time); at app scale the leaf is an ordinary `core` brief. Do NOT use to author an intent (use `frame-intent`) or to test a bet (use `de-risk-intent`).
SKILL.md
8.2 KB, as published. Nobody here has run it
Skill: decompose-intent
Break a de-risked intent into the next level down — child intents, or, at
the leaf, a shippable spec/slice — and optionally project the tree onto a tracker.
Decomposition is recursive: it produces one level at a time, until the leaf is a
unit your delivery loop can build. At app Scale the leaf feature intent is a
core brief, so the hand-off is receive-brief → new-spec → work-loop with
no new machinery. The recursion + the brief projection are in
references/recursive-decomposition.md.
When to invoke
Before decomposing, confirm:
- The intent's riskiest assumption has survived
de-risk-intent. Don't fan a bet out into children you haven't de-risked at its own level — a killed assumption should reshape the parent, not spawn doomed specs. - You know the intent's Scale (set by
frame-intent). It decides whether the leaf is a same-repo brief (app) or a per-component slice crossing repos (business-unit, coordinated from a value-stream meta-repo viaalign-value-stream).
Procedure
-
Decompose one level. From the intent, produce its children:
- If the intent is above feature level, produce child intents (a lower
Level:), each inheriting the parent's outcome/scope context and aParent intent:back-link. Each child re-enters the loop atframe-intent→de-risk-intent→decompose-intent. Don't skip levels. When running the discovery-traceability chain, carry theKind:(outcome | opportunity) andLevel:markers on each child (the same markersframe-intent's template ships) so the structural-orphan lint places each decomposed rung on the chain. - If the intent is a feature (the leaf), produce the spec/slice — the shippable, agent-buildable unit (one coherent scope, vertical, ships and tests on its own). Cut by shippability, never by component or layer.
- If the intent is above feature level, produce child intents (a lower
-
Record the decomposition decision. Note why the cut went the way it did on the parent's
Decomposition— the grouping rationale, and any branch you considered and dropped or replaced (with a pointer to the killed child'sde-risk-intentverdict when an upward kill forced the re-cut). This mirrors the de-risk trail, which already records why a bet was tested the way it was (de-risk-intent'sreferences/reversibility-triage.md). Without it the parent reads as if the tree were always this shape, and a later reader re-litigates a branch you already ruled out. A line or two per decision — a log, not a memo. -
Project the leaf — by Scale. A feature-level intent is the leaf; how it projects depends on Scale (
references/recursive-decomposition.md):appScale — it is a singlecorebrief (same outcome, success metrics from the input/lagging/guardrail, scope/non-goals, appetite). Write it todocs/product/briefs/<slug>.mdand hand toreceive-brief. No new fields, no slicing —receive-briefis level-agnostic and receives a brief for its own repo.business-unitScale — slice it per component into onecorebrief per affected repo. Read the affected components and theirprovidesApi/consumesApiedges + the contract references from the meta-repo's catalog (align-value-stream), and stamp each brief withparent-intent:(the intent it was projected from), acontract@versionreference + read-only courier snapshot, and a provider/consumer role. Seed one rollup row per slice in the meta-repo. Each brief then crosses into its component repo, wherereceive-brief→new-spec→work-looptake over. Coordinating across repos this way has hard limits (no atomic cross-repo commit, no shared release train) —align-value-streamstates them honestly.
-
Keep the contract behavioral here. Carry only the interaction shape (who talks to whom, the consumer's expectations) into the brief; the detailed wire contract is pinned at the spec stage via the existing
Contract:seam, where the component's full context lives. Don't author OpenAPI/AsyncAPI here. -
Rank the children (optional). When a decomposition produces several children that compete for the same appetite — and the order they ship in is a real call, not obvious from dependencies alone — apply a lightweight prioritization/ranking step over them: the adopter's own rubric (RICE, Torres's opportunity-sizing, a custom decision matrix), recorded as a
rankon each child with its one-line rationale. This is the multi-criteria ranking the appetite + Scope Boundary do not do (constraint-setting, not ranking). It is optional — skip it when dependencies already order the children, or when there is one child. The rubric is the adopter's; this skill ships the step, not a fixed scoring formula. Discovery's backlog bridge reads therankto order the handoff towork-loop. -
Project onto a tracker (optional, one-way). If the team uses a tracker, render the tree onto it per
references/tracker-projection.md—none(markdown only), Linear (lean; collapse), or Jira Align (deep; expand). The canonical tree is the source; the tracker is a render. One-way only — don't try to round-trip status back.
Spotting a missing parent — offer, never block
Two prompt-only checks catch a skipped product rung. Both offer; neither gates, and the user can decline and proceed.
- Sibling-spawn detector. When decomposition (or framing) produces children
that won't each reduce to a single shippable slice — they read as several
independent value bets, not slices of one buildable thing — that is the signal a
product parent is missing. The sibling count is a hint, not a fixed
threshold; the real test is the qualitative shippability test above. Offer to
frame the product parent (
product-vision/product-strategy) and hang the siblings beneath it, rather than emitting orphaned siblings. - Retroactive parent. When several intents already exist with no shared parent
(a rung was skipped earlier), offer to reconstruct one and back-link the
siblings via their
Parent intent:field. Infer the altitude and name it for the user to correct: siblings that are architectural slices of one buildable thing → acapabilityparent; siblings that are independent value bets that together constitute one product → aproduct-vision/product-strategyparent. Infer and confirm, never assume.
Anti-patterns to refuse
- Decomposing by component or layer instead of shippability. "Backend then frontend" is not two slices; "the slice that lets a user reset their password, end to end" is. If a slice can't ship and test on its own, it isn't a slice.
- Skipping a level. Jumping a capability intent straight to specs hides the feature-level seams and the per-feature bets. Produce child intents first.
- Decomposing a killed bet. If
de-risk-intentkilled the riskiest assumption, reshape the parent — don't fan out specs that inherit the dead bet. - Silently re-shaping the tree. Dropping or replacing a branch after a kill without recording why leaves the parent reading as if it were always cut this way — and invites a later reader to re-propose the dead branch. Log the decision (step 2).
- Letting the tracker dictate the model. Linear's flatness and Jira Align's depth are projection targets, not the product model. Model in intents; render to the tracker. Same canonical spec lands at an Issue (Linear) and a Story (Jira Align) — proof the tree must be canonical.
- Authoring the wire contract here. Behavioral interaction only; the spec stage owns the detailed contract.