Install
$ agentstack add skill-sidsaladi9-persona-os-user-stories ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
User Stories
Turn a fuzzy epic, spec, or feature into a backlog of small, testable, independently shippable user stories. Each story names a user, a capability, and an outcome, carries acceptance criteria a developer and tester can verify, and is sliced as a thin vertical end-to-end path — never a horizontal technical layer. Where a story is too big, split it with a proven pattern rather than guessing.
Grounded in: User Story Mapping — Jeff Patton: vertical slices and story mapping, with INVEST and Given/When/Then. Go deeper (The Product Channel): Guide to Product Requirements Documents
When to use this
- An epic or spec is too large to estimate or build, and needs decomposing.
- You're handed a PRD and need a ready-to-groom backlog out of it.
- A single story keeps growing or hides several decisions and should be split.
- A story exists but its acceptance criteria are vague, missing, or untestable.
- Sprint planning needs stories small enough to fit a sprint with clear "done."
Before you start (gather these)
- The epic / spec / feature you're decomposing — the scope boundary.
- The user or persona who benefits (and any distinct user types involved).
- The outcome / goal: what changes for them when this ships.
- If pointed at a PRD or doc, read it first and pull the above from it.
- If scope, persona, or outcome is unclear, ask before slicing — don't invent them.
Principles
- Story form: As a [user/persona], I want [capability], so that [outcome]. The "so that" is non-negotiable — it's the user value and the reason to build.
- INVEST every story:
- Independent — minimal ordering dependencies on other stories.
- Negotiable — a conversation, not a frozen contract of implementation detail.
- Valuable — delivers observable value to a user or the business.
- Estimable — the team understands it well enough to size it.
- Small — fits comfortably in a sprint; ideally a few days.
- Testable — you can write the acceptance criteria that prove it's done.
- Acceptance criteria as Given/When/Then — Given [context], When [action], Then [observable result]. Cover the happy path AND edge cases (empty, invalid, unauthorized, limits, failures).
- Vertical slices over horizontal — each story is a thin end-to-end path that delivers value (UI + logic + data for one capability), not a layer ("build the API," "build the schema") that delivers nothing alone. Exception for quality-bar / model-accuracy work: a story that proves a probabilistic capability hits its bar against an eval set (detection/scoring verified offline, no UI yet) is a legitimate first vertical slice — the verifiable accuracy is the value.
- Acceptance criteria for probabilistic / ML / quality-bar features — Given/When/Then is deterministic, but ML behavior is only correct ~85% of the time, so don't write AC as if each case must pass. Instead make the criteria threshold-based and measured against a fixed eval set / golden dataset: define a labeled dataset, set precision/recall (or F1, accuracy) targets, and write AC like "Given the golden eval set of N labeled examples, when the model runs, then precision ≥ 0.90 and recall ≥ 0.80." Specify the dataset, the metric, and the threshold so the AC is still pass/fail — just measured statistically rather than per-instance.
Splitting patterns (when a story is too big)
- Workflow steps — slice along the steps of a process. "Checkout" → enter address → choose shipping → pay → confirm.
- Business-rule variations — one story per rule. Discount: percentage off, then BOGO, then loyalty tier.
- Happy vs. edge path — ship the happy path first, edges as follow-ups. "Pay with valid card" before "handle declined card."
- Simple vs. complex — do the basic case, defer the hard one. "Search by exact name" before "fuzzy + filters search."
- Data / interface variations — split by input type, format, or channel. "Upload CSV" before "upload Excel and JSON."
- CRUD operations — split create / read / update / delete. "View saved reports" can ship before "edit" and "delete."
- Defer performance — make it work, then make it fast. "Generate report (any speed)" before "generate report in <2s."
Process
- Identify the user(s) and the epic's outcome — who benefits and what changes for them. List distinct personas if more than one.
- Slice into vertical stories — break the outcome into thin end-to-end capabilities, each delivering value on its own. Reach for a splitting pattern when a slice is still chunky.
- Write each in story form — As a / I want / so that. Confirm the "so that" states real value.
- Add Given/When/Then acceptance criteria — at least one happy-path scenario plus the edge cases that matter (invalid, empty, unauthorized, limits, failure).
- Check INVEST and bound the slice — run each story through the six letters; flag and fix anything that fails. State what's explicitly out of scope for the story (deferred work, things handled elsewhere) so the boundary is unambiguous.
- Split anything too big — if a story fails Small or Estimable, or hides multiple decisions, apply a splitting pattern and re-check.
- Sequence — order by dependency and value; surface the thinnest slice that proves the epic end-to-end first.
Output template
Copy-paste per story:
### [Story title]
As a [user/persona],
I want [capability],
so that [outcome].
**Acceptance criteria**
- Given [context], when [action], then [observable result].
- Given [edge context], when [action], then [result].
- Given [error/limit context], when [action], then [result].
**Notes / edge cases**
- [assumptions, open questions, data or rule details]
**Out of scope**
- [explicitly not in this story — deferred or handled elsewhere]
Suggested build order
- [story] — thinnest end-to-end slice; proves the path.
- [story] — [why next: unblocks X / highest value]
- [story] — ...
Worked example (the split that matters)
An epic arrives as "bulk CSV export." The lazy split is by layer — backend story, frontend story, QA story — which produces three stories none of which ship value alone.
The useful split is by thin vertical slice, each independently shippable:
- As an ops manager, I want to export the current filtered view as CSV, so I can hand my director numbers without asking data for a pull. — one view, ≤1,000 rows, synchronous download.
- As an ops manager, I want exports over 1,000 rows to arrive by email, so a big export doesn't time out in my browser.
- As an ops manager, I want my last export's filters remembered, so the Monday report takes one click.
Story 1 alone is worth shipping. That's the test: if a story can't be released on its own and be worth something, it's a task, not a story.
Notice the "so that" clauses — each names a real outcome, not a restatement of the action. "so that I can export a CSV" is the tell that the value wasn't understood.
Avoid (anti-patterns)
- Horizontal / technical-layer stories — "build the API," "create the schema," "wire up the service." They deliver no user value alone. Slice vertically. Exception: a detection/eval-only story for an ML or quality-bar feature — verified against an eval set with no UI — is not a horizontal layer; the measured accuracy is real, demonstrable value and is a valid first slice.
- Untestable acceptance criteria — "works well," "is fast," "is intuitive." If you can't write a pass/fail check, rewrite it as Given/When/Then.
- Giant stories — one story hiding a dozen decisions, rules, or screens. If you can't estimate it, split it.
- Missing the "so that" — a capability with no stated user value. If there's no outcome, question whether to build it.
Tips
- One verb per story. "Create and edit and export" is three stories.
- If estimation triggers an argument, the story is too big or too vague — split or clarify.
- Write the edge-case criteria first sometimes; they expose hidden scope fast.
- A story you can demo in one sentence ("watch me pay with a saved card") is the right size.
- Keep acceptance criteria about observable behavior, not implementation.
- Name the persona specifically ("returning shopper," not "user") — it sharpens the slice.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: Sidsaladi9
- Source: Sidsaladi9/persona-os
- License: MIT
- Homepage: https://sidsaladi.substack.com
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.