Use when building or modifying a JSON-driven walkthrough site with @jeswr/solid-showcase — authoring or validating walkthrough documents, rendering the four showcase pages, the walkthrough UI components (stepper, try-live, launcher, ecosystem map, persona card), the walkthrough.v1.json schema artifact, or the deploy helpers under ./next (zone rewrites, env matrix, vercel.json, health routes, metadata).
Resources
10Install
npx skillscat add jeswr/solid-sdk/solid-showcase Install via the SkillsCat registry.
Work with @jeswr/solid-showcase
One validated walkthrough document drives the whole site. Author the document, validate it
with parseWalkthrough, render it with the four page components, and wire deploys with the./next helpers. Never fork document content into components — the single registry is the
point.
The invariants parseWalkthrough enforces
All are hard errors, all reported AT ONCE, each with a stable code and a message naming
the chapter/step/role/check:
| code | rule |
|---|---|
registry-key-mismatch |
every registry.apps record key equals its entry's slug |
unknown-try-live-app / unknown-role-app / unknown-launcher-app |
every reference resolves in registry.apps |
duplicate-launcher-app |
launcherOrder has no duplicates |
duplicate-role-slug / center-role |
role slugs unique; exactly one center: true role matching registry.center |
unknown-role-scene |
roles[].scene names an existing chapter scene |
chapter-scene-order / duplicate-chapter-slug |
scenes contiguous 1..N in array order; slugs unique |
lead-budget / step-budget / min-steps |
editorial word/step budgets (defaults 40/65/2) |
underneath-required / underneath-length |
underneathRequired ⇒ non-empty points, each ≥ minUnderneathChars (default 20) |
unknown-compliance-chapter / compliance-scene-mismatch |
checks resolve to chapters with matching scenes |
editorial-floor |
overrides only TIGHTEN the schema floors (minSteps ≥ 2, minUnderneathChars ≥ 20) |
persona-honesty |
persona.descriptor must contain "fictional" or "simulated" |
editorialFindings(doc) returns the budget findings without throwing (CI gate:expect(editorialFindings(doc)).toEqual([])). walkthroughWarnings(doc) carries the
non-fatal role-first naming advisory (modelledOn must not appear inside appName).
Schema rules
- Schema-first: plain
z.objects, types inferred.brandingandthemeare COMPOSED
from@jeswr/solid-showcase-kit(brandingConfigSchema,themeSpecSchema) — never
redeclare them here; kit owns those contracts, and kit never imports from showcase
(acyclic edge). - The artifact
schema/walkthrough.v1.jsonis GENERATED: after any schema change runpnpm run build && pnpm run generate:schemaand commit the artifact —test/schema-sync.test.tsfails on drift. registry.apps[].podRoutes(optional, additive) declares an app's authenticated pod
API routes; it exists soenvMatrixcan require the forwarded-headers trust var on
exactly those projects.
Rendering rules
ShowcaseLayoutis client-side ("use client"): it builds the disclaimer pack viadocumentDisclaimerPack(doc)(cookie prefix defaults to{deploy.slug}-demo-consent-),
resolves the shell theme from the registry entry at path "/" (neutral fallback
otherwise), and renders kit AppShell variant "own" + Launcher + ConsentInterstitial.- Landing/chapter/compliance renderers are server-safe; they pass only serializable
document data into the client building blocks. - Chapter routes live at
/chapters/{slug}, the lens at/compliance. Guard unknown
slugs withchapterBySlug(doc, slug)before renderingShowcaseChapterPage— it
throws on unknown slugs.ShowcaseCompliancePagethrows whendoc.complianceis
absent; only route to it when configured. - Honest degradation is a contract, not a style: try-live and launcher entries for
undeployed zones stay VISIBLE as href-less placeholder links witharia-disabledand
an explanation. Never hide them, never leave a navigable href to a dead zone.
Deploy helpers (./next)
zoneRewrites(doc, { env?, fallbackSuffix? })— two rules per zone app (prefix,prefix/:path+); unset env vars fall back tohttps://{slug}.invalidso they can never
route anywhere real. Zone URLs are read at BUILD time — changing one needs a shell
redeploy, and the build env allowlist must include the zone vars.envMatrix(doc)— zone-URL vars target the shell project; the{envPrefix}_TRUST_FORWARDED_HEADERS=1spec targets exactly thepodRoutesapps.appVercelJson(app, doc)— pair with a project-levelrootDirectoryofapps/{slug}
and CLEARED project-level build overrides (they silently win oververcel.json).healthRoute(service)→export const { GET } = healthRoute("{slug}"); the payload is
honestlysimulated: true.showcaseMetadata(doc)is always noindex/nofollow.
Domain-generic gate (the whole point)
This package is a GENERIC multistakeholder walkthrough framework. No use-case or domain
string may enter src/, tests, docs, or shipped artifacts — test/domain-generic.test.ts
greps the whole package for a banned-term roster and must stay empty. Real walkthrough
documents (and their golden tests) live in consumer repositories; the fixture here is a
fictional trail-expedition flow. Never "improve" the fixture with real-world content.
Verify API usage against the published dist, run the workspace gate after changes, and
never weaken the malformed-document suite or the grep gate.