Skip to content
Back to skills

Ui Apply Generic

ASecurity

Use when implementing a UI brief on a stack with no framework executor — Svelte, Astro, Angular, plain HTML. Stack-independent sibling of react-shadcn-ui; idiom from the stack corpus.

  • 10 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 2, 2026
ai-agentsgobashreactvueangulargitfrontend

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 12, 2026

npx -y skills add event4u-app/agent-config --skill ui-apply-generic --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Ui Apply Generic?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Ui Apply Generic
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/event4u-app-ui-apply-generic/badge)](https://www.skillsdirectory.com/skills/event4u-app-ui-apply-generic)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
model_tier: medium
name: ui-apply-generic
description: "Use when implementing a UI brief on a stack with no framework executor — Svelte, Astro, Angular, plain HTML. Stack-independent sibling of react-shadcn-ui; idiom from the stack corpus."
personas:
  - frontend-engineer
domain: engineering
workspaces:
  - engineering
packs:
  - engineering-base
---

# ui-apply-generic

> The `plain` lane used to be a name with nothing behind it. This skill is the
> lane: it carries the implementation discipline that previously lived **only**
> inside the framework executors, and it gets framework idiom from the 16-stack
> corpus instead of from prose written here.
>
> That split is the whole point. One skill plus a corpus serves Svelte, Astro,
> Angular, Alpine, htmx and everything future at once. Sixteen framework skills
> would serve the same set and cost a single maintainer sixteen surfaces to keep
> current — the enumeration this package refuses.

## When to use

- `state.stack.frontend` resolves to `plain`, or to a label with no
  framework-specific overlay.
- A stack whose `axes.reactivity` or `axes.meta` is recognised but has no
  executor skill (`svelte`, `angular`, `astro`, `solid`, `qwik`, `htmx`).
- As the base of a composition: an overlay skill (`livewire`, `flux`,
  `blade-ui`, `react-shadcn-ui`) adds framework specifics **on top** of this
  contract, it does not replace it.

Do NOT use when a framework executor already covers the whole job — then this
skill is the base and the executor is the overlay, dispatched together.

## Procedure

### Step 1 — Query the stack corpus (mandatory)

Read `state.stack.axes` and query per resolved axis value, most specific first:
`meta` → `reactivity` → `component_lib`.

```bash
<skills-root>/corpus-grounding/scripts/ground search \
  --manifest <skills-root>/design-intelligence/data/manifest.json \
  --stack <axis-value> "<the concrete question>"
```

`axes.meta: nuxt` with `axes.reactivity: vue` means **two** queries —
`--stack nuxtjs` and `--stack vue`. A meta-framework does not replace the layer
it wraps; that conflation is the defect the axes exist to fix.

**Cite what you used.** The result names the corpus rows the implementation
followed. An uncited pick is indistinguishable from the model's memory, and
memory is exactly what the corpus exists to replace.

**No corpus domain for the detected stack** → say so, in the result:

> No stack corpus for `<stack>` — proceeding on the generic contract. Framework
> idiom below is not grounded and should be reviewed by someone who knows this
> stack.

Silence is the failure mode. An unstated gap reads as grounded output.

### Step 2 — Apply the stack-independent contract

Every item is a hard requirement, and none of them is framework-specific:

1. **Verbatim floor.** Microcopy comes from `state.ui_design.microcopy` exactly
   as written — every label, empty-state line, and validation message. No
   paraphrase, no improvement. Where a source artifact was provided, it beats
   the brief (see `design-fidelity`).
2. **Token discipline.** Colour, spacing, radius and shadow values come from the
   project's tokens. A raw hex or arbitrary px that no token backs is a finding,
   not a choice. Validate with `design-tokens`' `tokens validate`.
3. **Component reuse.** Check `state.ui_audit.components_found` before creating
   anything. In a run that has already added components, re-read the component
   directories — the audit inventory is computed once per state-file and does
   not refresh (see `existing-ui-audit` § Gotchas).
4. **a11y floor.** Semantic elements over `div` + role; every interactive
   element reachable and labelled; focus visible; contrast meets the project's
   stated level, AA when unstated.
5. **All five states.** `empty`, `loading`, `error`, `success`, `disabled` per
   the brief. An explicit `n/a` is legitimate for a surface that genuinely has
   no such state — declaring that is the opposite of inventing filler.
6. **Asset discipline.** Copy referenced assets into the project's asset path.
   Never hotlink; never fabricate a logo or a screenshot.
7. **No placeholders.** `<placeholder>`, `lorem`, `todo:`, `tbd`, `xxx` are
   rejected at the boundary — including inside arrays.

### Step 3 — Verify, with honest degrade

Exercise the result with whatever the host actually has, and name which:

| Available | Do |
|---|---|
| Browser / Playwright | Render, check the states, exercise one interaction |
| Screenshot only | Capture and inspect layout at 375 / 768 / 1280 |
| Neither | Static inspection only, and **say** the render is unverified |

Never claim a state or interaction works without having exercised it. A caveat
is a finding; a silent claim is a defect.

## Output format

Four requirements, in order — each is checkable by a reader of the result:

1. **Name the corpora queried**, or state that none exists for this stack.
2. **Cite the rows that changed a decision** — not every row read.
3. **State the verification method and its caveats**, never an unqualified
   "works".
4. **List components reused before components added**, so a duplicate is
   visible rather than buried.

Write `state.ticket["ui_apply"]`:

```yaml
ui_apply:
  files: ["resources/js/UserCard.svelte"]
  rendered:
    "resources/js/UserCard.svelte": |
      <full text, microcopy-locked>
  components_added: ["UserCard"]
  components_reused: ["Button"]
  microcopy_lock: true
  stack_corpus:                 # which corpora answered, or the degrade note
    queried: ["svelte"]
    cited: ["svelte.csv:12 — prefer stores over prop drilling"]
  verify:
    method: static_inspect      # or playwright / screenshot
    caveats: ["render not verified — no browser available"]
```

## Gotchas

- **Do not write framework prose into this skill.** The moment it explains how
  Svelte stores work, it stops being one maintainable surface and starts being
  sixteen. Framework knowledge belongs in the corpus.
- **`axes.reactivity: unknown` is not `none`.** `unknown` means a project has
  manifests and no recognised reactivity layer — proceed, and say the stack was
  not recognised. `none` means there genuinely is no reactivity layer, which is
  the normal shape for a static page.
- **A meta-framework needs its own query.** Querying only `--stack vue` for a
  Nuxt project silently drops the routing, data-fetching and SSR idioms that
  are the whole reason Nuxt exists.
- **The generic contract is a floor, not a ceiling.** Where an overlay skill is
  dispatched with this one, its framework rules win on their subject.
- **The floor now lives in exactly one place, and that is the point.** Overlay
  composition applies this contract to every lane, so a future change to any of
  its seven items is a one-point edit here rather than four lane patches that
  drift apart. Concretely: the five-states requirement reaches every lane
  through this skill. That requirement is deliberately unconditional — an
  explicit `n/a` is the escape for a surface that genuinely has no such state
  (asserted in `ui_lane_matrix.test.ts`), so this is not a defect being
  broadened. But if the decision is ever revisited, revisit it here.

## Do NOT

- Emit framework code from memory and present it as grounded.
- Skip the corpus query because the stack "looks obvious".
- Claim a render or an interaction was verified when no primitive was available.
- Invent states, sections, or copy the brief does not carry.
- Treat a missing corpus as an evidence gap — it is a missing pack, and the two
  must not be recorded the same way.

## See also

- [`design-intelligence`](../design-intelligence/SKILL.md) — the `--stack`
  corpus this skill queries (16 stacks).
- [`existing-ui-audit`](../existing-ui-audit/SKILL.md) — the inventory Step 2
  checks, and its once-per-state-file limit.
- [`design-tokens`](../design-tokens/SKILL.md) — `tokens validate`.
- [`fe-design`](../fe-design/SKILL.md) — where the brief's selection decisions
  come from, and what it does when the corpus is not installed.
- [`ui-component-architect`](../ui-component-architect/SKILL.md),
  [`tailwind-engineer`](../tailwind-engineer/SKILL.md) — stack-neutral
  companions this skill composes with.

Files in this skill

  • SKILL.md8.1 KB
  • evals/triggers.json1.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.