{"data":{"skill":{"slug":"vercel-next-dev-loop","name":"next-dev-loop","icon":"📦","repo":"https://github.com/vercel/next.js/tree/13ac36ea9451f35c5d39306ce6902d70dc3c93d9/skills/next-dev-loop","status":"approved","author":"vercel","authorVersion":null,"skillstoreRevision":1,"license":null},"licenseCorrection":null,"audit":{"id":"8961997c-cf65-471a-85bf-1b7699125e22","skill_id":"9be3bfeb-4dab-4c18-94e8-0a462f6fc2c9","version":1,"content_hash":"v3:c993c6abcbffafea2683d7748b53b3dfaf438415:a5406518dbf30c63bea2860b4e4043cc89efe1286a411d9a7717909183f60a66:1b92a4edd4fdf0f90e9c69c826f7cc29ce05b85ae96e692cd93b41e0ced5b0fd:736b696c6c732f76657263656c2f6e6578742d6465762d6c6f6f70:a9beb895548d63f423dd0ae506002bf8","risk_level":"low","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"Of 74 static findings, 72 are false positives involving Markdown, ordinary diagnostics, documentation links, or local development access. Two findings confirm instructions to install an unpinned global package without an explicit approval step; a separate concern is retained authentication state without cleanup guidance. No evidence found of credential exfiltration, malicious reconnaissance, or audit-directed prompt injection.","remediation":[{"issue":"SKILL.md:47-49 directs installation of agent-browser@latest when the CLI is missing, without explicit approval.","severity":"medium","suggestion":"Ask before installation, pin a reviewed compatible version, and prefer a project-local dependency over a global installation."},{"issue":"SKILL.md:71-74 and 195-198 persist login cookies and browser storage without retention or deletion guidance.","severity":"low","suggestion":"Disclose authentication persistence, use dedicated test accounts, and document storage protection and explicit state deletion when retention is unnecessary."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":8,"line_start":8},{"file":"SKILL.md","line_end":13,"line_start":13},{"file":"SKILL.md","line_end":19,"line_start":19},{"file":"SKILL.md","line_end":22,"line_start":22},{"file":"SKILL.md","line_end":23,"line_start":23},{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":33,"line_start":33},{"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":43,"line_start":43},{"file":"SKILL.md","line_end":47,"line_start":47},{"file":"SKILL.md","line_end":48,"line_start":48},{"file":"SKILL.md","line_end":55,"line_start":55},{"file":"SKILL.md","line_end":57,"line_start":57},{"file":"SKILL.md","line_end":63,"line_start":59},{"file":"SKILL.md","line_end":67,"line_start":63},{"file":"SKILL.md","line_end":69,"line_start":67},{"file":"SKILL.md","line_end":71,"line_start":69},{"file":"SKILL.md","line_end":72,"line_start":71},{"file":"SKILL.md","line_end":75,"line_start":72},{"file":"SKILL.md","line_end":81,"line_start":75},{"file":"SKILL.md","line_end":83,"line_start":81},{"file":"SKILL.md","line_end":85,"line_start":83},{"file":"SKILL.md","line_end":90,"line_start":85},{"file":"SKILL.md","line_end":90,"line_start":90},{"file":"SKILL.md","line_end":92,"line_start":91},{"file":"SKILL.md","line_end":93,"line_start":92},{"file":"SKILL.md","line_end":94,"line_start":93},{"file":"SKILL.md","line_end":95,"line_start":94},{"file":"SKILL.md","line_end":96,"line_start":95},{"file":"SKILL.md","line_end":98,"line_start":96},{"file":"SKILL.md","line_end":99,"line_start":98},{"file":"SKILL.md","line_end":101,"line_start":99},{"file":"SKILL.md","line_end":107,"line_start":101},{"file":"SKILL.md","line_end":116,"line_start":107},{"file":"SKILL.md","line_end":117,"line_start":116},{"file":"SKILL.md","line_end":119,"line_start":117},{"file":"SKILL.md","line_end":121,"line_start":119},{"file":"SKILL.md","line_end":125,"line_start":121},{"file":"SKILL.md","line_end":128,"line_start":125},{"file":"SKILL.md","line_end":133,"line_start":128},{"file":"SKILL.md","line_end":136,"line_start":133},{"file":"SKILL.md","line_end":140,"line_start":136},{"file":"SKILL.md","line_end":142,"line_start":140},{"file":"SKILL.md","line_end":143,"line_start":142},{"file":"SKILL.md","line_end":145,"line_start":143},{"file":"SKILL.md","line_end":147,"line_start":145},{"file":"SKILL.md","line_end":147,"line_start":147},{"file":"SKILL.md","line_end":153,"line_start":152}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":44,"line_start":44},{"file":"SKILL.md","line_end":46,"line_start":46},{"file":"SKILL.md","line_end":93,"line_start":93}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":47,"line_start":47}],"confidence":0.96,"description":"- Install or upgrade `agent-browser`: `npm i -g agent-browser@latest`.","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The installation command selects an unpinned latest package for global installation. The next line directs installation without approval, risking lifecycle-script execution and unexpected global changes."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":48,"line_start":48}],"confidence":0.95,"description":"If the CLI isn't on `PATH`, install it before continuing — preflight","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The instruction says to install the CLI before continuing when it is absent from PATH. It authorizes the preceding unpinned global installation without an explicit approval step."}],"low_findings":[{"title":"Persistent Login State Lacks Cleanup Guidance","locations":[{"file":"SKILL.md","line_end":74,"line_start":71},{"file":"SKILL.md","line_end":198,"line_start":195}],"confidence":0.92,"description":"The skill says restoration loads saved cookies/localStorage and that close saves cookies and storage for later loops. No consent, retention limit, or deletion guidance accompanies authentication persistence, increasing exposure on shared or compromised development machines.","review_kind":"security","source_category":"semantic","source_severity":"low","confidence_reasoning":"The instructions explicitly require restoring and saving authentication state. The file provides no cleanup safeguards, although actual exposure depends on local storage protection."}],"dangerous_patterns":[],"files_scanned":1,"total_lines":213,"audit_model":"codex","audited_at":"2026-11-06T15:33:26.59+00:00","created_at":"2026-11-09T15:36:29.537915+00:00","static_findings":[{"id":"external_commands:SKILL.md:8:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Requires a running `next dev`.","category":"external_commands","line_end":8,"severity":"medium","line_start":8},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The edit/verify rhythm during `next dev` — make a change, then","category":"external_commands","line_end":13,"severity":"medium","line_start":13},{"id":"external_commands:SKILL.md:19:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **`/_next/mcp`** — an HTTP endpoint Next.js exposes about itself.","category":"external_commands","line_end":19,"severity":"medium","line_start":19},{"id":"external_commands:SKILL.md:22:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`tools/list` for the current surface.","category":"external_commands","line_end":22,"severity":"medium","line_start":22},{"id":"external_commands:SKILL.md:23:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **`agent-browser`** — a CLI that drives a real Chrome. Knows","category":"external_commands","line_end":23,"severity":"medium","line_start":23},{"id":"external_commands:SKILL.md:25:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"fiber, vitals. Before driving it, run `agent-browser skills get core`","category":"external_commands","line_end":25,"severity":"medium","line_start":25},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Next.js **16.3+** with **Turbopack** — `/_next/mcp` plus the","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":"proactive compile check via `get_compilation_issues`.","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":"- `agent-browser` **>= 0.31.1** — React introspection, worktree-scoped","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":"`session id`, idempotent `--restore`, and launch flag reconciliation.","category":"external_commands","line_end":36,"severity":"medium","line_start":36},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Upgrade Next.js: `pnpm next upgrade` (or `npx next upgrade`).","category":"external_commands","line_end":43,"severity":"medium","line_start":43},{"id":"external_commands:SKILL.md:47:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Install or upgrade `agent-browser`: `npm i -g agent-browser@latest`.","category":"external_commands","line_end":47,"severity":"medium","line_start":47},{"id":"external_commands:SKILL.md:48:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"If the CLI isn't on `PATH`, install it before continuing — preflight","category":"external_commands","line_end":48,"severity":"medium","line_start":48},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. **Open `agent-browser` at the target URL, restoring saved","category":"external_commands","line_end":55,"severity":"medium","line_start":55},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"this checkout and use it for every `agent-browser` command:","category":"external_commands","line_end":57,"severity":"medium","line_start":57},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":63,"severity":"medium","line_start":59},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":67,"severity":"medium","line_start":63},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","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":"```","category":"external_commands","line_end":71,"severity":"medium","line_start":69},{"id":"external_commands:SKILL.md:71:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`--scope worktree` keeps parallel worktrees and copied checkouts","category":"external_commands","line_end":72,"severity":"medium","line_start":71},{"id":"external_commands:SKILL.md:72:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"from colliding. Bare `--restore` uses the session id as the","category":"external_commands","line_end":75,"severity":"medium","line_start":72},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"launch flags on `open`; agent-browser will reuse, relaunch, or restart","category":"external_commands","line_end":81,"severity":"medium","line_start":75},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`agent-browser` state must carry over, reopen that session headed instead:","category":"external_commands","line_end":83,"severity":"medium","line_start":81},{"id":"external_commands:SKILL.md:83:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":85,"severity":"medium","line_start":83},{"id":"external_commands:SKILL.md:85:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":90,"severity":"medium","line_start":85},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. Probe `/_next/mcp` (`tools/list`) — confirm it's reachable and","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":"lists `get_compilation_issues`. First read the port off the","category":"external_commands","line_end":92,"severity":"medium","line_start":91},{"id":"external_commands:SKILL.md:92:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`next dev` banner; if it isn't 3000, set","category":"external_commands","line_end":93,"severity":"medium","line_start":92},{"id":"external_commands:SKILL.md:93:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`NEXT_MCP_URL=http://localhost:<port>/_next/mcp` before probing:","category":"external_commands","line_end":94,"severity":"medium","line_start":93},{"id":"external_commands:SKILL.md:94:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Unreachable → either `next dev` isn't running, or Next.js is","category":"external_commands","line_end":95,"severity":"medium","line_start":94},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"below 16.3. Check `package.json` to disambiguate, then refuse.","category":"external_commands","line_end":96,"severity":"medium","line_start":95},{"id":"external_commands:SKILL.md:96:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `get_compilation_issues` not in the list → Next.js below 16.3.","category":"external_commands","line_end":98,"severity":"medium","line_start":96},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"3. `get_compilation_issues` doubles as a Turbopack probe. An error","category":"external_commands","line_end":99,"severity":"medium","line_start":98},{"id":"external_commands:SKILL.md:99:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"response of `\"Turbopack project is not available...\"` means the","category":"external_commands","line_end":101,"severity":"medium","line_start":99},{"id":"external_commands:SKILL.md:101:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"4. `get_routes` → your route map for the rest of the session.","category":"external_commands","line_end":107,"severity":"medium","line_start":101},{"id":"external_commands:SKILL.md:107:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Ask the running app, not the codebase. `/_next/mcp` knows which","category":"external_commands","line_end":116,"severity":"medium","line_start":107},{"id":"external_commands:SKILL.md:116:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Compiles** — `get_compilation_issues`.","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":"- **Runs without errors** — `/_next/mcp` (server and bubbled-up","category":"external_commands","line_end":119,"severity":"medium","line_start":117},{"id":"external_commands:SKILL.md:119:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Behaves as intended** — `agent-browser` drives the page; assert","category":"external_commands","line_end":121,"severity":"medium","line_start":119},{"id":"external_commands:SKILL.md:121:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **React-level behavior** — `agent-browser` with react-devtools","category":"external_commands","line_end":125,"severity":"medium","line_start":121},{"id":"external_commands:SKILL.md:125:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"alone miss them. Use `agent-browser react tree --json` to get the tree","category":"external_commands","line_end":128,"severity":"medium","line_start":125},{"id":"external_commands:SKILL.md:128:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Pick the specific tool from `tools/list` or the agent-browser","category":"external_commands","line_end":133,"severity":"medium","line_start":128},{"id":"external_commands:SKILL.md:133:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Preserve `.next` while the development server is running.** Moving or","category":"external_commands","line_end":136,"severity":"medium","line_start":133},{"id":"external_commands:SKILL.md:136:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"build needs isolated output, configure a separate `distDir`.","category":"external_commands","line_end":140,"severity":"medium","line_start":136},{"id":"external_commands:SKILL.md:140:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Every `agent-browser` command must know your session and restore","category":"external_commands","line_end":142,"severity":"medium","line_start":140},{"id":"external_commands:SKILL.md:142:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"state.** Easiest: export both `AGENT_BROWSER_SESSION=\"$SESSION\"` and","category":"external_commands","line_end":143,"severity":"medium","line_start":142},{"id":"external_commands:SKILL.md:143:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`AGENT_BROWSER_RESTORE=\"$SESSION\"` at the top of each shell you run","category":"external_commands","line_end":145,"severity":"medium","line_start":143},{"id":"external_commands:SKILL.md:145:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`--session \"$SESSION\" --restore` on every command.","category":"external_commands","line_end":147,"severity":"medium","line_start":145},{"id":"external_commands:SKILL.md:147:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`agent-browser` says a route is broken but `/_next/mcp` and the","category":"external_commands","line_end":147,"severity":"medium","line_start":147},{"id":"external_commands:SKILL.md:152:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"wait with `wait --load networkidle` (no path to get wrong), then","category":"external_commands","line_end":153,"severity":"medium","line_start":152},{"id":"external_commands:SKILL.md:153:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"snapshot/read to confirm the page. Avoid `wait --url` unless you pass","category":"external_commands","line_end":157,"severity":"medium","line_start":153},{"id":"external_commands:SKILL.md:157:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- A blank read, empty snapshot, `about:blank`, or a \"no browser","category":"external_commands","line_end":158,"severity":"medium","line_start":157},{"id":"external_commands:SKILL.md:158:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"session\" error — right after `open` or after a click (even if `open`","category":"external_commands","line_end":158,"severity":"medium","line_start":158},{"id":"external_commands:SKILL.md:162:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`agent-browser --session \"$SESSION\" --restore close`, then reopen with","category":"external_commands","line_end":163,"severity":"medium","line_start":162},{"id":"external_commands:SKILL.md:163:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"those same flags. Don't fall back to `curl`; it bypasses the browser","category":"external_commands","line_end":166,"severity":"medium","line_start":163},{"id":"external_commands:SKILL.md:166:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `/_next/mcp` replies are SSE — read the JSON off the `data:` line","category":"external_commands","line_end":166,"severity":"medium","line_start":166},{"id":"external_commands:SKILL.md:167:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"with `sed -n 's/^data: //p'` (a plain `sed 's/^data: //'` leaves the","category":"external_commands","line_end":167,"severity":"medium","line_start":167},{"id":"external_commands:SKILL.md:168:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`event:` line and the parse fails).","category":"external_commands","line_end":169,"severity":"medium","line_start":168},{"id":"external_commands:SKILL.md:169:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `get_errors` and `get_page_metadata` need at least one navigation","category":"external_commands","line_end":169,"severity":"medium","line_start":169},{"id":"external_commands:SKILL.md:174:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"All tools below are present once preflight passes. If `tools/list`","category":"external_commands","line_end":177,"severity":"medium","line_start":174},{"id":"external_commands:SKILL.md:177:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":191,"severity":"medium","line_start":177},{"id":"external_commands:SKILL.md:191:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":196,"severity":"medium","line_start":191},{"id":"external_commands:SKILL.md:196:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`agent-browser --session \"$SESSION\" --restore close`. `close` saves","category":"external_commands","line_end":196,"severity":"medium","line_start":196},{"id":"external_commands:SKILL.md:197:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"that session's cookies and storage so the next loop's `--restore` open","category":"external_commands","line_end":198,"severity":"medium","line_start":197},{"id":"external_commands:SKILL.md:60:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"SESSION=\"$(agent-browser session id --scope worktree --prefix next-dev-loop)\"","category":"external_commands","line_end":60,"severity":"medium","line_start":60},{"id":"external_commands:SKILL.md:59:template-literal-with-command-substitution","file":"SKILL.md","pattern":"Template literal with command substitution","snippet":"```bash","category":"external_commands","line_end":63,"severity":"medium","line_start":59},{"id":"network:SKILL.md:44:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Docs: https://nextjs.org/docs/app/getting-started/upgrading","category":"network","line_end":44,"severity":"low","line_start":44},{"id":"network:SKILL.md:46:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"https://nextjs.org/docs/app/guides/upgrading/version-16)","category":"network","line_end":46,"severity":"low","line_start":46},{"id":"network:SKILL.md:93:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"`NEXT_MCP_URL=http://localhost:<port>/_next/mcp` before probing:","category":"network","line_end":93,"severity":"low","line_start":93},{"id":"blocker:SKILL.md:56:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"login state when present.** First derive one stable session id for","category":"blocker","line_end":56,"severity":"low","line_start":56},{"id":"blocker:SKILL.md:60:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"SESSION=\"$(agent-browser session id --scope worktree --prefix next-dev-loop)\"","category":"blocker","line_end":60,"severity":"low","line_start":60},{"id":"blocker:SKILL.md:72:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"from colliding. Bare `--restore` uses the session id as the","category":"blocker","line_end":72,"severity":"low","line_start":72},{"id":"blocker:SKILL.md:153:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"snapshot/read to confirm the page. Avoid `wait --url` unless you pass","category":"blocker","line_end":153,"severity":"low","line_start":153},{"id":"blocker:SKILL.md:188:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"get_server_action_by_id      hashed id → file + functionName","category":"blocker","line_end":188,"severity":"low","line_start":188}],"finding_verdicts":[{"id":"external_commands:SKILL.md:8:ruby-shell-backtick-execution","reason":"The backticks format the required development-server command in Markdown. They do not execute Ruby or shell code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","reason":"This sentence describes the normal development workflow using inline code formatting. It contains no executable backtick substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:19:ruby-shell-backtick-execution","reason":"The inline text names the local framework diagnostics endpoint. Markdown formatting is not shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:22:ruby-shell-backtick-execution","reason":"tools/list is an MCP discovery operation documented as inline code. It is not a Ruby or shell expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:23:ruby-shell-backtick-execution","reason":"This line identifies the browser automation CLI used by the workflow. Naming a tool in Markdown does not execute it.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:25:ruby-shell-backtick-execution","reason":"The fixed command retrieves the installed CLI's version-matched usage guide for legitimate browser operation. No command injection or unauthorized data transfer appears.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","reason":"The backticks identify the framework diagnostics endpoint within version requirements. This is descriptive Markdown, not executable substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","reason":"The line names a compilation diagnostics tool. There is no shell expression or dangerous execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:35:ruby-shell-backtick-execution","reason":"This requirement names the browser CLI and its minimum version. The backticks only format a tool name.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","reason":"The inline fragments describe session identification and restoration features. They are not executable backtick expressions.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","reason":"The surrounding requirements instruct the agent to tell the user how to upgrade and stop. These are upgrade suggestions, not automatic shell execution.","verdict":"false_positive","confidence":0.94},{"id":"external_commands:SKILL.md:47:ruby-shell-backtick-execution","reason":"The installation command selects an unpinned latest package for global installation. The next line directs installation without approval, risking lifecycle-script execution and unexpected global changes.","verdict":"confirmed","severity":"medium","confidence":0.96},{"id":"external_commands:SKILL.md:48:ruby-shell-backtick-execution","reason":"The instruction says to install the CLI before continuing when it is absent from PATH. It authorizes the preceding unpinned global installation without an explicit approval step.","verdict":"confirmed","severity":"medium","confidence":0.95},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","reason":"The text directs opening the target development app with the browser tool. Inline tool naming is not executable backtick substitution.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","reason":"This line requires a consistent browser session for the checkout. Its backticks only format the CLI name.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","reason":"The detected backticks open a Markdown Bash code fence. The enclosed commands derive a session identifier and export quoted session variables.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"This range contains Markdown code-fence boundaries and the instruction to open the target URL. The backticks do not invoke a shell.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","reason":"The fenced command opens the intended app using a quoted session identifier. The Markdown fence is not backtick execution.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:69:ruby-shell-backtick-execution","reason":"The detected characters close a Markdown code fence before session-isolation guidance. They are not executable shell syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:71:ruby-shell-backtick-execution","reason":"The inline flag describes worktree isolation that prevents session collisions. No shell backtick expression appears.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:72:ruby-shell-backtick-execution","reason":"The text explains browser session restoration using inline flag names. Authentication retention is reviewed separately, not evidence of backtick execution.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","reason":"The inline command name describes browser launch-flag reconciliation and session reuse. The surrounding prose contains no executable substitution.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","reason":"This passage explains when the user may need a visible browser session. The CLI name and code-fence boundary are Markdown syntax.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:83:ruby-shell-backtick-execution","reason":"The fenced command opens the selected development URL in the same headed browser session. It does not execute backtick substitutions.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:85:ruby-shell-backtick-execution","reason":"The detected backticks close a Markdown example before user-driven login guidance. They are not an executable shell construct.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","reason":"The inline endpoint and discovery method support local framework preflight checks. Markdown backticks do not execute these names.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:91:ruby-shell-backtick-execution","reason":"This passage checks diagnostic-tool availability and reads the development server's port. It contains no executable backtick substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:92:ruby-shell-backtick-execution","reason":"The text identifies the development-server banner and the local MCP URL setting. These inline examples are not shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:93:ruby-shell-backtick-execution","reason":"The environment-variable example points diagnostics at the selected localhost port. No dangerous substitution or external destination appears.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:94:ruby-shell-backtick-execution","reason":"This guidance diagnoses a stopped or incompatible development server. Inline command and filename references do not execute code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","reason":"Reading project metadata to distinguish compatibility problems is ordinary preflight behavior. The backticks format names rather than execute them.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:96:ruby-shell-backtick-execution","reason":"The passage requires refusing an unsupported framework version. Its inline diagnostics name is not a shell expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","reason":"The named tool and quoted error identify whether Turbopack is available. This is ordinary compatibility checking, not backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:99:ruby-shell-backtick-execution","reason":"The inline string is an expected error response used to reject webpack sessions. It is data, not executable shell syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:101:ruby-shell-backtick-execution","reason":"The tool name requests the development app's route map for verification. Markdown formatting does not execute a shell.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:107:ruby-shell-backtick-execution","reason":"The passage uses local framework metadata to narrow the files involved in an edit. Inline endpoint naming is not command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:116:ruby-shell-backtick-execution","reason":"The backticks name the compilation check and local diagnostics endpoint. These are intended verification tools, not executable substitutions.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:117:ruby-shell-backtick-execution","reason":"The line describes checking runtime errors through framework diagnostics. The inline endpoint text is not shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:119:ruby-shell-backtick-execution","reason":"Driving the development page and asserting visible behavior is the skill's stated purpose. Inline tool names do not provide an injection vector.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:121:ruby-shell-backtick-execution","reason":"The passage describes React inspection for component behavior checks. No executable backtick substitution or unauthorized destination is present.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:125:ruby-shell-backtick-execution","reason":"The fixed CLI command reads the React tree as diagnostic output. It is legitimate inspection, not command injection.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:128:ruby-shell-backtick-execution","reason":"The text tells the agent to select tools from their documented surface. The backticks only format an MCP method name.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:133:ruby-shell-backtick-execution","reason":"This warning explicitly prohibits moving or deleting active development output. Formatting the directory name is not shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:136:ruby-shell-backtick-execution","reason":"The guidance separates build output and server ports to avoid disrupting development. The inline configuration key is not executable syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:140:ruby-shell-backtick-execution","reason":"The text requires consistent browser session selection to prevent using the wrong context. Inline CLI naming is not backtick execution.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:142:ruby-shell-backtick-execution","reason":"The environment assignments pass a quoted session identifier to the browser CLI. They do not evaluate untrusted shell expressions.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:143:ruby-shell-backtick-execution","reason":"The restoration variable selects the intended browser session rather than exposing a credential value. Inline formatting is not command substitution.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:145:ruby-shell-backtick-execution","reason":"The fixed flags use a quoted session variable for ordinary browser isolation. No shell backtick execution or injection appears.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:147:ruby-shell-backtick-execution","reason":"The passage recommends reconciling browser and framework observations before debugging. The backticks format tool names only.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:152:ruby-shell-backtick-execution","reason":"The wait command synchronizes browser assertions after navigation. Its fixed flags do not create an execution vulnerability.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:153:ruby-shell-backtick-execution","reason":"The text warns against guessed URL waits and recommends fresh page observations. Markdown command references are not executable backtick syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:157:ruby-shell-backtick-execution","reason":"about:blank is a browser-state example used for troubleshooting. It is not shell code or a remote destination.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:158:ruby-shell-backtick-execution","reason":"The sentence describes a stale browser session after navigation. Backticks around the command name are only Markdown formatting.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:162:ruby-shell-backtick-execution","reason":"The fixed close command targets the existing quoted session to recover from stale browser state. No untrusted command construction appears.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:163:ruby-shell-backtick-execution","reason":"The passage rejects curl as a substitute for real-browser testing. Merely mentioning curl is not execution or data exfiltration.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:166:ruby-shell-backtick-execution","reason":"The text explains the local MCP response format and its data field. The backticks format protocol identifiers.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:167:ruby-shell-backtick-execution","reason":"The fixed sed expressions filter response lines as text. They do not execute response content or interpolate untrusted commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:168:ruby-shell-backtick-execution","reason":"The inline text names an SSE field and diagnostics methods. These protocol references are not executable shell substitutions.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:169:ruby-shell-backtick-execution","reason":"The sentence documents navigation prerequisites for runtime diagnostics. The method names are Markdown code spans.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:174:ruby-shell-backtick-execution","reason":"This passage requires checking the advertised MCP tool list before using the reference. The code fence and method name are not shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:177:ruby-shell-backtick-execution","reason":"The fenced block is a reference table of development diagnostics methods and their outputs. It is not executable Ruby or shell code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:191:ruby-shell-backtick-execution","reason":"The backticks close a Markdown reference table before teardown guidance. No command substitution is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:196:ruby-shell-backtick-execution","reason":"The close command targets the existing quoted session for normal teardown. Authentication persistence is a separate retention concern, not backtick execution.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:197:ruby-shell-backtick-execution","reason":"This sentence describes restoring saved browser state between loops. The inline flag does not execute code; retention safeguards are assessed separately.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:60:shell-command-substitution","reason":"The substitution runs a fixed CLI operation to derive a worktree-scoped identifier. Its output remains quoted data and is not evaluated as another command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:59:template-literal-with-command-substitution","reason":"This is a Markdown Bash example, not a JavaScript template literal. Its fixed command substitution derives a session identifier and exports quoted values.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:44:hardcoded-url","reason":"The URL links to official Next.js upgrade documentation. It is a reference link with no data-upload instruction.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:46:hardcoded-url","reason":"The URL is an official version-upgrade guide. No credentials, private payload, or unauthorized network request accompanies it.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:93:hardcoded-url","reason":"The address targets the local development server's diagnostics endpoint at its selected port. It is not an external exfiltration destination.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:56:system-reconnaissance","reason":"The session identifier belongs to browser automation for this checkout. The text does not request host, user, or network reconnaissance.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:60:system-reconnaissance","reason":"agent-browser session id derives an isolated browser session name with fixed arguments. It is not the operating-system id command or account enumeration.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:72:system-reconnaissance","reason":"The session id is a browser persistence key intended to prevent checkout collisions. No operating-system identity collection occurs.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:153:system-reconnaissance","reason":"The passage concerns waiting for the exact navigation URL during browser testing. It does not enumerate system resources.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:188:system-reconnaissance","reason":"The hashed id identifies a Next.js server action for source mapping. This framework diagnostic lookup is not operating-system reconnaissance.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[{"title":"Persistent Login State Lacks Cleanup Guidance","severity":"low","locations":[{"file":"SKILL.md","line_end":74,"line_start":71},{"file":"SKILL.md","line_end":198,"line_start":195}],"confidence":0.92,"description":"The skill says restoration loads saved cookies/localStorage and that close saves cookies and storage for later loops. No consent, retention limit, or deletion guidance accompanies authentication persistence, increasing exposure on shared or compromised development machines.","confidence_reasoning":"The instructions explicitly require restoring and saving authentication state. The file provides no cleanup safeguards, although actual exposure depends on local storage protection."}],"subject_marketplace_commit_sha":"c993c6abcbffafea2683d7748b53b3dfaf438415","subject_content_hash":"a5406518dbf30c63bea2860b4e4043cc89efe1286a411d9a7717909183f60a66","subject_tree_hash":"1b92a4edd4fdf0f90e9c69c826f7cc29ce05b85ae96e692cd93b41e0ced5b0fd","subject_plugin_path":"skills/vercel/next-dev-loop","audit_payload_hash":"a9beb895548d63f423dd0ae506002bf8","confirmed_risk_level":"low","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"c993c6abcbffafea2683d7748b53b3dfaf438415","contentHash":"a5406518dbf30c63bea2860b4e4043cc89efe1286a411d9a7717909183f60a66","treeHash":"1b92a4edd4fdf0f90e9c69c826f7cc29ce05b85ae96e692cd93b41e0ced5b0fd","pluginPath":"skills/vercel/next-dev-loop","auditPayloadHash":"a9beb895548d63f423dd0ae506002bf8"},"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-next-dev-loop/audits/1/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"low","confirmedFindingCount":1,"capabilityReviewCount":2,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}