Use when reviewing UI for accessibility — WCAG 2.2 AA, keyboard nav, focus, ARIA, contrast, screen-reader semantics — even on 'is this a11y-OK?' or 'mach das barrierefrei'.
日本語の概要は準備中です。原文の説明を表示しています。
Hand-author or edit an SVG — icon, mark, illustration, diagram, animation, raster-to-vector — checked and rendered.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
The one owner for SVG an agent writes by hand. Six lanes produce one — a missing icon glyph, a geometric mark, an illustration, a diagram, an animated asset, a wireframe canvas — and until this skill existed none of them had a procedure or a check beyond the agent's own belief that the file looked right.
iconography first — the set wins).logo-generation takes the true-vector path..svg or an inline graphic.iconography, and stop there.image-generation.logo-generation (which routes back here for the mark).motion-choreographer.inline
in a host page, a standalone document opened directly, img, a CSS
background, or a deck. It decides what can animate, what can execute, and how
the graphic gets its accessible name. An undeclared mode is treated as
inline, the strictest.icon, mark, illustration, diagram,
animated. The class picks the fill-ratio threshold and the geometry
tolerance; there is no global threshold, because a 24-grid icon's designed
padding reads as an under-filled viewBox against one.rect/circle/polygon is a
true vector and is often the right answer, not a lesser one.id="title" names the second
inline graphic on the page after the first.meaningful standalone svg chart graphic accessible name against
accessibility-auditor's aria-patterns.csv and follow the
Meaningful standalone graphic or Decorative graphic row.currentColor, never a loose hex.font-family with a fallback the target actually ships; a
<text> with none resolves to the platform serif.<script>, no on*, no javascript:, no foreignObject, no external
href or url(), no internal DTD subset or <!ENTITY (a bare public
DOCTYPE is fine).lint_svg_asset, with the delivery mode declared:
npx tsx node_modules/@event4u/agent-config/src/scripts/lint_svg_asset.ts \
--file path/to/asset.svg --delivery inline
agent-config ui:render path/to/asset.svg --profile asset --class icon
unverified with the reason pass-cap-reached and lists what is open —
never verified, and never done. That reason is yours to report: the render
manifest never carries it, because one invocation of ui:render cannot see
how many passes you have made.verified,
static-only or unverified — plus goal: unassessed, and name only
output files read back from disk. Where the renderer is absent, run the
static witness, report static-only, and name the missing capability in one
line; opening the file in a browser is never a step of this procedure or of
the user's.| Status | Allowed only when |
|---|---|
verified | a render manifest from the asset profile exists whose recorded file digest equals the delivered file's digest on disk. A manifest from an earlier pass does not count. |
static-only | the static check ran and no render did. A parser pass (xmllint --noout) is this, never verified — a file can parse and still be the wrong picture. |
unverified | no browser resolved, or the pass cap was reached with error findings open (pass-cap-reached). Never a pass; never silently upgraded. |
A second axis, and it is not this table's. Every status above is about
whether a CHECK ran and what it found. Whether the graphic is right is a
different question, and verified was being read as an answer to it. So every
report carries goal: beside the status, and this skill writes exactly one
value into it:
| Goal | Written by |
|---|---|
unassessed | always, by this skill and by the renderer. The default, and the only value either may write. |
accepted / rejected | an owner statement, or a pre-registered scenario witness. Never derived from a digest match, a clean witness, or a score. |
Declare the ids the edit is allowed to touch, then let the readout decide:
npx tsx node_modules/@event4u/agent-config/src/scripts/lint_svg_asset.ts \
--file after.svg --baseline before.svg --allow hat,hat-band
Every element outside the allowed set that changed is reported with the attribute that changed, after number and whitespace canonicalisation. No pixel diff decides this — anti-aliasing and font metrics would make it a per-machine verdict.
This applies between the owner's own passes too. A part the user already accepted joins the baseline and may not move by hand. A conversion pass that re-derives that part from the source instead re-measures it and re-checks the accepted property — a hole that was accepted as a hole stays a hole through a full re-trace.
Drawing it from a look fails, and it fails the same way every time: the outlines "coincide within a few pixels" by eye and read 0.883 silhouette IoU when measured. The procedure below reached 0.984 with the same tools.
The trace is the underlay by default, not the deliverable. Trace the source to measure and to align; then construct the deliverable over that underlay from few points, palette colours and named shapes. Keep a trace AS the deliverable only when the owner asks for maximum fidelity over editability, and say that is what they are getting.
The reason is measured, not stylistic. In one session the traced mark scored 0.989 region IoU against the constructed one's 0.935 — and the trace was sent back fifteen minutes after it was accepted, on criteria no score sees: a crown cut at the crop edge, hairlines between segments, an off-palette spot, jagged edges, 49 KB of edit-hostile points, and a face unreadable at 32 px. The rebuild was 4.5 KB with 14 shapes and about 180 points. The score is the alignment check. It is never the acceptance.
When the score stops applying. Once the owner's goal becomes a redesign rather than a reproduction — different fingers, depth taken from a style reference — the source-fidelity number measures agreement with something nobody is still trying to match. Stop reporting it as progress and say why.
geometry/source-cut-by-frame reading is the check.<name>.pass-<n>.svg, and diff the next
pass against the last accepted snapshot with lint_svg_asset --baseline.
Report which accepted properties carried forward. Restoring "version 4" is
then a copy, not a reconstruction — one session lost the same accepted
detail twice between hand edits, and the owner had to supply the file back
from their own downloads.x,y,w,h in the source's pixel frame, the
scorer that produced it (ui:render, or a named script) and the sample
resolution. Two scorers disagreed on one file by a factor of four and
neither number could be told from the other afterwards; a wordmark's frame
could not be recovered at all, and three plausible ones moved its IoU from
0.56 to 0.81.Any tracing tool the host has may do the deriving, and a host with none can write one. The measurement is the procedure, not the tool.
The last step reads every delivered file back from its final path in a fresh
browser context (file://, every other request aborted) and re-renders it from
there — not from the source text the agent wrote. Report path, byte size and
digest. An img delivery is additionally loaded through a host <img> and must
report a non-zero natural width.
A file that does not re-open is not delivered.
x,y,w,h in the source's pixel
frame), the scorer that produced it and the sample resolution, so a later
run can repeat the reading and no second scorer's number is quoted as the
first's.mark, the small-size variant when the 16 and 32 px
captures lose the detail, and a light-on-dark variant when the contrast
reading is low on a capture's ground. Built, or named as missing. Never
silent: one wordmark shipped in a dark violet that is unreadable on a dark
ground, and the dark variant was simply not mentioned.bytes, elements, paths,
gradients, coordinates), beside the fidelity numbers. No threshold: none
was measured, and a gate on bytes would have refused a 195 KB trace and a
59 KB accepted figure alike.<path> is not evidence of a vector. A raster embedded beside one dummy
path passes a presence-of-<path> check and is not a vector; a mark built
from rect/circle fails that check and is one.svg * { animation: none !important } under an
emulated reduce leaves an <animate> running. Route the animation itself.<img>-delivered SVG never sees the OS motion preference. The host
needs a <picture> with a media="(prefers-reduced-motion: reduce)" source
pointing at a static file.screenshot({ animations: 'disabled' }) does not freeze SMIL. Use
pauseAnimations() + setCurrentTime().transform-origin without transform-box pivots against the view box, not
the element — per element, so a correct sibling proves nothing about it.keySplines outside [0,1] stops the animation outright rather than
clamping it.verified on a look, a parser pass, or a render of an earlier
draft.Named rather than linked, and that is a correctness property rather than a style one: this skill ships in four packs, so a relative link to an artifact that lives in only one of them resolves for a consumer who installed that pack and is dead for the other three. The names are stable; the paths are not promises this skill can keep.
iconography — the set comes first; this skill is
for the glyph it lacks.logo-generation — the brand pipeline that
routes a geometric mark here.image-provider-routing — illustrative
vector art goes to a provider, not here.fe-design § Motion — the motion authority, in
references/design-patterns.md § Motion — decision-tree and rationale. The
SVG mechanism lines are step 6b, "Which mechanism carries it inside an
SVG?" — transform-box, pathLength, the keySplines range, path-morph
command equality, and delivery mode picking the reduced-motion route. Cited
here and never restated.frontend-render-security § The
patterns AI ships by default, row Untrusted SVG markup into an HTML sink
— the sinks an SVG carries into a host origin, and what each delivery mode
can execute. Its § Backstop greps carries the grep that finds them.design-intelligence — diagram layout; its
geometric pre-checks are witnessed by the asset profile now.accessibility-auditor — the ARIA
corpus that answers what a graphic's accessible name has to be; its
data/aria-patterns.csv carries the Meaningful standalone graphic and
Decorative graphic rows this skill grounds against rather than copies.canvas-design, wireframe
— the two lanes that use SVG as an execution surface.design-fidelity — a provided artifact is
the spec; the baseline readout above is its surgical-edit witness.docs/contracts/design-artifact-verification.md — frame_seek and the other
primitives the witness depends on.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Use when reviewing UI for accessibility — WCAG 2.2 AA, keyboard nav, focus, ARIA, contrast, screen-reader semantics — even on 'is this a11y-OK?' or 'mach das barrierefrei'.
日本語の概要は準備中です。原文の説明を表示しています。
Use when defining or auditing the activation event — aha-moment selection, retention correlation, falsifiable definition. Triggers on 'what is our aha moment', 'redefine activation'.
日本語の概要は準備中です。原文の説明を表示しています。
Use when capturing an architectural decision — file naming, next ADR number, Status / Context / Decision / Consequences, index regen; fires even without saying 'ADR'.
日本語の概要は準備中です。原文の説明を表示しています。
Adversarial critique — devil's advocate, stress-test, honest teardown ('poke holes', 'be brutal', 'was hältst du davon'); explicit request only. Routine code or design review → code-review.
日本語の概要は準備中です。原文の説明を表示しています。
Use when reading, creating, or updating agent documentation, module docs, roadmaps, or AGENTS.md. Understands the full .augment/, agents/, and copilot-instructions structure.
日本語の概要は準備中です。原文の説明を表示しています。
Use for an adversarial red-team / blue-team / auditor review of an AI agent's CONFIG + behaviour (rules, skills, MCP, hooks, permissions) — attack-chain → defensive-gap list, not a code audit.
日本語の概要は準備中です。原文の説明を表示しています。