{"data":{"skill":{"slug":"emilkowalski-animation-performance","name":"animation-performance","icon":"📦","repo":"https://github.com/emilkowalski/skills/tree/2d228630ba1446365f614a108cb8252f1feda202/skills/animation-performance","status":"approved","author":"emilkowalski","authorVersion":null,"skillstoreRevision":1},"audit":{"id":"a9881d3e-6d0f-4d0f-baeb-3a75e6290b67","skill_id":"c76e7203-d7fb-4583-8d97-1bb716bda7e5","version":1,"content_hash":"v3:c54b9829974da440ea8d4e418a3c6224f07eb302:ceb9dd3fe912615830f725a0120ccf8d012d15a6218001a5cd6c15d38e39a957:acc9adcb5d04dbbafdeb47f6e8ab30458825bdc7d5934f1b5e332b80e87761ad:736b696c6c732f656d696c6b6f77616c736b692f616e696d6174696f6e2d706572666f726d616e6365:281a2f6392b71c649e145569a34ddd6e","risk_level":"safe","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"All 65 static findings are false positives from Markdown formatting, browser animation examples, a reference link, and ordinary headings. No evidence found of shell execution, system reconnaissance, data exfiltration, or audit-targeting prompt injection. The skill provides scoped animation diagnostics and recommends applying fixes only when asked.","remediation":[],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":3,"line_start":3},{"file":"SKILL.md","line_end":16,"line_start":16},{"file":"SKILL.md","line_end":29,"line_start":29},{"file":"SKILL.md","line_end":33,"line_start":33},{"file":"SKILL.md","line_end":34,"line_start":34},{"file":"SKILL.md","line_end":36,"line_start":36},{"file":"SKILL.md","line_end":45,"line_start":45},{"file":"SKILL.md","line_end":46,"line_start":46},{"file":"SKILL.md","line_end":48,"line_start":48},{"file":"SKILL.md","line_end":49,"line_start":49},{"file":"SKILL.md","line_end":50,"line_start":50},{"file":"SKILL.md","line_end":51,"line_start":51},{"file":"SKILL.md","line_end":52,"line_start":52},{"file":"SKILL.md","line_end":53,"line_start":53},{"file":"SKILL.md","line_end":78,"line_start":78},{"file":"SKILL.md","line_end":79,"line_start":79},{"file":"SKILL.md","line_end":80,"line_start":80},{"file":"SKILL.md","line_end":82,"line_start":82},{"file":"SKILL.md","line_end":88,"line_start":88},{"file":"SKILL.md","line_end":89,"line_start":89},{"file":"SKILL.md","line_end":90,"line_start":90},{"file":"SKILL.md","line_end":91,"line_start":91},{"file":"SKILL.md","line_end":97,"line_start":97},{"file":"SKILL.md","line_end":98,"line_start":98},{"file":"SKILL.md","line_end":102,"line_start":102},{"file":"SKILL.md","line_end":106,"line_start":106},{"file":"SKILL.md","line_end":107,"line_start":107},{"file":"SKILL.md","line_end":112,"line_start":112},{"file":"SKILL.md","line_end":121,"line_start":118},{"file":"SKILL.md","line_end":123,"line_start":121},{"file":"SKILL.md","line_end":123,"line_start":123},{"file":"SKILL.md","line_end":129,"line_start":125},{"file":"SKILL.md","line_end":131,"line_start":129},{"file":"SKILL.md","line_end":136,"line_start":131},{"file":"SKILL.md","line_end":138,"line_start":136},{"file":"SKILL.md","line_end":140,"line_start":138},{"file":"SKILL.md","line_end":140,"line_start":140},{"file":"SKILL.md","line_end":146,"line_start":144},{"file":"SKILL.md","line_end":148,"line_start":146},{"file":"SKILL.md","line_end":150,"line_start":148},{"file":"SKILL.md","line_end":153,"line_start":150},{"file":"SKILL.md","line_end":154,"line_start":153},{"file":"SKILL.md","line_end":156,"line_start":154},{"file":"SKILL.md","line_end":158,"line_start":156},{"file":"SKILL.md","line_end":160,"line_start":158},{"file":"SKILL.md","line_end":162,"line_start":160},{"file":"SKILL.md","line_end":164,"line_start":162},{"file":"SKILL.md","line_end":168,"line_start":164},{"file":"SKILL.md","line_end":170,"line_start":168},{"file":"SKILL.md","line_end":170,"line_start":170}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":20,"line_start":20}]}],"critical_findings":[],"high_findings":[],"medium_findings":[],"low_findings":[],"dangerous_patterns":[],"files_scanned":1,"total_lines":223,"audit_model":"codex","audited_at":"2026-10-11T14:34:11.176+00:00","created_at":"2026-10-11T15:31:10.226578+00:00","static_findings":[{"id":"external_commands:SKILL.md:3:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"description: Keep web animations inside the frame budget — animate composite-only properties, keep m","category":"external_commands","line_end":3,"severity":"medium","line_start":3},{"id":"external_commands:SKILL.md:16:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"A diagnostic skill. It does ONE thing: make motion land every frame. It does not pick easing or dura","category":"external_commands","line_end":16,"severity":"medium","line_start":16},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. **Sprinkling `will-change` and calling it fixed.** It's the last step, not the first. Most jank i","category":"external_commands","line_end":29,"severity":"medium","line_start":29},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. **`transform` and `opacity` by default.** Anything else needs a reason. If a cheaper property pro","category":"external_commands","line_end":33,"severity":"medium","line_start":33},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. **Name the cause before changing code.** Every fix you propose names which of the causes below it","category":"external_commands","line_end":34,"severity":"medium","line_start":34},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"4. **Never `transition: all`.** List the exact properties. `all` animates whatever changes next, inc","category":"external_commands","line_end":36,"severity":"medium","line_start":36},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Animation stutters | Animate `transform`/`opacity`, not `width`/`height`/`top`/`margin` |","category":"external_commands","line_end":45,"severity":"medium","line_start":45},{"id":"external_commands:SKILL.md:46:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Shadow animation is choppy | `filter: drop-shadow()` |","category":"external_commands","line_end":46,"severity":"medium","line_start":46},{"id":"external_commands:SKILL.md:48:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Framer Motion `x`/`y` drops frames | Animate the full `transform` string |","category":"external_commands","line_end":48,"severity":"medium","line_start":48},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Hand-rolled animation drops frames in React | Write to `ref.current.style`, not state |","category":"external_commands","line_end":49,"severity":"medium","line_start":49},{"id":"external_commands:SKILL.md:50:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Drag gets laggier as the list grows | Stop animating an inherited CSS variable; set `transform` di","category":"external_commands","line_end":50,"severity":"medium","line_start":50},{"id":"external_commands:SKILL.md:51:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Blur transition lags (especially Safari) | Keep animated `blur()` under 20px |","category":"external_commands","line_end":51,"severity":"medium","line_start":51},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Unexpected properties animate | Replace `transition: all` with explicit properties |","category":"external_commands","line_end":52,"severity":"medium","line_start":52},{"id":"external_commands:SKILL.md:53:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Element shifts 1px when motion starts or ends | `will-change: transform`, only once you see it |","category":"external_commands","line_end":53,"severity":"medium","line_start":53},{"id":"external_commands:SKILL.md:78:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Composite only | `transform`, `opacity`, and in current Chrome/Firefox also `filter`, `clip-path`,","category":"external_commands","line_end":78,"severity":"medium","line_start":78},{"id":"external_commands:SKILL.md:79:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Paint + composite | `box-shadow`, `border-radius`, `color` | No re-measuring, but a redraw every f","category":"external_commands","line_end":79,"severity":"medium","line_start":79},{"id":"external_commands:SKILL.md:80:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Layout + paint + composite | `width`, `height`, `padding`, `margin`, `top`, `left`, `border-width`","category":"external_commands","line_end":80,"severity":"medium","line_start":80},{"id":"external_commands:SKILL.md:82:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`transform` and `opacity` change how an element looks, not where it sits in the document flow, so no","category":"external_commands","line_end":82,"severity":"medium","line_start":82},{"id":"external_commands:SKILL.md:88:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `width` / `height` / `padding` to grow or shrink | `scale()` |","category":"external_commands","line_end":88,"severity":"medium","line_start":88},{"id":"external_commands:SKILL.md:89:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `top` / `left` / `margin` to move | `translate()` (percentages are relative to the element's own s","category":"external_commands","line_end":89,"severity":"medium","line_start":89},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `display` / `visibility` swaps | `opacity` |","category":"external_commands","line_end":90,"severity":"medium","line_start":90},{"id":"external_commands:SKILL.md:91:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `box-shadow` | `filter: drop-shadow(...)` |","category":"external_commands","line_end":91,"severity":"medium","line_start":91},{"id":"external_commands:SKILL.md:97:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Layout animations don't always drop frames.** An absolutely positioned element, or one with few ","category":"external_commands","line_end":97,"severity":"medium","line_start":97},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Layout properties also move the wrong things.** Animating a sidebar's `margin-left` pushes the c","category":"external_commands","line_end":98,"severity":"medium","line_start":98},{"id":"external_commands:SKILL.md:102:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**JavaScript always runs on the main thread.** An animation driven by `requestAnimationFrame` compet","category":"external_commands","line_end":102,"severity":"medium","line_start":102},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| JS + `requestAnimationFrame` (GSAP, `motion/react` components) | Main thread, always |","category":"external_commands","line_end":106,"severity":"medium","line_start":106},{"id":"external_commands:SKILL.md:107:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Web Animations API (`element.animate()`, Motion's `animate()`) | Can be hardware-accelerated |","category":"external_commands","line_end":107,"severity":"medium","line_start":107},{"id":"external_commands:SKILL.md:112:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Reliably accelerated: `transform` and `opacity`. Gaining support: `filter`, `clip-path`, `background","category":"external_commands","line_end":112,"severity":"medium","line_start":112},{"id":"external_commands:SKILL.md:118:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":121,"severity":"medium","line_start":118},{"id":"external_commands:SKILL.md:121:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":123,"severity":"medium","line_start":121},{"id":"external_commands:SKILL.md:123:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The `x`, `y`, `scale`, `rotate` shorthands are implemented with CSS variables, and animated CSS vari","category":"external_commands","line_end":123,"severity":"medium","line_start":123},{"id":"external_commands:SKILL.md:125:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Acceleration is progressive enhancement.** Browsers silently decline it under conditions that chan","category":"external_commands","line_end":129,"severity":"medium","line_start":125},{"id":"external_commands:SKILL.md:129:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Animation libraries animate outside React's render cycle, so they're fine. The trap is a hand-rolled","category":"external_commands","line_end":131,"severity":"medium","line_start":129},{"id":"external_commands:SKILL.md:131:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":136,"severity":"medium","line_start":131},{"id":"external_commands:SKILL.md:136:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"ref.current.style.transform = `translateY(${nextY}px)`;","category":"external_commands","line_end":138,"severity":"medium","line_start":136},{"id":"external_commands:SKILL.md:138:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":140,"severity":"medium","line_start":138},{"id":"external_commands:SKILL.md:140:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Look for state updates inside `requestAnimationFrame`, `pointermove`, `scroll`, or drag handlers.","category":"external_commands","line_end":140,"severity":"medium","line_start":140},{"id":"external_commands:SKILL.md:144:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Both of these use `transform` and still drop frames.","category":"external_commands","line_end":146,"severity":"medium","line_start":144},{"id":"external_commands:SKILL.md:146:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Inherited CSS variables.** Vaul's drag got laggy once a drawer held more than ~20 items, with no r","category":"external_commands","line_end":148,"severity":"medium","line_start":146},{"id":"external_commands:SKILL.md:148:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```js","category":"external_commands","line_end":150,"severity":"medium","line_start":148},{"id":"external_commands:SKILL.md:150:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"const style = { \"--swipe-amount\": `${draggedDistance}px` };","category":"external_commands","line_end":153,"severity":"medium","line_start":150},{"id":"external_commands:SKILL.md:153:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"const style = { transform: `translateY(${draggedDistance}px)` };","category":"external_commands","line_end":154,"severity":"medium","line_start":153},{"id":"external_commands:SKILL.md:154:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":156,"severity":"medium","line_start":154},{"id":"external_commands:SKILL.md:156:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"CSS variables inherit, so changing one on a parent triggers style recalculation for every child. The","category":"external_commands","line_end":158,"severity":"medium","line_start":156},{"id":"external_commands:SKILL.md:158:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Blur.** `filter: blur()` gets expensive fast, especially in Safari. Keep animated blur under 20px;","category":"external_commands","line_end":160,"severity":"medium","line_start":158},{"id":"external_commands:SKILL.md:160:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"## `will-change`","category":"external_commands","line_end":162,"severity":"medium","line_start":160},{"id":"external_commands:SKILL.md:162:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"A browser can hand an animation from the CPU to the GPU mid-flight, and that hand-off can make the e","category":"external_commands","line_end":164,"severity":"medium","line_start":162},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```css","category":"external_commands","line_end":168,"severity":"medium","line_start":164},{"id":"external_commands:SKILL.md:168:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":170,"severity":"medium","line_start":168},{"id":"external_commands:SKILL.md:170:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Add it only once you see the shift or measured dropped frames.** Browsers already promote elements","category":"external_commands","line_end":170,"severity":"medium","line_start":170},{"id":"external_commands:SKILL.md:190:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Tab indicator | `motion/react` `layoutId` | layout | route change |","category":"external_commands","line_end":190,"severity":"medium","line_start":190},{"id":"external_commands:SKILL.md:191:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Drawer | CSS transition | `transform` | user drag |","category":"external_commands","line_end":192,"severity":"medium","line_start":191},{"id":"external_commands:SKILL.md:192:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Card hover | CSS transition | `all` | hover |","category":"external_commands","line_end":194,"severity":"medium","line_start":192},{"id":"external_commands:SKILL.md:194:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Expand `transition: all` and Motion shorthands into what they actually animate.","category":"external_commands","line_end":200,"severity":"medium","line_start":194},{"id":"external_commands:SKILL.md:200:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. **Which properties animate?** Anything other than `transform`/`opacity` is the first suspect: lay","category":"external_commands","line_end":200,"severity":"medium","line_start":200},{"id":"external_commands:SKILL.md:204:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"5. **Is a CSS variable animated at all?** Directly, or through Motion's `x`/`y`/`scale`.","category":"external_commands","line_end":204,"severity":"medium","line_start":204},{"id":"external_commands:SKILL.md:205:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"6. **Any animated `blur()` above 20px?**","category":"external_commands","line_end":206,"severity":"medium","line_start":205},{"id":"external_commands:SKILL.md:206:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"7. **Still shifting or stuttering?** Now add `will-change: transform` to the animating element.","category":"external_commands","line_end":214,"severity":"medium","line_start":206},{"id":"external_commands:SKILL.md:214:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":215,"severity":"medium","line_start":214},{"id":"external_commands:SKILL.md:215:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**[Element]**: `file.tsx:42`","category":"external_commands","line_end":217,"severity":"medium","line_start":215},{"id":"external_commands:SKILL.md:217:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Before: `transition: all 200ms` (animates `padding`, triggers layout)","category":"external_commands","line_end":217,"severity":"medium","line_start":217},{"id":"external_commands:SKILL.md:218:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"After: `transition: transform 200ms` with `scale(0.97)`","category":"external_commands","line_end":218,"severity":"medium","line_start":218},{"id":"network:SKILL.md:20:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Imagine [Sonner](https://sonner.emilkowal.ski/) running at 30fps. Same easing, same durations, same ","category":"network","line_end":20,"severity":"low","line_start":20},{"id":"blocker:SKILL.md:57:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"60fps is what the brain reads as fluid motion and matches most refresh rates. It gives the browser *","category":"blocker","line_end":57,"severity":"low","line_start":57},{"id":"blocker:SKILL.md:174:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"## Should You Avoid JS Animation?","category":"blocker","line_end":174,"severity":"low","line_start":174}],"finding_verdicts":[{"id":"external_commands:SKILL.md:3:ruby-shell-backtick-execution","reason":"The frontmatter description uses Markdown backticks around will-change. This is descriptive metadata, not Ruby or shell execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:16:ruby-shell-backtick-execution","reason":"Backticks format names of related animation skills. The paragraph describes scope and contains no executable command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","reason":"Backticks mark the CSS property will-change in performance guidance. No shell interpreter or execution mechanism is present.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","reason":"The line formats transform and opacity as CSS property names. These Markdown spans do not execute commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","reason":"The line quotes will-change while requiring a diagnosis before optimization. The backticks are Markdown formatting, not shell syntax.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","reason":"Inline backticks format transition: all and all in CSS guidance. The text recommends explicit transition properties without executing anything.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","reason":"The table compares CSS properties that affect animation cost. Backticks are inline Markdown delimiters, not command substitution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:46:ruby-shell-backtick-execution","reason":"The table formats filter: drop-shadow() as a browser styling recommendation. It contains no Ruby or shell invocation.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:48:ruby-shell-backtick-execution","reason":"Backticks identify Framer Motion properties and the transform string. This is an animation recommendation, not external command execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","reason":"The table references ref.current.style as a React animation technique. Markdown formatting does not invoke a shell.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:50:ruby-shell-backtick-execution","reason":"The line recommends direct transform updates instead of inherited CSS variables. The backticks only format a CSS property.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:51:ruby-shell-backtick-execution","reason":"The backticked blur() is a CSS filter function in performance advice. It is not a shell command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","reason":"The line formats transition: all while recommending explicit CSS properties. There is no command execution mechanism.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:53:ruby-shell-backtick-execution","reason":"The backticked will-change: transform is a CSS declaration for a measured rendering issue. It does not invoke external commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:78:ruby-shell-backtick-execution","reason":"Backticks format CSS properties in a rendering cost table. This is documentation, not Ruby or shell code.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:79:ruby-shell-backtick-execution","reason":"The table lists CSS properties associated with painting. Inline Markdown backticks do not execute these property names.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:80:ruby-shell-backtick-execution","reason":"The table lists layout-related CSS properties. The backticks are Markdown code spans, with no shell execution context.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:82:ruby-shell-backtick-execution","reason":"Backticks mark transform and opacity in a browser rendering explanation. The prose contains no executable shell expressions.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:88:ruby-shell-backtick-execution","reason":"The table compares layout properties with the CSS scale() function. The formatting is not command substitution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:89:ruby-shell-backtick-execution","reason":"The table recommends CSS translate() instead of positional layout properties. Backticks delimit documentation examples, not shell commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","reason":"The table formats display, visibility, and opacity as CSS identifiers. No Ruby or shell execution is present.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:91:ruby-shell-backtick-execution","reason":"The table compares box-shadow with a CSS drop-shadow filter. The backticks only format browser styling syntax.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:97:ruby-shell-backtick-execution","reason":"The paragraph compares padding animation with scale() for rendering cost. Inline code formatting is not shell execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","reason":"The paragraph compares margin-left with translateX in a sidebar animation. Backticks format CSS identifiers without executing commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:102:ruby-shell-backtick-execution","reason":"Backticks identify the browser requestAnimationFrame API in explanatory prose. This API reference is not external command execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","reason":"The table references requestAnimationFrame and motion/react as animation drivers. Backticks are Markdown formatting rather than shell syntax.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:107:ruby-shell-backtick-execution","reason":"The table documents browser animation API methods. These inline method names neither invoke a shell nor execute external commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:112:ruby-shell-backtick-execution","reason":"The line lists CSS properties with differing acceleration support. Inline Markdown backticks do not execute these names.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:118:ruby-shell-backtick-execution","reason":"The triple backticks open a JSX documentation block comparing Framer Motion animation properties. The block contains no shell or Ruby execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:121:ruby-shell-backtick-execution","reason":"The backticks close the JSX example and format property names in the following explanation. They are Markdown delimiters, not executable expressions.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:123:ruby-shell-backtick-execution","reason":"The line describes Framer Motion shorthands and CSS variables. Backticks format animation property names without invoking commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:125:ruby-shell-backtick-execution","reason":"Backticks format translateY(100%) in advice about browser acceleration. The cited range contains ordinary prose, not shell execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:129:ruby-shell-backtick-execution","reason":"The paragraph formats setState and introduces a JSX example about React rendering. Neither the prose nor the code fence executes shell commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:131:ruby-shell-backtick-execution","reason":"The triple backticks open a JSX example comparing state updates with DOM style updates. The example has no external command invocation.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:136:ruby-shell-backtick-execution","reason":"The backticks form a JavaScript template literal assigned to a DOM transform style. They interpolate a movement value, not a shell command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:138:ruby-shell-backtick-execution","reason":"The backticks close a JSX block and format browser event names in the next paragraph. No shell execution mechanism appears.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:140:ruby-shell-backtick-execution","reason":"The line names browser animation and input handlers to inspect for React state updates. Backticks are inline documentation formatting.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:144:ruby-shell-backtick-execution","reason":"The paragraph formats transform while introducing CSS variable and blur performance issues. This is explanatory prose, not command execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:146:ruby-shell-backtick-execution","reason":"Backticks format translateY() and open a JavaScript example about inherited CSS variables. The range contains no shell or Ruby interpreter.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:148:ruby-shell-backtick-execution","reason":"The triple backticks open a JavaScript documentation block constructing style values. These examples do not execute external commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:150:ruby-shell-backtick-execution","reason":"The backticks create JavaScript template literals for pixel distances and CSS transforms. They do not invoke a shell or evaluate command text.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:153:ruby-shell-backtick-execution","reason":"The transform value uses a JavaScript template literal, followed by a Markdown closing fence. Neither construct is shell execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:154:ruby-shell-backtick-execution","reason":"The backticks close a JavaScript example and format transform in explanatory prose. No command interpreter is invoked.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:156:ruby-shell-backtick-execution","reason":"The paragraph explains inherited CSS variable recalculation and references transform. Its backticks are Markdown code spans, not shell syntax.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:158:ruby-shell-backtick-execution","reason":"The range formats filter: blur() and will-change in browser performance guidance. These CSS references do not execute external commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:160:ruby-shell-backtick-execution","reason":"The heading and paragraph use backticks around the CSS property will-change. They are documentation formatting with no execution behavior.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:162:ruby-shell-backtick-execution","reason":"The paragraph explains GPU layer promotion and introduces a fenced CSS declaration. It contains no shell or Ruby execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","reason":"The triple backticks surround a CSS rule setting will-change: transform on a drawer. The rule is browser styling, not an external command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:168:ruby-shell-backtick-execution","reason":"The closing CSS fence is followed by advice against excessive GPU layer promotion. Backticks remain Markdown delimiters throughout.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:170:ruby-shell-backtick-execution","reason":"Backticks format CSS properties and the universal selector in layer promotion guidance. No executable command or shell invocation appears.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:190:ruby-shell-backtick-execution","reason":"The animation inventory table formats motion/react and layoutId. These are library identifiers, not external commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:191:ruby-shell-backtick-execution","reason":"The table rows format transform and all as CSS properties to inventory. The backticks have no shell execution context.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:192:ruby-shell-backtick-execution","reason":"The table and following instruction discuss expanding transition: all during animation review. Backticks format CSS syntax, not executable commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:194:ruby-shell-backtick-execution","reason":"The diagnostic instructions reference transition and rendering properties using Markdown code spans. The range contains no shell execution mechanism.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:200:ruby-shell-backtick-execution","reason":"The checklist formats CSS properties while prioritizing layout and paint costs. This is animation diagnosis, not command execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:204:ruby-shell-backtick-execution","reason":"The checklist names Motion shorthands for CSS variable inspection. Inline backticks do not execute these identifiers.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:205:ruby-shell-backtick-execution","reason":"The checklist references blur() and will-change as browser performance suspects. These Markdown code spans are not shell commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:206:ruby-shell-backtick-execution","reason":"The range recommends a CSS declaration and device profiling, then opens a report template. It contains no shell or Ruby invocation.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:214:ruby-shell-backtick-execution","reason":"The triple backticks open a plain-text report template with an illustrative source reference. This formatting does not execute commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:215:ruby-shell-backtick-execution","reason":"Backticks format an illustrative source reference and CSS example inside a report template. The template does not invoke external commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:217:ruby-shell-backtick-execution","reason":"The report template formats a before-state CSS transition and padding property. These are documentation examples, not shell expressions.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:218:ruby-shell-backtick-execution","reason":"The report template formats an after-state CSS transition and scale function. Backticks delimit inline examples without executing anything.","verdict":"false_positive","confidence":1},{"id":"network:SKILL.md:20:hardcoded-url","reason":"The URL is a Markdown reference to the Sonner animation demonstration. No request code, upload instruction, or data transmission is present.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:57:system-reconnaissance","reason":"The line explains refresh rates and frame time budgets. It does not query the host system, enumerate resources, or gather environment information.","verdict":"false_positive","confidence":1},{"id":"blocker:SKILL.md:174:system-reconnaissance","reason":"The line is the heading Should You Avoid JS Animation? It contains no reconnaissance command or environment collection instruction.","verdict":"false_positive","confidence":1}],"semantic_findings":[],"subject_marketplace_commit_sha":"c54b9829974da440ea8d4e418a3c6224f07eb302","subject_content_hash":"ceb9dd3fe912615830f725a0120ccf8d012d15a6218001a5cd6c15d38e39a957","subject_tree_hash":"acc9adcb5d04dbbafdeb47f6e8ab30458825bdc7d5934f1b5e332b80e87761ad","subject_plugin_path":"skills/emilkowalski/animation-performance","audit_payload_hash":"281a2f6392b71c649e145569a34ddd6e","confirmed_risk_level":"safe","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"c54b9829974da440ea8d4e418a3c6224f07eb302","contentHash":"ceb9dd3fe912615830f725a0120ccf8d012d15a6218001a5cd6c15d38e39a957","treeHash":"acc9adcb5d04dbbafdeb47f6e8ab30458825bdc7d5934f1b5e332b80e87761ad","pluginPath":"skills/emilkowalski/animation-performance","auditPayloadHash":"281a2f6392b71c649e145569a34ddd6e"},"scannerVersion":"3.0.0","policyVersion":"skillstore-security-audit-policy-v1"},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"issued","url":"/api/skills/emilkowalski-animation-performance/audits/1/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"safe","confirmedFindingCount":0,"capabilityReviewCount":0,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}