The current docs-shell route map is `/uix/components/{kebab}`. Components
without a routed page are reported as `SKIP no route`; routed pages without
`data-perm-step` or `perm-axes` opt-in are reported as
`SKIP no perm instrumentation`. Override the prefix with
`PERM_ROUTE_PREFIX=/some/path` when testing another shell.
Exit codes:
- `0` — every demo with `data-perm-step` passes all permutations.
- `0` — every instrumented routed demo passes all permutations. If no routed
demo is instrumented yet, the runner exits cleanly and says so.
- `1` — at least one permutation failed.
- `2` — no dev server / no morfos found.
Demos without `data-perm-step` are skipped with a `SKIP` line (they haven't opted in yet).
Demos without `data-perm-step` / `perm-axes` are skipped with a `SKIP` line
(they haven't opted in yet).
---
@ -139,9 +147,12 @@ v1 covers "click through a state sequence and validate after each step." v2 adds
### Layout plumbing
`web/routes/+layout.svelte` parses `?perm.*` params once at mount, exposes them via a context at `web/routes/_perms.svelte.ts`, and also honours `?perm.dir=ltr|rtl` and `?perm.locale=es|en` by routing through the existing `App.setDir` / `App.setLocale` path (so the control strip stays in sync).
> **Note (2026-05-08):** routes were relocated from `src/routes/test/soma/` to `web/routes/` during the active-uix cleanup. The `_perms.svelte.ts` context wiring referenced above predates that move and may need re-implementation when permutation testing is re-enabled on the new demo tree.
The old `/test/soma` shell used a shared `_perms.svelte.ts` context. That
shell was retired; the current runner only provides the URL variants and
expects each routed page under `web/routes` to read `?perm.*` params directly
or through a new shell-level helper when we decide to add one. Until a page
does that and declares `perm-axes` / `data-perm-step`, it is skipped rather
than counted as coverage.
### Demo opt-in
@ -149,14 +160,13 @@ Read the perms and use them as **initial** state (not live-bound — the user ca
```svelte
<scriptlang="ts">
import { Perms } from '../_perms.svelte';
const perms = Perms.getOr({} as Record<string,string|number|boolean>);