
Agile Product Owner
Generate INVEST-style user stories with personas and acceptance criteria so a solo builder can scope and backlog features like a product owner.
Overview
Agile-product-owner is an agent skill most often used in Validate (also Build, Ship) that generates INVEST-style user stories with personas and acceptance criteria for solo-builder backlogs.
Install
npx skills add https://github.com/davila7/claude-code-templates --skill agile-product-ownerWhat is this skill?
- Python UserStoryGenerator with INVEST-compliant story structuring
- Four built-in personas: end user, administrator, power user, new user
- Story templates for feature, improvement, and fix narratives
- Persona needs and context fields to ground acceptance criteria
- Claude Code template skill for agile product-owner style backlog output
- 4 predefined personas in UserStoryGenerator
- 3 story_templates: feature, improvement, fix
Adoption & trust: 739 installs on skills.sh; 27.8k GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You know what to build next but your backlog is vague bullet points that agents and future-you cannot test against.
Who is it for?
Solo SaaS builders scoping an MVP or slicing a feature into testable stories before invoking planning or coding skills.
Skip if: Teams that already maintain a formal PRD with signed-off requirements and no need for generated story drafts.
When should I use this skill?
User needs user stories, INVEST criteria, product owner backlog help, or persona-driven acceptance criteria.
What do I get? / Deliverables
You get structured user stories with persona context and template-driven wording ready to drop into specs, implementation plans, or sprint notes.
- INVEST-oriented user story text with persona and benefit clauses
- Structured backlog entries using feature, improvement, or fix templates
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Backlog shaping starts when you validate what to build; the same stories carry into build and ship planning, so canonical shelf is validate/scope. User story generation tightens feature scope and acceptance criteria before full implementation—core validate activity, not runtime ops.
Where it fits
Turn a rough feature idea into persona-based stories before committing build time.
Split an epic into improvement and fix story templates for the next implementation plan.
Document expected behavior stories for a release checklist the agent can verify.
How it compares
Backlog story generator with personas, not a roadmapping OKR workshop or automated Jira sync integration.
Common Questions / FAQ
Who is agile-product-owner for?
Indie builders and small teams who act as their own product owner and want INVEST-shaped stories without opening a separate PM tool.
When should I use agile-product-owner?
Use it in Validate to narrow scope with acceptance criteria, in Build when breaking epics into agent-sized tasks, and in Ship when turning fixes into explicit user-expectation stories.
Is agile-product-owner safe to install?
Review the Security Audits panel on this Prism page; the skill includes executable Python template code—run it in a trusted environment and inspect before piping output into production repos.
SKILL.md
READMESKILL.md - Agile Product Owner
#!/usr/bin/env python3 """ User Story Generator with INVEST Criteria Creates well-formed user stories with acceptance criteria """ import json from typing import Dict, List, Tuple class UserStoryGenerator: """Generate INVEST-compliant user stories""" def __init__(self): self.personas = { 'end_user': { 'name': 'End User', 'needs': ['efficiency', 'simplicity', 'reliability', 'speed'], 'context': 'daily usage of core features' }, 'admin': { 'name': 'Administrator', 'needs': ['control', 'visibility', 'security', 'configuration'], 'context': 'system management and oversight' }, 'power_user': { 'name': 'Power User', 'needs': ['advanced features', 'automation', 'customization', 'shortcuts'], 'context': 'expert usage and workflow optimization' }, 'new_user': { 'name': 'New User', 'needs': ['guidance', 'learning', 'safety', 'clarity'], 'context': 'first-time experience and onboarding' } } self.story_templates = { 'feature': "As a {persona}, I want to {action} so that {benefit}", 'improvement': "As a {persona}, I need {capability} to {achieve_goal}", 'fix': "As a {persona}, I expect {behavior} when {condition}", 'integration': "As a {persona}, I want to {integrate} so that {workflow}" } self.acceptance_criteria_patterns = [ "Given {precondition}, When {action}, Then {outcome}", "Should {behavior} when {condition}", "Must {requirement} to {achieve}", "Can {capability} without {negative_outcome}" ] def generate_epic_stories(self, epic: Dict) -> List[Dict]: """Break down epic into user stories""" stories = [] # Analyze epic for key components epic_name = epic.get('name', 'Feature') epic_description = epic.get('description', '') personas = epic.get('personas', ['end_user']) scope = epic.get('scope', []) # Generate stories for each persona and scope item for persona in personas: for i, scope_item in enumerate(scope): story = self.generate_story( persona=persona, feature=scope_item, epic=epic_name, index=i+1 ) stories.append(story) # Add enabler stories (technical, infrastructure) if epic.get('technical_requirements'): for req in epic['technical_requirements']: enabler = self.generate_enabler_story(req, epic_name) stories.append(enabler) return stories def generate_story(self, persona: str, feature: str, epic: str, index: int) -> Dict: """Generate a single user story""" persona_data = self.personas.get(persona, self.personas['end_user']) # Create story story = { 'id': f"{epic[:3].upper()}-{index:03d}", 'type': 'story', 'title': self._generate_title(feature), 'narrative': self._generate_narrative(persona_data, feature), 'acceptance_criteria': self._generate_acceptance_criteria(feature), 'estimation': self._estimate_complexity(feature), 'priority': self._determine_priority(persona, feature), 'dependencies': [], 'invest_check': self._check_invest_criteria(feature) } return story def generate_enabler_story(self, requirement: str, epic: str) -> Dict: """Generate technical enabler story""" return { 'id': f"{epic[:3].upper()}-E{len(requireme