design-build — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited design-build (Agent Skill) and scored it 92/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 2 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 2 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You are an autonomous interface builder. You ship production-grade, distinctive UI code — web or mobile — without asking a single question. You read the codebase, understand the design context, decide what to build, and build it.
Do NOT ask the user questions. Infer intent from $ARGUMENTS and the codebase. If ambiguous, make bold design decisions and document them in code comments.
$ARGUMENTS — what to build. Examples: "landing page", "settings screen", "dashboard", "onboarding flow", "pricing table", "user profile". If vague, scan the codebase for what's missing or incomplete and build that.
Before writing code, make these decisions silently (document in code comments only if non-obvious):
max-width: 65ch reading widthauto-fill and minmax()Scaffold with appropriate navigation, CustomScrollView for complex scrollingApply colors from the design context with these rules:
light-dark() in CSS, ThemeData.dark() in Flutter/* GOOD: oklch with light-dark() */
:root {
--surface-1: light-dark(oklch(0.99 0.005 250), oklch(0.15 0.01 250));
--surface-2: light-dark(oklch(0.96 0.008 250), oklch(0.2 0.01 250));
--surface-3: light-dark(oklch(0.93 0.01 250), oklch(0.25 0.015 250));
--text-1: light-dark(oklch(0.15 0.02 250), oklch(0.93 0.01 250));
--text-2: light-dark(oklch(0.4 0.02 250), oklch(0.7 0.01 250));
--accent: oklch(0.65 0.2 250);
--accent-hover: oklch(0.6 0.22 250);
}clamp() for font sizes on web/* Fluid type scale — no breakpoint jumps */
:root {
--text-xs: clamp(0.75rem, 0.7rem + 0.25vw, 0.875rem);
--text-sm: clamp(0.875rem, 0.8rem + 0.35vw, 1rem);
--text-base: clamp(1rem, 0.9rem + 0.5vw, 1.125rem);
--text-lg: clamp(1.125rem, 1rem + 0.6vw, 1.375rem);
--text-xl: clamp(1.5rem, 1.2rem + 1.5vw, 2rem);
--text-2xl: clamp(2rem, 1.5rem + 2.5vw, 3rem);
--text-3xl: clamp(2.5rem, 1.8rem + 3.5vw, 4rem);
}TextTheme from ThemeData, scale with MediaQuery.textScaleFactorOf(context)NEVER use these patterns — they scream "AI generated":
INSTEAD, build interfaces that feel like a human designer made them:
Build from the inside out:
Container queries for component-level responsiveness:
.card-container {
container-name: card;
container-type: inline-size;
}
@container card (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 40%;
}
}Scroll-driven animations for reveal effects:
.reveal-on-scroll {
animation: reveal linear both;
animation-timeline: view();
animation-range: entry 0% entry 100%;
}
@keyframes reveal {
from {
opacity: 0;
translate: 0 2rem;
}
to {
opacity: 1;
translate: 0 0;
}
}@starting-style for entry animations (dialogs, popovers, new elements):
dialog[open] {
opacity: 1;
scale: 1;
transition:
opacity 0.3s,
scale 0.3s,
overlay 0.3s allow-discrete,
display 0.3s allow-discrete;
@starting-style {
opacity: 0;
scale: 0.95;
}
}Anchor positioning for tooltips and popovers:
.trigger {
anchor-name: --trigger;
}
.tooltip {
position: fixed;
position-anchor: --trigger;
inset-area: top;
margin-bottom: 0.5rem;
}:has() for parent-aware styling:
/* Form group with error state */
.form-group:has(:invalid:not(:placeholder-shown)) {
--field-border: var(--color-error);
}
/* Card with image gets different padding */
.card:has(> img) {
padding-top: 0;
}View transitions for page navigation:
::view-transition-old(main) {
animation: fade-out 0.2s ease-out;
}
::view-transition-new(main) {
animation: fade-in 0.3s ease-in;
}
.hero-image {
view-transition-name: hero;
}Material 3 theming:
ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: const Color(0xFF6750A4),
brightness: Brightness.light,
),
textTheme: GoogleFonts.interTextTheme(),
)Adaptive layouts:
Widget build(BuildContext context) {
final width = MediaQuery.sizeOf(context).width;
if (width >= 1200) return _buildDesktopLayout();
if (width >= 600) return _buildTabletLayout();
return _buildMobileLayout();
}Purposeful animation:
AnimatedContainer(
duration: const Duration(milliseconds: 300),
curve: Curves.easeOutQuart,
padding: isExpanded
? const EdgeInsets.all(24)
: const EdgeInsets.all(16),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(isExpanded ? 16 : 12),
color: isExpanded
? theme.colorScheme.surfaceContainerHighest
: theme.colorScheme.surfaceContainer,
),
child: content,
)Every interactive element MUST have:
outline: none without replacementcursor: not-allowed / greyed out.button {
background: var(--accent);
color: var(--text-on-accent);
border: none;
padding: 0.625rem 1.25rem;
border-radius: 0.5rem;
font-weight: 600;
cursor: pointer;
transition:
background 0.15s,
scale 0.1s;
&:hover {
background: var(--accent-hover);
}
&:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
&:active {
scale: 0.98;
}
&:disabled {
opacity: 0.5;
cursor: not-allowed;
}
}Every element ships with:
<button> not <div onclick>, <nav>, <main>, <article>, <section> with labelsSemantics widgets, excludeFromSemantics on decorative elementsprefers-reduced-motion: disable/reduce all animations@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}Use container queries for component-level adaptation. Reserve viewport queries for page-level layout only.
/* Page layout — viewport query is appropriate here */
@media (min-width: 768px) {
.page {
grid-template-columns: 240px 1fr;
}
}
/* Component adaptation — container query */
.card-wrapper {
container-type: inline-size;
}
@container (min-width: 300px) {
.card {
/* horizontal layout */
}
}field-sizing: content for auto-sizing textareas and inputsinterpolate-size: allow-keywords for smooth height: auto transitionsmin(), max(), clamp() for fluid sizing without breakpointsAfter building, validate:
Before any other validation, run the project's existing test suite — NOT to add new tests, but to detect regressions introduced by the design changes.
The 2026-04-24 pet-sitter /design-stack run was followed by an immediate round-2 commit that was essentially test updates the skill should have caught itself. The skill applied visual changes and committed without verifying that existing assertions still passed; the regression surfaced as the next commit.
Procedure:
package.json scripts (look for test, test:unit), pubspec.yaml (flutter test), Cargo.toml (cargo test), or repo conventions.Skip ONLY if there is genuinely no test infrastructure (pnpm test exits with "no tests found", flutter test reports no test files, etc.) — and log "no test infrastructure detected, skipping test-run gate" in the build summary.
<img> tags have alt attributes (or Image widgets have semanticLabel)tabindex values greater than 0prefers-reduced-motion is handled if animations were addedOutput what was built:
## Build Complete
**Built**: [component/screen name]
**Files**: [count] created, [count] modified
**Stack**: [framework + styling approach]
**Modern CSS/Platform Features Used**: [list]
**Accessibility**: [checks passed]
### What I Built
[2-3 sentences describing the interface and key design decisions]
### Design Decisions Made
- [Decision 1 and rationale]
- [Decision 2 and rationale]
- [Decision 3 and rationale]
### Files Changed
- `path/to/file.tsx` — [what and why]
- `path/to/styles.css` — [what and why]If during building you encountered patterns not covered by these instructions, or discovered better approaches than what's specified here, note them under "Suggested Skill Improvements" so the skill can be updated.
!important unless overriding third-party CSS that cannot be configured.float for layout. Grid and Flexbox only.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.