Edge Case
An edge case is a situation that occurs at the limits of a product's expected inputs or conditions, such as an empty list, the maximum file size or a date at the end of a month. Edge cases are rare in normal use, but they reveal whether a feature still behaves correctly once a user or system steps outside the typical path.
How Edge Cases Work
In engineering, an edge case is a problem that appears only at an extreme, minimum or maximum, value of one operating parameter. When several parameters reach their extremes at the same time, it is usually called a corner case. In product requirements the term is used more loosely for any uncommon but plausible scenario that the main "happy path" does not cover.
Common sources of edge cases:
- Boundaries: zero, one, the maximum length, a plan limit.
- Missing or empty data: no results, a blank optional field.
- Invalid input: wrong formats, unexpected characters, a renamed file.
- Timing: double submission, two people editing the same record, an expired session.
- Environment: slow networks, time zones, leap years.
Teams record each edge case with its expected outcome, usually in the acceptance criteria or a dedicated section of the requirements. Many boundary values come straight from business rules, such as a refund limit or a trial length.
Why Edge Cases Matter
An unspecified edge case still gets a behavior: whatever the code happens to do. Deciding that behavior in the requirements is far cheaper than discovering it in a support ticket. AI coding agents make this sharper, because they fill gaps with guesses. Listing edge cases explicitly is one of the most effective ways to get correct output, as shown in this guide to writing a PRD an AI coding agent will not misread.
Edge Case Example
An upload feature accepts PDFs up to 10 MB. The team specifies: a file of exactly 10 MB is accepted; a 10.1 MB file is rejected with "Files must be 10 MB or smaller"; a zero-byte file is rejected; a file renamed to .pdf that is not a PDF is rejected; if the connection drops at 90%, the user can retry without starting over. Each line has an outcome a tester can check.