From builder-product
Use before any engineering estimate is made. Requires a written scope before an estimate, and a written estimate before a commit. Blocks "we'll scope as we go" and "just give me a rough number" completions.
How this skill is triggered — by the user, by Claude, or both
Slash command
/builder-product:feature-scopingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
```
A FEATURE ESTIMATED WITHOUT A WRITTEN SCOPE IS A COMMITMENT MADE AGAINST UNKNOWN WORK.
"Give me a rough number" produces a number that becomes a deadline before the scope is understood.
Written scope → time estimate against that scope → explicit commit IS a feature decision.
Trigger before:
A scope document answers four questions before any estimate is given.
User-visible behaviour only. Not implementation details.
The user can:
- [Action 1] — e.g., "filter search results by date range"
- [Action 2] — e.g., "export the filtered results as CSV"
The system will:
- [Behaviour 1] — e.g., "persist filter state across sessions"
Name the exclusions. Every implicit exclusion is a future dispute.
NOT included in this scope:
- [Exclusion 1] — e.g., "bulk export (> 1000 rows)"
- [Exclusion 2] — e.g., "real-time filter updates without page reload"
Specific, testable conditions that define "done":
Given [state], when [action], then [observable result].
Acceptance criteria are the contract between product and engineering. Vague criteria ("works correctly") are not acceptance criteria.
Dependencies:
- [Service/team/data that must be ready before this can ship]
Risks:
- [Known unknowns that could expand the estimate]
An estimate is only valid if it names the scope document it was made against.
Estimate format:
Feature: <name>
Scope reference: product/scopes/<feature>-<date>.md
Estimate: <N days> (confidence: high / medium / low)
Assumptions: [any assumption that, if wrong, invalidates the estimate]
Not included: [any exclusion the estimate depends on]
What does NOT count as an estimate:
A commit is an estimate made public. Before committing:
If any of these are false, the "commitment" is a guess that will be held as a promise.
Before any number is given. Create product/scopes/<feature>-<date>.md with all four sections.
Engineering estimates the scope document — not a verbal description of it. The estimate references the scope file path.
Product and engineering review the assumptions explicitly. Any assumption that product disputes is a scope change — update the document and re-estimate.
When a deadline is shared with stakeholders, share the scope reference. "We'll have X by [date], scope is product/scopes/X-YYYYMMDD.md" makes the scope part of the commitment.
If scope changes after commit, the estimate is re-done. No exceptions. "It's a small addition" always comes with a small amount of time that nobody accounted for.
These thoughts mean scoping was skipped — stop:
When feature-scoping is satisfied, state it like this:
Scope complete.
File: product/scopes/<feature>-<date>.md ✓
What's built: <N user-visible behaviours listed> ✓
What's NOT built: <M explicit exclusions listed by name> ✓
Acceptance criteria: <N testable Given/When/Then statements> ✓
Dependencies: <listed> / Risks: <listed or "none identified"> ✓
Estimate: <N days>, confidence: <level>, made against this scope document ✓
Assumptions: <listed — reviewed with both product and engineering> ✓
The estimate is invalid without the scope reference. A number without a scope is not an estimate.
Scope and estimate are not separable. An estimate made before scope is complete is not an estimate — it is a guess that will be treated as a deadline. The scope document is what makes the estimate defensible when the feature takes longer than the guess. Without it, "you said two weeks" is an argument that cannot be won.
Whole-repo audit for over-engineering: finds dead code, unnecessary abstractions, stdlib-replaceable dependencies. Outputs ranked findings and net line/dep savings.
npx claudepluginhub rbraga01/a-team --plugin builder-product