Release · May 26–29, 2026 · v0.6.27
What's new
This wasn't a patch week. We shipped a composable product platform — first-run onboarding with a live sidebar preview, a four-app switcher, tenant authoring, settings that finally split personal from workspace, Product Studio for builders, and AI guardrails so agents stop inventing off-brand hubs. Everything below is from the running reference app.
Step 1 · Product — Prism, One, or Custom. Built-ins lock wordmark + brand; Custom opens the name and color editor.
I · Compose a product
Onboarding is the first screen.
Builders no longer land in an empty shell. Add new product in the five-step wizard — pick Custom (or Prism / One), name it, set scope + persona, build starter nav — with the sidebar updating live on every choice. Re-pick without stale preview; type nav labels and icons infer themselves.
II · Four apps, one switcher
Prism, One Schools, One Sites — and yours.
Exxat One is two switcher entries, not a sub-toggle. Custom products get suffix URL slugs (`/assessment/*`), their own theme surface,
and isolated persistKey prefixes so Library filters never leak across apps. Switching hard-redirects to that product's dashboard.
III · Settings grew up
Profile vs Organization — finally.
Personal theme, contrast, text size, and coach-mark resets live in Profile. Products, brand colours, default startup, hide/show, and Add product live in Organization. End users always see the product list; builders get authoring controls in dev.
Appearance card rebuilt
Brand tint mixes against neutral --card — Blue reads blue, not Prism pink bleed.
Wordmark editor aligned
Inline suffix input matches ExxatProductLogo baseline in Add product.
Logo cascade
Full wordmark → suffix-only → wrapped suffix at narrow sidebar widths.
Builder floor in prod
Authoring UI gated to import.meta.env.DEV — coordinators never see Add product in deploy.
IV · The hubs you ship against
Same patterns — product-scoped.
Library now mounts under /prism/library/* (and custom roots). Secondary panel, seven view tabs,
flat KPI band, collaboration header, and dashboard charts — unchanged IA, namespaced state.
Starter scaffolds ship the real dashboard composition, not a marketing placeholder.
DataTable fills the canvas
Grid stretches when columns are narrow — no awkward empty gutter.
Sidebar labels wrap
SidebarNavLabel — long hub names break lines instead of truncating mid-word.
Secondary panel elevation
OKLCH brand tint per active product — not a flat grey rail.
SidebarDrillIn exported
Settings / Tokens category pickers ship from the package barrel.
V · AI that asks first
Agents post a brief — or they don't ship.
0.6.0 lifted the product framework and wired a Cursor brief-gate hook. By 0.6.12 it stops trapping consumer apps.
Consumer repos now get exxat-product-context, domain-context skill, and 45 binding rules via sync-extras.
The agent must declare Product / Scope / Persona before writing a hub.
What this means in review
When a PM asks Cursor to "rebuild the courses page," the agent should pause, post a design brief, and map to ListPageTemplate + reference hub —
not drop charcoal bg-primary buttons and a raw card grid. If it doesn't, the hook blocks the write.
VI · Feedback & polish
No toasts. Banners instead.
Sonner is gone from the package. Product feedback routes through LocalBanner, inline status, and dialogs — the pattern you already spec in hub flows. Plus HC polish on secondary panel, view tabs, and ToggleSwitch green "on" track.
Resize handles off tab order
WCAG 2.4.7 — no invisible column tab-stops in DataTable.
Dev reload storm fixed
Persisted-state no-op writes + builder sync no longer thrash Vite on every hub mount.
Onboarding blob fixed
Background gradient no longer clips at the wizard inset bottom.
Package half the size
Source maps dropped from npm tarball — faster installs for design partners.
VII · Day by day
The arc of the week.
0.6.0 — Platform lift
Product framework package, defineProduct(), brief-gate hook, multi-product routing docs, sync-extras postinstall.
0.6.3–0.6.7 — Install quality
Tailwind self-scan fixes unstyled scaffolds; zero-warning pnpm dev; consumer Cursor rules attach in Vite apps.
0.6.14 — Tenant persistence
Settings split begins; products survive reload via centralized store + dev sync.
0.6.16–0.6.18 — Builder authoring
Shipped catalog, add-product CLI, authoring roles, SidebarDrillIn export, reload-storm fixes.
0.6.20–0.6.27 — Onboarding + shell
Five-step wizard rebuild, Product Studio, first-visit redirect, real starter dashboard, product-framework boundary, no-toast, auto-upgrade on install.
VIII · The full inventory
More than fits one page.
28 semver bumps in four days. Below is everything UX-facing that landed — including the plumbing designers don't see until it breaks.
If it's not here, it's in packages/ui/RELEASES.md from 0.6.0 through 0.6.27.
Platform & routing
@exxatdesignux/product-frameworkpublisheddefineProduct()+registerProducts()- Four-app switcher (Prism, One Schools, One Sites, Custom)
- URL-is-truth product adoption on direct visits
productPersistKey()— no cross-app filter leaks- Custom suffix slugs (
/assessment/*) - Library under product roots + back-compat alias
- First-visit → onboarding; then default dashboard
- Custom nav active state at runtime
- Empty default tenant catalog (no seeded Assessment)
Builder authoring
- Product Studio — catalog sync, route roots, checklist
- Add product CLI + shipped catalog import
tenant-products.jsondev sync (no reload trap)- Builder mode on in dev; end-user mode in prod builds
- Authoring hard floor —
import.meta.env.DEV - Wordmark editor aligned with
ExxatProductLogo - Logo cascade: full → suffix → wrap
- Suffix clamped to 24 chars in registry
- Appearance card — brand tint on neutral card
- Restart onboarding from Profile settings
Onboarding wizard
- 5 steps with live sidebar preview
- 3-card picker — ring selection, no black fill
- Built-ins lock wordmark + brand colour
- Re-pick product without stale preview
- 80-icon FA matcher from label text
- Suggested nav rows (Library, Reports, …)
- Enter / Esc workflow shortcuts
- Leaner copy — no ALL CAPS eyebrows
- BlobBackground clip fix at wizard bottom
- Per-device completion flag
Shell & hubs
- Real starter dashboard (KPI + charts, not marketing cards)
SidebarNavLabel— wrap, don't truncate- Secondary panel OKLCH brand elevation
SidebarDrillInin package barrel- DataTable fills canvas when columns are narrow
- Seven hub view types parity
- Org settings product list for end users
- Profile / Organization settings split
- Product switcher with mark colours
- HC polish on panel, tabs, ToggleSwitch
AI & consumer DX
- Brief-gate hook — ask before design-critical writes
exxat-senior-ux+ discovery protocol- 45 binding Cursor rules via
sync-extras - 23 AI skills vendored to consumer apps
exxat-product-contextruleexxat-domain-contextskillexxat-ui upgrade— port shell filesexxat-ui doctor— drift detection- Postinstall auto-upgrade on fresh installs
- Zero-warning
pnpm devon scaffold
Quality & packaging
- Sonner removed — no-toast guardrail
- Package tarball ~50% smaller (no source maps)
- Tailwind self-scan — scaffolds styled on install
- Persisted-state no-op write guard
- Resize handles off tab order (WCAG 2.4.7)
next-themes+react-router-domrequired peers- Consumer rules globs fixed for Vite apps
- RELEASES.md renamed (no 120 KB in node_modules)
- 198 tokens · 90 components in package
- Builder onboarding handoff doc shipped