# Sample-site Markdown test catalog

34 standalone browser tests; ten optional section files. The deepest test is four folders below the catalog root.

Catalog root: [`sample-site/`](sample-site/). Tests use `.snag.md`; optional `section.md` supplies guidance, and other Markdown is ignored.

## Run and inspect

From the SnagBadger checkout, install the pinned toolchain and dependencies, then build the workspace. Start the maintained site with `pnpm dev:examples`; use its printed URL as `<sample-base>`. Keep the server and outputs owned by that worktree. For deployment, `<sample-base>` includes the repository prefix.

```sh
node tooling/testing/plan.mts inspect --catalog examples/test-plans/sample-site
```

To execute, use the run-test-plan skill with this catalog and the agreed base URL. Configure your installed browser MCP for genuinely new contexts and a fresh delegated worker per test. See [the runtime contract](../../docs/integration/testing-runtimes.md). The standalone CLI needs its bridge requests serviced by that coordinator; it is not unattended browser automation.

```sh
node tooling/testing/plan.mts start --catalog examples/test-plans/sample-site --output test-results/sample-run-UNIQUE --runtime <your-runtime.json> --tag smoke
```

`<sample-base>` is prose shorthand supplied to the coordinator, not runner variable interpolation. Most checks use the developer controls: use `pnpm dev:examples`, not a production build that intentionally hides those controls. A usable existing server may also be supplied.

## Reading the hierarchy

- Root `section.md`: browser executor, acceptance level, screenshot requirement, optional video, sample Jira destination, server preflight and per-test cleanup.
- Profile persistence has deeper fixed/buggy sections, selecting the mode in a per-test instruction hook. No authentication exists on this sample site; see [function-hook configuration](../../docs/integration/agent-testing.md#lifecycle-hooks) for an actual authenticateUser integration.
- `profile/form`, `profile/navigation`, `plain-html/interaction`, and several deep theme/recorder directories have no section file: directories still create report groups and inherit their ancestors.
- Plain HTML and branding explicitly disable the root navigation hook before supplying their own. The navigation test overrides inherited cleanup. Setup runs root to leaf; cleanup reverses it.
- Branding replaces the inherited destination with Jira `SAMPLE-BRANDING`. Both project keys are illustrative: replace them for your project, and never submit the demo findings automatically.
- Smoke is assigned selectively to individual tests, not the root: saying “execute smoke test plan” excludes known failures and most extended checks. `sample-site`, `mobile`, `keyboard`, `privacy` and other tags demonstrate inherited and local filtering.
- Recorder tests override optional video with required video; unavailable proof yields incomplete. Mobile and system-appearance tests require actual viewport/device capabilities; missing action capabilities should be reported blocked.

## Expected failures and evidence

The two `profile/persistence/buggy` scenarios carry inherited `known-failure` tags and should fail the product persistence expectation. The fixture is deliberately broken. There is no expected-failure/x-fail schema field; keep the failed attempt and use its Create bug draft to explore reporting. Fixed mode retains state only within the current page; reload deliberately resets it.

A site demo recording or “illustrative evidence” checkbox is not the runner video. Record real screenshots/video and assertion observations separately. The site’s local simulations do not submit Jira reports or durably save drafts. Each case is independent: it must not consume state produced by the previous case.

The catalog is authored coverage, not a claim that every Markdown scenario was agent-executed. Parser/selection validation and maintained automated browser journeys verify the examples and sample behaviors; execution produces a separate report.

## Inventory

| Test                                                                                                                                   | Tags                   |
| -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- |
| [Profile starts with a reproducible fixture](sample-site/profile/form/initial-state.snag.md)                                           | smoke                  |
| [Empty name disables saving](sample-site/profile/form/empty-name.snag.md)                                                              | validation             |
| [Whitespace-only name disables saving](sample-site/profile/form/whitespace-name.snag.md)                                               | validation             |
| [Profile treats markup as literal text](sample-site/profile/form/literal-text.snag.md)                                                 | security               |
| [Save the fixed form with the keyboard](sample-site/profile/form/keyboard-submit.snag.md)                                              | keyboard, smoke        |
| [Fixed save survives in-page navigation](sample-site/profile/persistence/fixed/save-roundtrip.snag.md)                                 | smoke                  |
| [A later fixed save replaces the earlier value](sample-site/profile/persistence/fixed/replace-save.snag.md)                            | regression             |
| [Reset restores the fixture while retaining mode](sample-site/profile/persistence/fixed/reset.snag.md)                                 | regression             |
| [Reload resets the page-local fixture](sample-site/profile/persistence/fixed/reload-boundary.snag.md)                                  | regression             |
| [Saved name should remain after navigation](sample-site/profile/persistence/buggy/save-roundtrip.snag.md)                              | inherits known-failure |
| [Save confirmation should match stored value](sample-site/profile/persistence/buggy/confirmation-consistency.snag.md)                  | inherits known-failure |
| [Navigate between the maintained example pages](sample-site/profile/navigation/links.snag.md)                                          | smoke                  |
| [Plain HTML host responds to clicks](sample-site/plain-html/interaction/button.snag.md)                                                | smoke                  |
| [Plain HTML interaction works with keyboard](sample-site/plain-html/interaction/keyboard.snag.md)                                      | keyboard               |
| [Optional reporter mount starts empty](sample-site/plain-html/integration/empty-mount.snag.md)                                         | integration            |
| [Presentation links to the recording workspace](sample-site/branding/presentation/start-recording.snag.md)                             | smoke                  |
| [Start and stop a demo recording](sample-site/branding/recorder/lifecycle/start-stop.snag.md)                                          | smoke                  |
| [Pause freezes the timer and resume advances it](sample-site/branding/recorder/lifecycle/pause-resume.snag.md)                         | regression             |
| [Review a demo report without illustrative media](sample-site/branding/recorder/review/save-without-recording.snag.md)                 | smoke                  |
| [Record again returns to setup](sample-site/branding/recorder/review/restart.snag.md)                                                  | regression             |
| [Escape closes the recorder and restores focus](sample-site/branding/recorder/accessibility/escape-focus.snag.md)                      | keyboard               |
| [A selected failure seeds an editable draft](sample-site/branding/reporting/failure-drafts/create.snag.md)                             | smoke                  |
| [Evidence choice survives review and back navigation](sample-site/branding/reporting/failure-drafts/evidence/evidence-opt-out.snag.md) | privacy                |
| [Complete a local simulation without submission](sample-site/branding/reporting/failure-drafts/complete-local.snag.md)                 | smoke                  |
| [Brand name and accent are editable](sample-site/branding/themes/palette/brand-name.snag.md)                                           | branding               |
| [Directions retain independent palette edits](sample-site/branding/themes/palette/direction-state.snag.md)                             | branding               |
| [Reset restores system appearance and defaults](sample-site/branding/themes/appearance/manual-reset.snag.md)                           | branding               |
| [System appearance follows the device](sample-site/branding/themes/appearance/system-follow.snag.md)                                   | capability-dependent   |
| [Typography changes and resets predictably](sample-site/branding/themes/typography/default-and-reset.snag.md)                          | branding               |
| [Reporter theme changes preserve host styles](sample-site/branding/accessibility/desktop/host-style-isolation.snag.md)                 | integration            |
| [Presentation and recording fit a phone](sample-site/branding/accessibility/mobile/pages.snag.md)                                      | smoke                  |
| [Recorder dialog fits a phone](sample-site/branding/accessibility/mobile/recorder-dialog.snag.md)                                      | keyboard               |
| [Recorder remains usable without the default skin](sample-site/branding/integration/optional-skin.snag.md)                             | integration            |

| [Study directions wrap and preserve shareable URLs](sample-site/branding/navigation/directions.snag.md) | branding, navigation |

## Copying to your project

Copy the catalog directory and retain only behaviors your application has. Replace paths, fixture setup, expected outcomes and illustrative project destinations; change stable IDs when you introduce distinct tests. Frontmatter uses only the existing schema: optional section-local ID/title/tags here; executor, components, levels, instructions, destination, evidence and hooks inherit from sections. The [full contract](../../docs/integration/agent-testing.md) documents replacement and function hooks. Supporting Markdown may live inside the catalog. Prefix filenames for start order; numeric order has no precedence.
