Skip to content

How to shape a feature intent in an app repo

Turn an application-scale idea into a de-risked feature intent and the smallest delivery-ready contract.

Use this when: You have an idea or request at app scale (one repo, one feature) and want to turn it into a spec your delivery loop can build — without skipping framing, de-risking, and decomposition. Prerequisites: product-engineering pack installed; an app-scale repo with app code; a feature idea, request, or brownfield context to shape. Result: A de-risked feature intent routed directly to one core spec when it is independently shippable, or to a coordinating brief when several specs or repositories need a shared envelope, ready for new-spec, author-delivery-brief continue, and work-loop.

You have an idea or a request and you want to turn it into a spec your delivery loop can build, without skipping the thinking. Install the product-engineering pack, then:

Shape this feature intent: workspace owners need export retention controls so compliance requests no longer require manual work.

Invoke frame-intent. It runs intake first: it infers Scale (one repo with app code → app), confirms it, and asks whether this work is greenfield or brownfield. Then you fill an intent (the skill ships the template at frame-intent/assets/intent-template.md; copy it to docs/product/intents/<slug>.md):

  • Outcome — a steerable input metric, the lagging outcome it should drive, and a guardrail that must not get worse. In 0-to-1, a qualitative-but- falsifiable outcome is fine.
  • Opportunity — what the user is trying to get done, framed without a solution. In brownfield you may pull in a journey or process map; in greenfield, skip them.
  • Assumptions — what must be true for the bet to pay off, one line each.

frame-intent step 5 prompts for all four dimensions of the opportunity using a three-tier JTBD model. Fill each into the intent’s optional Opportunity sub-fields:

  • Functional job: what the user is trying to accomplish, independent of any solution — “get back into my account on my own without waiting for a support queue.”
  • Emotional job: how they want to feel during or after the job — “feel in control of the situation, not at the mercy of a slow email link.”
  • Social job: how they want to be perceived by others — “be seen as self-sufficient and capable by my team.”
  • Struggling moment: where today’s situation fails them — “when locked out, the reset-link email arrives minutes late — so the user is stuck with no progress signal.”

Free-form prose in the Opportunity section remains valid — use the sub-fields when the opportunity is job-shaped and you want all three dimensions captured. For a deeper pass that surfaces and scores every job behind the opportunity area, run identify-opportunities after framing.

frame-intent is knowledge-surface aware: when an internal knowledge surface is reachable (an enterprise-knowledge MCP tool, an internal CLI, an in-repo doc set), it consults the business-domain and meaning areas so the outcome and opportunity use your org’s real terms and rules instead of generic ones, and it states which surface it used — or “none”, with the confidence lowered to match.

If the Core pack and its shaping-reviewer are installed, frame-intent can send one attributed evidence packet to an isolated reviewer in intent mode. It is an optional augmentation: a genuinely fresh context or an independent human reviewing the same packet can stand in, while warm self-review is only advisory. The reviewer returns Clean or Findings; frame-intent retains the decision and status, and unresolved findings block a reviewed handoff.

Without Core or another independent route, the intent remains authorable. frame-intent reports that the optional Core intent shaping review is unavailable and does not claim Clean.

Invoke de-risk-intent. It triages reversibility (one-way vs two-way door), picks the riskiest assumption, and — crucially — predeclares a kill condition in the test’s own currency (a number if you have traffic, a qualitative bar if you don’t) before running anything. It then runs under a prototype-approach:

  • validate-first (default for irreversible bets) — build the cheapest probe that tests the kill condition, take the verdict.
  • prototype-led (default for cheap, reversible bets) — build a prototype early and let it drive the intent’s refinement; the build is the test.

You get a survive/kill verdict. Killed → reframe. Survived → decompose.

3. Decompose to the smallest delivery contract

Section titled “3. Decompose to the smallest delivery contract”

Invoke decompose-intent. At app scale, one independently shippable feature routes directly to a core spec at docs/specs/<slug>/spec.md. Use a brief only when the intent coordinates multiple specs or crosses repository boundaries; the brief carries the shared outcome, success metrics, scope/non-goals, and appetite while the child specs own their delivery contracts.

From here it’s the loop you already have: new-spec authors a direct single-feature contract, while author-delivery-brief continue decomposes a coordinating brief into specs. In both routes, work-loop builds the approved spec and the Contract: seam pins the detailed contract at spec authoring time.


Business-unit / cross-component. When a capability spans many component repos, decompose-intent slices the feature intent per component into one brief per repo, coordinated from a value-stream meta-repo via align-value-stream. See the how-to Run a capability across a value stream.

  • A de-risked feature intent that records its outcome, opportunity, and assumptions.
  • A route to new-spec for one independently shippable feature, or to a coordinating brief for multi-spec or cross-repository work.