Frontend Design Skill
Ad-hoc mode — outside the engine, YOU run this loop now
One question decides which mode you are in: is a /implement-ticket run
dispatching this?
| Situation |
Who owns the UI write |
This skill is |
| A ticketed run — the UI directive set is dispatching |
directives/ui/* |
a reference it cites |
| Anything else — "build me the page", "improve this form", "implement the approved design" |
you, in this turn |
the executor |
| A renderer axis is in play — WebGL / Three.js / canvas / scroll-scrubbed video |
still you — the renderer is a grounding question, not a second executor |
the executor, grounded via search_stack |
The third row is an axis, not an owner. Renderer selection resolves through
machinery that already exists: search_stack in
corpus-grounding
(scripts/decision_engine.ts), whose stack corpus carries threejs.csv among
its stacks, read beside the register in
design-intelligence
§ Register. No second frontend executor is declared, and none is needed: a
renderer changes what you ground against, never who writes the UI.
Outside the engine, nothing else owns the design quality of a UI write. Reading
this skill and then writing the UI from priors is the failure it exists to
prevent — the loop below is not optional context, it is the work.
Skip only when the change is ui-trivial, decidable off the diff: ≤ 1 file,
≤ 5 changed lines, no new component, no new state, no new dependency. Anything
else runs the loop.
The loop
Audit first — run existing-ui-audit.
What already exists (components, tokens, layout conventions) outranks every
heuristic below. Reinventing an existing component is the #1 failure mode.
Brief — seven keys before any code. Five are the ones the engine gates
(REQUIRED_BRIEF_KEYS): layout, components, states, microcopy,
a11y. states means all five of empty, loading, error, success,
disabled — a brief missing one is unfinished, not concise.
Two more are declared, not gated: frequency and initiation. The
engine does not halt on them, and that is stated rather than left to be
discovered — adding a required key would halt every brief already written
against the five.
| Key |
Values |
Why it is declared and never inferred |
frequency |
one-time · low · medium · high (100+ per day) |
How often a surface is used decides whether motion on it reads as polish or as a toll. Nothing in a diff reveals it. |
initiation |
keyboard · pointer · system |
A keyboard-initiated surface is reached by someone who already knows where they are going; an animation there is pure latency. |
Both are prefilled from the surface's role and overridden only on evidence.
There is no resolver and no inference from handlers: a mousemove listener
is not proof of pointer initiation, and a keyboard shortcut in the code is
not proof anyone uses it.
| Surface role |
frequency |
initiation |
| Command palette |
high |
keyboard |
| Tooltip |
high |
pointer |
| Modal / sheet |
medium |
pointer |
| Onboarding flow |
one-time |
pointer |
| Toast / notification |
medium |
system |
| Table row action |
high |
pointer |
The default for a role not listed is medium / pointer, stated in the
brief as a default rather than left blank.
Inventory — only when an artifact was provided, and before you build.
List the artifact's interactions, keyframes, and script includes from its
source (design-fidelity-mechanics § Data-basis ladder — read it, do not
look at a picture of it). Then place every listed item in exactly one
bucket, using the engine's own names (apply.ts, COVERAGE_BUCKETS) so the
two surfaces read the same. Nothing enforces that they stay the same —
this is a copied vocabulary, not a shared constant, and no test pins it;
renaming a bucket in the engine leaves this list stale and silent:
| Bucket |
Meaning |
honoured |
carried over as-is |
translated |
carried over in a different shape (a handler became a framework binding) |
flagged |
not carried over — with the reason, in the output |
Dropping a handler stays allowed; hiding one does not. An item in no bucket
is the failure this step exists to catch — "missing JavaScript" is what it
looks like from the user's side. Inside the engine this is enforced
(apply.ts, COVERAGE_BUCKETS, an unaccounted item is a halt); out here it
is a duty you carry, and nothing checks it for you. (fixture:
daf-adhoc-port-coverage.)
Build — against the audit's primitives, in the project's stack. Where the
artifact's own markup/CSS/JS is stack-compatible, adapt that code;
re-deriving it from scratch is a deviation needing confirmation
(design-fidelity-mechanics § Adopt the code).
Review, then re-enter — run design-review
before calling it done, and scope the verdict honestly: render-scoped when
you can render it, otherwise explicitly static-scoped, naming which checks
actually ran. "Looks good" with neither scope named is a verdict without
evidence. Findings → fix them and re-enter step 5, at most 2 rounds,
and stop early on a null: a round that produces no new finding ends
the loop, and a round that produces only findings the provided artifact
already covers produces no new finding. At the 2-round ceiling with findings
still open, stop and hand the remaining list back — ship-as-is or abort is
the user's call, never another silent pass. Judgement alone never buys a
third round.
The ceiling is 2, the same number the engine enforces
(directives/ui/polish.ts, POLISH_CEILING), so the ad-hoc path and the
ticketed path bound the loop identically rather than by two conventions that
can drift. Fixtures: daf-adhoc-converges (round 2 is a null, loop ends) and
daf-adhoc-ceiling (findings remain at the ceiling, loop hands back).
The floors — pulled immediately before the write
PULL references/craft-floor.md IMMEDIATELY BEFORE THE WRITE, NOT AT SKILL LOAD.
Twelve universal floors that do not vary by mode, register, intent or stack.
They were inline here until the delivery point moved: a floor read at skill-load
time can be a compaction away from the write it governs (ADR-227).
One precedence rule stays here because it is authority, not craft: the audit
outranks every heuristic. Say [audit override] when it does.
Positioning — reference inside the engine, executor outside it
Inside a /implement-ticket run, fe-design is a universal reference
skill: it carries stack-agnostic heuristics the UI directive set cites, and
it does not own the flow. The ownership table below applies to that mode.
Outside the engine the table has no dispatcher behind it — the ad-hoc loop
above is the owner instead.
When to use
Cite this skill when:
- Planning a new page or feature UI before implementing
- Choosing between component patterns (modal vs. inline, table vs. cards)
- Designing forms with complex validation or multi-step flows
- Making responsive design decisions
- Reviewing UI for accessibility and usability
Inside a ticketed run, do NOT use this skill to:
- Implement components — that is the apply-step's stack-dispatched skill
- Audit an existing UI — that is
existing-ui-audit
- Drive the full UI flow — that is the
directives/ui/ orchestrator
Outside a ticketed run, the first and third lines invert: no dispatcher is
running, so implementation quality and the flow are yours. The second holds in
both modes — the audit is always existing-ui-audit; you invoke it, you do not
replace it.
Resource-first, before taste. Any request to recreate / redesign / mock /
prototype / improve an existing UI runs the
resource-first context gate
FIRST — search the project's tokens/design-system/assets, hard-stop and ask
when a referenced source is inaccessible (never invent from memory), and
prefer code over screenshots for exact values. Planning here starts from that
inventory, not from generic aesthetic memory (design-artifact lifecycle,
Inspect stage).
How the directive set cites this skill
directives/ui/design.ts produces the design brief (layout, components,
states, microcopy, a11y). Selection decisions (style, semantic color
tokens, typography pairing, layout pattern, anti-patterns) come grounded
from design-intelligence — run its
corpus query first; fall back to the heuristics in this reference only
where the corpus reports an evidence gap or the audit already pins a
project pattern. Stack-specific choices come from the dispatched
implementation skill, not from here.
When the corpus is not installed. design-intelligence ships in the
frontend-design pack; this skill ships in engineering-base. A consumer
who installed only laravel or only react therefore has this skill and
not the corpus. Fall back to the heuristics here and say so in the
result — "selected from heuristics; frontend-design not installed, so no
corpus grounding". The evidence-gap fallback above is about a corpus that
answered "nothing here"; this is about a corpus that is absent. Never
present an ungrounded pick as grounded, and never record a missing pack as
an evidence gap.
Section index — load on demand
Load the reference file whose sections the task needs — never all of them by default:
references/design-patterns.md — Component Architecture · Form Design · Table Design · Responsive Strategy · Accessibility (a11y) · Motion — decision-tree and rationale · UX Principles · Craft details — typography & imagery · Presenting variants
references/design-read-and-memory.md — Cross-task design memory — read DESIGN.md / PRODUCT.md first · Register — brand vs product · Design Read — articulate intent before generating · Aesthetic direction
Procedure
When directives/ui/design.ts (or any caller) cites this skill:
- Inspect
state.ui_audit first — review the audit produced by existing-ui-audit; it is mandatory. Stop and request the audit if missing.
- Pick the smallest matching section — Component Architecture, Form Design, Table Design, Responsive Strategy, Accessibility, or UX Principles. Cite by H2/H3 heading, never paste the whole skill.
- Defer to audit findings — when the audit pins a project pattern (token, primitive, layout convention), use it. The heuristics here are fallbacks for gaps, not overrides.
- Defer to the stack apply skill — Blade vs. Livewire vs. Flux vs. React-shadcn choices come from the dispatched implementation skill, never from this reference.
- Surface conflicts — if a heuristic here contradicts an audit finding or stack convention, name both and let the caller decide; do not silently pick.
Output format
When this skill's content is folded into a design brief or review:
- Quote the cited heuristic verbatim, with the H2/H3 heading and a one-line "why this applies" tie-back to the request.
- Map each heuristic to a concrete artifact in the brief (component, form section, table column, breakpoint rule, a11y check, UX state).
- Keep stack-agnostic — never name Blade/Livewire/Flux/React primitives in the cited prose; the apply step adds those.
- Mark anything overridden by audit findings as
[audit override] and link to the audit entry.
Related
- Orchestrator:
directives/ui/ — owns the UI flow
- Pre-step (mandatory):
existing-ui-audit — inventory before design
- Stack apply skills (dispatched, not standalone):
- Adjacent reference:
dashboard-design — monitoring dashboard design (different domain)
Gotcha
- Don't design components without running
existing-ui-audit first — the audit's component/token inventory is the canonical source for "what already exists in this project". Reinventing is the #1 failure mode.
- Heuristics in this reference apply across stacks; do not promote them to project rules without checking the audit.
- Mobile-first is not optional — every layout must work on 320px width.
Read the authority object — never re-infer it
Read the resolved ui_authority
(contract) before the loop:
surface_mode, register, change_intent, reference_maturity,
constraints. This skill is a declared consumer — a second decision table
beside the object is a drift surface, so do not re-derive any field.
surface_mode sets density, hierarchy and expressiveness only, per
design-modes § The second axis.
QUALITY FLOORS DO NOT VARY BY SURFACE MODE.
A FLOOR THAT MOVES WITH THE MODE IS A PREFERENCE WEARING A FLOOR'S NAME.
The source-led path
reference_maturity: runnable-artifact → the artifact's own markup, CSS and JS
is the data basis; adapting it is the default and a from-scratch
re-derivation is a deviation. Sort every mechanic into honoured / translated
/ flagged; one present, absent and unflagged is a silent drop, target zero.
Procedure and the vanishing-mechanic classes:
references/source-led-port.md.
Maturity is not decided here — it arrives on the authority object, and per-value
provenance belongs to road-to-frontend-fidelity-calibration Phases 0 and 2.
Anti-slop discipline
Before proposing a direction, scan the Visual (V1–V8) and Layout (L1–L10)
sections of design-antipatterns,
plus Motion (M1–M8) for the interaction layer.
On a match, choose differently or invoke the entry's own override condition in
the brief — every entry has one. Two of them, T7 and T8, are additionally
register-scoped: the brand and product registers admit different answers, and
neither admits an undeclared pick. The Q* floors are
in references/craft-floor.md instead of here, so
they arrive at the write rather than at skill load.
Do NOT
- Do NOT skip mobile viewport testing.
- Do NOT use fixed pixel widths for responsive layouts.
- Do NOT ignore accessibility requirements.
- Do NOT use this skill as an executor INSIDE a ticketed run — there the executor is
directives/ui/design.ts and this is the reference it cites. Outside one, the ad-hoc loop at the top of this file IS the executor; do NOT read the reference and then write the UI from priors.
1---2name: fe-design3description: Frontend design heuristics and the loop applying them: existing-ui-audit, brief, inventory, build, review. Use when building or changing any UI, not only when planning one.4---56# Frontend Design Skill78## Ad-hoc mode — outside the engine, YOU run this loop now910One question decides which mode you are in: **is a `/implement-ticket` run11dispatching this?**1213| Situation | Who owns the UI write | This skill is |14|---|---|---|15| A ticketed run — the UI directive set is dispatching | `directives/ui/*` | a reference it cites |16| Anything else — "build me the page", "improve this form", "implement the approved design" | **you, in this turn** | the executor |17| A renderer axis is in play — WebGL / Three.js / canvas / scroll-scrubbed video | **still you** — the renderer is a grounding question, not a second executor | the executor, grounded via `search_stack` |1819The third row is an **axis**, not an owner. Renderer selection resolves through20machinery that already exists: `search_stack` in21[`corpus-grounding`](../corpus-grounding/SKILL.md)22(`scripts/decision_engine.ts`), whose stack corpus carries `threejs.csv` among23its stacks, read beside the register in24[`design-intelligence`](../design-intelligence/references/context-and-registers.md)25§ Register. No second frontend executor is declared, and none is needed: a26renderer changes what you ground against, never who writes the UI.2728Outside the engine, nothing else owns the design quality of a UI write. Reading29this skill and then writing the UI from priors is the failure it exists to30prevent — the loop below is not optional context, it is the work.3132**Skip only when the change is `ui-trivial`, decidable off the diff:** ≤ 1 file,33≤ 5 changed lines, no new component, no new state, no new dependency. Anything34else runs the loop.3536### The loop37381. **Audit first** — run [`existing-ui-audit`](../existing-ui-audit/SKILL.md).39 What already exists (components, tokens, layout conventions) outranks every40 heuristic below. Reinventing an existing component is the #1 failure mode.412. **Brief** — seven keys before any code. Five are the ones the engine gates42 (`REQUIRED_BRIEF_KEYS`): `layout`, `components`, `states`, `microcopy`,43 `a11y`. `states` means all five of `empty`, `loading`, `error`, `success`,44 `disabled` — a brief missing one is unfinished, not concise.4546 Two more are **declared, not gated**: `frequency` and `initiation`. The47 engine does not halt on them, and that is stated rather than left to be48 discovered — adding a required key would halt every brief already written49 against the five.5051 | Key | Values | Why it is declared and never inferred |52 |---|---|---|53 | `frequency` | `one-time` · `low` · `medium` · `high` (100+ per day) | How often a surface is used decides whether motion on it reads as polish or as a toll. Nothing in a diff reveals it. |54 | `initiation` | `keyboard` · `pointer` · `system` | A keyboard-initiated surface is reached by someone who already knows where they are going; an animation there is pure latency. |5556 Both are prefilled from the surface's role and overridden only on evidence.57 There is no resolver and no inference from handlers: a `mousemove` listener58 is not proof of pointer initiation, and a keyboard shortcut in the code is59 not proof anyone uses it.6061 | Surface role | `frequency` | `initiation` |62 |---|---|---|63 | Command palette | `high` | `keyboard` |64 | Tooltip | `high` | `pointer` |65 | Modal / sheet | `medium` | `pointer` |66 | Onboarding flow | `one-time` | `pointer` |67 | Toast / notification | `medium` | `system` |68 | Table row action | `high` | `pointer` |6970 The default for a role not listed is `medium` / `pointer`, stated in the71 brief as a default rather than left blank.723. **Inventory — only when an artifact was provided, and before you build.**73 List the artifact's **interactions, keyframes, and script includes** from its74 source (`design-fidelity-mechanics` § Data-basis ladder — read it, do not75 look at a picture of it). Then place **every** listed item in exactly one76 bucket, using the engine's own names (`apply.ts`, `COVERAGE_BUCKETS`) so the77 two surfaces read the same. **Nothing enforces that they stay the same** —78 this is a copied vocabulary, not a shared constant, and no test pins it;79 renaming a bucket in the engine leaves this list stale and silent:8081 | Bucket | Meaning |82 |---|---|83 | `honoured` | carried over as-is |84 | `translated` | carried over in a different shape (a handler became a framework binding) |85 | `flagged` | **not** carried over — with the reason, in the output |8687 Dropping a handler stays allowed; hiding one does not. An item in no bucket88 is the failure this step exists to catch — "missing JavaScript" is what it89 looks like from the user's side. Inside the engine this is enforced90 (`apply.ts`, `COVERAGE_BUCKETS`, an unaccounted item is a halt); out here it91 is a duty you carry, and nothing checks it for you. (fixture:92 `daf-adhoc-port-coverage`.)934. **Build** — against the audit's primitives, in the project's stack. Where the94 artifact's own markup/CSS/JS is stack-compatible, adapt **that code**;95 re-deriving it from scratch is a deviation needing confirmation96 (`design-fidelity-mechanics` § Adopt the code).975. **Review, then re-enter** — run [`design-review`](../design-review/SKILL.md)98 before calling it done, and scope the verdict honestly: render-scoped when99 you can render it, otherwise explicitly static-scoped, naming which checks100 actually ran. "Looks good" with neither scope named is a verdict without101 evidence. Findings → fix them and **re-enter step 5**, at most **2 rounds**,102 and **stop early on a null**: a round that produces **no new finding** ends103 the loop, and a round that produces only findings the provided artifact104 already covers produces no new finding. At the 2-round ceiling with findings105 still open, stop and hand the remaining list back — ship-as-is or abort is106 the user's call, never another silent pass. Judgement alone never buys a107 third round.108109 The ceiling is **2**, the same number the engine enforces110 (`directives/ui/polish.ts`, `POLISH_CEILING`), so the ad-hoc path and the111 ticketed path bound the loop identically rather than by two conventions that112 can drift. Fixtures: `daf-adhoc-converges` (round 2 is a null, loop ends) and113 `daf-adhoc-ceiling` (findings remain at the ceiling, loop hands back).114115### The floors — pulled immediately before the write116117```118PULL references/craft-floor.md IMMEDIATELY BEFORE THE WRITE, NOT AT SKILL LOAD.119```120121Twelve universal floors that do not vary by mode, register, intent or stack.122They were inline here until the delivery point moved: a floor read at skill-load123time can be a compaction away from the write it governs (`ADR-227`).124125One precedence rule stays here because it is authority, not craft: **the audit126outranks every heuristic.** Say `[audit override]` when it does.127128## Positioning — reference inside the engine, executor outside it129130Inside a `/implement-ticket` run, `fe-design` is a **universal reference131skill**: it carries stack-agnostic heuristics the UI directive set cites, and132it does not own the flow. The ownership table below applies **to that mode**.133Outside the engine the table has no dispatcher behind it — the ad-hoc loop134above is the owner instead.135136| Concern | Owner (engine-mediated runs) |137|---|---|138| Layout / states / microcopy lock | [`directives/ui/design.ts`](../../templates/scripts/work_engine/directives/ui/design.ts) |139| Stack-dispatched implementation | [`directives/ui/apply.ts`](../../templates/scripts/work_engine/directives/ui/apply.ts) → `blade-ui` / `livewire` / `flux` / `react-shadcn-ui` |140| Existing-component inventory + tokens | [`existing-ui-audit`](../existing-ui-audit/SKILL.md) (mandatory pre-step) |141| Grounded selection (style, color tokens, typography, pattern, anti-patterns) | [`design-intelligence`](../design-intelligence/SKILL.md) — corpus-grounded; this skill stays the heuristic layer and *invokes* it |142| Design-review polish loop | [`directives/ui/review.ts`](../../templates/scripts/work_engine/directives/ui/review.ts) + [`directives/ui/polish.ts`](../../templates/scripts/work_engine/directives/ui/polish.ts) |143144## When to use145146Cite this skill when:147148- Planning a new page or feature UI before implementing149- Choosing between component patterns (modal vs. inline, table vs. cards)150- Designing forms with complex validation or multi-step flows151- Making responsive design decisions152- Reviewing UI for accessibility and usability153154**Inside a ticketed run**, do NOT use this skill to:155156- Implement components — that is the apply-step's stack-dispatched skill157- Audit an existing UI — that is `existing-ui-audit`158- Drive the full UI flow — that is the `directives/ui/` orchestrator159160Outside a ticketed run, the first and third lines invert: no dispatcher is161running, so implementation quality and the flow are yours. The second holds in162both modes — the audit is always `existing-ui-audit`; you invoke it, you do not163replace it.164165> **Resource-first, before taste.** Any request to recreate / redesign / mock /166> prototype / improve an existing UI runs the167> [resource-first context gate](../existing-ui-audit/SKILL.md#resource-first-context-gate-design-fidelity)168> FIRST — search the project's tokens/design-system/assets, hard-stop and ask169> when a referenced source is inaccessible (never invent from memory), and170> prefer code over screenshots for exact values. Planning here starts from that171> inventory, not from generic aesthetic memory (design-artifact lifecycle,172> Inspect stage).173174## How the directive set cites this skill175176`directives/ui/design.ts` produces the design brief (layout, components,177states, microcopy, a11y). Selection decisions (style, semantic color178tokens, typography pairing, layout pattern, anti-patterns) come **grounded**179from [`design-intelligence`](../design-intelligence/SKILL.md) — run its180corpus query first; fall back to the heuristics in this reference only181where the corpus reports an evidence gap or the audit already pins a182project pattern. Stack-specific choices come from the dispatched183implementation skill, not from here.184185> **When the corpus is not installed.** `design-intelligence` ships in the186> `frontend-design` pack; this skill ships in `engineering-base`. A consumer187> who installed only `laravel` or only `react` therefore has this skill and188> **not** the corpus. Fall back to the heuristics here and say so in the189> result — "selected from heuristics; `frontend-design` not installed, so no190> corpus grounding". The evidence-gap fallback above is about a corpus that191> answered "nothing here"; this is about a corpus that is absent. Never192> present an ungrounded pick as grounded, and never record a missing pack as193> an evidence gap.194195## Section index — load on demand196197Load the reference file whose sections the task needs — never all of them by default:198199- [`references/design-patterns.md`](references/design-patterns.md) — Component Architecture · Form Design · Table Design · Responsive Strategy · Accessibility (a11y) · Motion — decision-tree and rationale · UX Principles · Craft details — typography & imagery · Presenting variants200- [`references/design-read-and-memory.md`](references/design-read-and-memory.md) — Cross-task design memory — read DESIGN.md / PRODUCT.md first · Register — brand vs product · Design Read — articulate intent before generating · Aesthetic direction201202## Procedure203204When `directives/ui/design.ts` (or any caller) cites this skill:2052061. **Inspect `state.ui_audit` first** — review the audit produced by [`existing-ui-audit`](../existing-ui-audit/SKILL.md); it is mandatory. Stop and request the audit if missing.2072. **Pick the smallest matching section** — Component Architecture, Form Design, Table Design, Responsive Strategy, Accessibility, or UX Principles. Cite by H2/H3 heading, never paste the whole skill.2083. **Defer to audit findings** — when the audit pins a project pattern (token, primitive, layout convention), use it. The heuristics here are fallbacks for gaps, not overrides.2094. **Defer to the stack apply skill** — Blade vs. Livewire vs. Flux vs. React-shadcn choices come from the dispatched implementation skill, never from this reference.2105. **Surface conflicts** — if a heuristic here contradicts an audit finding or stack convention, name both and let the caller decide; do not silently pick.211212## Output format213214When this skill's content is folded into a design brief or review:2152161. Quote the cited heuristic verbatim, with the H2/H3 heading and a one-line "why this applies" tie-back to the request.2172. Map each heuristic to a concrete artifact in the brief (component, form section, table column, breakpoint rule, a11y check, UX state).2183. Keep stack-agnostic — never name Blade/Livewire/Flux/React primitives in the cited prose; the apply step adds those.2194. Mark anything overridden by audit findings as `[audit override]` and link to the audit entry.220221## Related222223- **Orchestrator:** [`directives/ui/`](../../templates/scripts/work_engine/directives/ui/) — owns the UI flow224- **Pre-step (mandatory):** [`existing-ui-audit`](../existing-ui-audit/SKILL.md) — inventory before design225- **Stack apply skills (dispatched, not standalone):**226 - [`blade-ui`](../blade-ui/SKILL.md) — Blade template implementation227 - [`livewire`](../livewire/SKILL.md) — Livewire component implementation228 - [`flux`](../flux/SKILL.md) — Flux component library usage229 - [`react-shadcn-ui`](../react-shadcn-ui/SKILL.md) — React + shadcn primitives230- **Adjacent reference:** [`dashboard-design`](../dashboard-design/SKILL.md) — monitoring dashboard design (different domain)231232## Gotcha233234- Don't design components without running `existing-ui-audit` first — the audit's component/token inventory is the canonical source for "what already exists in this project". Reinventing is the #1 failure mode.235- Heuristics in this reference apply across stacks; do not promote them to project rules without checking the audit.236- Mobile-first is not optional — every layout must work on 320px width.237238## Read the authority object — never re-infer it239240Read the resolved `ui_authority`241([contract](../../../docs/contracts/ui-authority.md)) before the loop:242`surface_mode`, `register`, `change_intent`, `reference_maturity`,243`constraints`. This skill is a **declared consumer** — a second decision table244beside the object is a drift surface, so do not re-derive any field.245246`surface_mode` sets density, hierarchy and expressiveness only, per247[`design-modes`](../../../docs/guidelines/design-modes.md) § The second axis.248249```250QUALITY FLOORS DO NOT VARY BY SURFACE MODE.251A FLOOR THAT MOVES WITH THE MODE IS A PREFERENCE WEARING A FLOOR'S NAME.252```253254### The source-led path255256`reference_maturity: runnable-artifact` → the artifact's own markup, CSS and JS257is the data basis; adapting it is the **default** and a from-scratch258re-derivation is a deviation. Sort every mechanic into `honoured` / `translated`259/ `flagged`; one present, absent and unflagged is a **silent drop**, target zero.260Procedure and the vanishing-mechanic classes:261[`references/source-led-port.md`](references/source-led-port.md).262263Maturity is not decided here — it arrives on the authority object, and per-value264provenance belongs to `road-to-frontend-fidelity-calibration` Phases 0 and 2.265266## Anti-slop discipline267268Before proposing a direction, scan the Visual (V1–V8) and Layout (L1–L10)269sections of [`design-antipatterns`](../../../docs/guidelines/design-antipatterns.md),270plus Motion (M1–M8) for the interaction layer.271On a match, choose differently or invoke the entry's own override condition in272the brief — every entry has one. Two of them, T7 and T8, are additionally273*register-scoped*: the brand and product registers admit different answers, and274neither admits an undeclared pick. The Q* floors are275in [`references/craft-floor.md`](references/craft-floor.md) instead of here, so276they arrive at the write rather than at skill load.277278## Do NOT279280- Do NOT skip mobile viewport testing.281- Do NOT use fixed pixel widths for responsive layouts.282- Do NOT ignore accessibility requirements.283- Do NOT use this skill as an executor INSIDE a ticketed run — there the executor is `directives/ui/design.ts` and this is the reference it cites. Outside one, the ad-hoc loop at the top of this file IS the executor; do NOT read the reference and then write the UI from priors.