# Edge and corner cases ## What this pack lets workers do A collection of nouns and verbs for finding edge and corner cases on purpose, before people do. Workers plan which edges apply to a target and write every expected result before anything runs. Tested, seeded code generates labelled cases for text, numbers, dates, lists and JSON request bodies: combining marks, right-to-left text, emoji and zero-width characters, other locales' numbers, daylight saving gaps and overlaps, leap days, duplicates in disguise and malformed bodies. Workers run them on a local build, put pages into edge states, check a video's edges and try an API's edges, store every input escaped with its digest, and turn every failure into a finding whose case becomes its regression test. ## Nouns | Noun | What it holds | | --- | --- | | Method | The lifecycle, the rules and four techniques: boundaries, classes, pairs and seeded variation | | Guardrails | Expect before running; local builds only; every input escaped; not run is never a pass | | Input catalog | Thirteen classes, from boundaries and Unicode to races, retries, partial failure and permissions | | Interface catalog | 320 pixels and reduced motion (the accessibility audit's), 200 percent zoom, long words, right-to-left, dark, slow, offline, no JavaScript | | Video catalog | First and last frames, captions at cuts, silent edges, muted, captions off, small screens, ratios, seek, loop, poster | | API catalog | Malformed JSON, content types, huge bodies, unknown fields, replays, expired leases, auth, paths, rate limits | | Oracle rules | Seven expected outcomes, what always fails and how a verdict follows | | Tool card and labels | The generator in [code/](code/README.md), pinned by digest, and its 169 labels in five nouns | | Edge checks | 16 checks on a results record, with 3 good and 16 bad records the validator recomputes | | Templates | Edge plan, case set and case results | | Sources and test cases | 12 dated public sources; 7 synthetic cases | | Worked examples | A plan, the generated case set, input and interface results, and one finding | ## Verbs | Verb | Who | What happens | | --- | --- | --- | | `plan-edges` | agent | Every catalog class chosen or skipped, an expectation per label, seed, limits and the local build, pinned first | | `generate-cases` | agent, no model | The seeded cases, generated twice to confirm the digest, pinned as a case set | | `run-input-cases` | agent | Generated cases through the target's input paths on a local build, read back | | `check-interface-edges` | agent | The local build's pages in each edge state, with screenshots | | `check-video-edges` | agent | The delivered file's edges, measured or judged from stills | | `check-api-edges` | agent | Bodies, replays, leases, auth and paths against a local build | | `record-edge-findings` | agent | One finding per failure, the case as its reproduction and its guard | Each verb can also end with `no_change`, `unknown` or `blocked`, and proposes follow-up verbs instead of enqueueing them. Findings go through [findings to fixes](../findings-to-fixes/README.md): reproduce, propose-fix, fix, verify-fix by a different worker and add-regression-guard. Interface states use the [screenshot design review](../screenshot-design-review/README.md) capture matrix and the [accessibility audit](../accessibility-audit/README.md) layout rules; video edges use the [video QA](../video-qa/README.md) measurements. ## Worked examples All synthetic: a volunteer sign-up form, its API and its 45-second explainer. The plan places all 43 catalog classes, 17 chosen and 26 skipped with reasons, and pins an expectation for every label it runs. Seed 20261030 gives 178 cases. Ten run: a decomposed name stored unnormalized, a 02:30 shift start on 2026-03-08 in New York saved as 03:30, a repeated roster id overwriting a record and duplicate JSON keys accepted all fail; one case could not reach the build. The interface and video results find a submit button hidden at 200 percent zoom, a long name overflowing, a black poster and a caption hanging across a cut. While this pack was written, its tests found that Python 3.14 reads 24:00 as the next day's midnight where 3.10 and 3.12 refuse it. ## How to use it Run `make check` in [code/](code/README.md). Write the nouns in [nouns.json](nouns.json) create-only with a key scoped to your team's surface, then fill a template from [verbs.json](verbs.json) with `scripts/build_packs.py --instantiate