
Deliver Edge Cases
- 566 installs
- 518 repo stars
- Updated August 4, 2026
- product-on-purpose/pm-skills
deliver-edge-cases is an agent skill that documents edge cases, error states, boundary conditions, race conditions, and recovery paths as a systematic whole-feature catalog for developers specifying or testing software f
About
deliver-edge-cases in product-on-purpose/pm-skills (version 2.1.1, updated 2026-06-13, Apache-2.0) catalogs unusual, boundary, and error scenarios for a feature so happy-path specs do not hide production failures. The seven-step workflow defines feature scope, walks input validation extremes, explores boundary values, maps network and permission errors, considers concurrency and double-submit races, defines user-facing recovery paths, and prioritizes cases by likelihood and impact. Output follows references/TEMPLATE.md with Feature Overview, Edge Case Categories, Error Messages, Recovery Paths, and Test Scenarios sections, validated against a six-item quality checklist before handoff. Developers reach for deliver-edge-cases during specification before engineering, when preparing QA test plans, after production bugs expose gaps, or before launch to confirm error states are designed. The skill complements deliver-acceptance-criteria, which writes story-level Given/When/Then checks, by covering the whole-feature failure surface. deliver-edge-cases fits product engineers and tech leads who want intentional error handling rather than edge cases discovered only in production.
- deliver-edge-cases
- AI & Agent Building
- AI-coding skill
Deliver Edge Cases by the numbers
- 566 all-time installs (skills.sh)
- +35 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #1,641 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/product-on-purpose/pm-skills --skill deliver-edge-casesAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 566 |
|---|---|
| repo stars | ★ 518 |
| Last updated | August 4, 2026 |
| Repository | product-on-purpose/pm-skills ↗ |
How do you document feature edge cases before coding?
Helps with ai & agent building tasks.
Who is it for?
Product engineers and tech leads specifying features who need a systematic failure-surface catalog before implementation or QA test planning begins.
Skip if: Story-level Given/When/Then acceptance criteria alone—use deliver-acceptance-criteria—or launch readiness checklists without failure analysis.
When should I use this skill?
User specifies feature edge cases, maps failure modes, plans QA boundary tests, reviews PRD completeness, or documents race conditions and recovery paths.
What you get
Edge-case catalog with categories, error messages, recovery paths, prioritized failure modes, and test scenarios from TEMPLATE.md.
- Edge-case catalog document
- Recovery path definitions
- Prioritized test scenarios
By the numbers
- Version 2.1.1 updated 2026-06-13
- TEMPLATE.md defines 5 output sections
- Quality checklist contains 6 verification items
Files
<!-- PM-Skills | https://github.com/product-on-purpose/pm-skills | Apache 2.0 -->
Edge Cases
An edge cases document systematically catalogs the unusual, boundary, and error scenarios for a feature. While happy-path flows are typically well-specified, edge cases often get discovered in production - causing bugs, poor user experience, and support burden. Documenting edge cases upfront ensures engineering handles them intentionally and QA knows what to test.
When to Use
- When you need to enumerate failure modes, race conditions, timeouts, and boundary or limit scenarios - everything that can go wrong - and define a recovery path for each
- During feature specification before engineering begins
- When preparing QA test plans
- After discovering production bugs to prevent similar issues
- When reviewing PRDs or user stories for completeness
- Before launch to ensure error states have been designed
When NOT to Use
- You need story-scoped Given/When/Then checks for handoff -> use
deliver-acceptance-criteria; this skill catalogs the whole feature's failure surface - The feature is not specified enough to enumerate inputs, states, and limits -> use
deliver-prdfirst - A production incident already happened and you want the learning banked -> use
iterate-lessons-log, then update this catalog with the new case - You need readiness coordination for a launch, not failure analysis -> use
deliver-launch-checklist
Instructions
When asked to document edge cases, follow these steps:
1. Define the Feature Scope Clearly describe what feature or flow you're analyzing. Edge cases are specific to context - the same input might be valid in one feature and invalid in another.
2. Walk Through Input Validation Consider every user input: What if it's empty? Too long? Wrong format? Contains special characters? What are the minimum and maximum valid values?
3. Explore Boundary Conditions Find the edges of acceptable ranges. If a field accepts 1-100, test 0, 1, 100, and 101. Consider pagination boundaries, timeout thresholds, and rate limits.
4. Map Error States Identify what can go wrong: network failures, permission denied, resource not found, concurrent modifications, expired sessions. Document both the scenario and expected behavior.
5. Consider Concurrency Issues What if two users act simultaneously? What if the user double-clicks? What if data changes between load and save? Race conditions often cause subtle bugs.
6. Define Recovery Paths For each error, specify how users recover. What message do they see? Can they retry? Is data preserved? Good error handling turns frustration into confidence.
7. Prioritize by Likelihood and Impact Not all edge cases need the same attention. High-likelihood + high-impact cases need robust handling; rare + low-impact cases might just need graceful failure.
Output Format
Use the template in references/TEMPLATE.md to structure the output. A complete edge-case catalog fills every template section: Feature Overview; Edge Case Categories; Error Messages; Recovery Paths; and Test Scenarios.
Quality Checklist
Before finalizing, verify:
- [ ] All user inputs have validation edge cases documented
- [ ] Boundary conditions are explicitly listed
- [ ] Network/system failure scenarios are covered
- [ ] Each error state has a defined user-facing message
- [ ] Recovery paths are specified (not just error detection)
- [ ] Edge cases are prioritized by likelihood and impact
Examples
See references/EXAMPLE.md for a completed example.
Scenario: profile-photo and document upload
This is the INPUT brief for an output-quality eval. The skill arm and the control arm each receive everything below (and nothing else about how to do the work) and produce an edge-case catalog for it. Judges never see this header.
Feature brief
Product: a consumer mobile + web app (a freelancer marketplace). Users upload a profile photo and up to 5 portfolio documents (PDF/PNG/JPG) when building their profile.
How it should work (intended behavior):
- Users pick files from the device (camera, photo library, or file picker) and see a thumbnail
preview before confirming.
- Profile photo: square crop, max 10 MB, JPG/PNG only.
- Portfolio documents: max 5 files, each up to 25 MB, PDF/PNG/JPG.
- Uploads show a progress bar and can be canceled mid-upload.
- A virus/malware scan runs server-side before a file is accepted.
Known constraints and concerns the team has raised:
- Mobile users are often on flaky cellular connections; an upload can stall or drop partway.
- Files can be corrupt, zero-byte, wrong type despite the extension, or **far over the
size limit**.
- A user can background the app or lock the phone mid-upload.
- The malware scan can fail, time out, or flag a file.
- Two devices logged into the same account can upload at the same time.
- Storage has a per-account quota; a 6th portfolio file or an over-quota upload must be handled.
- Image files can carry EXIF orientation and location metadata.
- The feature must be accessible (screen-reader labels for upload state, no color-only error
signaling) and work offline-to-online (queue then sync).
Explicitly out of scope: video upload, bulk/folder upload, and third-party cloud imports (Google Drive, Dropbox).
{
"schema": 1,
"skill": "deliver-edge-cases",
"runs_per_query": 3,
"trigger_threshold": 0.5,
"queries": [
{
"q": "Document the edge cases for the file upload feature before engineering starts",
"expect": "trigger",
"split": "train"
},
{
"q": "What boundary conditions and error states should we cover for bulk CSV import?",
"expect": "trigger",
"split": "train"
},
{
"q": "List everything that can go wrong in the checkout flow, with a recovery path for each",
"expect": "trigger",
"split": "train",
"notes": "Intent-only phrasing, no edge-case keyword"
},
{
"q": "We keep getting burned by weird inputs in production; map the failure surface of the search feature",
"expect": "trigger",
"split": "train",
"notes": "Intent-only phrasing"
},
{
"q": "Prepare a QA catalog of unusual and failure scenarios for the scheduling feature",
"expect": "trigger",
"split": "train"
},
{
"q": "What happens at the limits for the cart: zero items, max items, expired sessions, concurrent edits? Enumerate them",
"expect": "trigger",
"split": "train"
},
{
"q": "Identify the race conditions and timeout scenarios we need to design for in the sync engine",
"expect": "trigger",
"split": "validation"
},
{
"q": "Before launch, make sure every error state in onboarding has a designed message and recovery path",
"expect": "trigger",
"split": "validation"
},
{
"q": "Review this PRD and enumerate the boundary and failure scenarios it does not cover",
"expect": "trigger",
"split": "validation"
},
{
"q": "After last week's outage, build a systematic catalog of failure modes for the notifications pipeline",
"expect": "trigger",
"split": "validation"
},
{
"q": "Write Given/When/Then acceptance criteria for the password reset story",
"expect": "no-trigger",
"split": "train",
"near_miss_of": "deliver-acceptance-criteria",
"notes": "Story-scoped GWT checks for handoff belong to the partner"
},
{
"q": "Add testable done conditions, including a couple of error scenarios, to this single user story for handoff",
"expect": "no-trigger",
"split": "train",
"near_miss_of": "deliver-acceptance-criteria",
"notes": "Error scenarios inside one story's criteria stay with acceptance criteria"
},
{
"q": "I need story-scoped pass/fail conditions for the export slice so QA can sign off",
"expect": "no-trigger",
"split": "validation",
"near_miss_of": "deliver-acceptance-criteria",
"notes": "Done-ness for a slice, not the feature-wide failure catalog"
},
{
"q": "A production incident just happened; write up the lesson so future teams avoid repeating it",
"expect": "no-trigger",
"split": "train",
"near_miss_of": "iterate-lessons-log",
"notes": "Banking the learning comes first; the catalog gets updated after"
},
{
"q": "Build the pre-launch checklist covering support, legal, and marketing readiness",
"expect": "no-trigger",
"split": "train",
"near_miss_of": "deliver-launch-checklist",
"notes": "Launch readiness coordination, not failure analysis"
},
{
"q": "Break the reporting feature into user stories for the next two sprints",
"expect": "no-trigger",
"split": "validation",
"near_miss_of": "deliver-user-stories"
},
{
"q": "Write the PRD for the document signing feature",
"expect": "no-trigger",
"split": "train",
"near_miss_of": "deliver-prd",
"notes": "Feature not specified enough yet to enumerate inputs and limits"
},
{
"q": "Fix this flaky Jest test that fails intermittently in CI",
"expect": "no-trigger",
"split": "train",
"notes": "Unrelated engineering ask"
},
{
"q": "Write a SQL query that finds orders with negative totals",
"expect": "no-trigger",
"split": "validation",
"notes": "Unrelated"
},
{
"q": "Suggest a birthday gift for my 8 year old nephew",
"expect": "no-trigger",
"split": "validation",
"notes": "Unrelated"
}
]
}
deliver-edge-cases - Version History
| Version | Date | Release | Effort | Type | Summary |
|---|---|---|---|---|---|
| 2.1.1 | 2026-06-13 | - | M-31-B1 | patch | Trigger-recall fix: added intent-synonyms (failure modes, what can go wrong, race conditions, boundary/limit scenarios) to the description and When to Use; boundary pointers unchanged |
| 2.1.0 | 2026-06-10 | v2.26.0 | F-12-batch-1 | minor | Quality convergence: When NOT to Use + output-contract enumeration (F-12 Batch 1) |
| 2.0.1 | 2026-06-10 | v2.26.0 | F-12-batch-0 | patch | Description rewrite for trigger accuracy (boundary disambiguation; 2026-06-09 audit, v2.26.0 Batch 0) |
| 2.0.0 | 2026-01-26 | - | - | baseline | Prior published version |
2.1.1 (2026-06-13)
Trigger-recall patch (M-31 finding B1): the trigger-eval baseline confirmed under-triggering on intent-only phrasings (no literal "edge case" keyword) on both Haiku (50% validation) and Sonnet (63% validation). The description and the "When to Use" section now name the common synonyms explicitly - failure modes, what can go wrong, race conditions, timeouts, and boundary or limit scenarios - so the router recognizes the domain when expressed in user language. Boundary pointers to deliver-acceptance-criteria, deliver-prd, iterate-lessons-log, and deliver-launch-checklist are unchanged. No body, template, or example changes beyond the one added "When to Use" bullet.
2.1.0 (2026-06-10)
Quality-convergence minor (F-12 Batch 1): added a "When NOT to Use" section with boundary pointers to neighboring skills, and the Output Format now enumerates the template sections a complete artifact fills. No template or example changes.
2.0.1 (2026-06-10)
Description-only patch (F-12 Batch 0, from the 2026-06-09 repo audit): the trigger-surface description was rewritten to disambiguate collision pairs with an explicit boundary pointer to the sibling skill. No body, template, or behavior changes.
2.0.0 (2026-01-26)
Baseline row for the prior published version; see git history for its changes.
Edge Cases: File Upload
Feature Overview
Users can upload documents (PDF, Word, images) to their workspace. Files are stored in cloud storage with metadata in our database. Maximum file size is 100MB, with a limit of 50 files per upload batch.
Related Documents:
- PRD: Document Upload Feature (PRD-2026-012)
- Design: Upload Flow Mockups (Figma/uploads-v2)
Edge Case Categories
Input Validation
| Scenario | Expected Behavior | Priority | Notes |
|---|---|---|---|
| No file selected | Submit button disabled, tooltip: "Select files to upload" | P1 | Prevent empty submissions |
| File has no extension | Reject with error: "File type could not be determined" | P2 | Security: don't guess types |
| File extension doesn't match content | Reject with error: "File appears corrupted or mislabeled" | P1 | MIME type validation |
| Filename contains special characters | Accept but sanitize: replace with underscores | P2 | Allow unicode, strip \/:<>*? |
| Filename exceeds 255 characters | Truncate to 255, preserve extension | P3 | Show truncation warning |
| Filename is empty (just extension) | Reject with error: "Please provide a filename" | P2 | e.g., ".pdf" alone |
| Duplicate filename in same folder | Append "(1)", "(2)" etc. automatically | P2 | Show rename notification |
Boundary Conditions
| Scenario | Expected Behavior | Priority | Notes |
|---|---|---|---|
| File exactly 100MB | Accept | P1 | Boundary acceptance |
| File 100MB + 1 byte | Reject: "File exceeds 100MB limit" | P1 | Clear limit enforcement |
| File is 0 bytes | Reject: "File appears to be empty" | P2 | Prevent empty file uploads |
| 50 files in batch (max) | Accept all | P1 | Batch limit boundary |
| 51 files in batch | Reject batch: "Maximum 50 files per upload" | P1 | Pre-upload validation |
| Single file with 50 already in folder | Accept (folder limits are separate) | P3 | Clarify vs batch limit |
Error States
| Scenario | Expected Behavior | Priority | Notes |
|---|---|---|---|
| Network failure during upload | Pause upload, show "Connection lost. Retry?" | P1 | Auto-retry 3x before asking |
| Network failure mid-file | Resume from last chunk when reconnected | P1 | Chunked upload recovery |
| Storage quota exceeded | Reject: "Storage full. Free up space or upgrade." | P1 | Check before upload starts |
| File locked/in use (Windows) | Reject: "File is in use. Close it and try again." | P2 | Clear guidance |
| Upload session expires (>1 hour) | Restart upload with warning | P2 | Token refresh failed |
| File deleted locally during upload | Skip file, continue others: "1 file no longer available" | P2 | Non-blocking failure |
| Server error (5xx) | Show "Upload failed. Please try again." + retry button | P1 | Generic fallback |
| Malware detected by scanner | Reject file, quarantine, notify admin | P1 | Security critical |
Concurrency
| Scenario | Expected Behavior | Priority | Notes |
|---|---|---|---|
| User double-clicks upload | Ignore second click (button disabled during upload) | P1 | Prevent duplicate uploads |
| User navigates away during upload | Warning: "Upload in progress. Leave anyway?" | P1 | Confirmation dialog |
| User starts second upload batch | Queue second batch, show queue UI | P2 | Or reject with "upload in progress" |
| Same file uploaded simultaneously by 2 users | Both succeed with unique versions | P3 | Conflict resolution via versioning |
| User refreshes page during upload | Upload cancelled, show restart option on return | P2 | Cannot persist upload state |
Integration Failures
| Scenario | Expected Behavior | Priority | Notes |
|---|---|---|---|
| Cloud storage unavailable | Retry 3x, then "Upload temporarily unavailable" | P1 | 30-second timeout |
| Virus scanner timeout | Proceed with upload, flag for async scan | P2 | Don't block on slow scans |
| Virus scanner unavailable | Proceed with upload, flag for later scan | P2 | Queue for retry |
| Metadata service failure | Upload to storage, queue metadata write | P2 | Eventually consistent |
| Thumbnail generation failure | Upload succeeds, show generic icon | P3 | Non-critical failure |
Error Messages
| Error State | User Message | Additional Action |
|---|---|---|
| File too large | "This file is too large. Maximum size is 100MB." | "Compress file" link to help |
| Unsupported type | "This file type isn't supported. Try PDF, Word, or images." | List of supported types |
| Network failure | "Connection lost. Check your internet and try again." | [Retry] button |
| Storage full | "You've run out of storage space." | [Upgrade] or [Manage storage] |
| Permission denied | "You don't have permission to upload here." | [Request access] |
| Upload failed (generic) | "Something went wrong. Please try again." | [Retry] + [Contact support] |
| Malware detected | "This file was blocked for security reasons." | [Learn more] |
Recovery Paths
Network Failure During Upload
User sees: Progress bar pauses, toast notification: "Connection lost. Retrying..."
Recovery options: 1. Automatic retry (3 attempts, 5-second intervals) 2. Manual retry button after auto-retry exhausted 3. Cancel upload and start over
Data preservation: Completed file chunks preserved. Upload resumes from last successful chunk.
Storage Quota Exceeded
User sees: Modal: "You've run out of storage space. You're using 10GB of 10GB."
Recovery options: 1. Click "Manage storage" to delete files 2. Click "Upgrade plan" for more space 3. Cancel upload, files not uploaded
Data preservation: No partial upload - check happens before transfer starts.
Session Expired During Long Upload
User sees: Toast: "Your session expired. Please sign in to continue."
Recovery options: 1. Sign in via modal (doesn't lose page state) 2. If sign-in succeeds, upload auto-resumes 3. If sign-in fails, upload cancelled
Data preservation: Upload progress preserved during re-auth attempt.
Test Scenarios
Must Test (P1)
- [ ] Upload file exactly 100MB - should succeed
- [ ] Upload file 100MB + 1KB - should fail with size error
- [ ] Upload 50 files at once - should succeed
- [ ] Upload 51 files at once - should fail with batch limit error
- [ ] Disconnect network mid-upload - should pause and recover
- [ ] Upload .exe disguised as .pdf - should be rejected (MIME check)
- [ ] Double-click upload button - should only upload once
Should Test (P2)
- [ ] Upload file with unicode filename - should sanitize
- [ ] Upload file with 300-character name - should truncate
- [ ] Upload 0-byte file - should fail
- [ ] Upload duplicate filename - should auto-rename
- [ ] Navigate away during upload - should show warning
- [ ] Storage 99% full, upload 2% of quota - should fail
Nice to Test (P3)
- [ ] Upload when thumbnail service down - should succeed with generic icon
- [ ] Two users upload same file simultaneously - both should succeed
- [ ] Upload file with only extension (.pdf) - should fail
Edge Cases: [Feature Name]
Feature Overview
<!-- Brief description of the feature being analyzed -->
[Feature description]
Related Documents:
- [PRD or User Story link]
- [Design specs link]
Edge Case Categories
Input Validation
| Scenario | Expected Behavior | Priority | Notes |
|---|---|---|---|
| [Input field] is empty | [What happens] | P1/P2/P3 | [Additional context] |
| [Input field] exceeds max length | [What happens] | P1/P2/P3 | [Max: X characters] |
| [Input field] contains special characters | [What happens] | P1/P2/P3 | [Which characters] |
| [Input field] wrong format | [What happens] | P1/P2/P3 | [Expected format] |
Boundary Conditions
| Scenario | Expected Behavior | Priority | Notes |
|---|---|---|---|
| [Value] at minimum | [What happens] | P1/P2/P3 | [Min value: X] |
| [Value] at maximum | [What happens] | P1/P2/P3 | [Max value: X] |
| [Value] below minimum | [What happens] | P1/P2/P3 | [Error handling] |
| [Value] above maximum | [What happens] | P1/P2/P3 | [Error handling] |
Error States
| Scenario | Expected Behavior | Priority | Notes |
|---|---|---|---|
| Network failure during [action] | [What happens] | P1/P2/P3 | [Retry behavior] |
| [Resource] not found | [What happens] | P1/P2/P3 | [404 handling] |
| Permission denied | [What happens] | P1/P2/P3 | [Auth flow] |
| Session expired | [What happens] | P1/P2/P3 | [Re-auth flow] |
| Server error (5xx) | [What happens] | P1/P2/P3 | [Fallback behavior] |
Concurrency
| Scenario | Expected Behavior | Priority | Notes |
|---|---|---|---|
| User double-clicks submit | [What happens] | P1/P2/P3 | [Debounce/disable] |
| Two users edit same [resource] | [What happens] | P1/P2/P3 | [Conflict resolution] |
| Data changes after page load | [What happens] | P1/P2/P3 | [Stale data handling] |
Integration Failures
| Scenario | Expected Behavior | Priority | Notes |
|---|---|---|---|
| [External service] unavailable | [What happens] | P1/P2/P3 | [Fallback/retry] |
| [External service] returns error | [What happens] | P1/P2/P3 | [Error mapping] |
| [External service] timeout | [What happens] | P1/P2/P3 | [Timeout value: Xs] |
Error Messages
<!-- User-facing copy for each error state -->
| Error State | User Message | Additional Action |
|---|---|---|
| [Error 1] | "[Message shown to user]" | [Button/link if any] |
| [Error 2] | "[Message shown to user]" | [Button/link if any] |
| [Error 3] | "[Message shown to user]" | [Button/link if any] |
Recovery Paths
<!-- How users recover from each error -->
[Error State 1]
User sees: [Error message or UI state]
Recovery options: 1. [Primary recovery action] 2. [Alternative recovery action]
Data preservation: [What data is saved/lost]
[Error State 2]
User sees: [Error message or UI state]
Recovery options: 1. [Primary recovery action] 2. [Alternative recovery action]
Data preservation: [What data is saved/lost]
Test Scenarios
<!-- QA checklist derived from edge cases -->
Must Test (P1)
- [ ] [Test scenario 1]
- [ ] [Test scenario 2]
- [ ] [Test scenario 3]
Should Test (P2)
- [ ] [Test scenario 4]
- [ ] [Test scenario 5]
Nice to Test (P3)
- [ ] [Test scenario 6]
- [ ] [Test scenario 7]
Related skills
How it compares
Pick deliver-edge-cases for whole-feature failure catalogs; pick deliver-acceptance-criteria for per-story Given/When/Then handoff checks.
FAQ
How is deliver-edge-cases different from acceptance criteria?
deliver-edge-cases catalogs the whole-feature failure surface—boundaries, race conditions, and recovery paths—while deliver-acceptance-criteria writes story-level Given/When/Then checks. Use deliver-edge-cases when systematic error and boundary coverage must precede per-story acc
What sections does deliver-edge-cases output include?
deliver-edge-cases fills references/TEMPLATE.md with Feature Overview, Edge Case Categories, Error Messages, Recovery Paths, and Test Scenarios. A six-item quality checklist verifies validation coverage, boundary listing, network failures, user messages, recovery paths, and prior
When should developers invoke deliver-edge-cases?
deliver-edge-cases fits feature specification before engineering, QA test planning, post-incident gap analysis, or pre-launch error-state reviews. Version 2.1.1 in product-on-purpose/pm-skills targets teams who want intentional failure handling instead of discovering edge cases o