[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71C463JVY3CE6Z5VRNK4WPC":3,"skill-same:01M71C463JVY3CE6Z5VRNK4WPC":68},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M71C463JVY3CE6Z5VRNK4WPC","genjutsu-design-audit",null,"Design audit checklist - motion gaps, accessibility, color consistency, responsive, performance.","nexuslinkproductions\u002Fyuri-os","nexuslinkproductions","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F273246263?v=4","01M718YX9NZRCW50B59B8ZVDKN","Marcel Spatz","01M718YXAQ7530F4B1VKN6SFQV",2,"MIT","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fgenjutsu-design-audit\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40],"design","audit","design audit","genjutsu design audit","performance","accessibility","motion","checklist","responsive","color","consistency","gaps","2026-11-10 10:12:30",false,"---\nname: genjutsu-design-audit\ndescription: \"Design audit checklist - motion gaps, accessibility, color consistency, responsive, performance.\"\n---\n\n# Design Audit\n\n> The final checkpoint. Loaded by `\u002Fgenjutsu:paint` at the end of the pipeline.\n> Scans the codebase for motion gaps, a11y violations, perf issues, and inconsistencies.\n\n---\n\n## Motion Gap Analysis\n\nRun these greps against the project to detect missing animations.\n\n### Conditional renders without AnimatePresence\n\n```bash\ngrep -rn '{.*&&\\s*\u003C\\|{.*?\\s*:\\s*\u003C\\|{.*ternary.*\u003C' --include='*.tsx' --include='*.jsx' src\u002F | grep -v 'AnimatePresence'\n```\n\nLook for: `{show && \u003CComponent \u002F>}` or ternary renders without a wrapping `\u003CAnimatePresence>`. Every conditional mount\u002Funmount needs exit animation support.\n\n### Hover states without transition\n\n```bash\ngrep -rn ':hover' --include='*.css' --include='*.scss' --include='*.module.css' src\u002F | grep -vE 'transition|animation'\n```\n\nEvery `:hover` rule must have a corresponding `transition` on the base selector. Instant state flips feel broken.\n\n### Dynamic lists without stagger\n\n```bash\ngrep -rn '\\.map(' --include='*.tsx' --include='*.jsx' src\u002F | grep -vE 'stagger|delay.*index|variants|transition.*delay'\n```\n\nLists rendered via `.map()` should stagger their entrance. Simultaneous pop-in looks cheap.\n\n### Style changes without transition\n\n```bash\ngrep -rn 'style={{' --include='*.tsx' --include='*.jsx' src\u002F | grep -vE 'transition|transform|opacity'\n```\n\nInline style changes (e.g., dynamic background, color) need a CSS transition or motion wrapper.\n\n### Entries without corresponding exits\n\n```bash\ngrep -rn 'initial=' --include='*.tsx' --include='*.jsx' src\u002F | grep -v 'exit='\n```\n\nEvery Framer Motion `initial` + `animate` should have an `exit` prop when inside `AnimatePresence`.\n\n---\n\n## Accessibility Audit\n\n### Reduced motion - MANDATORY\n\nA project with animation MUST have at least one global handler matching its stack. Run all 3 greps:\n\n```bash\n# Web\ngrep -rn 'prefers-reduced-motion' --include='*.css' --include='*.scss' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' src\u002F 2>\u002Fdev\u002Fnull\n\n# SwiftUI \u002F UIKit\ngrep -rn 'accessibilityReduceMotion\\|isReduceMotionEnabled\\|reduceMotionStatusDidChangeNotification' --include='*.swift' . 2>\u002Fdev\u002Fnull\n\n# Compose\ngrep -rn 'LocalAccessibilityManager\\|isReduceTransitions\\|TRANSITION_ANIMATION_SCALE\\|ANIMATOR_DURATION_SCALE\\|areTransitionsEnabled' --include='*.kt' . 2>\u002Fdev\u002Fnull\n```\n\n**Zero results across all 3 in an animated project = critical violation.** At least one handler must exist somewhere. Cross-reference `motion-principles\u002FSKILL.md` for canonical implementations per stack.\n\n### Contrast ratio 4.5:1\n\n- Use browser DevTools (Inspect > color swatch > contrast ratio)\n- Run `npx pa11y \u003Curl>` or Lighthouse accessibility audit\n- Check animated text at mid-transition -- fading text must remain readable at every opacity above 0.4\n\n### Focus visible on all interactives\n\n```bash\ngrep -rn 'outline:\\s*none\\|outline:\\s*0' --include='*.css' --include='*.scss' --include='*.module.css' src\u002F\n```\n\nAny `outline: none` MUST be paired with a custom `:focus-visible` style. Removing focus rings without replacement is a WCAG failure.\n\n### Semantic HTML -- no clickable divs\n\n```bash\ngrep -rn 'onClick' --include='*.tsx' --include='*.jsx' src\u002F | grep -E '\u003Cdiv|\u003Cspan' | grep -v 'role='\n```\n\nEvery `\u003Cdiv onClick>` or `\u003Cspan onClick>` must either be a `\u003Cbutton>`, an `\u003Ca>`, or have `role=\"button\"` + `tabIndex` + `onKeyDown`.\n\n### ARIA on decorative animations\n\n```bash\ngrep -rn '\u003Cmotion\\.\\|\u003Canimated\\.\\|\u003CLottie\\|\u003CCanvas' --include='*.tsx' --include='*.jsx' src\u002F | grep -v 'aria-hidden'\n```\n\nPurely decorative animations (background particles, ambient motion, Lottie illustrations) must have `aria-hidden=\"true\"` to avoid polluting screen readers.\n\n---\n\n## Performance Audit\n\n### Layout thrashing -- animating layout properties\n\n```bash\ngrep -rn 'transition.*\\(width\\|height\\|top\\|left\\|right\\|bottom\\|margin\\|padding\\)' --include='*.css' --include='*.scss' --include='*.module.css' src\u002F\n```\n\nAnimating layout properties triggers reflow every frame. Replace with `transform: translate\u002Fscale` and `opacity`.\n\n### Excessive paint triggers\n\n```bash\ngrep -rn 'will-change' --include='*.css' --include='*.scss' --include='*.module.css' src\u002F\n```\n\n`will-change` should be rare and scoped. If more than ~5 elements use it permanently, the GPU memory cost outweighs the benefit. Apply it dynamically (add on hover\u002Ffocus, remove on animation end).\n\n### Animation library bundle cost\n\nCheck actual impact:\n\n```bash\nnpx source-map-explorer dist\u002F**\u002F*.js 2>\u002Fdev\u002Fnull || npx vite-bundle-visualizer 2>\u002Fdev\u002Fnull\n```\n\nReference sizes (gzipped): framer-motion ~30KB, GSAP ~25KB, popmotion ~5KB, CSS-only = 0KB. If the project only uses fade+slide, a 30KB lib is overkill.\n\nOn mobile native, the APK \u002F IPA size matters. A third-party animation library adds typically 500KB-2MB:\n\n| Library | Size impact (uncompressed) |\n|---|---|\n| Lottie (iOS) | ~600KB |\n| Lottie (Android) | ~900KB |\n| Rive (iOS) | ~1.5MB |\n| Rive (Android) | ~2MB |\n| Native Compose \u002F SwiftUI animations | 0KB (built-in) |\n\nIf the project only uses fades, slides, and springs, native APIs (Compose `animate*AsState` + spring, SwiftUI `withAnimation`) are sufficient. Justify a Lottie \u002F Rive dependency only for genuinely complex pre-designed animations (e.g., onboarding illustrations).\n\n### requestAnimationFrame vs setTimeout\n\n```bash\ngrep -rn 'setTimeout\\|setInterval' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' src\u002F | grep -iE 'anim\\|motion\\|scroll\\|position\\|style\\|transform'\n```\n\nAnimation loops must use `requestAnimationFrame`. `setTimeout`\u002F`setInterval` causes frame drops and doesn't pause in background tabs.\n\n---\n\n## Consistency Audit\n\n### Duration consistency\n\n```bash\ngrep -rnoE 'duration[:\"'\\''= ]+[0-9.]+' --include='*.tsx' --include='*.jsx' --include='*.ts' --include='*.css' --include='*.scss' src\u002F | sort -t: -k3 | uniq -c -f2 | sort -rn\n```\n\nA well-designed project uses 3-5 distinct durations max (e.g., 0.15, 0.25, 0.35, 0.5). If you see 15 different values, extract them into a motion tokens file.\n\n### Easing inventory\n\nRun all 3 greps to inventory easing values across the codebase:\n\n```bash\n# Web (CSS \u002F JS \u002F TSX)\ngrep -rnoE 'ease[A-Za-z]*|cubic-bezier\\([^)]+\\)|spring\\([^)]*\\)' --include='*.tsx' --include='*.jsx' --include='*.ts' --include='*.css' --include='*.scss' src\u002F 2>\u002Fdev\u002Fnull\n\n# SwiftUI\ngrep -rnoE '\\.spring\\([^)]*\\)|\\.snappy|\\.bouncy|\\.smooth|\\.linear\\(|\\.easeIn|\\.easeOut|\\.interpolatingSpring' --include='*.swift' . 2>\u002Fdev\u002Fnull\n\n# Compose\ngrep -rnoE 'spring\\([^)]*\\)|tween\\([^)]*\\)|FastOutSlowInEasing|LinearOutSlowInEasing|FastOutLinearInEasing|CubicBezierEasing' --include='*.kt' . 2>\u002Fdev\u002Fnull\n```\n\nSame rule across all stacks: 3-5 named easings max in the design system. Random values scattered across files = visual inconsistency. If the codebase has 12 different `cubic-bezier(...)` values or 8 custom `spring(response:dampingFraction:)` configurations, that's a design-system violation, fix it by centralizing into named tokens.\n\n### Symmetric enter\u002Fexit\n\nScan for motion components and verify that:\n- Enter duration >= exit duration (never the reverse)\n- Enter uses `ease-out`, exit uses `ease-in`\n- Enter has full choreography (translate + opacity + scale), exit is simpler (opacity only or opacity + slight scale)\n\n```bash\ngrep -A5 'exit=' --include='*.tsx' --include='*.jsx' -rn src\u002F\n```\n\nCompare `animate` and `exit` props side by side. Asymmetric timing (fast exit, slow enter) is correct. The reverse is wrong.\n\n---\n\n## Stack-specific audit\n\nPick the subsection matching the project stack.\n\n### Compose (Android \u002F Multiplatform)\n- [ ] Run **Layout Inspector** (Android Studio): inspect recompositions, identify components recomposing on every state change.\n- [ ] Run **Macrobenchmark** (`androidx.benchmark.macro`): measure frame timing on a real device under representative scrolling \u002F animation load. Target: \u003C16.67ms per frame at 60fps, \u003C8.33ms at 120fps.\n- [ ] Inspect **recomposition counts** via `Modifier.recomposeHighlighter()` (Compose 1.6+) or Layout Inspector.\n- [ ] Generate **Baseline Profiles** (`BaselineProfileGenerator`) for production builds.\n- [ ] Verify `Modifier.semantics` is set on custom components (TalkBack support).\n\n### SwiftUI (iOS \u002F macOS)\n- [ ] Run **Instruments Time Profiler**: identify hot paths during animation (target: zero frames over 16.67ms).\n- [ ] Run **Instruments Hitches Instrument** (iOS 14+): detects dropped frames and stalls.\n- [ ] Run **Instruments GPU Frame Capture** for Metal shaders: verify shader compile time, GPU vs CPU bottleneck.\n- [ ] Verify `.accessibilityLabel` \u002F `.accessibilityHint` on every interactive view.\n- [ ] Test with Dynamic Type at 200% size (`Environment Overrides` in Xcode).\n- [ ] Test with Reduce Motion ON.\n\n### Web\n- [ ] Existing checklist above (Lighthouse, Chrome DevTools Performance, etc.).\n\n---\n\n## Output Format\n\nStructure findings by severity:\n\n### Critical (must fix before ship)\n- Missing `prefers-reduced-motion` handling\n- Clickable divs without keyboard support\n- `outline: none` without `:focus-visible` replacement\n- Animating layout properties (width\u002Fheight\u002Ftop\u002Fleft)\n\n### Important (fix in current sprint)\n- Conditional renders without `AnimatePresence`\n- Hover states without transition\n- Missing `aria-hidden` on decorative animations\n- `setTimeout` used for animation loops\n- Inconsistent durations (>8 unique values)\n\n### Nice-to-have (backlog)\n- Lists without stagger animation\n- Inline styles without transition\n- Excessive `will-change` usage\n- Asymmetric enter\u002Fexit (wrong direction)\n- Animation library oversized for actual usage\n","# Design Audit\n\n> The final checkpoint. Loaded by `\u002Fgenjutsu:paint` at the end of the pipeline.\n> Scans the codebase for motion gaps, a11y violations, perf issues, and inconsistencies.\n\n---\n\n## Motion Gap Analysis\n\nRun these greps against the project to detect missing animations.\n\n### Conditional renders without AnimatePresence\n\n```bash\ngrep -rn '{.*&&\\s*\u003C\\|{.*?\\s*:\\s*\u003C\\|{.*ternary.*\u003C' --include='*.tsx' --include='*.jsx' src\u002F | grep -v 'AnimatePresence'\n```\n\nLook for: `{show && \u003CComponent \u002F>}` or ternary renders without a wrapping `\u003CAnimatePresence>`. Every conditional mount\u002Funmount needs exit animation support.\n\n### Hover states without transition\n\n```bash\ngrep -rn ':hover' --include='*.css' --include='*.scss' --include='*.module.css' src\u002F | grep -vE 'transition|animation'\n```\n\nEvery `:hover` rule must have a corresponding `transition` on the base selector. Instant state flips feel broken.\n\n### Dynamic lists without stagger\n\n```bash\ngrep -rn '\\.map(' --include='*.tsx' --include='*.jsx' src\u002F | grep -vE 'stagger|delay.*index|variants|transition.*delay'\n```\n\nLists rendered via `.map()` should stagger their entrance. Simultaneous pop-in looks cheap.\n\n### Style changes without transition\n\n```bash\ngrep -rn 'style={{' --include='*.tsx' --include='*.jsx' src\u002F | grep -vE 'transition|transform|opacity'\n```\n\nInline style changes (e.g., dynamic background, color) need a CSS transition or motion wrapper.\n\n### Entries without corresponding exits\n\n```bash\ngrep -rn 'initial=' --include='*.tsx' --include='*.jsx' src\u002F | grep -v 'exit='\n```\n\nEvery Framer Motion `initial` + `animate` should have an `exit` prop when inside `AnimatePresence`.\n\n---\n\n## Accessibility Audit\n\n### Reduced motion - MANDATORY\n\nA project with animation MUST have at least one global handler matching its stack. Run all 3 greps:\n\n```bash\n# Web\ngrep -rn 'prefers-reduced-motion' --include='*.css' --include='*.scss' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' src\u002F 2>\u002Fdev\u002Fnull\n\n# SwiftUI \u002F UIKit\ngrep -rn 'accessibilityReduceMotion\\|isReduceMotionEnabled\\|reduceMotionStatusDidChangeNotification' --include='*.swift' . 2>\u002Fdev\u002Fnull\n\n# Compose\ngrep -rn 'LocalAccessibilityManager\\|isReduceTransitions\\|TRANSITION_ANIMATION_SCALE\\|ANIMATOR_DURATION_SCALE\\|areTransitionsEnabled' --include='*.kt' . 2>\u002Fdev\u002Fnull\n```\n\n**Zero results across all 3 in an animated project = critical violation.** At least one handler must exist somewhere. Cross-reference `motion-principles\u002FSKILL.md` for canonical implementations per stack.\n\n### Contrast ratio 4.5:1\n\n- Use browser DevTools (Inspect > color swatch > contrast ratio)\n- Run `npx pa11y \u003Curl>` or Lighthouse accessibility audit\n- Check animated text at mid-transition -- fading text must remain readable at every opacity above 0.4\n\n### Focus visible on all interactives\n\n```bash\ngrep -rn 'outline:\\s*none\\|outline:\\s*0' --include='*.css' --include='*.scss' --include='*.module.css' src\u002F\n```\n\nAny `outline: none` MUST be paired with a custom `:focus-visible` style. Removing focus rings without replacement is a WCAG failure.\n\n### Semantic HTML -- no clickable divs\n\n```bash\ngrep -rn 'onClick' --include='*.tsx' --include='*.jsx' src\u002F | grep -E '\u003Cdiv|\u003Cspan' | grep -v 'role='\n```\n\nEvery `\u003Cdiv onClick>` or `\u003Cspan onClick>` must either be a `\u003Cbutton>`, an `\u003Ca>`, or have `role=\"button\"` + `tabIndex` + `onKeyDown`.\n\n### ARIA on decorative animations\n\n```bash\ngrep -rn '\u003Cmotion\\.\\|\u003Canimated\\.\\|\u003CLottie\\|\u003CCanvas' --include='*.tsx' --include='*.jsx' src\u002F | grep -v 'aria-hidden'\n```\n\nPurely decorative animations (background particles, ambient motion, Lottie illustrations) must have `aria-hidden=\"true\"` to avoid polluting screen readers.\n\n---\n\n## Performance Audit\n\n### Layout thrashing -- animating layout properties\n\n```bash\ngrep -rn 'transition.*\\(width\\|height\\|top\\|left\\|right\\|bottom\\|margin\\|padding\\)' --include='*.css' --include='*.scss' --include='*.module.css' src\u002F\n```\n\nAnimating layout properties triggers reflow every frame. Replace with `transform: translate\u002Fscale` and `opacity`.\n\n### Excessive paint triggers\n\n```bash\ngrep -rn 'will-change' --include='*.css' --include='*.scss' --include='*.module.css' src\u002F\n```\n\n`will-change` should be rare and scoped. If more than ~5 elements use it permanently, the GPU memory cost outweighs the benefit. Apply it dynamically (add on hover\u002Ffocus, remove on animation end).\n\n### Animation library bundle cost\n\nCheck actual impact:\n\n```bash\nnpx source-map-explorer dist\u002F**\u002F*.js 2>\u002Fdev\u002Fnull || npx vite-bundle-visualizer 2>\u002Fdev\u002Fnull\n```\n\nReference sizes (gzipped): framer-motion ~30KB, GSAP ~25KB, popmotion ~5KB, CSS-only = 0KB. If the project only uses fade+slide, a 30KB lib is overkill.\n\nOn mobile native, the APK \u002F IPA size matters. A third-party animation library adds typically 500KB-2MB:\n\n| Library | Size impact (uncompressed) |\n|---|---|\n| Lottie (iOS) | ~600KB |\n| Lottie (Android) | ~900KB |\n| Rive (iOS) | ~1.5MB |\n| Rive (Android) | ~2MB |\n| Native Compose \u002F SwiftUI animations | 0KB (built-in) |\n\nIf the project only uses fades, slides, and springs, native APIs (Compose `animate*AsState` + spring, SwiftUI `withAnimation`) are sufficient. Justify a Lottie \u002F Rive dependency only for genuinely complex pre-designed animations (e.g., onboarding illustrations).\n\n### requestAnimationFrame vs setTimeout\n\n```bash\ngrep -rn 'setTimeout\\|setInterval' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' src\u002F | grep -iE 'anim\\|motion\\|scroll\\|position\\|style\\|transform'\n```\n\nAnimation loops must use `requestAnimationFrame`. `setTimeout`\u002F`setInterval` causes frame drops and doesn't pause in background tabs.\n\n---\n\n## Consistency Audit\n\n### Duration consistency\n\n```bash\ngrep -rnoE 'duration[:\"'\\''= ]+[0-9.]+' --include='*.tsx' --include='*.jsx' --include='*.ts' --include='*.css' --include='*.scss' src\u002F | sort -t: -k3 | uniq -c -f2 | sort -rn\n```\n\nA well-designed project uses 3-5 distinct durations max (e.g., 0.15, 0.25, 0.35, 0.5). If you see 15 different values, extract them into a motion tokens file.\n\n### Easing inventory\n\nRun all 3 greps to inventory easing values across the codebase:\n\n```bash\n# Web (CSS \u002F JS \u002F TSX)\ngrep -rnoE 'ease[A-Za-z]*|cubic-bezier\\([^)]+\\)|spring\\([^)]*\\)' --include='*.tsx' --include='*.jsx' --include='*.ts' --include='*.css' --include='*.scss' src\u002F 2>\u002Fdev\u002Fnull\n\n# SwiftUI\ngrep -rnoE '\\.spring\\([^)]*\\)|\\.snappy|\\.bouncy|\\.smooth|\\.linear\\(|\\.easeIn|\\.easeOut|\\.interpolatingSpring' --include='*.swift' . 2>\u002Fdev\u002Fnull\n\n# Compose\ngrep -rnoE 'spring\\([^)]*\\)|tween\\([^)]*\\)|FastOutSlowInEasing|LinearOutSlowInEasing|FastOutLinearInEasing|CubicBezierEasing' --include='*.kt' . 2>\u002Fdev\u002Fnull\n```\n\nSame rule across all stacks: 3-5 named easings max in the design system. Random values scattered across files = visual inconsistency. If the codebase has 12 different `cubic-bezier(...)` values or 8 custom `spring(response:dampingFraction:)` configurations, that's a design-system violation, fix it by centralizing into named tokens.\n\n### Symmetric enter\u002Fexit\n\nScan for motion components and verify that:\n- Enter duration >= exit duration (never the reverse)\n- Enter uses `ease-out`, exit uses `ease-in`\n- Enter has full choreography (translate + opacity + scale), exit is simpler (opacity only or opacity + slight scale)\n\n```bash\ngrep -A5 'exit=' --include='*.tsx' --include='*.jsx' -rn src\u002F\n```\n\nCompare `animate` and `exit` props side by side. Asymmetric timing (fast exit, slow enter) is correct. The reverse is wrong.\n\n---\n\n## Stack-specific audit\n\nPick the subsection matching the project stack.\n\n### Compose (Android \u002F Multiplatform)\n- [ ] Run **Layout Inspector** (Android Studio): inspect recompositions, identify components recomposing on every state change.\n- [ ] Run **Macrobenchmark** (`androidx.benchmark.macro`): measure frame timing on a real device under representative scrolling \u002F animation load. Target: \u003C16.67ms per frame at 60fps, \u003C8.33ms at 120fps.\n- [ ] Inspect **recomposition counts** via `Modifier.recomposeHighlighter()` (Compose 1.6+) or Layout Inspector.\n- [ ] Generate **Baseline Profiles** (`BaselineProfileGenerator`) for production builds.\n- [ ] Verify `Modifier.semantics` is set on custom components (TalkBack support).\n\n### SwiftUI (iOS \u002F macOS)\n- [ ] Run **Instruments Time Profiler**: identify hot paths during animation (target: zero frames over 16.67ms).\n- [ ] Run **Instruments Hitches Instrument** (iOS 14+): detects dropped frames and stalls.\n- [ ] Run **Instruments GPU Frame Capture** for Metal shaders: verify shader compile time, GPU vs CPU bottleneck.\n- [ ] Verify `.accessibilityLabel` \u002F `.accessibilityHint` on every interactive view.\n- [ ] Test with Dynamic Type at 200% size (`Environment Overrides` in Xcode).\n- [ ] Test with Reduce Motion ON.\n\n### Web\n- [ ] Existing checklist above (Lighthouse, Chrome DevTools Performance, etc.).\n\n---\n\n## Output Format\n\nStructure findings by severity:\n\n### Critical (must fix before ship)\n- Missing `prefers-reduced-motion` handling\n- Clickable divs without keyboard support\n- `outline: none` without `:focus-visible` replacement\n- Animating layout properties (width\u002Fheight\u002Ftop\u002Fleft)\n\n### Important (fix in current sprint)\n- Conditional renders without `AnimatePresence`\n- Hover states without transition\n- Missing `aria-hidden` on decorative animations\n- `setTimeout` used for animation loops\n- Inconsistent durations (>8 unique values)\n\n### Nice-to-have (backlog)\n- Lists without stagger animation\n- Inline styles without transition\n- Excessive `will-change` usage\n- Asymmetric enter\u002Fexit (wrong direction)\n- Animation library oversized for actual usage\n",{"name":5,"description":7},"main","4c6d8d65f3d6096e2fc25b0845e481dda73c2794","skills\u002Fgenjutsu-design-audit",0,"https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions","Building deterministic AI governance and continuity systems. Workflow architect + visual storyteller","2026-11-11 16:42:59",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add nexuslinkproductions\u002Fyuri-os --skill genjutsu-design-audit",{"tool":60,"command":61},"bunx","bunx skills add nexuslinkproductions\u002Fyuri-os --skill genjutsu-design-audit",{"tool":63,"command":64},"pnpm","pnpm dlx skills add nexuslinkproductions\u002Fyuri-os --skill genjutsu-design-audit","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fgenjutsu-design-audit\u002FSKILL.md",true,[],[69,92,116,144,169,188],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":41},"01M71CG1AME5WC0A79AE65WT0X","zoom-out","Tell the agent to zoom out and give broader context or a higher-level perspective. Use when you're unfamiliar with a section of code or need to understand how it fits into the bigger picture.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fzoom-out\u002FSKILL.md",[],[76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91],"zoom out","zoom","with","harness","how","section","re","true","understand","use","perspective","when","you","code","it","context",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":41},"01M71CFY9ATD0BAXV6B14HFG7C","yuri-shura","6-perspective adversarial review for high-stakes turns (architecture decisions, refactor planning, deployment review) — fans out architect, adversary (7-vector attack), maintainer, ops, product, and security perspectives in parallel, then consolidates. Use when user says 'review this decision', '\u002Fshura', 'adversarial review', 'what could go wrong', 'architecture review', or 'deployment review'.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fyuri-shura\u002FSKILL.md",[],[99,100,79,101,102,103,104,105,106,107,108,85,109,87,110,111,112,113,114,115],"yuri shura","parallel","architecture review","planning","for","deployment","vector","strategic review","decision","strategic","ops","workflow","decisions","architecture","review","perspectives","adversarial",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":125,"publishedAt":41},"01M71CFTTYW1HA2MNX38EV1GJ5","yuri-sales-intelligence","Unified sales and outreach skill generating cold outreach openers, social selling sequences, objection rebuttals, and ad creative for any paid platform — multi-persona aware, adapting tone and offer frame to buyer type. Use when user says 'write a cold email', 'outreach sequence', 'objection handling', 'ad copy', or 'sales pitch'.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fyuri-sales-intelligence\u002FSKILL.md",[122],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通",[126,127,128,129,130,131,132,133,134,87,135,136,137,138,139,140,141,103,142,143],"intelligence","sales intelligence","yuri sales intelligence","sales","cold","paid","social","persona","pitch","cold email","ad creative","write","sequences","sequence","platform","email","cold outreach","frame",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":156,"publishedAt":41},"01M71CFQMBFTFADJNGP0Z2WCYK","yuri-code-intelligence","Unified code quality intelligence layer that diagnoses code smells (Long Method, Feature Envy, design pattern issues), prescribes targeted Fowler refactoring techniques, and reviews code for security, performance, and clarity. Use when user says 'review this code', 'refactor this', 'what's wrong with this method', 'code smells', or 'clean this up'.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fyuri-code-intelligence\u002FSKILL.md",[150,153],{"categoryNo":151,"categoryName":152,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":154,"categoryName":155,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师",[157,89,158,126,79,159,160,161,103,33,162,163,164,165,166,167,168,29,85,87],"yuri code intelligence","code intelligence","reviews","code quality","feature","code review","long","up","issues","clean","techniques","improve",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":175,"publishedAt":41},"01M71CFP32RT6GD3GKNHCJP8VP","yuri-adw","Invoke when user asks to run the ADW loop \u002F agentic engineering loop \u002F software factory workflow.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fyuri-adw\u002FSKILL.md",[],[176,177,178,179,180,181,182,183,184,87,185,110,186,187],"yuri adw","run","engineering loop","software factory","software","agentic engineering","factory","loop","invoke","engineering","agentic","user",{"skillNo":189,"name":190,"nameZh":6,"description":191,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":192,"categories":193,"keywords":206,"publishedAt":41},"01M71CFK4VPEKY6A73237P7RSN","writing-skills","Use when creating new skills, editing existing skills, or verifying skills work before deployment","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fwriting-skills\u002FSKILL.md",[194,197,200,203],{"categoryNo":195,"categoryName":196,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":198,"categoryName":199,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":201,"categoryName":202,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":204,"categoryName":205,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000036","内容创作者",[207,208,209,87,110,210,79,211,104,85,212],"writing","writing skills","new","work","editing","Existing"]