AI shipped it. You found the gaps.
Impossible states ship as real
Cancelled and confirmed. Sold out and bookable. Unverified and checked out. AI builds screens that allow combinations the product should never allow.
Dependencies get skipped
Publish without approval. Pay without a hold. Invite without a role. Prerequisites that define the product disappear — the agent only wired the happy sequence.
States have no way out
Users get stuck mid-flow with no cancel, retry, or handoff. Valid paths in, missing transitions out — the state machine was never designed, only generated.
Install in one command.
A headless product-design skill for your AI coding agent — then run the design → implement → verify loop on your next feature.
MIT · open source. Star on GitHub if Lamina saves you a loop.
npx skills install aryaniyaps/laminaWorks with your coding agent
Cursor
Claude Code
Codex
Gemini
Pi
- and more
Product behavior, not another UI skill.
Lamina structures product behavior — states, edges, and flows — before your agent writes a line of app code.
Design is how it works
The only AI skill for product behavior — not pixels.
Design skills agents lack
UI skills polish pixels. Lamina teaches product behavior — states, roles, recovery — so your agent builds the right thing.
Persona-based simulation
Parallel subagents walk your application as real actors — travelers, admins, partners — not one generic user.
Any interface, any stack
Web, mobile, desktop, CLI — Lamina slots into your framework, database, and UI layer. Pair any design skill; Lamina stays out of pixels and never writes app source.
Missing your stack? Lamina is unopinionated — if your agent can read implement.md, it fits.
Compatible with stacks including Next.js, React, Vue, Angular, Astro, Svelte, Expo, Flutter, NestJS, Django, Postgres, MongoDB, Redis, Supabase, Prisma, Tailwind, TypeScript, Docker, Vercel, Cloudflare.
Design → implement → verify → fix.
Your coding agent writes app source. Lamina owns product behavior — what to build, how states and flows work, which edges to cover. The loop shows up in the session itself.
.lamina/runs/a3f2/session.jsonl
- DESIGN
Domain charter → run.yaml + implement.md
{"role": "user","message": {"content": [{"type": "text","text": "/lamina-design guest checkout — hold, pay, cancel"}]}} {"role": "assistant","message": {"content": [{"type": "text","text": "Contract ready → .lamina/runs/a3f2/"}]}}- IMPLEMENT
Your agent writes app source — Lamina never does
{"role": "user","message": {"content": [{"type": "text","text": "Implement from .lamina/runs/a3f2/implement.md"}]}} {"role": "assistant","message": {"content": [{"type": "tool_use","name": "Write","input": {"path": "app/checkout/page.tsx"}}]}}- VERIFY
Persona walks + invariants → fix.md
{"role": "user","message": {"content": [{"type": "text","text": "/lamina-verify"}]}} {"role": "assistant","message": {"content": [{"type": "text","text": "3 findings → .lamina/runs/a3f2/fix.md"}]}}- FIX
Agent applies product fixes from fix.md
{"role": "user","message": {"content": [{"type": "text","text": "Fix from .lamina/runs/a3f2/fix.md"}]}} {"role": "assistant","message": {"content": [{"type": "tool_use","name": "StrReplace","input": {"path": "lib/holds.ts"}}]}}- RE-VERIFY
Loop until the contract holds
{"role": "user","message": {"content": [{"type": "text","text": "/lamina-verify"}]}} {"role": "assistant","message": {"content": [{"type": "text","text": "Contract holds. 0 open findings."}]}}
Same prompt. Two builds. Product behavior is the gap.
HavenStay — a hotel booking platform built from scratch by Cursor Composer 2.5 with no human-written app code. With Lamina vs without.


Drag or use arrow keys to compare · Same prompt, two builds — Cursor Composer 2.5, no human app code
What Lamina designed into the build
Behaviors the without-Lamina build skipped
- Guest checkout
Inventory hold with countdown
15-minute hold and hold-aware availability — a room can’t stay bookable while someone else is paying.
- Cancellation
Policy locked at booking
Flexible / Moderate / Strict per property, snapshotted immutably when the guest books.
- Partner go-live
Admin gate before publish
Property goes live only after approve, reject, or request-changes — not on submit alone.
- Partner onboarding
Wizard with readiness checklist
Multi-step setup that tracks what’s still missing before a property can accept guests.
- Guest cancel
Reason required, refund automatic
Cancel path asks why, then triggers the guest refund from the snapshotted policy.
Four commands. One contract loop.
Install once, then run init → design → verify around your coding agent. Output stays in .lamina/runs/<id>/— no app source, no visual styling.
$ npx skills install aryaniyaps/lamina# Domain charter — Scope the product domain before design/lamina-init Exam hall ticket system for universities# Design contract — Writes ready_to_build contract to .lamina/runs/<id>//lamina-design Hall ticket download with payment gate and venue assignment# … build with your coding agent from implement.md …# Verify — Persona walks surface gaps → fix.md when needed/lamina-verify# … fix product issues from fix.md with your coding agent …# Verify again — Re-run until the contract holds/lamina-verify
add real product design skills to your agent
npx skills install aryaniyaps/lamina