{"data":{"skill":{"slug":"supatest-ai-alan-test-feature","name":"alan-test-feature","icon":"📦","repo":"https://github.com/supatest-ai/alan-skills/tree/e6ebae2c86d4d3ad8597e588f3e820ab0c90658f/skills/alan-test-feature","status":"approved","author":"supatest-ai","authorVersion":"1.1.1","skillstoreRevision":1},"audit":{"id":"2cd9cc2b-d328-4401-af66-22bc7847a84d","skill_id":"505b2b70-f608-4427-bf95-62c8129cb4f9","version":1,"content_hash":"v3:bdb71a4bc34515f37772ae85fd5501f9c2ff33b0:a8ce601a33ab9116f6f9c850a848348691a47520fc861ee13e42bb6c971cf5eb:39483f20f806023bc7b3e35aee74f4858ca295272e65c42797c063e4349a8c1e:736b696c6c732f73757061746573742d61692f616c616e2d746573742d66656174757265:58d698b4f3ec270ec74c32b80d9d0a62","risk_level":"high","is_blocked":false,"safe_to_publish":false,"analysis_status":"ok","agent_auto_install_policy":"confirmation_required","manual_install_policy":"allowed","summary":"Most backtick, localhost, device-file, and reconnaissance alerts are false positives caused by Markdown examples or bounded local testing. Confirmed risks include unpinned global installation, repository script execution, environment-file access, predictable temporary storage, and mandatory capture uploads. Media can contain credentials or private application data and is uploaded without a review gate.","remediation":[{"issue":"Mandatory screenshot and video uploads can disclose sensitive application data.","severity":"high","suggestion":"Require explicit approval before upload, preview every capture, redact secrets and personal data, and support a local-only report mode."},{"issue":"The workflow reads .env and .env.local while discovering the application port.","severity":"high","suggestion":"Prefer server output and public configuration. If needed, parse only allowlisted port keys without exposing complete environment files."},{"issue":"The skill globally installs an unpinned npm package.","severity":"high","suggestion":"Pin an audited agent-browser version, verify package integrity, and require user confirmation before installation."},{"issue":"The skill starts repository-defined scripts and services.","severity":"high","suggestion":"Show the resolved command, inspect its definition, and request confirmation before executing project startup code."},{"issue":"Capture files use predictable paths in a shared temporary directory.","severity":"medium","suggestion":"Create a private temporary directory with restrictive permissions, reject symlinks, and remove captures after reporting."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":9,"line_start":9},{"file":"SKILL.md","line_end":19,"line_start":19},{"file":"SKILL.md","line_end":20,"line_start":20},{"file":"SKILL.md","line_end":21,"line_start":21},{"file":"SKILL.md","line_end":23,"line_start":23},{"file":"SKILL.md","line_end":27,"line_start":27},{"file":"SKILL.md","line_end":31,"line_start":29},{"file":"SKILL.md","line_end":34,"line_start":31},{"file":"SKILL.md","line_end":36,"line_start":34},{"file":"SKILL.md","line_end":39,"line_start":36},{"file":"SKILL.md","line_end":41,"line_start":39},{"file":"SKILL.md","line_end":45,"line_start":41},{"file":"SKILL.md","line_end":47,"line_start":45},{"file":"SKILL.md","line_end":49,"line_start":47},{"file":"SKILL.md","line_end":52,"line_start":49},{"file":"SKILL.md","line_end":53,"line_start":52},{"file":"SKILL.md","line_end":53,"line_start":53},{"file":"SKILL.md","line_end":55,"line_start":54},{"file":"SKILL.md","line_end":55,"line_start":55},{"file":"SKILL.md","line_end":67,"line_start":65},{"file":"SKILL.md","line_end":75,"line_start":67},{"file":"SKILL.md","line_end":81,"line_start":75},{"file":"SKILL.md","line_end":81,"line_start":81},{"file":"SKILL.md","line_end":112,"line_start":109},{"file":"SKILL.md","line_end":123,"line_start":112},{"file":"SKILL.md","line_end":123,"line_start":123},{"file":"SKILL.md","line_end":124,"line_start":124},{"file":"SKILL.md","line_end":125,"line_start":125},{"file":"SKILL.md","line_end":126,"line_start":126},{"file":"SKILL.md","line_end":127,"line_start":127},{"file":"SKILL.md","line_end":144,"line_start":130},{"file":"SKILL.md","line_end":149,"line_start":144},{"file":"SKILL.md","line_end":155,"line_start":149},{"file":"SKILL.md","line_end":162,"line_start":155},{"file":"SKILL.md","line_end":162,"line_start":162},{"file":"SKILL.md","line_end":164,"line_start":163},{"file":"SKILL.md","line_end":210,"line_start":164},{"file":"SKILL.md","line_end":220,"line_start":210},{"file":"SKILL.md","line_end":222,"line_start":220},{"file":"SKILL.md","line_end":222,"line_start":222},{"file":"SKILL.md","line_end":229,"line_start":226},{"file":"SKILL.md","line_end":235,"line_start":229},{"file":"SKILL.md","line_end":237,"line_start":235},{"file":"SKILL.md","line_end":245,"line_start":237},{"file":"SKILL.md","line_end":247,"line_start":245},{"file":"SKILL.md","line_end":254,"line_start":247},{"file":"SKILL.md","line_end":255,"line_start":254},{"file":"SKILL.md","line_end":255,"line_start":255},{"file":"SKILL.md","line_end":256,"line_start":256},{"file":"SKILL.md","line_end":260,"line_start":258}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":152,"line_start":152},{"file":"SKILL.md","line_end":163,"line_start":163},{"file":"SKILL.md","line_end":221,"line_start":221},{"file":"SKILL.md","line_end":227,"line_start":227},{"file":"SKILL.md","line_end":347,"line_start":347}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":30,"line_start":30},{"file":"SKILL.md","line_end":110,"line_start":110},{"file":"SKILL.md","line_end":111,"line_start":111},{"file":"SKILL.md","line_end":152,"line_start":152},{"file":"SKILL.md","line_end":163,"line_start":163},{"file":"SKILL.md","line_end":314,"line_start":314},{"file":"SKILL.md","line_end":315,"line_start":315},{"file":"SKILL.md","line_end":334,"line_start":334},{"file":"SKILL.md","line_end":45,"line_start":45},{"file":"SKILL.md","line_end":48,"line_start":48},{"file":"SKILL.md","line_end":52,"line_start":52},{"file":"SKILL.md","line_end":55,"line_start":55},{"file":"SKILL.md","line_end":236,"line_start":236},{"file":"SKILL.md","line_end":246,"line_start":246},{"file":"SKILL.md","line_end":259,"line_start":259},{"file":"SKILL.md","line_end":302,"line_start":302},{"file":"SKILL.md","line_end":313,"line_start":313},{"file":"SKILL.md","line_end":334,"line_start":334},{"file":"SKILL.md","line_end":353,"line_start":353}]}],"critical_findings":[],"high_findings":[{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":9,"line_start":9}],"confidence":0.97,"description":"Analyze the current branch's changes, scope the coverage level with the user, build an explicit test","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The instruction starts project processes and mandates uploading browser captures to S3. These are consequential external actions that can execute repository code and disclose application data."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":36,"line_start":34}],"confidence":0.98,"description":"```bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The fenced command installs an unpinned npm package globally and runs its installer. A compromised or changed package could execute arbitrary code with the agent's permissions."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":144,"line_start":130}],"confidence":0.93,"description":"```bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The command block starts repository-defined npm, Python, Ruby, or Docker services. Those startup paths can execute untrusted project code and alter the local environment."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":328,"line_start":328}],"confidence":0.99,"description":"For each captured file, use the `mcp__alan__get_upload_url` MCP tool to get a presigned S3 URL, then","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"This instruction explicitly sends every captured file to S3 through a presigned URL. Captures can contain credentials, personal data, or unreleased application details."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":354,"line_start":350}],"confidence":0.99,"description":"```bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The fenced curl command performs the external PUT that uploads a local screenshot. This is a direct data-transfer action with no content review or approval gate."},{"title":"Environment file access","locations":[{"file":"SKILL.md","line_end":126,"line_start":126}],"confidence":0.66,"description":"4. Check for `Procfile`, `.env`, `Pipfile`, `requirements.txt`, `Gemfile`","review_kind":"security","source_category":"sensitive","source_severity":"high","confidence_reasoning":"The discovery step includes checking .env while determining how to run the project. It may expose unrelated credentials even though the exact read method is not specified."},{"title":"Environment file access","locations":[{"file":"SKILL.md","line_end":162,"line_start":162}],"confidence":0.96,"description":"- Check `.env` or `.env.local` for `PORT` or `VITE_PORT` or similar","review_kind":"security","source_category":"sensitive","source_severity":"high","confidence_reasoning":"The skill explicitly directs the agent to inspect .env and .env.local. These files commonly contain credentials beyond the requested port value."},{"title":"Environment variant files","locations":[{"file":"SKILL.md","line_end":162,"line_start":162}],"confidence":0.96,"description":"- Check `.env` or `.env.local` for `PORT` or `VITE_PORT` or similar","review_kind":"security","source_category":"sensitive","source_severity":"high","confidence_reasoning":"The skill explicitly directs the agent to inspect .env and .env.local. These files commonly contain credentials beyond the requested port value."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":4,"line_start":4}],"confidence":0.98,"description":"description: Scope coverage, build a testing strategy, test the feature with agent-browser, capture ","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":9,"line_start":9}],"confidence":0.98,"description":"Analyze the current branch's changes, scope the coverage level with the user, build an explicit test","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":45,"line_start":45}],"confidence":0.9,"description":"All captures (screenshots, videos) MUST be written to `/tmp/alan-captures/`.","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":55,"line_start":55}],"confidence":0.9,"description":"> - If you are tempted to create a `reports/` or `screenshots/` folder anywhere other than `/tmp/`, ","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":246,"line_start":246}],"confidence":0.9,"description":"agent-browser --session test-feature screenshot /tmp/alan-captures/step-00-initial-state.png","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":259,"line_start":259}],"confidence":0.9,"description":"agent-browser --session test-feature screenshot /tmp/alan-captures/step-NN-description.png","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":302,"line_start":302}],"confidence":0.9,"description":"agent-browser --session test-feature screenshot /tmp/alan-captures/final-state.png","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":404,"line_start":404}],"confidence":0.98,"description":"\"screenshotUrl\": \"<s3Key from Phase 3 — e.g. sandbox-captures/org/task/step-01.png — omit if upload ","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":413,"line_start":413}],"confidence":0.98,"description":"\"screenshotUrl\": \"<s3Key from Phase 3 showing the issue — omit if upload failed>\"","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":426,"line_start":426}],"confidence":0.98,"description":"- **screenshotUrls**: flat list of ALL screenshot s3Keys from Phase 3 (for gallery display). Use the","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate."}],"medium_findings":[{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":45,"line_start":45}],"confidence":0.84,"description":"All captures (screenshots, videos) MUST be written to `/tmp/alan-captures/`.","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":48,"line_start":48}],"confidence":0.84,"description":"mkdir -p /tmp/alan-captures","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":52,"line_start":52}],"confidence":0.84,"description":"> - **ONLY** write capture files to `/tmp/alan-captures/`. Never anywhere else.","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":55,"line_start":55}],"confidence":0.84,"description":"> - If you are tempted to create a `reports/` or `screenshots/` folder anywhere other than `/tmp/`, ","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":236,"line_start":236}],"confidence":0.84,"description":"agent-browser --session test-feature record start /tmp/alan-captures/happy-path.webm","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":246,"line_start":246}],"confidence":0.84,"description":"agent-browser --session test-feature screenshot /tmp/alan-captures/step-00-initial-state.png","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":259,"line_start":259}],"confidence":0.84,"description":"agent-browser --session test-feature screenshot /tmp/alan-captures/step-NN-description.png","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":302,"line_start":302}],"confidence":0.84,"description":"agent-browser --session test-feature screenshot /tmp/alan-captures/final-state.png","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":313,"line_start":313}],"confidence":0.84,"description":"for f in /tmp/alan-captures/*.webm; do","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":334,"line_start":334}],"confidence":0.84,"description":"SIZE=$(stat -c%s \"/tmp/alan-captures/step-01.png\" 2>/dev/null || stat -f%z \"/tmp/alan-captures/step-","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":353,"line_start":353}],"confidence":0.84,"description":"--data-binary @/tmp/alan-captures/step-01.png","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems."}],"low_findings":[],"dangerous_patterns":[{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":4,"line_start":4}],"confidence":0.98,"description":"description: Scope coverage, build a testing strategy, test the feature with agent-browser, capture ","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":9,"line_start":9}],"confidence":0.98,"description":"Analyze the current branch's changes, scope the coverage level with the user, build an explicit test","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":45,"line_start":45}],"confidence":0.9,"description":"All captures (screenshots, videos) MUST be written to `/tmp/alan-captures/`.","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":55,"line_start":55}],"confidence":0.9,"description":"> - If you are tempted to create a `reports/` or `screenshots/` folder anywhere other than `/tmp/`, ","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":246,"line_start":246}],"confidence":0.9,"description":"agent-browser --session test-feature screenshot /tmp/alan-captures/step-00-initial-state.png","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":259,"line_start":259}],"confidence":0.9,"description":"agent-browser --session test-feature screenshot /tmp/alan-captures/step-NN-description.png","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":302,"line_start":302}],"confidence":0.9,"description":"agent-browser --session test-feature screenshot /tmp/alan-captures/final-state.png","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":404,"line_start":404}],"confidence":0.98,"description":"\"screenshotUrl\": \"<s3Key from Phase 3 — e.g. sandbox-captures/org/task/step-01.png — omit if upload ","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":413,"line_start":413}],"confidence":0.98,"description":"\"screenshotUrl\": \"<s3Key from Phase 3 showing the issue — omit if upload failed>\"","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate."},{"title":"Screen capture upload","locations":[{"file":"SKILL.md","line_end":426,"line_start":426}],"confidence":0.98,"description":"- **screenshotUrls**: flat list of ALL screenshot s3Keys from Phase 3 (for gallery display). Use the","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate."}],"files_scanned":1,"total_lines":440,"audit_model":"codex","audited_at":"2026-08-20T08:31:39.348+00:00","created_at":"2026-08-20T09:52:49.989472+00:00","static_findings":[{"id":"external_commands:SKILL.md:9:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Analyze the current branch's changes, scope the coverage level with the user, build an explicit test","category":"external_commands","line_end":9,"severity":"medium","line_start":9},{"id":"external_commands:SKILL.md:19:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- The task ID is available from the `ALAN_TASK_ID` environment variable.","category":"external_commands","line_end":19,"severity":"medium","line_start":19},{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- The conversation ID is available from the `ALAN_SESSION_ID` environment variable.","category":"external_commands","line_end":20,"severity":"medium","line_start":20},{"id":"external_commands:SKILL.md:21:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Resolve `teamId` with Alan MCP context/tools before creating the report.","category":"external_commands","line_end":21,"severity":"medium","line_start":21},{"id":"external_commands:SKILL.md:23:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"When calling `create_test_report`, always pass `taskId`, `conversationId`, and `teamId` explicitly. ","category":"external_commands","line_end":23,"severity":"medium","line_start":23},{"id":"external_commands:SKILL.md:27:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`agent-browser` is a **CLI tool** by Vercel Labs (`npm: agent-browser`) — it is NOT a skill or MCP t","category":"external_commands","line_end":27,"severity":"medium","line_start":27},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":31,"severity":"medium","line_start":29},{"id":"external_commands:SKILL.md:31:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":34,"severity":"medium","line_start":31},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":36,"severity":"medium","line_start":34},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":39,"severity":"medium","line_start":36},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> \"agent-browser is not available and could not be installed. Install it manually: `npm install -g a","category":"external_commands","line_end":41,"severity":"medium","line_start":39},{"id":"external_commands:SKILL.md:41:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Do NOT proceed to Phase 2 without a working `agent-browser` — all browser testing depends on it.","category":"external_commands","line_end":45,"severity":"medium","line_start":41},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"All captures (screenshots, videos) MUST be written to `/tmp/alan-captures/`.","category":"external_commands","line_end":47,"severity":"medium","line_start":45},{"id":"external_commands:SKILL.md:47:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":49,"severity":"medium","line_start":47},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":52,"severity":"medium","line_start":49},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> - **ONLY** write capture files to `/tmp/alan-captures/`. Never anywhere else.","category":"external_commands","line_end":53,"severity":"medium","line_start":52},{"id":"external_commands:SKILL.md:53:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> - **NEVER** write to `.claude/`, project directories, `reports/`, or any path inside the repo.","category":"external_commands","line_end":53,"severity":"medium","line_start":53},{"id":"external_commands:SKILL.md:54:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> - `.claude/` is a sensitive system directory — writing to it will be blocked and will abort the te","category":"external_commands","line_end":55,"severity":"medium","line_start":54},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> - If you are tempted to create a `reports/` or `screenshots/` folder anywhere other than `/tmp/`, ","category":"external_commands","line_end":55,"severity":"medium","line_start":55},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Use `AskUserQuestion` to ask the user:","category":"external_commands","line_end":67,"severity":"medium","line_start":65},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":75,"severity":"medium","line_start":67},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","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":"Based on the feature (which you may not know yet — do a quick `git diff --stat` first to get a hint)","category":"external_commands","line_end":81,"severity":"medium","line_start":81},{"id":"external_commands:SKILL.md:109:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":112,"severity":"medium","line_start":109},{"id":"external_commands:SKILL.md:112:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":123,"severity":"medium","line_start":112},{"id":"external_commands:SKILL.md:123:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. Read `package.json` — check `scripts.dev`, `scripts.start`, `scripts.serve`","category":"external_commands","line_end":123,"severity":"medium","line_start":123},{"id":"external_commands:SKILL.md:124:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. Check for `docker-compose.yml` / `docker-compose.yaml` / `compose.yml`","category":"external_commands","line_end":124,"severity":"medium","line_start":124},{"id":"external_commands:SKILL.md:125:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"3. Check for `Makefile` (look for `dev` or `serve` targets)","category":"external_commands","line_end":125,"severity":"medium","line_start":125},{"id":"external_commands:SKILL.md:126:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"4. Check for `Procfile`, `.env`, `Pipfile`, `requirements.txt`, `Gemfile`","category":"external_commands","line_end":126,"severity":"medium","line_start":126},{"id":"external_commands:SKILL.md:127:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"5. Check for framework-specific files: `next.config.*`, `vite.config.*`, `nuxt.config.*`, `angular.j","category":"external_commands","line_end":127,"severity":"medium","line_start":127},{"id":"external_commands:SKILL.md:130:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":144,"severity":"medium","line_start":130},{"id":"external_commands:SKILL.md:144:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":149,"severity":"medium","line_start":144},{"id":"external_commands:SKILL.md:149:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":155,"severity":"medium","line_start":149},{"id":"external_commands:SKILL.md:155:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":162,"severity":"medium","line_start":155},{"id":"external_commands:SKILL.md:162:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Check `.env` or `.env.local` for `PORT` or `VITE_PORT` or similar","category":"external_commands","line_end":162,"severity":"medium","line_start":162},{"id":"external_commands:SKILL.md:163:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Test common ports with `curl -sf http://localhost:PORT >/dev/null`","category":"external_commands","line_end":164,"severity":"medium","line_start":163},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- If you cannot determine it, ask the user via `AskUserQuestion`","category":"external_commands","line_end":210,"severity":"medium","line_start":164},{"id":"external_commands:SKILL.md:210:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Use `TodoWrite` to create a todo entry for each test scenario so progress is tracked. Each todo shou","category":"external_commands","line_end":220,"severity":"medium","line_start":210},{"id":"external_commands:SKILL.md:220:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> `agent-browser` is a CLI tool — invoke it via bash, not as an MCP tool or skill.","category":"external_commands","line_end":222,"severity":"medium","line_start":220},{"id":"external_commands:SKILL.md:222:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> Key commands: `open`, `snapshot`, `click`, `fill`, `screenshot`, `record`, `wait`, `find`, `close`","category":"external_commands","line_end":222,"severity":"medium","line_start":222},{"id":"external_commands:SKILL.md:226:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":229,"severity":"medium","line_start":226},{"id":"external_commands:SKILL.md:229:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":235,"severity":"medium","line_start":229},{"id":"external_commands:SKILL.md:235:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":237,"severity":"medium","line_start":235},{"id":"external_commands:SKILL.md:237:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":245,"severity":"medium","line_start":237},{"id":"external_commands:SKILL.md:245:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":247,"severity":"medium","line_start":245},{"id":"external_commands:SKILL.md:247:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":254,"severity":"medium","line_start":247},{"id":"external_commands:SKILL.md:254:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Use `agent-browser snapshot -i` to discover interactive elements","category":"external_commands","line_end":255,"severity":"medium","line_start":254},{"id":"external_commands:SKILL.md:255:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Use `agent-browser click @eN`, `agent-browser fill @eN \"text\"`, etc. to interact","category":"external_commands","line_end":255,"severity":"medium","line_start":255},{"id":"external_commands:SKILL.md:256:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Use `agent-browser wait --load networkidle` or `agent-browser wait 1500` between actions","category":"external_commands","line_end":256,"severity":"medium","line_start":256},{"id":"external_commands:SKILL.md:258:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":260,"severity":"medium","line_start":258},{"id":"external_commands:SKILL.md:260:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":261,"severity":"medium","line_start":260},{"id":"external_commands:SKILL.md:261:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Name screenshots descriptively: `step-02-form-filled.png`, `step-03-submit-clicked.png`, `step-04-su","category":"external_commands","line_end":261,"severity":"medium","line_start":261},{"id":"external_commands:SKILL.md:264:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":267,"severity":"medium","line_start":264},{"id":"external_commands:SKILL.md:267:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":300,"severity":"medium","line_start":267},{"id":"external_commands:SKILL.md:300:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":304,"severity":"medium","line_start":300},{"id":"external_commands:SKILL.md:304:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":306,"severity":"medium","line_start":304},{"id":"external_commands:SKILL.md:306:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Keep the recording under 2 minutes.** If the feature requires more exploration, split into multipl","category":"external_commands","line_end":306,"severity":"medium","line_start":306},{"id":"external_commands:SKILL.md:310:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"WebM files recorded by agent-browser often have `duration = Infinity` in the container header — the ","category":"external_commands","line_end":310,"severity":"medium","line_start":310},{"id":"external_commands:SKILL.md:312:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":320,"severity":"medium","line_start":312},{"id":"external_commands:SKILL.md:320:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":328,"severity":"medium","line_start":320},{"id":"external_commands:SKILL.md:328:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"For each captured file, use the `mcp__alan__get_upload_url` MCP tool to get a presigned S3 URL, then","category":"external_commands","line_end":328,"severity":"medium","line_start":328},{"id":"external_commands:SKILL.md:333:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":335,"severity":"medium","line_start":333},{"id":"external_commands:SKILL.md:335:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":338,"severity":"medium","line_start":335},{"id":"external_commands:SKILL.md:338:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":346,"severity":"medium","line_start":338},{"id":"external_commands:SKILL.md:346:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":347,"severity":"medium","line_start":346},{"id":"external_commands:SKILL.md:347:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Returns: `{ \"uploadUrl\": \"https://...\", \"s3Key\": \"sandbox-captures/...\" }`","category":"external_commands","line_end":350,"severity":"medium","line_start":347},{"id":"external_commands:SKILL.md:350:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":354,"severity":"medium","line_start":350},{"id":"external_commands:SKILL.md:354:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":356,"severity":"medium","line_start":354},{"id":"external_commands:SKILL.md:356:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"4. **Save the `s3Key`** — you will pass it to `create_test_report` in Phase 4.","category":"external_commands","line_end":356,"severity":"medium","line_start":356},{"id":"external_commands:SKILL.md:359:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Screenshots: `image/png`","category":"external_commands","line_end":360,"severity":"medium","line_start":359},{"id":"external_commands:SKILL.md:360:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Video recordings: `video/webm`","category":"external_commands","line_end":362,"severity":"medium","line_start":360},{"id":"external_commands:SKILL.md:362:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**If uploads fail**: Continue to Phase 4 anyway — omit the `screenshotUrl`, `videoUrl`, and `screens","category":"external_commands","line_end":362,"severity":"medium","line_start":362},{"id":"external_commands:SKILL.md:368:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**CRITICAL: You MUST call `mcp__alan__create_test_report` to complete this skill. This is non-negoti","category":"external_commands","line_end":378,"severity":"medium","line_start":368},{"id":"external_commands:SKILL.md:378:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Call the `mcp__alan__create_test_report` MCP tool with structured data from your testing.","category":"external_commands","line_end":382,"severity":"medium","line_start":378},{"id":"external_commands:SKILL.md:382:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":419,"severity":"medium","line_start":382},{"id":"external_commands:SKILL.md:419:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":426,"severity":"medium","line_start":419},{"id":"external_commands:SKILL.md:426:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **screenshotUrls**: flat list of ALL screenshot s3Keys from Phase 3 (for gallery display). Use the","category":"external_commands","line_end":426,"severity":"medium","line_start":426},{"id":"external_commands:SKILL.md:431:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"After calling `mcp__alan__create_test_report`, tell the user:","category":"external_commands","line_end":433,"severity":"medium","line_start":431},{"id":"external_commands:SKILL.md:151:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"for i in $(seq 1 30); do","category":"external_commands","line_end":151,"severity":"medium","line_start":151},{"id":"external_commands:SKILL.md:334:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"SIZE=$(stat -c%s \"/tmp/alan-captures/step-01.png\" 2>/dev/null || stat -f%z \"/tmp/alan-captures/step-","category":"external_commands","line_end":334,"severity":"medium","line_start":334},{"id":"external_commands:SKILL.md:149:template-literal-with-command-substitution","file":"SKILL.md","pattern":"Template literal with command substitution","snippet":"```bash","category":"external_commands","line_end":155,"severity":"medium","line_start":149},{"id":"external_commands:SKILL.md:333:template-literal-with-command-substitution","file":"SKILL.md","pattern":"Template literal with command substitution","snippet":"```bash","category":"external_commands","line_end":335,"severity":"medium","line_start":333},{"id":"network:SKILL.md:152:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"curl -sf http://localhost:PORT >/dev/null 2>&1 && break","category":"network","line_end":152,"severity":"low","line_start":152},{"id":"network:SKILL.md:163:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"- Test common ports with `curl -sf http://localhost:PORT >/dev/null`","category":"network","line_end":163,"severity":"low","line_start":163},{"id":"network:SKILL.md:221:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"> Docs: https://github.com/vercel-labs/agent-browser","category":"network","line_end":221,"severity":"low","line_start":221},{"id":"network:SKILL.md:227:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"agent-browser --session test-feature open http://localhost:PORT","category":"network","line_end":227,"severity":"low","line_start":227},{"id":"network:SKILL.md:347:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Returns: `{ \"uploadUrl\": \"https://...\", \"s3Key\": \"sandbox-captures/...\" }`","category":"network","line_end":347,"severity":"low","line_start":347},{"id":"filesystem:SKILL.md:30:standard-device-file-access","file":"SKILL.md","pattern":"Standard device file access","snippet":"command -v agent-browser >/dev/null 2>&1 && echo \"agent-browser: OK\" || echo \"agent-browser: MISSING","category":"filesystem","line_end":30,"severity":"low","line_start":30},{"id":"filesystem:SKILL.md:110:standard-device-file-access","file":"SKILL.md","pattern":"Standard device file access","snippet":"git log main..HEAD --oneline 2>/dev/null || git log HEAD~5..HEAD --oneline","category":"filesystem","line_end":110,"severity":"low","line_start":110},{"id":"filesystem:SKILL.md:111:standard-device-file-access","file":"SKILL.md","pattern":"Standard device file access","snippet":"git diff main...HEAD --stat 2>/dev/null || git diff HEAD~1 --stat","category":"filesystem","line_end":111,"severity":"low","line_start":111},{"id":"filesystem:SKILL.md:152:standard-device-file-access","file":"SKILL.md","pattern":"Standard device file access","snippet":"curl -sf http://localhost:PORT >/dev/null 2>&1 && break","category":"filesystem","line_end":152,"severity":"low","line_start":152},{"id":"filesystem:SKILL.md:163:standard-device-file-access","file":"SKILL.md","pattern":"Standard device file access","snippet":"- Test common ports with `curl -sf http://localhost:PORT >/dev/null`","category":"filesystem","line_end":163,"severity":"low","line_start":163},{"id":"filesystem:SKILL.md:314:standard-device-file-access","file":"SKILL.md","pattern":"Standard device file access","snippet":"if command -v ffmpeg >/dev/null 2>&1; then","category":"filesystem","line_end":314,"severity":"low","line_start":314},{"id":"filesystem:SKILL.md:315:standard-device-file-access","file":"SKILL.md","pattern":"Standard device file access","snippet":"ffmpeg -y -i \"$f\" -c copy \"${f%.webm}-fixed.webm\" 2>/dev/null \\","category":"filesystem","line_end":315,"severity":"low","line_start":315},{"id":"filesystem:SKILL.md:334:standard-device-file-access","file":"SKILL.md","pattern":"Standard device file access","snippet":"SIZE=$(stat -c%s \"/tmp/alan-captures/step-01.png\" 2>/dev/null || stat -f%z \"/tmp/alan-captures/step-","category":"filesystem","line_end":334,"severity":"low","line_start":334},{"id":"filesystem:SKILL.md:45:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"All captures (screenshots, videos) MUST be written to `/tmp/alan-captures/`.","category":"filesystem","line_end":45,"severity":"medium","line_start":45},{"id":"filesystem:SKILL.md:48:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"mkdir -p /tmp/alan-captures","category":"filesystem","line_end":48,"severity":"medium","line_start":48},{"id":"filesystem:SKILL.md:52:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"> - **ONLY** write capture files to `/tmp/alan-captures/`. Never anywhere else.","category":"filesystem","line_end":52,"severity":"medium","line_start":52},{"id":"filesystem:SKILL.md:55:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"> - If you are tempted to create a `reports/` or `screenshots/` folder anywhere other than `/tmp/`, ","category":"filesystem","line_end":55,"severity":"medium","line_start":55},{"id":"filesystem:SKILL.md:236:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"agent-browser --session test-feature record start /tmp/alan-captures/happy-path.webm","category":"filesystem","line_end":236,"severity":"medium","line_start":236},{"id":"filesystem:SKILL.md:246:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"agent-browser --session test-feature screenshot /tmp/alan-captures/step-00-initial-state.png","category":"filesystem","line_end":246,"severity":"medium","line_start":246},{"id":"filesystem:SKILL.md:259:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"agent-browser --session test-feature screenshot /tmp/alan-captures/step-NN-description.png","category":"filesystem","line_end":259,"severity":"medium","line_start":259},{"id":"filesystem:SKILL.md:302:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"agent-browser --session test-feature screenshot /tmp/alan-captures/final-state.png","category":"filesystem","line_end":302,"severity":"medium","line_start":302},{"id":"filesystem:SKILL.md:313:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"for f in /tmp/alan-captures/*.webm; do","category":"filesystem","line_end":313,"severity":"medium","line_start":313},{"id":"filesystem:SKILL.md:334:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"SIZE=$(stat -c%s \"/tmp/alan-captures/step-01.png\" 2>/dev/null || stat -f%z \"/tmp/alan-captures/step-","category":"filesystem","line_end":334,"severity":"medium","line_start":334},{"id":"filesystem:SKILL.md:353:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"--data-binary @/tmp/alan-captures/step-01.png","category":"filesystem","line_end":353,"severity":"medium","line_start":353},{"id":"sensitive:SKILL.md:126:environment-file-access","file":"SKILL.md","pattern":"Environment file access","snippet":"4. Check for `Procfile`, `.env`, `Pipfile`, `requirements.txt`, `Gemfile`","category":"sensitive","line_end":126,"severity":"high","line_start":126},{"id":"sensitive:SKILL.md:162:environment-file-access","file":"SKILL.md","pattern":"Environment file access","snippet":"- Check `.env` or `.env.local` for `PORT` or `VITE_PORT` or similar","category":"sensitive","line_end":162,"severity":"high","line_start":162},{"id":"sensitive:SKILL.md:162:environment-variant-files","file":"SKILL.md","pattern":"Environment variant files","snippet":"- Check `.env` or `.env.local` for `PORT` or `VITE_PORT` or similar","category":"sensitive","line_end":162,"severity":"high","line_start":162},{"id":"blocker:SKILL.md:4:screen-capture-upload","file":"SKILL.md","pattern":"Screen capture upload","snippet":"description: Scope coverage, build a testing strategy, test the feature with agent-browser, capture ","category":"blocker","line_end":4,"severity":"high","line_start":4},{"id":"blocker:SKILL.md:9:screen-capture-upload","file":"SKILL.md","pattern":"Screen capture upload","snippet":"Analyze the current branch's changes, scope the coverage level with the user, build an explicit test","category":"blocker","line_end":9,"severity":"high","line_start":9},{"id":"blocker:SKILL.md:45:screen-capture-upload","file":"SKILL.md","pattern":"Screen capture upload","snippet":"All captures (screenshots, videos) MUST be written to `/tmp/alan-captures/`.","category":"blocker","line_end":45,"severity":"high","line_start":45},{"id":"blocker:SKILL.md:55:screen-capture-upload","file":"SKILL.md","pattern":"Screen capture upload","snippet":"> - If you are tempted to create a `reports/` or `screenshots/` folder anywhere other than `/tmp/`, ","category":"blocker","line_end":55,"severity":"high","line_start":55},{"id":"blocker:SKILL.md:246:screen-capture-upload","file":"SKILL.md","pattern":"Screen capture upload","snippet":"agent-browser --session test-feature screenshot /tmp/alan-captures/step-00-initial-state.png","category":"blocker","line_end":246,"severity":"high","line_start":246},{"id":"blocker:SKILL.md:259:screen-capture-upload","file":"SKILL.md","pattern":"Screen capture upload","snippet":"agent-browser --session test-feature screenshot /tmp/alan-captures/step-NN-description.png","category":"blocker","line_end":259,"severity":"high","line_start":259},{"id":"blocker:SKILL.md:302:screen-capture-upload","file":"SKILL.md","pattern":"Screen capture upload","snippet":"agent-browser --session test-feature screenshot /tmp/alan-captures/final-state.png","category":"blocker","line_end":302,"severity":"high","line_start":302},{"id":"blocker:SKILL.md:404:screen-capture-upload","file":"SKILL.md","pattern":"Screen capture upload","snippet":"\"screenshotUrl\": \"<s3Key from Phase 3 — e.g. sandbox-captures/org/task/step-01.png — omit if upload ","category":"blocker","line_end":404,"severity":"high","line_start":404},{"id":"blocker:SKILL.md:413:screen-capture-upload","file":"SKILL.md","pattern":"Screen capture upload","snippet":"\"screenshotUrl\": \"<s3Key from Phase 3 showing the issue — omit if upload failed>\"","category":"blocker","line_end":413,"severity":"high","line_start":413},{"id":"blocker:SKILL.md:426:screen-capture-upload","file":"SKILL.md","pattern":"Screen capture upload","snippet":"- **screenshotUrls**: flat list of ALL screenshot s3Keys from Phase 3 (for gallery display). Use the","category":"blocker","line_end":426,"severity":"high","line_start":426},{"id":"blocker:SKILL.md:86:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"- \"Are there any specific non-happy paths you're concerned about (e.g. invalid input, network errors","category":"blocker","line_end":86,"severity":"low","line_start":86},{"id":"blocker:SKILL.md:199:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"- Invalid / missing required inputs","category":"blocker","line_end":199,"severity":"low","line_start":199},{"id":"blocker:SKILL.md:204:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"- Rapid repeated actions (double-click, spam submit)","category":"blocker","line_end":204,"severity":"low","line_start":204},{"id":"blocker:SKILL.md:279:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"- [ ] Invalid input values — correct rejection, no crash","category":"blocker","line_end":279,"severity":"low","line_start":279},{"id":"blocker:SKILL.md:284:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"- [ ] Rapid repeated actions (double-click submit, spam button)","category":"blocker","line_end":284,"severity":"low","line_start":284},{"id":"blocker:SKILL.md:202:network-reconnaissance","file":"SKILL.md","pattern":"Network reconnaissance","snippet":"- Permission denied / unauthorized access","category":"blocker","line_end":203,"severity":"low","line_start":202},{"id":"blocker:SKILL.md:253:network-reconnaissance","file":"SKILL.md","pattern":"Network reconnaissance","snippet":"- Mark the corresponding todo as in-progress","category":"blocker","line_end":254,"severity":"low","line_start":253}],"finding_verdicts":[{"id":"external_commands:SKILL.md:9:ruby-shell-backtick-execution","reason":"The instruction starts project processes and mandates uploading browser captures to S3. These are consequential external actions that can execute repository code and disclose application data.","verdict":"confirmed","severity":"high","confidence":0.97},{"id":"external_commands:SKILL.md:19:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:21:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:23:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:27:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:31:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","reason":"The fenced command installs an unpinned npm package globally and runs its installer. A compromised or changed package could execute arbitrary code with the agent's permissions.","verdict":"confirmed","severity":"high","confidence":0.98},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:41:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:47:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:53:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:54:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:109:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:112:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:123:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:124:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:125:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:126:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:127:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:130:ruby-shell-backtick-execution","reason":"The command block starts repository-defined npm, Python, Ruby, or Docker services. Those startup paths can execute untrusted project code and alter the local environment.","verdict":"confirmed","severity":"high","confidence":0.93},{"id":"external_commands:SKILL.md:144:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:149:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:155:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:162:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:163:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:210:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:220:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:222:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:226:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:229:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:235:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:237:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:245:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:247:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:254:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:255:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:256:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:258:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:260:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:261:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:264:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:267:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:300:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:304:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:306:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:310:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:312:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:320:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:328:ruby-shell-backtick-execution","reason":"This instruction explicitly sends every captured file to S3 through a presigned URL. Captures can contain credentials, personal data, or unreleased application details.","verdict":"confirmed","severity":"high","confidence":0.99},{"id":"external_commands:SKILL.md:333:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:335:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:338:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:346:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:347:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:350:ruby-shell-backtick-execution","reason":"The fenced curl command performs the external PUT that uploads a local screenshot. This is a direct data-transfer action with no content review or approval gate.","verdict":"confirmed","severity":"high","confidence":0.99},{"id":"external_commands:SKILL.md:354:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:356:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:359:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:360:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:362:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:368:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:378:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:382:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:419:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown code-fence delimiters, not Ruby or shell backtick execution. This finding does not establish an injection path.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:426:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:431:ruby-shell-backtick-execution","reason":"The backticks format a command name, filename, identifier, MIME type, or example in Markdown. They do not perform Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:151:shell-command-substitution","reason":"The substitution expands the fixed sequence 1 through 30 for a bounded localhost readiness loop. It contains no user-controlled command or argument.","verdict":"false_positive","confidence":0.94},{"id":"external_commands:SKILL.md:334:shell-command-substitution","reason":"The substitution reads metadata for one fixed capture path with Linux and macOS fallbacks. No untrusted value is evaluated as a command.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:149:template-literal-with-command-substitution","reason":"The detected token is the opening of a Markdown bash fence. It is not a programming-language template literal and does not execute interpolation.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:333:template-literal-with-command-substitution","reason":"The detected token is the opening of a Markdown bash fence. It is not a programming-language template literal and does not execute interpolation.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:152:hardcoded-url","reason":"The URL targets localhost with a port placeholder for the application under test. It does not contact an external host or expose data.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:163:hardcoded-url","reason":"The URL targets localhost with a port placeholder for the application under test. It does not contact an external host or expose data.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:221:hardcoded-url","reason":"This is a public documentation link for agent-browser. The line does not transmit local data or instruct an authenticated request.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:227:hardcoded-url","reason":"The URL targets localhost with a port placeholder for the application under test. It does not contact an external host or expose data.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:347:hardcoded-url","reason":"The URL is an ellipsis placeholder in an example response, not a hardcoded destination. No host is present to contact.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:30:standard-device-file-access","reason":"The command only redirects routine status or error output to /dev/null. It does not read a device, persist data, or access sensitive files.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:110:standard-device-file-access","reason":"The command only redirects routine status or error output to /dev/null. It does not read a device, persist data, or access sensitive files.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:111:standard-device-file-access","reason":"The command only redirects routine status or error output to /dev/null. It does not read a device, persist data, or access sensitive files.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:152:standard-device-file-access","reason":"The command only redirects routine status or error output to /dev/null. It does not read a device, persist data, or access sensitive files.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:163:standard-device-file-access","reason":"The command only redirects routine status or error output to /dev/null. It does not read a device, persist data, or access sensitive files.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:314:standard-device-file-access","reason":"The command only redirects routine status or error output to /dev/null. It does not read a device, persist data, or access sensitive files.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:315:standard-device-file-access","reason":"The command only redirects routine status or error output to /dev/null. It does not read a device, persist data, or access sensitive files.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:334:standard-device-file-access","reason":"The command only redirects routine status or error output to /dev/null. It does not read a device, persist data, or access sensitive files.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:45:temp-directory-access","reason":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems.","verdict":"confirmed","severity":"medium","confidence":0.84},{"id":"filesystem:SKILL.md:48:temp-directory-access","reason":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems.","verdict":"confirmed","severity":"medium","confidence":0.84},{"id":"filesystem:SKILL.md:52:temp-directory-access","reason":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems.","verdict":"confirmed","severity":"medium","confidence":0.84},{"id":"filesystem:SKILL.md:55:temp-directory-access","reason":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems.","verdict":"confirmed","severity":"medium","confidence":0.84},{"id":"filesystem:SKILL.md:236:temp-directory-access","reason":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems.","verdict":"confirmed","severity":"medium","confidence":0.84},{"id":"filesystem:SKILL.md:246:temp-directory-access","reason":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems.","verdict":"confirmed","severity":"medium","confidence":0.84},{"id":"filesystem:SKILL.md:259:temp-directory-access","reason":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems.","verdict":"confirmed","severity":"medium","confidence":0.84},{"id":"filesystem:SKILL.md:302:temp-directory-access","reason":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems.","verdict":"confirmed","severity":"medium","confidence":0.84},{"id":"filesystem:SKILL.md:313:temp-directory-access","reason":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems.","verdict":"confirmed","severity":"medium","confidence":0.84},{"id":"filesystem:SKILL.md:334:temp-directory-access","reason":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems.","verdict":"confirmed","severity":"medium","confidence":0.84},{"id":"filesystem:SKILL.md:353:temp-directory-access","reason":"The skill mandates predictable names under a shared /tmp directory without restrictive permissions or symlink checks. Captures may be exposed or redirected on multi-user systems.","verdict":"confirmed","severity":"medium","confidence":0.84},{"id":"sensitive:SKILL.md:126:environment-file-access","reason":"The discovery step includes checking .env while determining how to run the project. It may expose unrelated credentials even though the exact read method is not specified.","verdict":"confirmed","severity":"high","confidence":0.66},{"id":"sensitive:SKILL.md:162:environment-file-access","reason":"The skill explicitly directs the agent to inspect .env and .env.local. These files commonly contain credentials beyond the requested port value.","verdict":"confirmed","severity":"high","confidence":0.96},{"id":"sensitive:SKILL.md:162:environment-variant-files","reason":"The skill explicitly directs the agent to inspect .env and .env.local. These files commonly contain credentials beyond the requested port value.","verdict":"confirmed","severity":"high","confidence":0.96},{"id":"blocker:SKILL.md:4:screen-capture-upload","reason":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate.","verdict":"confirmed","severity":"high","confidence":0.98},{"id":"blocker:SKILL.md:9:screen-capture-upload","reason":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate.","verdict":"confirmed","severity":"high","confidence":0.98},{"id":"blocker:SKILL.md:45:screen-capture-upload","reason":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state.","verdict":"confirmed","severity":"high","confidence":0.9},{"id":"blocker:SKILL.md:55:screen-capture-upload","reason":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state.","verdict":"confirmed","severity":"high","confidence":0.9},{"id":"blocker:SKILL.md:246:screen-capture-upload","reason":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state.","verdict":"confirmed","severity":"high","confidence":0.9},{"id":"blocker:SKILL.md:259:screen-capture-upload","reason":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state.","verdict":"confirmed","severity":"high","confidence":0.9},{"id":"blocker:SKILL.md:302:screen-capture-upload","reason":"This mandatory capture is part of the workflow that uploads every screenshot and video to S3. The image may contain credentials, personal data, or private application state.","verdict":"confirmed","severity":"high","confidence":0.9},{"id":"blocker:SKILL.md:404:screen-capture-upload","reason":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate.","verdict":"confirmed","severity":"high","confidence":0.98},{"id":"blocker:SKILL.md:413:screen-capture-upload","reason":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate.","verdict":"confirmed","severity":"high","confidence":0.98},{"id":"blocker:SKILL.md:426:screen-capture-upload","reason":"The workflow requires captured application screens to be uploaded and referenced from a persistent report. Sensitive UI data can leave the local environment without a review gate.","verdict":"confirmed","severity":"high","confidence":0.98},{"id":"blocker:SKILL.md:86:system-reconnaissance","reason":"The line describes application test cases such as invalid input or repeated submission. It does not enumerate host software, hardware, users, or system configuration.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:199:system-reconnaissance","reason":"The line describes application test cases such as invalid input or repeated submission. It does not enumerate host software, hardware, users, or system configuration.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:204:system-reconnaissance","reason":"The line describes application test cases such as invalid input or repeated submission. It does not enumerate host software, hardware, users, or system configuration.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:279:system-reconnaissance","reason":"The line describes application test cases such as invalid input or repeated submission. It does not enumerate host software, hardware, users, or system configuration.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:284:system-reconnaissance","reason":"The line describes application test cases such as invalid input or repeated submission. It does not enumerate host software, hardware, users, or system configuration.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:202:network-reconnaissance","reason":"The line describes an application authorization test or todo status. It does not scan hosts, ports, services, or network topology.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:253:network-reconnaissance","reason":"The line describes an application authorization test or todo status. It does not scan hosts, ports, services, or network topology.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[],"subject_marketplace_commit_sha":"bdb71a4bc34515f37772ae85fd5501f9c2ff33b0","subject_content_hash":"a8ce601a33ab9116f6f9c850a848348691a47520fc861ee13e42bb6c971cf5eb","subject_tree_hash":"39483f20f806023bc7b3e35aee74f4858ca295272e65c42797c063e4349a8c1e","subject_plugin_path":"skills/supatest-ai/alan-test-feature","audit_payload_hash":"58d698b4f3ec270ec74c32b80d9d0a62","confirmed_risk_level":"high","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"bdb71a4bc34515f37772ae85fd5501f9c2ff33b0","contentHash":"a8ce601a33ab9116f6f9c850a848348691a47520fc861ee13e42bb6c971cf5eb","treeHash":"39483f20f806023bc7b3e35aee74f4858ca295272e65c42797c063e4349a8c1e","pluginPath":"skills/supatest-ai/alan-test-feature","auditPayloadHash":"58d698b4f3ec270ec74c32b80d9d0a62"},"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/supatest-ai-alan-test-feature/audits/1/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"high","confirmedFindingCount":13,"capabilityReviewCount":16,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"confirmation_required","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}