Reference
Check rules
Every rule prongs check applies, by profile: what it catches, how bad it is, and the fix. Each comes from the rule’s own package, so this page lists exactly what check runs.
Errors fail prongs check; warnings are reported but pass; info is a note. A deliberate exception takes // prongs-ignore: <reason> on the line above, and existing findings can be recorded in a baseline so only new ones fail.
Every profile
unknown-intent error
An intent that is not in the registry. Suggests the closest names, so a typo is one step from the fix.
<Action intent="action.delet">Delete</Action><Action intent="action.delete">Delete</Action>internal-intent error
A ref-only intent (a look, a status, a level) used where code should name a meaning. Suggests the meaning intents built on it.
<Action intent="control.primary">Save</Action><Action intent="action.save">Save</Action>deprecated-intent warning
An intent marked deprecated. Suggests the intent its "not for" line points to.
unknown-check warning
An intent asks for a per-intent check its profile does not implement.
UI
raw-element error
A <button>, <h2>, <input> or styled <p>/<span>/<a> instead of a component. Suggests the closest intents.
<button className="rounded bg-red-600 px-4 text-white" onClick={remove}>Delete</button><Action intent="action.delete" onClick={remove}>Delete</Action>raw-surface error
A <div> that draws its own box (background, border, shadow). Suggests a Layout intent that says what the region is.
<div className="rounded-lg border bg-white p-6">…</div><Layout intent="layout.panel">…</Layout>domain-mismatch error
An intent rendered by the wrong component, like an action on <Text>.
<Text intent="action.save">Save</Text><Action intent="action.save">Save</Action>leaf-classname error
className on <Text>, <Action>, <Field>, <Media>, <Dialog> or <Popover>, which take intents and layout props only.
<Text intent="text.caption" className="text-red-600">…</Text><Text intent="feedback.error">…</Text>leaf-style error
style on a component that takes no style. An inline style overrides the intent just like a className.
<Action intent="action.save" style={{ color: 'red' }}>Save</Action><Action intent="action.delete">Delete</Action>layout-visual-class error
Colours, type or borders in a <Layout> className, which is for layout and spacing only.
<Layout intent="layout.group" className="gap-4 bg-muted">…</Layout><Layout intent="layout.panel" className="gap-4">…</Layout>repeated-tweak warning
The same layout class added to the same <Layout> intent in three or more places, across the whole project. Each is allowed, but a tweak that repeats is a missing intent: points to an intent that already has it, or a ready add-intent command. check --suggest lists these with the overrides.
<Layout intent="layout.group" className="gap-4">…</Layout> // and in 15 other places<Layout intent="layout.section">…</Layout>raw-style error
An inline style that sets colour, type or borders. Layout values and CSS variables are fine.
<div style={{ color: '#c00', fontWeight: 600 }}>…</div><Action intent="choice.color" vars={{ '--choice-color': color }} />unsafe-classname warning
The escape hatch. A warning with a // prongs-unsafe: <reason> comment on the line above, an error without one; counted by --max-unsafe.
name-mismatch warning
An action whose handler, label or text points to a different intent, through the intents’ keywords.
<Action intent="action.save" onClick={shareArticle}>Share</Action><Action intent="action.share" onClick={shareArticle}>Share</Action>raw-look error
A plain element with look classes that the other rules do not cover: a <div> with text colours, a <span> drawn as a dot, a styled <hr> or <iframe>. Inline SVG and the document root are allowed.
<span className="h-2 w-2 rounded-full bg-[var(--accent)]" /><Text intent="text.indicator" aria-label="Unread" />intent-selector error
CSS or a class that selects elements by data-intent. The attribute is for finding elements (analytics, tests, A/B tools); looks come from the registry.
[data-intent="action.delete"] { color: red; }'action.delete': { refs: ['control.destructive'] }unknown-token error
A registry class that reads a CSS variable nothing declares, so it resolves to nothing. Variables count as declared when a CSS file sets them or code passes them through vars.
'tone.accent': { binding: { classes: 'text-[var(--brand-blue)]' } }'tone.accent': { binding: { classes: 'text-primary' } }raw-value warning
A colour the theme cannot change: a literal (bg-[#e5383b]) or a Tailwind palette colour (text-sky-700) in a registry class, or a literal colour set as a CSS variable in style or vars. White and black are allowed.
'tone.info': { binding: { classes: 'text-sky-700' } }'tone.info': { binding: { classes: 'text-info' } }dynamic-intent info
An intent computed at runtime, so it could not be checked. A ternary of literals can be.
<Action intent={intentFor(state)}>…</Action><Action intent={following ? 'action.toggle' : 'action.add'}>…</Action>Errors
raw-error-response error
An error response written by hand. Suggests the error intents with the same status.
return NextResponse.json({ ok: false, error: 'Profile not found.' }, { status: 404 });return fail('record.missing', 'Profile not found.');leaked-error error
An error’s own message (error.message, String(err)) sent to the caller. It can expose internals and changes with every library.
return NextResponse.json({ ok: false, error: error.message }, { status: 400 });return fail('failure.internal', undefined, { cause: error });failure-with-200 warning
ok: false or success: false answered with 200, which clients and monitoring read as success.
return Response.json({ success: false, error: message });return fail('failure.internal', message);Logs
raw-console warning
console.* in app code. Nothing says who needs to know, and it may run in production. Scripts, tests, config files and the helpers themselves are left alone.
console.error('[sync]', error);log('incident.failed', 'Sync stopped', { cause: error });swallowed-error error
A catch whose only job is to print the error, so nothing notices the failure.
try { await sync(); } catch (e) { console.log(e); }try { await sync(); } catch (e) { log('incident.failed', 'Sync stopped', { cause: e }); throw e; }secret-in-log error
Something named like a token, secret, password or cookie passed to a log, unless it goes through a masking function first.
log('security.token', 'Bad token', { token });log('security.token', 'Bad token', { tokenPresent: Boolean(token) });