Group L closes the three UI smoke-test gaps the verify-sweep flagged:
#142 sovereign wizard — tests/e2e/playwright/tests/sovereign-wizard.spec.ts
#143 admin voucher UI — tests/e2e/playwright/tests/admin-vouchers.spec.ts
#144 unified bp-<x> grid — tests/e2e/playwright/tests/marketplace-cards.spec.ts
Tests target the actual shipped UI shape (Pass 105+):
* Wizard step model is StepOrg → StepTopology → StepProvider →
StepCredentials → StepComponents → StepReview, not the original ticket's
StepDomain/StepHetzner draft from before the unified-Blueprints refactor.
* Admin voucher model uses an `active` toggle, not ISSUED/REVOKED status.
* "Marketplace card grid" = the Catalyst wizard's StepComponents (bp-<x>
Blueprints), NOT the SME marketplace at core/marketplace (which is for
SaaS Apps). Today every Blueprint is `visibility: unlisted`, so the test
asserts the data layer (catalog.generated.ts) plus the documented
EmptyState; once `visibility: listed` lands, the third assertion
auto-extends to the rendered card grid.
Per principle #4 ("never hardcode"), all URLs come from env vars with
sensible local-dev defaults. Per principle #1 ("never speculate"), tests
self-skip with explicit reasons when their target app isn't reachable
instead of fail-noisy.
CI: .github/workflows/playwright-smoke.yaml boots the Catalyst UI in the
background and runs the suite on PRs touching UI sources or tests; admin
and marketplace specs self-skip in that workflow because spinning up all
three Astro apps + catalyst-api + Postgres is the full E2E pipeline's
job, not this smoke.
Local run (Catalyst UI on :4399, admin on :4398): 5 passed, 2 skipped
(skip reasons: marketplace #3 needs StepComponents reachable past
required-field gating; admin #2 needs ADMIN_TEST_COOKIE for an
authenticated session).
Refs: #142, #143, #144