Decompose intent
Skill eugenelim/agent-ready-repo/packs/product-engineering/.apm/skills/decompose-intent
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`).From its SKILL.md
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
- 15 stars15 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.
SKILL.md
8.2 KB, ~1.9k tokens by cl100k_base, 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.
What ships with it: 4 files
9.9 KB alongside SKILL.md
evals/
- eval_queries.json1.5 KB
- evals.json1.4 KB
references/
- recursive-decomposition.md4.2 KB
- tracker-projection.md2.8 KB