| name | conformance |
| layer | stack |
| description | The crouton-conformance gate — the SECOND acceptance axis of graduation (the first is the experience side-by-side, /graduate stage C1). Checks a graduated app is a REAL crouton app — CLI-scaffolded, real collections, consumes the correct packages without reinventing them — by composing the existing probes (frontend-review, a11y, e2e-smoke, typecheck) plus crouton-structural checks, then renders a required, signed-off checklist on the graduation PR. Use at /graduate stage C2, or when asked "is this app crouton-native", "run the conformance gate", "check graduation conformance". |
| argument-hint | <app-path> [--comment] |
| allowed-tools | Bash, Read, Grep, Glob, Agent, mcp__github__add_issue_comment, mcp__github__pull_request_read |
Conformance Skill — the crouton-conformance gate (graduation axis C2)
A graduated app needs two signed-off acceptance axes (/graduate): experience
(it matches the signed-off spec — the side-by-side comparison, C1) and
crouton-conformance (it's a real crouton app, not a hand-assembled look-alike). This
skill is the second one. It exists because "it matches the POC" alone let v1 ship a
hand-assembled scaffold that 500'd at runtime on a green build (missing
server/db/schema.ts, #988) and reimplemented what packages already provide.
This is a gate, not a finding-rater. Unlike /frontend-review and /a11y (which
find and rate issues), this composes those probes with crouton-structural checks and
renders a required, signed-off checklist. It doesn't replace the probes — it runs
them and refuses to go green until each line is checked and a human has signed off
(lgtm, the #310 loop). Status is derived from that sign-off, never self-asserted
(the done-rule, AGENTS.md).
When to run
/graduate stage C2, after the experience gate (C1) is walking green.
- Any time you need to certify an app under
apps//pocs/ is crouton-native before promotion.
It needs an environment that can run pnpm typecheck + the e2e smoke. From a sandbox that
can't, run the structural checks (deterministic, static) and hand the probe lines to
the human to run — mark them ⏳ needs-human, never ✅.
The checklist (each line is a gate, each needs a sign-off)
Resolve <app-path> (e.g. apps/builder), then work the four groups. Structural is
deterministic and you run it; Probes compose existing skills; Docs is a grep + a
human read.
1. CLI-scaffolded (correct-by-construction, not hand-built)
The #988 class — a hand-assembled scaffold silently omits standard files and 500s at runtime.
test -f <app>/server/db/schema.ts && echo "✅ schema.ts" || echo "❌ MISSING server/db/schema.ts (the #988 500)"
grep -q 'nuxt prepare 2>/dev/null' <app>/package.json && echo "✅ guarded postinstall" || echo "❌ unguarded postinstall"
2. Real collections (not demo/stub blocks)
The collections ARE the data model the app composes — backend-free demo blocks are a POC crutch.
3. Consumes the correct packages — doesn't reinvent them (DRY)
The most important conformance check and the least mechanical: the app must use the
graduated package(s) + the standard stack, not re-implement what they export.
4. The probes (compose, don't duplicate) + docs
Render + gate
Render the four groups as one checklist with per-line status — ✅ pass · ❌ fail (with the
one-line reason) · ⏳ needs-human (a probe you couldn't run here). Then:
- Any
❌ → the gate is red. Fix and re-run; do not present it as passable.
- All
✅/⏳ → post the checklist on the graduation PR (--comment) and hold on
status:blocked for sign-off. The conformance axis is "done" only on a reply comment
containing lgtm/approve that names this gate — not a green build, not your own read
(the done-rule). A ⏳ line can't be signed off until a human runs it and flips it to ✅.
The app is promotable when both axes are signed off — this gate (C2) and the experience
comparison (C1). Never one, never a proxy.
Conventions
Defers to the root CLAUDE.md / AGENTS.md for the done-rule + the sign-off loop (#310/#572).
Composes /frontend-review, /a11y, /e2e-smoke, and pnpm typecheck rather than reimplementing
them. Invoked by /graduate at stage C2; the experience axis (C1) is the side-by-side comparison,
not this skill. Mirrors the review-family split (a focused, CI-gateable skill beside /review).