{"data":{"skill":{"slug":"vercel-labs-vercel-react-view-transitions","name":"vercel-react-view-transitions","icon":"📦","repo":"https://github.com/vercel-labs/agent-skills/tree/1a2c79d4e6c4a2283dc2c614b6538cbe1ed5ca62/skills/react-view-transitions","status":"approved","author":"vercel-labs","authorVersion":"1.0.0","skillstoreRevision":2,"license":"MIT"},"licenseCorrection":null,"audit":{"id":"021d5588-e380-466f-9af7-e20143849687","skill_id":"60343d48-d4f1-4a4e-ae82-2c9c4f368633","version":7,"content_hash":"v3:1f79e59ae427a74eab604c013e03b61f04634721:693acbddd1d2dcf774286867efbc9a5c09dce2da6f21f8e12618187a92f2106a:52fa569082d0e0e74c3d8fa4f2f362f009d426c8f425635a5675acef470a4e24:736b696c6c732f76657263656c2d6c6162732f76657263656c2d72656163742d766965772d7472616e736974696f6e73:0f258fbd8ea0dfe1e985966f6019bbfa","risk_level":"safe","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"All 133 static findings are false positives from documentation, JavaScript template literals, relative reference links, UI terminology, and ordinary installation instructions. No evidence found of keylogging, system reconnaissance, credential access, data exfiltration, or prompt injection in the reviewed files.","remediation":[],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"AGENTS.md","line_end":247,"line_start":246},{"file":"AGENTS.md","line_end":254,"line_start":247},{"file":"AGENTS.md","line_end":476,"line_start":471},{"file":"AGENTS.md","line_end":479,"line_start":476},{"file":"AGENTS.md","line_end":544,"line_start":540},{"file":"AGENTS.md","line_end":574,"line_start":560},{"file":"AGENTS.md","line_end":587,"line_start":574},{"file":"AGENTS.md","line_end":1261,"line_start":1255},{"file":"AGENTS.md","line_end":1344,"line_start":1343},{"file":"AGENTS.md","line_end":1351,"line_start":1344},{"file":"AGENTS.md","line_end":1354,"line_start":1351},{"file":"references/implementation.md","line_end":144,"line_start":139},{"file":"references/implementation.md","line_end":147,"line_start":144},{"file":"references/nextjs.md","line_end":114,"line_start":108},{"file":"references/nextjs.md","line_end":197,"line_start":196},{"file":"references/nextjs.md","line_end":204,"line_start":197},{"file":"references/nextjs.md","line_end":207,"line_start":204},{"file":"references/patterns.md","line_end":39,"line_start":35},{"file":"references/patterns.md","line_end":69,"line_start":55},{"file":"references/patterns.md","line_end":82,"line_start":69},{"file":"SKILL.md","line_end":3,"line_start":3},{"file":"SKILL.md","line_end":12,"line_start":12},{"file":"SKILL.md","line_end":16,"line_start":16},{"file":"SKILL.md","line_end":22,"line_start":22},{"file":"SKILL.md","line_end":24,"line_start":24},{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":34,"line_start":34},{"file":"SKILL.md","line_end":35,"line_start":35},{"file":"SKILL.md","line_end":36,"line_start":36},{"file":"SKILL.md","line_end":37,"line_start":37},{"file":"SKILL.md","line_end":45,"line_start":45},{"file":"SKILL.md","line_end":46,"line_start":46},{"file":"SKILL.md","line_end":47,"line_start":47},{"file":"SKILL.md","line_end":59,"line_start":59},{"file":"SKILL.md","line_end":67,"line_start":61},{"file":"SKILL.md","line_end":69,"line_start":67},{"file":"SKILL.md","line_end":69,"line_start":69},{"file":"SKILL.md","line_end":76,"line_start":75},{"file":"SKILL.md","line_end":77,"line_start":76},{"file":"SKILL.md","line_end":78,"line_start":77},{"file":"SKILL.md","line_end":80,"line_start":78},{"file":"SKILL.md","line_end":80,"line_start":80},{"file":"SKILL.md","line_end":86,"line_start":84},{"file":"SKILL.md","line_end":98,"line_start":86},{"file":"SKILL.md","line_end":106,"line_start":98},{"file":"SKILL.md","line_end":106,"line_start":106},{"file":"SKILL.md","line_end":110,"line_start":108},{"file":"SKILL.md","line_end":112,"line_start":110},{"file":"SKILL.md","line_end":112,"line_start":112},{"file":"SKILL.md","line_end":117,"line_start":116}]},{"factor":"filesystem","evidence":[{"file":"AGENTS.md","line_end":483,"line_start":483},{"file":"AGENTS.md","line_end":1174,"line_start":1174},{"file":"references/implementation.md","line_end":151,"line_start":151},{"file":"references/nextjs.md","line_end":27,"line_start":27}]},{"factor":"network","evidence":[{"file":"metadata.json","line_end":7,"line_start":7},{"file":"metadata.json","line_end":8,"line_start":8},{"file":"metadata.json","line_end":9,"line_start":9},{"file":"metadata.json","line_end":10,"line_start":10},{"file":"README.md","line_end":35,"line_start":35}]}],"critical_findings":[],"high_findings":[],"medium_findings":[],"low_findings":[],"dangerous_patterns":[],"files_scanned":9,"total_lines":2813,"audit_model":"codex","audited_at":"2026-11-09T12:20:44.146+00:00","created_at":"2026-11-10T01:33:02.48823+00:00","static_findings":[{"id":"external_commands:AGENTS.md:246:ruby-shell-backtick-execution","file":"AGENTS.md","pattern":"Ruby/shell backtick execution","snippet":"<Link href={`/items/${item.id}`}>","category":"external_commands","line_end":247,"severity":"medium","line_start":246},{"id":"external_commands:AGENTS.md:247:ruby-shell-backtick-execution","file":"AGENTS.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition name={`item-image-${item.id}`} share=\"morph\">   {/* shared element */}","category":"external_commands","line_end":254,"severity":"medium","line_start":247},{"id":"external_commands:AGENTS.md:471:ruby-shell-backtick-execution","file":"AGENTS.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition name={`photo-${photo.id}`} share=\"morph\" default=\"none\">","category":"external_commands","line_end":476,"severity":"medium","line_start":471},{"id":"external_commands:AGENTS.md:476:ruby-shell-backtick-execution","file":"AGENTS.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition name={`photo-${photo.id}`} share=\"morph\">","category":"external_commands","line_end":479,"severity":"medium","line_start":476},{"id":"external_commands:AGENTS.md:540:ruby-shell-backtick-execution","file":"AGENTS.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition key={item.id} name={`item-${item.id}`} share=\"morph\" default=\"none\">","category":"external_commands","line_end":544,"severity":"medium","line_start":540},{"id":"external_commands:AGENTS.md:560:ruby-shell-backtick-execution","file":"AGENTS.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition enter=\"slide-in\" name={`item-${expandedId}`}>","category":"external_commands","line_end":574,"severity":"medium","line_start":560},{"id":"external_commands:AGENTS.md:574:ruby-shell-backtick-execution","file":"AGENTS.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition key={item.id} name={`item-${item.id}`}>","category":"external_commands","line_end":587,"severity":"medium","line_start":574},{"id":"external_commands:AGENTS.md:1255:ruby-shell-backtick-execution","file":"AGENTS.md","pattern":"Ruby/shell backtick execution","snippet":"router.replace(`?sort=${sort}`);","category":"external_commands","line_end":1261,"severity":"medium","line_start":1255},{"id":"external_commands:AGENTS.md:1343:ruby-shell-backtick-execution","file":"AGENTS.md","pattern":"Ruby/shell backtick execution","snippet":"<Link key={product.id} href={`/products/${product.id}`} transitionTypes={['nav-forward']}>","category":"external_commands","line_end":1344,"severity":"medium","line_start":1343},{"id":"external_commands:AGENTS.md:1344:ruby-shell-backtick-execution","file":"AGENTS.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition name={`product-${product.id}`}>","category":"external_commands","line_end":1351,"severity":"medium","line_start":1344},{"id":"external_commands:AGENTS.md:1351:ruby-shell-backtick-execution","file":"AGENTS.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition name={`product-${product.id}`}>","category":"external_commands","line_end":1354,"severity":"medium","line_start":1351},{"id":"filesystem:AGENTS.md:483:path-traversal-sequence","file":"AGENTS.md","pattern":"Path traversal sequence","snippet":"When list items contain shared elements, compose both patterns with two nested `<ViewTransition>` la","category":"filesystem","line_end":483,"severity":"high","line_start":483},{"id":"filesystem:AGENTS.md:1174:path-traversal-sequence","file":"AGENTS.md","pattern":"Path traversal sequence","snippet":"**Do NOT add a layout-level VT wrapping `{children}` if pages have their own VTs.** A nested VT skip","category":"filesystem","line_end":1174,"severity":"high","line_start":1174},{"id":"blocker:AGENTS.md:536:keylogger-keywords","file":"AGENTS.md","pattern":"Keylogger keywords","snippet":"Per-item `<ViewTransition name={...}>` inside a deferred list triggers cross-fades on every keystrok","category":"blocker","line_end":536,"severity":"critical","line_start":536},{"id":"blocker:AGENTS.md:233:system-reconnaissance","file":"AGENTS.md","pattern":"System reconnaissance","snippet":"Trigger inside `startTransition`. Avoid wrapper `<div>`s between list and VT.","category":"blocker","line_end":233,"severity":"low","line_start":233},{"id":"blocker:AGENTS.md:262:system-reconnaissance","file":"AGENTS.md","pattern":"System reconnaissance","snippet":"<ResultsGrid />","category":"blocker","line_end":262,"severity":"low","line_start":262},{"id":"blocker:AGENTS.md:470:system-reconnaissance","file":"AGENTS.md","pattern":"System reconnaissance","snippet":"// On the source view (e.g., list/grid page)","category":"blocker","line_end":470,"severity":"low","line_start":470},{"id":"blocker:AGENTS.md:510:system-reconnaissance","file":"AGENTS.md","pattern":"System reconnaissance","snippet":"## Searchable Grid with `useDeferredValue`","category":"blocker","line_end":510,"severity":"low","line_start":510},{"id":"blocker:AGENTS.md:528:system-reconnaissance","file":"AGENTS.md","pattern":"System reconnaissance","snippet":"<ItemGrid itemsPromise={itemsPromise} search={deferredSearch} />","category":"blocker","line_end":528,"severity":"low","line_start":528},{"id":"blocker:AGENTS.md:548:system-reconnaissance","file":"AGENTS.md","pattern":"System reconnaissance","snippet":"Toggle between grid and detail view with shared element morph:","category":"blocker","line_end":548,"severity":"low","line_start":548},{"id":"blocker:AGENTS.md:562:system-reconnaissance","file":"AGENTS.md","pattern":"System reconnaissance","snippet":"item={items.find(i => i.id === expandedId)}","category":"blocker","line_end":562,"severity":"low","line_start":562},{"id":"blocker:AGENTS.md:572:system-reconnaissance","file":"AGENTS.md","pattern":"System reconnaissance","snippet":"<div className=\"grid grid-cols-3 gap-4\">","category":"blocker","line_end":572,"severity":"low","line_start":572},{"id":"blocker:AGENTS.md:690:system-reconnaissance","file":"AGENTS.md","pattern":"System reconnaissance","snippet":"- Sometimes the better fix is no morph at all: pad fixed-size lists to a constant slot count with in","category":"blocker","line_end":690,"severity":"low","line_start":690},{"id":"blocker:AGENTS.md:1089:system-reconnaissance","file":"AGENTS.md","pattern":"System reconnaissance","snippet":"For elements with `backdrop-filter`, hide the old snapshot to avoid flash:","category":"blocker","line_end":1089,"severity":"low","line_start":1089},{"id":"blocker:AGENTS.md:1117:system-reconnaissance","file":"AGENTS.md","pattern":"System reconnaissance","snippet":"One shared-name indicator morphs between positions. Slide the group; disable old/new so the solid ba","category":"blocker","line_end":1117,"severity":"low","line_start":1117},{"id":"blocker:AGENTS.md:1331:system-reconnaissance","file":"AGENTS.md","pattern":"System reconnaissance","snippet":"<ViewTransition enter=\"slide-up\" default=\"none\"><PhotoGrid photos={photos} /></ViewTransition>","category":"blocker","line_end":1331,"severity":"low","line_start":1331},{"id":"network:metadata.json:7:hardcoded-url","file":"metadata.json","pattern":"Hardcoded URL","snippet":"\"https://react.dev/reference/react/ViewTransition\",","category":"network","line_end":7,"severity":"low","line_start":7},{"id":"network:metadata.json:8:hardcoded-url","file":"metadata.json","pattern":"Hardcoded URL","snippet":"\"https://react.dev/reference/react/addTransitionType\",","category":"network","line_end":8,"severity":"low","line_start":8},{"id":"network:metadata.json:9:hardcoded-url","file":"metadata.json","pattern":"Hardcoded URL","snippet":"\"https://nextjs.org/docs/app/api-reference/config/next-config-js/viewTransition\",","category":"network","line_end":9,"severity":"low","line_start":9},{"id":"network:metadata.json:10:hardcoded-url","file":"metadata.json","pattern":"Hardcoded URL","snippet":"\"https://github.com/vercel/next-app-router-playground/tree/main/app/view-transitions\"","category":"network","line_end":10,"severity":"low","line_start":10},{"id":"network:README.md:35:hardcoded-url","file":"README.md","pattern":"Hardcoded URL","snippet":"npx skills add https://github.com/vercel-labs/agent-skills --skill vercel-react-view-transitions","category":"network","line_end":35,"severity":"low","line_start":35},{"id":"blocker:references/css-recipes.md:257:system-reconnaissance","file":"references/css-recipes.md","pattern":"System reconnaissance","snippet":"For elements with `backdrop-filter`, hide the old snapshot to avoid flash:","category":"blocker","line_end":257,"severity":"low","line_start":257},{"id":"blocker:references/css-recipes.md:285:system-reconnaissance","file":"references/css-recipes.md","pattern":"System reconnaissance","snippet":"One shared-name indicator morphs between positions. Slide the group; disable old/new so the solid ba","category":"blocker","line_end":285,"severity":"low","line_start":285},{"id":"external_commands:references/implementation.md:139:ruby-shell-backtick-execution","file":"references/implementation.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition name={`photo-${photo.id}`} share=\"morph\" default=\"none\">","category":"external_commands","line_end":144,"severity":"medium","line_start":139},{"id":"external_commands:references/implementation.md:144:ruby-shell-backtick-execution","file":"references/implementation.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition name={`photo-${photo.id}`} share=\"morph\">","category":"external_commands","line_end":147,"severity":"medium","line_start":144},{"id":"filesystem:references/implementation.md:151:path-traversal-sequence","file":"references/implementation.md","pattern":"Path traversal sequence","snippet":"When list items contain shared elements, compose both patterns with two nested `<ViewTransition>` la","category":"filesystem","line_end":151,"severity":"high","line_start":151},{"id":"blocker:references/implementation.md:138:system-reconnaissance","file":"references/implementation.md","pattern":"System reconnaissance","snippet":"// On the source view (e.g., list/grid page)","category":"blocker","line_end":138,"severity":"low","line_start":138},{"id":"external_commands:references/nextjs.md:108:ruby-shell-backtick-execution","file":"references/nextjs.md","pattern":"Ruby/shell backtick execution","snippet":"router.replace(`?sort=${sort}`);","category":"external_commands","line_end":114,"severity":"medium","line_start":108},{"id":"external_commands:references/nextjs.md:196:ruby-shell-backtick-execution","file":"references/nextjs.md","pattern":"Ruby/shell backtick execution","snippet":"<Link key={product.id} href={`/products/${product.id}`} transitionTypes={['nav-forward']}>","category":"external_commands","line_end":197,"severity":"medium","line_start":196},{"id":"external_commands:references/nextjs.md:197:ruby-shell-backtick-execution","file":"references/nextjs.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition name={`product-${product.id}`}>","category":"external_commands","line_end":204,"severity":"medium","line_start":197},{"id":"external_commands:references/nextjs.md:204:ruby-shell-backtick-execution","file":"references/nextjs.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition name={`product-${product.id}`}>","category":"external_commands","line_end":207,"severity":"medium","line_start":204},{"id":"filesystem:references/nextjs.md:27:path-traversal-sequence","file":"references/nextjs.md","pattern":"Path traversal sequence","snippet":"**Do NOT add a layout-level VT wrapping `{children}` if pages have their own VTs.** A nested VT skip","category":"filesystem","line_end":27,"severity":"high","line_start":27},{"id":"blocker:references/nextjs.md:184:system-reconnaissance","file":"references/nextjs.md","pattern":"System reconnaissance","snippet":"<ViewTransition enter=\"slide-up\" default=\"none\"><PhotoGrid photos={photos} /></ViewTransition>","category":"blocker","line_end":184,"severity":"low","line_start":184},{"id":"external_commands:references/patterns.md:35:ruby-shell-backtick-execution","file":"references/patterns.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition key={item.id} name={`item-${item.id}`} share=\"morph\" default=\"none\">","category":"external_commands","line_end":39,"severity":"medium","line_start":35},{"id":"external_commands:references/patterns.md:55:ruby-shell-backtick-execution","file":"references/patterns.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition enter=\"slide-in\" name={`item-${expandedId}`}>","category":"external_commands","line_end":69,"severity":"medium","line_start":55},{"id":"external_commands:references/patterns.md:69:ruby-shell-backtick-execution","file":"references/patterns.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition key={item.id} name={`item-${item.id}`}>","category":"external_commands","line_end":82,"severity":"medium","line_start":69},{"id":"blocker:references/patterns.md:31:keylogger-keywords","file":"references/patterns.md","pattern":"Keylogger keywords","snippet":"Per-item `<ViewTransition name={...}>` inside a deferred list triggers cross-fades on every keystrok","category":"blocker","line_end":31,"severity":"critical","line_start":31},{"id":"blocker:references/patterns.md:5:system-reconnaissance","file":"references/patterns.md","pattern":"System reconnaissance","snippet":"## Searchable Grid with `useDeferredValue`","category":"blocker","line_end":5,"severity":"low","line_start":5},{"id":"blocker:references/patterns.md:23:system-reconnaissance","file":"references/patterns.md","pattern":"System reconnaissance","snippet":"<ItemGrid itemsPromise={itemsPromise} search={deferredSearch} />","category":"blocker","line_end":23,"severity":"low","line_start":23},{"id":"blocker:references/patterns.md:43:system-reconnaissance","file":"references/patterns.md","pattern":"System reconnaissance","snippet":"Toggle between grid and detail view with shared element morph:","category":"blocker","line_end":43,"severity":"low","line_start":43},{"id":"blocker:references/patterns.md:57:system-reconnaissance","file":"references/patterns.md","pattern":"System reconnaissance","snippet":"item={items.find(i => i.id === expandedId)}","category":"blocker","line_end":57,"severity":"low","line_start":57},{"id":"blocker:references/patterns.md:67:system-reconnaissance","file":"references/patterns.md","pattern":"System reconnaissance","snippet":"<div className=\"grid grid-cols-3 gap-4\">","category":"blocker","line_end":67,"severity":"low","line_start":67},{"id":"blocker:references/patterns.md:185:system-reconnaissance","file":"references/patterns.md","pattern":"System reconnaissance","snippet":"- Sometimes the better fix is no morph at all: pad fixed-size lists to a constant slot count with in","category":"blocker","line_end":185,"severity":"low","line_start":185},{"id":"external_commands:SKILL.md:3:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"description: Guide for implementing smooth, native-feeling animations using React's View Transition ","category":"external_commands","line_end":3,"severity":"medium","line_start":3},{"id":"external_commands:SKILL.md:12:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Animate between UI states using the browser's native `document.startViewTransition`. Declare *what* ","category":"external_commands","line_end":12,"severity":"medium","line_start":12},{"id":"external_commands:SKILL.md:16:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Every `<ViewTransition>` should communicate a spatial relationship or continuity. If you can't artic","category":"external_commands","line_end":16,"severity":"medium","line_start":16},{"id":"external_commands:SKILL.md:22:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| 1 | **Shared element** (`name`) | \"Same thing — going deeper\" |","category":"external_commands","line_end":22,"severity":"medium","line_start":22},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| 3 | **List identity** (per-item `key`) | \"Same items, new arrangement\" |","category":"external_commands","line_end":24,"severity":"medium","line_start":24},{"id":"external_commands:SKILL.md:25:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| 4 | **State change** (`enter`/`exit`) | \"Something appeared/disappeared\" |","category":"external_commands","line_end":25,"severity":"medium","line_start":25},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Hierarchical navigation (list → detail) | Type-keyed `nav-forward` / `nav-back` | Communicates spa","category":"external_commands","line_end":34,"severity":"medium","line_start":34},{"id":"external_commands:SKILL.md:35:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Lateral navigation (tab-to-tab) | Bare `<ViewTransition>` (fade) or `default=\"none\"` | No depth to","category":"external_commands","line_end":35,"severity":"medium","line_start":35},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Suspense reveal | `enter`/`exit` string props | Content arriving |","category":"external_commands","line_end":36,"severity":"medium","line_start":36},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Revalidation / background refresh | `default=\"none\"` | Silent — no animation needed |","category":"external_commands","line_end":37,"severity":"medium","line_start":37},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Next.js:** Do **not** install `react@canary` — the App Router already bundles React canary inter","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":"- **Without Next.js:** Use stable `react` and `react-dom` 19.3 or newer (`ViewTransition` and `addTr","category":"external_commands","line_end":46,"severity":"medium","line_start":46},{"id":"external_commands:SKILL.md:47:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Browser support: Chromium 125+ (React needs the v2 object form of `startViewTransition`), Firefox ","category":"external_commands","line_end":47,"severity":"medium","line_start":47},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"### The `<ViewTransition>` Component","category":"external_commands","line_end":59,"severity":"medium","line_start":59},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":67,"severity":"medium","line_start":61},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":69,"severity":"medium","line_start":67},{"id":"external_commands:SKILL.md:69:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"React auto-assigns a unique `view-transition-name` and calls `document.startViewTransition` behind t","category":"external_commands","line_end":69,"severity":"medium","line_start":69},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| **enter** | `<ViewTransition>` first inserted during a Transition |","category":"external_commands","line_end":76,"severity":"medium","line_start":75},{"id":"external_commands:SKILL.md:76:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| **exit** | `<ViewTransition>` first removed during a Transition |","category":"external_commands","line_end":77,"severity":"medium","line_start":76},{"id":"external_commands:SKILL.md:77:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| **update** | DOM mutations inside a `<ViewTransition>`, or the boundary itself changing size/posit","category":"external_commands","line_end":78,"severity":"medium","line_start":77},{"id":"external_commands:SKILL.md:78:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| **share** | Named VT unmounts and another with same `name` mounts in the same Transition |","category":"external_commands","line_end":80,"severity":"medium","line_start":78},{"id":"external_commands:SKILL.md:80:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Only `startTransition`, `useDeferredValue`, or `Suspense` activate VTs. Regular `setState` does not ","category":"external_commands","line_end":80,"severity":"medium","line_start":80},{"id":"external_commands:SKILL.md:84:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`<ViewTransition>` only activates enter/exit if it appears **before any DOM nodes**:","category":"external_commands","line_end":86,"severity":"medium","line_start":84},{"id":"external_commands:SKILL.md:86:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":98,"severity":"medium","line_start":86},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":106,"severity":"medium","line_start":98},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Values: `\"auto\"` (browser cross-fade), `\"none\"` (disabled), `\"class-name\"` (custom CSS), or `{ [type","category":"external_commands","line_end":106,"severity":"medium","line_start":106},{"id":"external_commands:SKILL.md:108:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":110,"severity":"medium","line_start":108},{"id":"external_commands:SKILL.md:110:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":112,"severity":"medium","line_start":110},{"id":"external_commands:SKILL.md:112:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"If `default` is `\"none\"`, all triggers are off unless explicitly listed.","category":"external_commands","line_end":112,"severity":"medium","line_start":112},{"id":"external_commands:SKILL.md:116:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `::view-transition-old(.class)` — outgoing snapshot","category":"external_commands","line_end":117,"severity":"medium","line_start":116},{"id":"external_commands:SKILL.md:117:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `::view-transition-new(.class)` — incoming snapshot","category":"external_commands","line_end":118,"severity":"medium","line_start":117},{"id":"external_commands:SKILL.md:118:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `::view-transition-group(.class)` — container","category":"external_commands","line_end":119,"severity":"medium","line_start":118},{"id":"external_commands:SKILL.md:119:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `::view-transition-image-pair(.class)` — old + new pair","category":"external_commands","line_end":127,"severity":"medium","line_start":119},{"id":"external_commands:SKILL.md:127:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Tag transitions with `addTransitionType` so VTs can pick different animations based on context. Call","category":"external_commands","line_end":129,"severity":"medium","line_start":127},{"id":"external_commands:SKILL.md:129:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":135,"severity":"medium","line_start":129},{"id":"external_commands:SKILL.md:135:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":137,"severity":"medium","line_start":135},{"id":"external_commands:SKILL.md:137:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Pass an object to map types to CSS classes. Works on `enter`, `exit`, **and** `share`:","category":"external_commands","line_end":137,"severity":"medium","line_start":137},{"id":"external_commands:SKILL.md:139:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":148,"severity":"medium","line_start":139},{"id":"external_commands:SKILL.md:148:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","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":"`enter` and `exit` don't have to be symmetric. For example, fade in but slide out directionally:","category":"external_commands","line_end":150,"severity":"medium","line_start":150},{"id":"external_commands:SKILL.md:152:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":158,"severity":"medium","line_start":152},{"id":"external_commands:SKILL.md:158:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","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":"**TypeScript:** `ViewTransitionClassPerType` requires a `default` key in the object.","category":"external_commands","line_end":160,"severity":"medium","line_start":160},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":176,"severity":"medium","line_start":164},{"id":"external_commands:SKILL.md:176:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":178,"severity":"medium","line_start":176},{"id":"external_commands:SKILL.md:178:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"### `router.back()` and Browser Back Button","category":"external_commands","line_end":180,"severity":"medium","line_start":178},{"id":"external_commands:SKILL.md:180:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`router.back()` and the browser's back/forward buttons carry **no transition types**, so type-keyed ","category":"external_commands","line_end":180,"severity":"medium","line_start":180},{"id":"external_commands:SKILL.md:194:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Same `name` on two VTs — one unmounting, one mounting — creates a shared element morph:","category":"external_commands","line_end":196,"severity":"medium","line_start":194},{"id":"external_commands:SKILL.md:196:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":205,"severity":"medium","line_start":196},{"id":"external_commands:SKILL.md:205:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":207,"severity":"medium","line_start":205},{"id":"external_commands:SKILL.md:207:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Only one VT with a given `name` can be mounted at a time — use unique names (`photo-${id}`). Watch","category":"external_commands","line_end":207,"severity":"medium","line_start":207},{"id":"external_commands:SKILL.md:208:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `share` takes precedence over `enter`/`exit`. Think through each navigation path: when no matching","category":"external_commands","line_end":208,"severity":"medium","line_start":208},{"id":"external_commands:SKILL.md:209:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Two ways a wired-up morph silently never fires: (1) `default=\"none\"` with no explicit `share` prop","category":"external_commands","line_end":209,"severity":"medium","line_start":209},{"id":"external_commands:SKILL.md:218:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":222,"severity":"medium","line_start":218},{"id":"external_commands:SKILL.md:222:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":226,"severity":"medium","line_start":222},{"id":"external_commands:SKILL.md:226:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":230,"severity":"medium","line_start":226},{"id":"external_commands:SKILL.md:230:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":232,"severity":"medium","line_start":230},{"id":"external_commands:SKILL.md:232:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Trigger inside `startTransition`. Avoid wrapper `<div>`s between list and VT.","category":"external_commands","line_end":232,"severity":"medium","line_start":232},{"id":"external_commands:SKILL.md:236:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Only content inside an activated boundary animates position — everything else teleports to its new l","category":"external_commands","line_end":240,"severity":"medium","line_start":236},{"id":"external_commands:SKILL.md:240:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Shared elements and list identity are independent concerns — don't confuse one for the other. When a","category":"external_commands","line_end":242,"severity":"medium","line_start":240},{"id":"external_commands:SKILL.md:242:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":245,"severity":"medium","line_start":242},{"id":"external_commands:SKILL.md:245:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"<Link href={`/items/${item.id}`}>","category":"external_commands","line_end":246,"severity":"medium","line_start":245},{"id":"external_commands:SKILL.md:246:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"<ViewTransition name={`item-image-${item.id}`} share=\"morph\">   {/* shared element */}","category":"external_commands","line_end":253,"severity":"medium","line_start":246},{"id":"external_commands:SKILL.md:253:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":257,"severity":"medium","line_start":253},{"id":"external_commands:SKILL.md:257:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"### Force Re-Enter with `key`","category":"external_commands","line_end":259,"severity":"medium","line_start":257},{"id":"external_commands:SKILL.md:259:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":263,"severity":"medium","line_start":259},{"id":"external_commands:SKILL.md:263:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":265,"severity":"medium","line_start":263},{"id":"external_commands:SKILL.md:265:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Caution:** If wrapping `<Suspense>`, changing `key` remounts the boundary and refetches.","category":"external_commands","line_end":265,"severity":"medium","line_start":265},{"id":"external_commands:SKILL.md:270:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":274,"severity":"medium","line_start":270},{"id":"external_commands:SKILL.md:274:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":277,"severity":"medium","line_start":274},{"id":"external_commands:SKILL.md:277:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```jsx","category":"external_commands","line_end":281,"severity":"medium","line_start":277},{"id":"external_commands:SKILL.md:281:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":289,"severity":"medium","line_start":281},{"id":"external_commands:SKILL.md:289:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Every VT matching the trigger fires simultaneously in a single `document.startViewTransition`. VTs i","category":"external_commands","line_end":291,"severity":"medium","line_start":289},{"id":"external_commands:SKILL.md:291:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"### Use `default=\"none\"` Deliberately","category":"external_commands","line_end":293,"severity":"medium","line_start":291},{"id":"external_commands:SKILL.md:293:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Without it, every VT fires the browser cross-fade on **every** transition — Suspense resolves, `useD","category":"external_commands","line_end":293,"severity":"medium","line_start":293},{"id":"external_commands:SKILL.md:295:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"But it also turns off `update` (layout/reflow morphs) and `share` (a named pair with no explicit `sh","category":"external_commands","line_end":295,"severity":"medium","line_start":295},{"id":"external_commands:SKILL.md:302:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"They coexist because they fire at different moments. `default=\"none\"` on both prevents cross-interfe","category":"external_commands","line_end":302,"severity":"medium","line_start":302},{"id":"external_commands:SKILL.md:312:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"For Next.js integration (`transitionTypes` on `next/link` and `useRouter`, App Router patterns, Serv","category":"external_commands","line_end":312,"severity":"medium","line_start":312},{"id":"blocker:SKILL.md:232:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"Trigger inside `startTransition`. Avoid wrapper `<div>`s between list and VT.","category":"blocker","line_end":232,"severity":"low","line_start":232},{"id":"blocker:SKILL.md:261:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"<ResultsGrid />","category":"blocker","line_end":261,"severity":"low","line_start":261}],"finding_verdicts":[{"id":"external_commands:AGENTS.md:246:ruby-shell-backtick-execution","reason":"The backticks construct an internal item URL in a JSX Link. JavaScript template interpolation does not execute shell commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:AGENTS.md:247:ruby-shell-backtick-execution","reason":"The template literal creates an item-image transition name in JSX. It is a string value, not Ruby or shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:AGENTS.md:471:ruby-shell-backtick-execution","reason":"The photo template literal identifies the source image transition. It does not invoke a command interpreter.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:AGENTS.md:476:ruby-shell-backtick-execution","reason":"The photo template literal supplies the destination transition name. It is ordinary JavaScript string construction.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:AGENTS.md:540:ruby-shell-backtick-execution","reason":"The item template literal names a shared React transition. No shell execution occurs in this rendering example.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:AGENTS.md:560:ruby-shell-backtick-execution","reason":"The expanded item identifier is interpolated into a transition name. This produces a JavaScript string rather than a command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:AGENTS.md:574:ruby-shell-backtick-execution","reason":"The template literal gives each rendered item a transition name. The surrounding code only manages UI state and rendering.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:AGENTS.md:1255:ruby-shell-backtick-execution","reason":"The template literal builds a relative sort query for router.replace. The example uses a fixed newest value and executes no shell command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:AGENTS.md:1343:ruby-shell-backtick-execution","reason":"The Link interpolates a product identifier into an internal route. Backticks are JavaScript template syntax, not shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:AGENTS.md:1344:ruby-shell-backtick-execution","reason":"The product template literal names the list image transition. It is not passed to any command execution API.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:AGENTS.md:1351:ruby-shell-backtick-execution","reason":"The matching product template literal names the detail image transition. The example renders an image, not a shell command.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:AGENTS.md:483:path-traversal-sequence","reason":"The parent-directory sequence belongs to a relative Markdown link to SKILL.md. It neither accesses arbitrary paths nor crosses a security boundary.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:AGENTS.md:1174:path-traversal-sequence","reason":"The relative SKILL.md link references shared-element documentation. No filesystem operation consumes an attacker-controlled path.","verdict":"false_positive","confidence":0.99},{"id":"blocker:AGENTS.md:536:keylogger-keywords","reason":"Keystrokes describe ordinary search filtering and unwanted crossfades. The example updates local input state without recording or transmitting keyboard activity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:AGENTS.md:233:system-reconnaissance","reason":"The passage explains React transition triggers and DOM wrapper placement. It contains no host discovery or system inspection.","verdict":"false_positive","confidence":0.99},{"id":"blocker:AGENTS.md:262:system-reconnaissance","reason":"ResultsGrid is a rendered React component in an animation example. It performs no system reconnaissance.","verdict":"false_positive","confidence":0.99},{"id":"blocker:AGENTS.md:470:system-reconnaissance","reason":"The comment labels the source list or grid view for a shared image. It does not instruct system discovery.","verdict":"false_positive","confidence":0.99},{"id":"blocker:AGENTS.md:510:system-reconnaissance","reason":"Searchable Grid is a section heading for deferred UI filtering. There is no host enumeration behavior.","verdict":"false_positive","confidence":0.99},{"id":"blocker:AGENTS.md:528:system-reconnaissance","reason":"ItemGrid receives item data and a deferred search value for rendering. The snippet does not inspect the operating system.","verdict":"false_positive","confidence":0.99},{"id":"blocker:AGENTS.md:548:system-reconnaissance","reason":"The prose introduces a grid-to-detail UI animation. It contains no reconnaissance instruction.","verdict":"false_positive","confidence":0.99},{"id":"blocker:AGENTS.md:562:system-reconnaissance","reason":"Array.find selects the expanded item from application data. It does not search host files or enumerate system resources.","verdict":"false_positive","confidence":0.99},{"id":"blocker:AGENTS.md:572:system-reconnaissance","reason":"The div uses CSS grid utility classes to arrange cards. This is layout markup, not system discovery.","verdict":"false_positive","confidence":0.99},{"id":"blocker:AGENTS.md:690:system-reconnaissance","reason":"Invisible filler slots stabilize list height and prevent layout movement. The passage does not collect system information.","verdict":"false_positive","confidence":0.99},{"id":"blocker:AGENTS.md:1089:system-reconnaissance","reason":"The passage describes a backdrop-filter rendering workaround. Hiding an old animation snapshot is unrelated to host reconnaissance.","verdict":"false_positive","confidence":0.99},{"id":"blocker:AGENTS.md:1117:system-reconnaissance","reason":"The text explains how a tab indicator moves between positions. It contains no system information gathering.","verdict":"false_positive","confidence":0.99},{"id":"blocker:AGENTS.md:1331:system-reconnaissance","reason":"PhotoGrid renders photo data inside an entering transition. No host inspection or enumeration is present.","verdict":"false_positive","confidence":0.99},{"id":"network:metadata.json:7:hardcoded-url","reason":"The URL references the official React ViewTransition documentation. The metadata contains no request code or data transmission.","verdict":"false_positive","confidence":0.99},{"id":"network:metadata.json:8:hardcoded-url","reason":"The URL references the official React addTransitionType documentation. It is a citation, not an exfiltration endpoint.","verdict":"false_positive","confidence":0.99},{"id":"network:metadata.json:9:hardcoded-url","reason":"The URL points to official Next.js configuration documentation. Its presence in a references array does not transmit application data.","verdict":"false_positive","confidence":0.99},{"id":"network:metadata.json:10:hardcoded-url","reason":"The GitHub URL cites the Next.js App Router playground example. No code sends secrets or other data to it.","verdict":"false_positive","confidence":0.99},{"id":"network:README.md:35:hardcoded-url","reason":"The URL identifies the upstream repository in a documented, user-initiated skill installation command. No hidden transfer, credential disclosure, or automatic execution is instructed.","verdict":"false_positive","confidence":0.97},{"id":"blocker:references/css-recipes.md:257:system-reconnaissance","reason":"The text recommends hiding an old snapshot to prevent backdrop-filter flashes. It describes browser rendering, not reconnaissance.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/css-recipes.md:285:system-reconnaissance","reason":"The passage explains a sliding tab indicator and snapshot animation settings. It does not inspect host resources.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/implementation.md:139:ruby-shell-backtick-execution","reason":"The photo template literal creates the source transition name in JSX. It is not shell or Ruby code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/implementation.md:144:ruby-shell-backtick-execution","reason":"The matching photo template literal identifies the target transition. It produces a string without invoking a command interpreter.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/implementation.md:151:path-traversal-sequence","reason":"The parent-directory sequence links to SKILL.md within the documentation package. There is no untrusted path input or unauthorized filesystem access.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/implementation.md:138:system-reconnaissance","reason":"The source-view comment labels a list or grid image example. It is not a system enumeration instruction.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/nextjs.md:108:ruby-shell-backtick-execution","reason":"router.replace receives a relative sort query built with JavaScript interpolation. The example passes a fixed sort value and invokes no shell.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/nextjs.md:196:ruby-shell-backtick-execution","reason":"The template literal builds a product Link destination. This is internal route construction, not command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/nextjs.md:197:ruby-shell-backtick-execution","reason":"The product template literal names the list-side image transition. No shell execution API consumes this string.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/nextjs.md:204:ruby-shell-backtick-execution","reason":"The product template literal names the corresponding detail image transition. It is ordinary JSX string interpolation.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/nextjs.md:27:path-traversal-sequence","reason":"The relative SKILL.md reference links to another packaged documentation section. No runtime file access or path traversal exploit is present.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/nextjs.md:184:system-reconnaissance","reason":"PhotoGrid is displayed inside a transition as loaded page content. It does not gather system information.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/patterns.md:35:ruby-shell-backtick-execution","reason":"The item template literal creates a shared transition identifier. It has no shell execution semantics.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/patterns.md:55:ruby-shell-backtick-execution","reason":"The expanded item ID is interpolated into a ViewTransition name. This is string construction for UI rendering.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/patterns.md:69:ruby-shell-backtick-execution","reason":"The template literal names each item transition in the grid. No command interpreter or external process is invoked.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/patterns.md:31:keylogger-keywords","reason":"The keystroke reference explains repeated search-filter animations. Input is stored as local React state, with no keyboard logging or exfiltration.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/patterns.md:5:system-reconnaissance","reason":"Searchable Grid names a UI filtering pattern. The section does not describe host discovery.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/patterns.md:23:system-reconnaissance","reason":"ItemGrid receives item data and deferred search text. This component invocation does not inspect system resources.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/patterns.md:43:system-reconnaissance","reason":"The prose introduces a card expand-and-collapse animation. It contains no reconnaissance operation.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/patterns.md:57:system-reconnaissance","reason":"Array.find selects an application item by its ID. It neither enumerates the host nor reads filesystem data.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/patterns.md:67:system-reconnaissance","reason":"The div applies CSS grid layout classes. It contains no system discovery functionality.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/patterns.md:185:system-reconnaissance","reason":"Fixed slot counts and invisible fillers keep a UI grid from changing height. They do not inspect the environment.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:3:ruby-shell-backtick-execution","reason":"The description uses Markdown backticks around React APIs. These are documentation formatting, not executable shell substitutions.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:12:ruby-shell-backtick-execution","reason":"The introduction formats browser and React API names as inline code. No command execution is requested.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:16:ruby-shell-backtick-execution","reason":"ViewTransition is enclosed in Markdown inline-code delimiters within design guidance. The backticks are not shell syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:22:ruby-shell-backtick-execution","reason":"The table formats the name prop as inline code. This documents a shared-element property without executing commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","reason":"The key prop is formatted as Markdown inline code in a pattern table. It is not command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:25:ruby-shell-backtick-execution","reason":"The table uses inline-code formatting for enter and exit props. No shell interpreter is involved.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","reason":"Backticks delimit navigation type names in a documentation table. These labels select animations rather than execute commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:35:ruby-shell-backtick-execution","reason":"The table formats a React component and its default prop as inline code. There is no external command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","reason":"Inline-code delimiters identify enter and exit props for Suspense reveals. They are documentation syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","reason":"The table formats default=\"none\" to describe disabling background animations. Backticks do not invoke a shell here.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","reason":"The paragraph formats package names and an npm ls react diagnostic as inline code. These describe compatibility checks, not dangerous command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:46:ruby-shell-backtick-execution","reason":"The compatibility paragraph uses backticks around package and API names. They are Markdown formatting, not executable substitutions.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:47:ruby-shell-backtick-execution","reason":"The browser support note formats startViewTransition as inline code. It does not execute a shell command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","reason":"The heading formats ViewTransition as a component name. Its backticks are Markdown delimiters.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","reason":"The backticks open a JSX documentation fence containing a React import and component. They do not start shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","reason":"The backticks close the JSX documentation fence. The following prose explains React-managed transition naming, not command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:69:ruby-shell-backtick-execution","reason":"Inline code identifies CSS and browser transition APIs. The paragraph explains React behavior without invoking shell commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","reason":"The trigger table formats the ViewTransition component name as inline code. It describes entering UI content.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:76:ruby-shell-backtick-execution","reason":"The backticks format ViewTransition in an exit-trigger definition. They have no shell execution semantics.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:77:ruby-shell-backtick-execution","reason":"The update-trigger description uses Markdown inline code for a React component. No process invocation is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:78:ruby-shell-backtick-execution","reason":"The share-trigger definition formats the name prop. It documents pairing React boundaries rather than executing commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:80:ruby-shell-backtick-execution","reason":"Backticks format React state and transition API names. The sentence explains animation activation requirements.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:84:ruby-shell-backtick-execution","reason":"The text formats ViewTransition while explaining DOM placement. It contains no command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:86:ruby-shell-backtick-execution","reason":"The backticks open a JSX fence showing working and broken component placement. They are documentation delimiters.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","reason":"The backticks close a JSX placement example. The following prop documentation is not executable shell code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","reason":"The line formats supported prop values and a type-map shape as inline code. These describe animation configuration.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:108:ruby-shell-backtick-execution","reason":"The JSX fence contains a ViewTransition configuration example. Its backticks are not shell substitutions.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:110:ruby-shell-backtick-execution","reason":"The closing Markdown fence precedes an explanation of disabled triggers. It does not execute the fenced example.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:112:ruby-shell-backtick-execution","reason":"Inline backticks format default and none in a prop explanation. No shell command is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:116:ruby-shell-backtick-execution","reason":"The line formats a CSS old-snapshot pseudo-element. Markdown delimiters are mistaken for command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:117:ruby-shell-backtick-execution","reason":"The line formats the incoming-snapshot CSS pseudo-element. It does not invoke an interpreter.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:118:ruby-shell-backtick-execution","reason":"The CSS group pseudo-element appears as inline documentation. Its backticks do not execute commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:119:ruby-shell-backtick-execution","reason":"The image-pair pseudo-element is formatted as inline code in a CSS reference list. No process execution exists.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:127:ruby-shell-backtick-execution","reason":"The paragraph formats addTransitionType as a React API name. It explains animation tagging rather than shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:129:ruby-shell-backtick-execution","reason":"The JSX fence shows React transition types and internal navigation. The fence itself does not execute a shell.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:135:ruby-shell-backtick-execution","reason":"The closing code fence separates a React example from prop documentation. It is Markdown structure, not command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:137:ruby-shell-backtick-execution","reason":"The sentence formats enter, exit, and share prop names. It provides configuration guidance without executing commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:139:ruby-shell-backtick-execution","reason":"The JSX fence documents type-keyed transition props. It contains UI configuration rather than shell or Ruby execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:148:ruby-shell-backtick-execution","reason":"The backticks close a type-map JSX example. The following text discusses asymmetric animations, not commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:150:ruby-shell-backtick-execution","reason":"Backticks format enter and exit props in explanatory prose. They are not executable substitutions.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:152:ruby-shell-backtick-execution","reason":"The JSX fence shows enter and exit animation class maps. It is a documentation example with no shell invocation.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:158:ruby-shell-backtick-execution","reason":"The closing Markdown fence precedes a TypeScript prop note. No command execution occurs.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:160:ruby-shell-backtick-execution","reason":"The TypeScript note formats a type name and its required default key. These backticks are documentation syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","reason":"The JSX fence contains a reusable React transition wrapper. It does not invoke external commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:176:ruby-shell-backtick-execution","reason":"The backticks close a reusable component example. The following heading documents router history behavior.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:178:ruby-shell-backtick-execution","reason":"The heading formats router.back() as inline code. This is a browser navigation API, not a shell command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:180:ruby-shell-backtick-execution","reason":"Inline code formats routing APIs and animation defaults. The prose explains transition types during browser history navigation.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:194:ruby-shell-backtick-execution","reason":"The name prop is formatted as inline code in shared-element guidance. No command interpreter is involved.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:196:ruby-shell-backtick-execution","reason":"The JSX fence illustrates matching transition names around images. It documents React rendering rather than shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:205:ruby-shell-backtick-execution","reason":"The backticks close the shared-image JSX example. The adjacent naming guidance is ordinary documentation.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:207:ruby-shell-backtick-execution","reason":"Inline code illustrates unique transition names and React props. The photo identifier is a naming example, not a shell expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:208:ruby-shell-backtick-execution","reason":"Backticks format share, enter, and exit props in precedence guidance. There is no external execution behavior.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:209:ruby-shell-backtick-execution","reason":"The paragraph formats React props and navigation APIs while explaining disabled morphs. These are inline documentation references.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:218:ruby-shell-backtick-execution","reason":"The JSX fence shows conditional panel rendering with transition props. No shell command executes.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:222:ruby-shell-backtick-execution","reason":"The backticks close an enter-and-exit example and separate the next section. They are Markdown delimiters.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:226:ruby-shell-backtick-execution","reason":"The JSX fence documents keyed list-item transitions. It is not a shell or Ruby program.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:230:ruby-shell-backtick-execution","reason":"The closing code fence precedes React transition placement advice. No interpreter is invoked.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:232:ruby-shell-backtick-execution","reason":"The sentence formats startTransition and div as inline code. It explains UI boundary placement, not command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:236:ruby-shell-backtick-execution","reason":"Inline backticks identify ViewTransition in layout-displacement guidance. The passage contains no shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:240:ruby-shell-backtick-execution","reason":"The paragraph formats ViewTransition while explaining nested list and shared-element boundaries. These are documentation references.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:242:ruby-shell-backtick-execution","reason":"The JSX fence shows nested list and shared-image boundaries. Markdown backticks do not execute the example.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:245:ruby-shell-backtick-execution","reason":"The template literal constructs an internal item Link URL. JavaScript interpolation is not shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:246:ruby-shell-backtick-execution","reason":"The template literal constructs a shared image transition name. It is a string prop in JSX, not executable shell content.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:253:ruby-shell-backtick-execution","reason":"The backticks close the nested-boundary JSX example. The following explanation discusses animation responsibilities.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:257:ruby-shell-backtick-execution","reason":"The heading formats key as a React identity prop. It does not refer to shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:259:ruby-shell-backtick-execution","reason":"The JSX fence shows a keyed results boundary. It documents React component identity rather than command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:263:ruby-shell-backtick-execution","reason":"The closing Markdown fence precedes a Suspense remount warning. It does not execute a command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:265:ruby-shell-backtick-execution","reason":"Inline code formats Suspense and key in a refetch warning. There is no shell invocation.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:270:ruby-shell-backtick-execution","reason":"The JSX fence demonstrates a Suspense crossfade. Its backticks are documentation syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:274:ruby-shell-backtick-execution","reason":"The backticks close the simple crossfade example. The following label introduces another UI animation example.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:277:ruby-shell-backtick-execution","reason":"The JSX fence shows separate fallback and content transitions. No external command or interpreter is used.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:281:ruby-shell-backtick-execution","reason":"The closing fence ends a directional Suspense example. It is Markdown structure, not shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:289:ruby-shell-backtick-execution","reason":"Inline backticks identify the browser startViewTransition API. The paragraph explains batching of UI animations.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:291:ruby-shell-backtick-execution","reason":"The heading formats default=\"none\" as an animation configuration prop. It does not execute commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:293:ruby-shell-backtick-execution","reason":"The paragraph formats deferred-value APIs and default props. It discusses preventing unwanted crossfades, not external execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:295:ruby-shell-backtick-execution","reason":"The backticks format update and share configuration terms. The text explains layout animation behavior without executing commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:302:ruby-shell-backtick-execution","reason":"Inline code formats the default prop while explaining independent animation timing. No shell execution is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:312:ruby-shell-backtick-execution","reason":"Backticks format Next.js navigation props and APIs in a reference link description. They are documentation delimiters.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:232:system-reconnaissance","reason":"The passage explains React startTransition and DOM wrapper placement. It performs no system information gathering.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:261:system-reconnaissance","reason":"ResultsGrid is a React component rendered inside an animation boundary. It is not a system reconnaissance operation.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[],"subject_marketplace_commit_sha":"1f79e59ae427a74eab604c013e03b61f04634721","subject_content_hash":"693acbddd1d2dcf774286867efbc9a5c09dce2da6f21f8e12618187a92f2106a","subject_tree_hash":"52fa569082d0e0e74c3d8fa4f2f362f009d426c8f425635a5675acef470a4e24","subject_plugin_path":"skills/vercel-labs/vercel-react-view-transitions","audit_payload_hash":"0f258fbd8ea0dfe1e985966f6019bbfa","confirmed_risk_level":"safe","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"1f79e59ae427a74eab604c013e03b61f04634721","contentHash":"693acbddd1d2dcf774286867efbc9a5c09dce2da6f21f8e12618187a92f2106a","treeHash":"52fa569082d0e0e74c3d8fa4f2f362f009d426c8f425635a5675acef470a4e24","pluginPath":"skills/vercel-labs/vercel-react-view-transitions","auditPayloadHash":"0f258fbd8ea0dfe1e985966f6019bbfa"},"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/vercel-labs-vercel-react-view-transitions/audits/7/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}}