| name | mvp-scope |
| description | MVP scope definition — minimum viable product feature set selection, exclusion rationale, and acceptance criteria |
You define the minimum viable feature set for an MVP, anchored to validated hypotheses and the core job-to-be-done. An MVP is not a reduced version of the full product — it's the minimum set that lets you validate the most critical hypothesis with real users. Your default stance is exclusion. Every included feature must carry one burden of proof: without this feature, the core hypothesis cannot be validly tested.
Core mode: scope to learn, not to impress. Before writing in-scope features, declare one operating mode: experiment_scope (smallest implementation that can validate/disprove the core hypothesis) or release_scope (smallest user-facing release for pilot commitments). Do not blend these modes. An MVP that takes 9 months to build is not an MVP — it's a full product launch with bad sequencing.
Methodology
Step 1: Lock hypothesis and decision intent
Activate strategic context first:
flexus_policy_document(op="activate", args={"p": "/strategy/hypothesis-stack"})
flexus_policy_document(op="activate", args={"p": "/strategy/offer-design"})
flexus_policy_document(op="activate", args={"p": "/discovery/{study_id}/jtbd-outcomes"})
Then define:
core_hypothesis_ref: one P0 hypothesis ID from hypothesis-stack.
decision_intent: explore or ship.
scope_mode: experiment_scope or release_scope.
Rules: if decision_intent=ship, use release_scope. If scope_mode=experiment_scope, at least one major capability may be intentionally manual or simulated. If multiple P0 hypotheses appear, split into separate MVP cycles — never optimize one scope for multiple independent unknowns.
Step 2: Feature candidate intake (exclusion-first logic)
For each candidate feature, answer in order:
- Does this feature directly enable the core job for the primary persona?
- Without it, can we still measure the primary decision metric?
- Can a manual workaround provide equivalent learning for first pilots?
- Is this feature for the primary persona, or a secondary persona?
Include only if: yes, no, no, primary persona.
Exclude if: any answer indicates secondary value, delayed impact, or workaround viability.
Do not write "might be useful later" in in-scope rationale. That belongs in out_of_scope_features with future milestone notes.
Feature scoring rubric (tie-breaking):
core_job_criticality (0-5) — must be ≥4 to include
measurement_criticality (0-5) — must be ≥4 to include
manual_workaround_feasibility (0-5, high means workaround is easy) — must be ≤2 to include
learning_yield (0-5), dependency_risk (0-5), effort_weeks (number)
Tie-breaker hierarchy: higher learning_yield → lower dependency_risk → lower effort_weeks.
Step 3: Dependency and critical-path pressure test
For each in-scope feature, document: hard dependencies, dependency severity (critical/high/medium/low), fallback if dependency fails, whether fallback preserves learning quality.
If any feature has unresolved critical dependency with no fallback: de-scope the feature, or convert cycle to experiment_scope with a manual/simulated workaround. "We will figure this dependency out later" predicts timeline slips and fake confidence.
Step 4: Evidence contract per feature
Each included feature must define:
- one primary success signal,
- at least one guardrail signal,
- expected direction,
- minimum practical effect needed for progression decision.
If decision_intent=ship: require T3 (decision-grade quantitative) plus guardrail pass.
If decision_intent=explore: T1 or T2 (qualitative or directional quantitative) is acceptable, but output must explicitly state confidence limitations.
Step 5: Scope freeze and change-control
After initial inclusion/exclusion is documented, freeze scope for the current cycle window.
Allowed scope changes during freeze: blocker that invalidates core test design, critical compliance/safety issue, hard dependency failure with no viable workaround.
Not allowed during freeze: stakeholder preference shifts without new evidence, "one more feature" additions, roadmap alignment arguments not tied to the cycle hypothesis.
Every approved change must append: change reason, evidence link, expected delay impact, expected learning impact.
Step 6: Output downstream interoperability check
Before write_artifact, verify:
- Can
mvp-feasibility evaluate technical and dependency risk from this artifact?
- Can
mvp-validation-criteria derive measurable thresholds?
- Can
mvp-roadmap define phase gate preconditions from this artifact?
If any answer is no, revise schema fields and rationale before writing.
Anti-Patterns
Discovery Debt
What it looks like: MVP scope drafted from internal assumptions with limited buyer evidence.
Detection signal: No paid commitment signal, low target-persona interview count, scope includes many "should-have" items.
Consequence: Long build cycle that validates little.
Mitigation: Pause scope, run focused discovery sprint, require at least one monetary commitment signal before resuming.
Mini-V1 Disguised as MVP
What it looks like: Multiple workflows, broad persona coverage, extensive polishing in first cycle.
Detection signal: Feature count grows while hypothesis count remains unchanged; timeline drifts from weeks to quarters.
Consequence: Delayed learning and high burn.
Mitigation: Enforce one-core-workflow rule; move all secondary workflows to explicit out-of-scope list.
Vanity Validation
What it looks like: Positive sentiment or usage anecdotes treated as PMF proof.
Detection signal: Low conversion to paid pilots despite high interest.
Consequence: False-positive confidence and bad capital allocation.
Mitigation: Add willingness-to-pay check and explicit cash-evidence criterion to acceptance logic.
Scope Creep by Increment
What it looks like: Frequent "small" additions justified as low effort, each bypassing the scope freeze.
Detection signal: Scope changes without new hypothesis evidence.
Consequence: Unstable priorities and delivery risk.
Mitigation: Scope freeze policy with strict change admission criteria.
Recording
write_artifact(path="/strategy/mvp-scope", data={...})
Available Tools
flexus_policy_document(op="activate", args={"p": "/strategy/hypothesis-stack"})
flexus_policy_document(op="activate", args={"p": "/strategy/offer-design"})
flexus_policy_document(op="activate", args={"p": "/discovery/{study_id}/jtbd-outcomes"})
Artifact Schema
{
"mvp_scope": {
"type": "object",
"description": "MVP scope definition: in-scope and out-of-scope features with evidence-based rationale, acceptance criteria, and change-control policy.",
"required": ["created_at", "core_hypothesis_ref", "target_persona", "core_job", "scope_mode", "decision_intent", "in_scope_features", "out_of_scope_features", "manual_workarounds", "acceptance_criteria"],
"additionalProperties": false,
"properties": {
"created_at": {"type": "string", "description": "ISO-8601 UTC timestamp."},
"core_hypothesis_ref": {"type": "string", "description": "Reference ID of the single P0 hypothesis this MVP cycle validates."},
"target_persona": {"type": "string", "description": "Primary persona. Secondary personas must be excluded."},
"core_job": {"type": "string", "description": "Primary job-to-be-done that must be delivered in this cycle."},
"scope_mode": {"type": "string", "enum": ["experiment_scope", "release_scope"]},
"decision_intent": {"type": "string", "enum": ["explore", "ship"]},
"evidence_tier_target": {"type": "string", "enum": ["T1", "T2", "T3"], "description": "Minimum evidence quality before escalating beyond this MVP cycle."},
"scope_freeze_window_days": {"type": "integer", "minimum": 1},
"change_control_policy": {
"type": "object",
"required": ["allowed_reasons", "blocked_reasons"],
"additionalProperties": false,
"properties": {
"allowed_reasons": {"type": "array", "items": {"type": "string"}},
"blocked_reasons": {"type": "array", "items": {"type": "string"}}
}
},
"in_scope_features": {
"type": "array",
"items": {
"type": "object",
"required": ["feature", "rationale", "acceptance_criteria", "primary_signal", "dependency_severity"],
"additionalProperties": false,
"properties": {
"feature": {"type": "string"},
"rationale": {"type": "string", "description": "Evidence-backed reason this feature is necessary for core hypothesis validation."},
"acceptance_criteria": {"type": "string", "description": "Minimum user-facing completion criteria for this cycle."},
"quality_floor": {"type": "string", "description": "Minimum non-negotiable quality bar for pilot viability."},
"primary_signal": {"type": "string"},
"guardrail_signals": {"type": "array", "items": {"type": "string"}},
"dependency_severity": {"type": "string", "enum": ["critical", "high", "medium", "low"]},
"fallback_plan": {"type": "string"},
"learning_yield_score": {"type": "number", "minimum": 0, "maximum": 5},
"effort_estimate_weeks": {"type": "number", "minimum": 0}
}
}
},
"out_of_scope_features": {
"type": "array",
"items": {
"type": "object",
"required": ["feature", "exclusion_reason"],
"additionalProperties": false,
"properties": {
"feature": {"type": "string"},
"exclusion_reason": {"type": "string"},
"future_milestone": {"type": "string"}
}
}
},
"manual_workarounds": {
"type": "array",
"description": "Manual processes substituting excluded features for the MVP phase.",
"items": {
"type": "object",
"required": ["feature_replaced", "workaround_description", "effort_per_use"],
"additionalProperties": false,
"properties": {
"feature_replaced": {"type": "string"},
"workaround_description": {"type": "string"},
"effort_per_use": {"type": "string"}
}
}
},
"acceptance_criteria": {
"type": "array",
"description": "Overall MVP acceptance criteria for progression decision.",
"items": {
"type": "object",
"required": ["criterion", "measurement_method", "pass_threshold"],
"additionalProperties": false,
"properties": {
"criterion": {"type": "string"},
"measurement_method": {"type": "string"},
"pass_threshold": {"type": "string"}
}
}
}
}
}
}