{"data":{"skill":{"slug":"screenci-screenci","name":"screenci","icon":"📦","repo":"https://github.com/screenci/screenci/tree/main/skills/screenci/","status":"approved","author":"screenci","authorVersion":null,"skillstoreRevision":null},"audit":{"id":"17432e13-0110-46c8-bcd7-b1b68b3a568b","skill_id":"a8f26506-8663-46d2-97c3-3acedf95c2d0","version":1,"content_hash":"4ce75b01bd247f6271a04959c8505891","risk_level":"high","is_blocked":false,"safe_to_publish":false,"analysis_status":"ok","agent_auto_install_policy":"confirmation_required","manual_install_policy":"allowed","summary":"The review confirmed real risk around automated ScreenCI recording, cloud upload, and handling of SCREENCI_SECRET in local environment files. Most Ruby shell backtick findings are Markdown inline-code false positives, but the documented npm and npx commands are real external command execution. No prompt injection attempt was found in the reviewed files.","remediation":[{"issue":"Automatic screen recording upload can expose sensitive browser content.","severity":"high","suggestion":"Require explicit user confirmation before recording, warn that successful recordings upload to ScreenCI, and recommend reviewing pages for private data."},{"issue":"SCREENCI_SECRET is passed to setup commands and written to screenci/.env.","severity":"high","suggestion":"Prefer secure secret entry, document gitignore expectations, and warn users not to place secrets in shell history or process arguments."},{"issue":"Anonymous trial recordings upload without an account connection.","severity":"high","suggestion":"Explain the upload destination, access link behavior, and claiming process before running the final record command."},{"issue":"The workflow runs npm and npx commands from package tooling.","severity":"medium","suggestion":"Ask for approval before external package execution and pin versions where the project can support it."}],"risk_factor_evidence":[{"factor":"filesystem","evidence":[{"file":"references/init.md","line_end":34,"line_start":34},{"file":"references/record.md","line_end":26,"line_start":26},{"file":"references/record.md","line_end":29,"line_start":29},{"file":"SKILL.md","line_end":119,"line_start":119},{"file":"SKILL.md","line_end":121,"line_start":121},{"file":"SKILL.md","line_end":122,"line_start":122}]},{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":3,"line_start":3},{"file":"SKILL.md","line_end":12,"line_start":12},{"file":"SKILL.md","line_end":16,"line_start":16},{"file":"SKILL.md","line_end":22,"line_start":22},{"file":"SKILL.md","line_end":33,"line_start":24},{"file":"SKILL.md","line_end":35,"line_start":33},{"file":"SKILL.md","line_end":35,"line_start":35},{"file":"SKILL.md","line_end":41,"line_start":39},{"file":"SKILL.md","line_end":42,"line_start":41},{"file":"SKILL.md","line_end":43,"line_start":42},{"file":"SKILL.md","line_end":44,"line_start":43},{"file":"SKILL.md","line_end":44,"line_start":44},{"file":"SKILL.md","line_end":47,"line_start":45},{"file":"SKILL.md","line_end":72,"line_start":47},{"file":"SKILL.md","line_end":76,"line_start":72},{"file":"SKILL.md","line_end":76,"line_start":76},{"file":"SKILL.md","line_end":78,"line_start":78},{"file":"SKILL.md","line_end":79,"line_start":79},{"file":"SKILL.md","line_end":89,"line_start":88},{"file":"SKILL.md","line_end":90,"line_start":89},{"file":"SKILL.md","line_end":91,"line_start":90},{"file":"SKILL.md","line_end":91,"line_start":91},{"file":"SKILL.md","line_end":92,"line_start":92},{"file":"SKILL.md","line_end":96,"line_start":96},{"file":"SKILL.md","line_end":113,"line_start":98},{"file":"SKILL.md","line_end":117,"line_start":113},{"file":"SKILL.md","line_end":117,"line_start":117},{"file":"SKILL.md","line_end":119,"line_start":119},{"file":"SKILL.md","line_end":121,"line_start":121},{"file":"SKILL.md","line_end":122,"line_start":122},{"file":"SKILL.md","line_end":128,"line_start":128},{"file":"SKILL.md","line_end":130,"line_start":129},{"file":"SKILL.md","line_end":130,"line_start":130},{"file":"SKILL.md","line_end":131,"line_start":131},{"file":"SKILL.md","line_end":132,"line_start":132},{"file":"SKILL.md","line_end":134,"line_start":134}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":132,"line_start":132}]}],"critical_findings":[],"high_findings":[{"title":"Environment file access","locations":[{"file":"references/init.md","line_end":34,"line_start":34}],"confidence":0.9,"description":"- If the user already has a `SCREENCI_SECRET` from an existing account, pass it as init's first posi","review_kind":"security","source_category":"sensitive","source_severity":"high","confidence_reasoning":"The referenced text handles SCREENCI_SECRET and stores or copies it into screenci/.env. Account organization secrets are sensitive credentials, so this is a real security concern even when user-authorized."},{"title":"Screen capture upload","locations":[{"file":"references/init.md","line_end":47,"line_start":47}],"confidence":0.94,"description":"npx screenci record # capture the final recording and upload","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The command is documented as capturing the final recording and uploading it. Screen recordings can contain private browser content, so automatic upload to an external service is a real high-risk behavior."},{"title":"Environment file access","locations":[{"file":"references/record.md","line_end":26,"line_start":26}],"confidence":0.9,"description":"To upload straight to an existing organization instead, get `SCREENCI_SECRET` into `screenci/.env` b","review_kind":"security","source_category":"sensitive","source_severity":"high","confidence_reasoning":"The referenced text handles SCREENCI_SECRET and stores or copies it into screenci/.env. Account organization secrets are sensitive credentials, so this is a real security concern even when user-authorized."},{"title":"Environment file access","locations":[{"file":"references/record.md","line_end":29,"line_start":29}],"confidence":0.9,"description":"- Or ask the user to copy `SCREENCI_SECRET` from their secrets page into `screenci/.env`. The org se","review_kind":"security","source_category":"sensitive","source_severity":"high","confidence_reasoning":"The referenced text handles SCREENCI_SECRET and stores or copies it into screenci/.env. Account organization secrets are sensitive credentials, so this is a real security concern even when user-authorized."},{"title":"Screen capture upload","locations":[{"file":"references/record.md","line_end":3,"line_start":3}],"confidence":0.86,"description":"Use `screenci record` to capture ScreenCI videos from `.screenci.ts` scripts.","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"This file defines the record command as capturing ScreenCI videos, and nearby runtime behavior states successful recordings upload. The finding reflects a real screen-capture workflow with external upload risk."},{"title":"Screen capture upload","locations":[{"file":"references/record.md","line_end":55,"line_start":55}],"confidence":0.91,"description":"npx screenci record # capture the final recording","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The workflow instructs running npx screenci record to capture the final recording. The same reference states record uploads successful recordings, so this is a real privacy and data exposure risk."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":33,"line_start":24}],"confidence":0.91,"description":"```bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The fenced command block instructs running npx screenci test and npx screenci record. These are real external CLI executions, and record can upload captured browser content."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":121,"line_start":121}],"confidence":0.89,"description":"1. **Pass it to init:** `npm init screenci@latest <SCREENCI_SECRET> -- --yes` writes it into `screen","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The cited command runs npm init screenci with SCREENCI_SECRET as an argument and writes it into screenci/.env. This is real package command execution and can expose the secret through command history or process arguments."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":130,"line_start":130}],"confidence":0.93,"description":"3. Run `npx screenci record` yourself once tests pass. Do not stop and ask the user to record. It up","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The workflow instructs the agent to run npx screenci record itself and states it uploads immediately. This combines external command execution with cloud upload of captured screen content."},{"title":"Environment file access","locations":[{"file":"SKILL.md","line_end":119,"line_start":119}],"confidence":0.9,"description":"To upload straight to an existing organization, get `SCREENCI_SECRET` into `screenci/.env` before th","review_kind":"security","source_category":"sensitive","source_severity":"high","confidence_reasoning":"The referenced text handles SCREENCI_SECRET and stores or copies it into screenci/.env. Account organization secrets are sensitive credentials, so this is a real security concern even when user-authorized."},{"title":"Environment file access","locations":[{"file":"SKILL.md","line_end":121,"line_start":121}],"confidence":0.9,"description":"1. **Pass it to init:** `npm init screenci@latest <SCREENCI_SECRET> -- --yes` writes it into `screen","review_kind":"security","source_category":"sensitive","source_severity":"high","confidence_reasoning":"The referenced text handles SCREENCI_SECRET and stores or copies it into screenci/.env. Account organization secrets are sensitive credentials, so this is a real security concern even when user-authorized."},{"title":"Environment file access","locations":[{"file":"SKILL.md","line_end":122,"line_start":122}],"confidence":0.9,"description":"2. **Secrets page:** ask the user to copy `SCREENCI_SECRET` from their secrets page into `screenci/.","review_kind":"security","source_category":"sensitive","source_severity":"high","confidence_reasoning":"The referenced text handles SCREENCI_SECRET and stores or copies it into screenci/.env. Account organization secrets are sensitive credentials, so this is a real security concern even when user-authorized."},{"title":"Autonomous Screen Recording Upload Without Confirmation","locations":[{"file":"SKILL.md","line_end":130,"line_start":130},{"file":"references/record.md","line_end":37,"line_start":33}],"confidence":0.93,"description":"The skill tells the agent to run npx screenci record itself and says the command uploads immediately with or without SCREENCI_SECRET. This can send captured browser content to ScreenCI before a user reviews the final recording.","review_kind":"security","source_category":"semantic","source_severity":"high","confidence_reasoning":"The reviewed files explicitly say record uploads every successful recording and instruct the agent not to ask the user to run it. That makes the privacy risk clear and intentional, not a scanner artifact."}],"medium_findings":[{"title":"Hidden file access","locations":[{"file":"references/init.md","line_end":34,"line_start":34}],"confidence":0.88,"description":"- If the user already has a `SCREENCI_SECRET` from an existing account, pass it as init's first posi","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill directs use of screenci/.env for SCREENCI_SECRET, which is a hidden environment file containing an organization secret. This is legitimate setup guidance but still creates a real local secret exposure risk."},{"title":"Hidden file access","locations":[{"file":"references/record.md","line_end":26,"line_start":26}],"confidence":0.88,"description":"To upload straight to an existing organization instead, get `SCREENCI_SECRET` into `screenci/.env` b","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill directs use of screenci/.env for SCREENCI_SECRET, which is a hidden environment file containing an organization secret. This is legitimate setup guidance but still creates a real local secret exposure risk."},{"title":"Hidden file access","locations":[{"file":"references/record.md","line_end":29,"line_start":29}],"confidence":0.88,"description":"- Or ask the user to copy `SCREENCI_SECRET` from their secrets page into `screenci/.env`. The org se","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill directs use of screenci/.env for SCREENCI_SECRET, which is a hidden environment file containing an organization secret. This is legitimate setup guidance but still creates a real local secret exposure risk."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":130,"line_start":129}],"confidence":0.86,"description":"2. Run `npx screenci test` until it passes. Fix selectors/flow/narration and rerun until green.","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The workflow explicitly instructs running npx screenci test until it passes. This is expected for the skill, but it is still real external command execution."},{"title":"Hidden file access","locations":[{"file":"SKILL.md","line_end":119,"line_start":119}],"confidence":0.88,"description":"To upload straight to an existing organization, get `SCREENCI_SECRET` into `screenci/.env` before th","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill directs use of screenci/.env for SCREENCI_SECRET, which is a hidden environment file containing an organization secret. This is legitimate setup guidance but still creates a real local secret exposure risk."},{"title":"Hidden file access","locations":[{"file":"SKILL.md","line_end":121,"line_start":121}],"confidence":0.88,"description":"1. **Pass it to init:** `npm init screenci@latest <SCREENCI_SECRET> -- --yes` writes it into `screen","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill directs use of screenci/.env for SCREENCI_SECRET, which is a hidden environment file containing an organization secret. This is legitimate setup guidance but still creates a real local secret exposure risk."},{"title":"Hidden file access","locations":[{"file":"SKILL.md","line_end":122,"line_start":122}],"confidence":0.88,"description":"2. **Secrets page:** ask the user to copy `SCREENCI_SECRET` from their secrets page into `screenci/.","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill directs use of screenci/.env for SCREENCI_SECRET, which is a hidden environment file containing an organization secret. This is legitimate setup guidance but still creates a real local secret exposure risk."}],"low_findings":[],"dangerous_patterns":[{"title":"Screen capture upload","locations":[{"file":"references/init.md","line_end":47,"line_start":47}],"confidence":0.94,"description":"npx screenci record # capture the final recording and upload","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The command is documented as capturing the final recording and uploading it. Screen recordings can contain private browser content, so automatic upload to an external service is a real high-risk behavior."},{"title":"Screen capture upload","locations":[{"file":"references/record.md","line_end":3,"line_start":3}],"confidence":0.86,"description":"Use `screenci record` to capture ScreenCI videos from `.screenci.ts` scripts.","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"This file defines the record command as capturing ScreenCI videos, and nearby runtime behavior states successful recordings upload. The finding reflects a real screen-capture workflow with external upload risk."},{"title":"Screen capture upload","locations":[{"file":"references/record.md","line_end":55,"line_start":55}],"confidence":0.91,"description":"npx screenci record # capture the final recording","review_kind":"security","source_category":"blocker","source_severity":"high","confidence_reasoning":"The workflow instructs running npx screenci record to capture the final recording. The same reference states record uploads successful recordings, so this is a real privacy and data exposure risk."}],"files_scanned":3,"total_lines":247,"audit_model":"codex","audited_at":"2026-07-05T11:04:50.812+00:00","created_at":"2026-07-05T13:56:14.179457+00:00","static_findings":[{"id":"filesystem:references/init.md:34:hidden-file-access","file":"references/init.md","pattern":"Hidden file access","snippet":"- If the user already has a `SCREENCI_SECRET` from an existing account, pass it as init's first posi","category":"filesystem","line_end":34,"severity":"medium","line_start":34},{"id":"sensitive:references/init.md:34:environment-file-access","file":"references/init.md","pattern":"Environment file access","snippet":"- If the user already has a `SCREENCI_SECRET` from an existing account, pass it as init's first posi","category":"sensitive","line_end":34,"severity":"high","line_start":34},{"id":"blocker:references/init.md:47:screen-capture-upload","file":"references/init.md","pattern":"Screen capture upload","snippet":"npx screenci record # capture the final recording and upload","category":"blocker","line_end":47,"severity":"high","line_start":47},{"id":"filesystem:references/record.md:26:hidden-file-access","file":"references/record.md","pattern":"Hidden file access","snippet":"To upload straight to an existing organization instead, get `SCREENCI_SECRET` into `screenci/.env` b","category":"filesystem","line_end":26,"severity":"medium","line_start":26},{"id":"filesystem:references/record.md:29:hidden-file-access","file":"references/record.md","pattern":"Hidden file access","snippet":"- Or ask the user to copy `SCREENCI_SECRET` from their secrets page into `screenci/.env`. The org se","category":"filesystem","line_end":29,"severity":"medium","line_start":29},{"id":"sensitive:references/record.md:26:environment-file-access","file":"references/record.md","pattern":"Environment file access","snippet":"To upload straight to an existing organization instead, get `SCREENCI_SECRET` into `screenci/.env` b","category":"sensitive","line_end":26,"severity":"high","line_start":26},{"id":"sensitive:references/record.md:29:environment-file-access","file":"references/record.md","pattern":"Environment file access","snippet":"- Or ask the user to copy `SCREENCI_SECRET` from their secrets page into `screenci/.env`. The org se","category":"sensitive","line_end":29,"severity":"high","line_start":29},{"id":"blocker:references/record.md:3:screen-capture-upload","file":"references/record.md","pattern":"Screen capture upload","snippet":"Use `screenci record` to capture ScreenCI videos from `.screenci.ts` scripts.","category":"blocker","line_end":3,"severity":"high","line_start":3},{"id":"blocker:references/record.md:55:screen-capture-upload","file":"references/record.md","pattern":"Screen capture upload","snippet":"npx screenci record # capture the final recording","category":"blocker","line_end":55,"severity":"high","line_start":55},{"id":"external_commands:SKILL.md:3:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"description: Create, show, and guide with ScreenCI videos in an already-initialized project by editi","category":"external_commands","line_end":3,"severity":"medium","line_start":3},{"id":"external_commands:SKILL.md:12:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Use this skill when the task is about ScreenCI video recording in an existing project: creating a vi","category":"external_commands","line_end":12,"severity":"medium","line_start":12},{"id":"external_commands:SKILL.md:16:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- If the user gives a URL for video context, use the `playwright-cli` skill first to discover the re","category":"external_commands","line_end":16,"severity":"medium","line_start":16},{"id":"external_commands:SKILL.md:22:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The project is already initialized. Add or edit scripts in `recordings/`. If you are creating new vi","category":"external_commands","line_end":22,"severity":"medium","line_start":22},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":33,"severity":"medium","line_start":24},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":35,"severity":"medium","line_start":33},{"id":"external_commands:SKILL.md:35:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`test` forwards normal `playwright test` arguments and still injects the resolved `screenci.config.t","category":"external_commands","line_end":35,"severity":"medium","line_start":35},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"ScreenCI uses Playwright-style `.screenci.ts` files plus recording helpers:","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":"- `video()` declares one output video per test.","category":"external_commands","line_end":42,"severity":"medium","line_start":41},{"id":"external_commands:SKILL.md:42:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `hide()` cuts setup and loading sections from the final recording.","category":"external_commands","line_end":43,"severity":"medium","line_start":42},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `autoZoom()` follows navigation and click-driven flows with smooth camera motion. Use it for movem","category":"external_commands","line_end":44,"severity":"medium","line_start":43},{"id":"external_commands:SKILL.md:44:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `zoomTo()` / `resetZoom()` hold a fixed frame for forms and steady editing sections.","category":"external_commands","line_end":44,"severity":"medium","line_start":44},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `video.narration({ ... })` is mandatory (see below).","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":"```ts","category":"external_commands","line_end":72,"severity":"medium","line_start":47},{"id":"external_commands:SKILL.md:72:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":76,"severity":"medium","line_start":72},{"id":"external_commands:SKILL.md:76:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Declare `video.narration({ ... })` on every video and speak throughout the demo. Pass a flat `cue ","category":"external_commands","line_end":76,"severity":"medium","line_start":76},{"id":"external_commands:SKILL.md:78:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Trigger cues from the `narration` fixture: `await narration.key()` runs the full line before movin","category":"external_commands","line_end":78,"severity":"medium","line_start":78},{"id":"external_commands:SKILL.md:79:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Use inline speech tags when needed: `[pronounce: ...]`, `[short pause]`, `[medium pause]`, `[long ","category":"external_commands","line_end":79,"severity":"medium","line_start":79},{"id":"external_commands:SKILL.md:88:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Hide initial setup.** Wrap page load, auth, navigation to the start page, loading spinners, and ","category":"external_commands","line_end":89,"severity":"medium","line_start":88},{"id":"external_commands:SKILL.md:89:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Navigate visibly with clicks** after hidden setup, not `page.goto()`.","category":"external_commands","line_end":90,"severity":"medium","line_start":89},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Prefer mouse-driven selection after typing** into search boxes, comboboxes, autocomplete, or com","category":"external_commands","line_end":91,"severity":"medium","line_start":90},{"id":"external_commands:SKILL.md:91:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Prefer native Playwright APIs over `page.evaluate()`** when a locator method already covers the ","category":"external_commands","line_end":91,"severity":"medium","line_start":91},{"id":"external_commands:SKILL.md:92:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Prefer default action options.** For `autoZoom()` and locator actions (`click`, `fill`, `pressSe","category":"external_commands","line_end":92,"severity":"medium","line_start":92},{"id":"external_commands:SKILL.md:96:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Prefer stable manual zoom for edit-heavy sections; use `autoZoom()` for movement between targets, an","category":"external_commands","line_end":96,"severity":"medium","line_start":96},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```ts","category":"external_commands","line_end":113,"severity":"medium","line_start":98},{"id":"external_commands:SKILL.md:113:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":117,"severity":"medium","line_start":113},{"id":"external_commands:SKILL.md:117:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`record` needs no account: without a `SCREENCI_SECRET` it uploads under a local, anonymous trial ses","category":"external_commands","line_end":117,"severity":"medium","line_start":117},{"id":"external_commands:SKILL.md:119:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"To upload straight to an existing organization, get `SCREENCI_SECRET` into `screenci/.env` before th","category":"external_commands","line_end":119,"severity":"medium","line_start":119},{"id":"external_commands:SKILL.md:121:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. **Pass it to init:** `npm init screenci@latest <SCREENCI_SECRET> -- --yes` writes it into `screen","category":"external_commands","line_end":121,"severity":"medium","line_start":121},{"id":"external_commands:SKILL.md:122:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. **Secrets page:** ask the user to copy `SCREENCI_SECRET` from their secrets page into `screenci/.","category":"external_commands","line_end":122,"severity":"medium","line_start":122},{"id":"external_commands:SKILL.md:128:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. Add or edit `.screenci.ts` files in `recordings/` (remove `example.screenci.ts` if creating new v","category":"external_commands","line_end":128,"severity":"medium","line_start":128},{"id":"external_commands:SKILL.md:129:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. Run `npx screenci test` until it passes. Fix selectors/flow/narration and rerun until green.","category":"external_commands","line_end":130,"severity":"medium","line_start":129},{"id":"external_commands:SKILL.md:130:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"3. Run `npx screenci record` yourself once tests pass. Do not stop and ask the user to record. It up","category":"external_commands","line_end":130,"severity":"medium","line_start":130},{"id":"external_commands:SKILL.md:131:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"4. ScreenCI writes `.screenci/<video-name>/recording.mp4` and `data.json` per video.","category":"external_commands","line_end":131,"severity":"medium","line_start":131},{"id":"external_commands:SKILL.md:132:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"5. Report the URL `record` printed (starts with the app's domain, e.g. `https://app.screenci.com/rec","category":"external_commands","line_end":132,"severity":"medium","line_start":132},{"id":"external_commands:SKILL.md:134:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`screenci init` (or `npm init screenci`) scaffolds a new project and fails on purpose if one already","category":"external_commands","line_end":134,"severity":"medium","line_start":134},{"id":"network:SKILL.md:132:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"5. Report the URL `record` printed (starts with the app's domain, e.g. `https://app.screenci.com/rec","category":"network","line_end":132,"severity":"low","line_start":132},{"id":"filesystem:SKILL.md:119:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"To upload straight to an existing organization, get `SCREENCI_SECRET` into `screenci/.env` before th","category":"filesystem","line_end":119,"severity":"medium","line_start":119},{"id":"filesystem:SKILL.md:121:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"1. **Pass it to init:** `npm init screenci@latest <SCREENCI_SECRET> -- --yes` writes it into `screen","category":"filesystem","line_end":121,"severity":"medium","line_start":121},{"id":"filesystem:SKILL.md:122:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"2. **Secrets page:** ask the user to copy `SCREENCI_SECRET` from their secrets page into `screenci/.","category":"filesystem","line_end":122,"severity":"medium","line_start":122},{"id":"sensitive:SKILL.md:119:environment-file-access","file":"SKILL.md","pattern":"Environment file access","snippet":"To upload straight to an existing organization, get `SCREENCI_SECRET` into `screenci/.env` before th","category":"sensitive","line_end":119,"severity":"high","line_start":119},{"id":"sensitive:SKILL.md:121:environment-file-access","file":"SKILL.md","pattern":"Environment file access","snippet":"1. **Pass it to init:** `npm init screenci@latest <SCREENCI_SECRET> -- --yes` writes it into `screen","category":"sensitive","line_end":121,"severity":"high","line_start":121},{"id":"sensitive:SKILL.md:122:environment-file-access","file":"SKILL.md","pattern":"Environment file access","snippet":"2. **Secrets page:** ask the user to copy `SCREENCI_SECRET` from their secrets page into `screenci/.","category":"sensitive","line_end":122,"severity":"high","line_start":122},{"id":"sensitive:SKILL.md:78:certificate-key-files","file":"SKILL.md","pattern":"Certificate/key files","snippet":"- Trigger cues from the `narration` fixture: `await narration.key()` runs the full line before movin","category":"sensitive","line_end":78,"severity":"high","line_start":78}],"finding_verdicts":[{"id":"filesystem:references/init.md:34:hidden-file-access","reason":"The skill directs use of screenci/.env for SCREENCI_SECRET, which is a hidden environment file containing an organization secret. This is legitimate setup guidance but still creates a real local secret exposure risk.","verdict":"confirmed","severity":"medium","confidence":0.88},{"id":"sensitive:references/init.md:34:environment-file-access","reason":"The referenced text handles SCREENCI_SECRET and stores or copies it into screenci/.env. Account organization secrets are sensitive credentials, so this is a real security concern even when user-authorized.","verdict":"confirmed","severity":"high","confidence":0.9},{"id":"blocker:references/init.md:47:screen-capture-upload","reason":"The command is documented as capturing the final recording and uploading it. Screen recordings can contain private browser content, so automatic upload to an external service is a real high-risk behavior.","verdict":"confirmed","severity":"high","confidence":0.94},{"id":"filesystem:references/record.md:26:hidden-file-access","reason":"The skill directs use of screenci/.env for SCREENCI_SECRET, which is a hidden environment file containing an organization secret. This is legitimate setup guidance but still creates a real local secret exposure risk.","verdict":"confirmed","severity":"medium","confidence":0.88},{"id":"filesystem:references/record.md:29:hidden-file-access","reason":"The skill directs use of screenci/.env for SCREENCI_SECRET, which is a hidden environment file containing an organization secret. This is legitimate setup guidance but still creates a real local secret exposure risk.","verdict":"confirmed","severity":"medium","confidence":0.88},{"id":"sensitive:references/record.md:26:environment-file-access","reason":"The referenced text handles SCREENCI_SECRET and stores or copies it into screenci/.env. Account organization secrets are sensitive credentials, so this is a real security concern even when user-authorized.","verdict":"confirmed","severity":"high","confidence":0.9},{"id":"sensitive:references/record.md:29:environment-file-access","reason":"The referenced text handles SCREENCI_SECRET and stores or copies it into screenci/.env. Account organization secrets are sensitive credentials, so this is a real security concern even when user-authorized.","verdict":"confirmed","severity":"high","confidence":0.9},{"id":"blocker:references/record.md:3:screen-capture-upload","reason":"This file defines the record command as capturing ScreenCI videos, and nearby runtime behavior states successful recordings upload. The finding reflects a real screen-capture workflow with external upload risk.","verdict":"confirmed","severity":"high","confidence":0.86},{"id":"blocker:references/record.md:55:screen-capture-upload","reason":"The workflow instructs running npx screenci record to capture the final recording. The same reference states record uploads successful recordings, so this is a real privacy and data exposure risk.","verdict":"confirmed","severity":"high","confidence":0.91},{"id":"external_commands:SKILL.md:3:ruby-shell-backtick-execution","reason":"The backticks are Markdown around .screenci.ts in the description, not Ruby backtick execution or a shell command.","verdict":"false_positive","confidence":0.94},{"id":"external_commands:SKILL.md:12:ruby-shell-backtick-execution","reason":"The line uses Markdown inline code for file names, not an executable shell construct.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:16:ruby-shell-backtick-execution","reason":"The line references another skill name in Markdown and gives routing guidance. It does not execute a command or interpolate user input into a shell.","verdict":"false_positive","confidence":0.85},{"id":"external_commands:SKILL.md:22:ruby-shell-backtick-execution","reason":"The backticks denote paths under recordings and an example filename. This is documentation text, not shell execution.","verdict":"false_positive","confidence":0.92},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","reason":"The fenced command block instructs running npx screenci test and npx screenci record. These are real external CLI executions, and record can upload captured browser content.","verdict":"confirmed","severity":"high","confidence":0.91},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","reason":"The cited range is the end of a Markdown code fence and explanatory CLI prose. The actual command execution risk is already captured on the command block finding.","verdict":"false_positive","confidence":0.77},{"id":"external_commands:SKILL.md:35:ruby-shell-backtick-execution","reason":"This line describes CLI argument forwarding using Markdown inline code. It does not itself run a command.","verdict":"false_positive","confidence":0.82},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","reason":"The backticks mark a TypeScript file extension in prose. There is no shell or Ruby execution syntax.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:41:ruby-shell-backtick-execution","reason":"video() is a ScreenCI helper referenced in Markdown. It is not a shell command or Ruby backtick execution.","verdict":"false_positive","confidence":0.91},{"id":"external_commands:SKILL.md:42:ruby-shell-backtick-execution","reason":"hide() is a recording helper documented in Markdown, not an executable shell command.","verdict":"false_positive","confidence":0.91},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","reason":"autoZoom() is a ScreenCI helper in prose. The backticks are formatting only.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:44:ruby-shell-backtick-execution","reason":"zoomTo() and resetZoom() are TypeScript helper names. This is not shell execution.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","reason":"video.narration() is a TypeScript API reference in Markdown. It is not Ruby or shell execution.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:SKILL.md:47:ruby-shell-backtick-execution","reason":"The block is a TypeScript ScreenCI example, not a shell or Ruby backtick expression. It uses fixed demonstration text and Playwright-style calls.","verdict":"false_positive","confidence":0.84},{"id":"external_commands:SKILL.md:72:ruby-shell-backtick-execution","reason":"The cited range closes a TypeScript example and begins narration prose. It does not run a shell command.","verdict":"false_positive","confidence":0.79},{"id":"external_commands:SKILL.md:76:ruby-shell-backtick-execution","reason":"The line documents narration object shapes with Markdown code formatting. It is not command execution.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:SKILL.md:78:ruby-shell-backtick-execution","reason":"The line describes a narration fixture API in Markdown. It does not execute a shell command.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:SKILL.md:79:ruby-shell-backtick-execution","reason":"The inline speech tags and example domain are narration text formatting. No shell command is executed.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:88:ruby-shell-backtick-execution","reason":"The line describes hiding setup steps in a recording script. It references helper usage but does not run shell code.","verdict":"false_positive","confidence":0.86},{"id":"external_commands:SKILL.md:89:ruby-shell-backtick-execution","reason":"page.goto() is a Playwright API name used in prose. It is not shell execution.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","reason":"press Enter is a browser interaction description, not a shell or Ruby backtick command.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:SKILL.md:91:ruby-shell-backtick-execution","reason":"page.evaluate() and locator.blur() are Playwright API references in Markdown. There is no shell execution path here.","verdict":"false_positive","confidence":0.87},{"id":"external_commands:SKILL.md:92:ruby-shell-backtick-execution","reason":"The line lists ScreenCI and locator action options in Markdown. It does not execute an external command.","verdict":"false_positive","confidence":0.86},{"id":"external_commands:SKILL.md:96:ruby-shell-backtick-execution","reason":"The backticks format helper names used by ScreenCI. This is prose guidance, not shell execution.","verdict":"false_positive","confidence":0.89},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","reason":"The block is a TypeScript example for zoom helpers and Playwright actions. It is not a Ruby backtick or shell command.","verdict":"false_positive","confidence":0.84},{"id":"external_commands:SKILL.md:113:ruby-shell-backtick-execution","reason":"The cited range transitions from a TypeScript example into account guidance. The upload risk is real, but this specific pattern is Markdown formatting, not shell execution.","verdict":"false_positive","confidence":0.75},{"id":"external_commands:SKILL.md:117:ruby-shell-backtick-execution","reason":"The inline word record is Markdown for the ScreenCI command name. Upload behavior is covered by separate findings, but this is not backtick shell execution.","verdict":"false_positive","confidence":0.78},{"id":"external_commands:SKILL.md:119:ruby-shell-backtick-execution","reason":"The backticks mark SCREENCI_SECRET and screenci/.env in prose. Secret handling is real, but this specific finding is not shell execution.","verdict":"false_positive","confidence":0.82},{"id":"external_commands:SKILL.md:121:ruby-shell-backtick-execution","reason":"The cited command runs npm init screenci with SCREENCI_SECRET as an argument and writes it into screenci/.env. This is real package command execution and can expose the secret through command history or process arguments.","verdict":"confirmed","severity":"high","confidence":0.89},{"id":"external_commands:SKILL.md:122:ruby-shell-backtick-execution","reason":"The line tells the user to copy SCREENCI_SECRET into screenci/.env. That is sensitive handling, but not external command execution.","verdict":"false_positive","confidence":0.83},{"id":"external_commands:SKILL.md:128:ruby-shell-backtick-execution","reason":"The line references file names and directories with Markdown code formatting. It does not run a command.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:129:ruby-shell-backtick-execution","reason":"The workflow explicitly instructs running npx screenci test until it passes. This is expected for the skill, but it is still real external command execution.","verdict":"confirmed","severity":"medium","confidence":0.86},{"id":"external_commands:SKILL.md:130:ruby-shell-backtick-execution","reason":"The workflow instructs the agent to run npx screenci record itself and states it uploads immediately. This combines external command execution with cloud upload of captured screen content.","verdict":"confirmed","severity":"high","confidence":0.93},{"id":"external_commands:SKILL.md:131:ruby-shell-backtick-execution","reason":"The line documents output paths under .screenci. It is file output documentation, not shell execution.","verdict":"false_positive","confidence":0.87},{"id":"external_commands:SKILL.md:132:ruby-shell-backtick-execution","reason":"The line describes reporting a URL printed by the record command. It does not itself execute a command.","verdict":"false_positive","confidence":0.8},{"id":"external_commands:SKILL.md:134:ruby-shell-backtick-execution","reason":"The line names screenci init and npm init screenci in Markdown while explaining existing-project behavior. It is not an executable command invocation in this context.","verdict":"false_positive","confidence":0.78},{"id":"network:SKILL.md:132:hardcoded-url","reason":"The URL is an example of the ScreenCI app link printed after recording, not a hardcoded outbound request in executable code. Upload behavior is covered by the screen-capture findings.","verdict":"false_positive","confidence":0.83},{"id":"filesystem:SKILL.md:119:hidden-file-access","reason":"The skill directs use of screenci/.env for SCREENCI_SECRET, which is a hidden environment file containing an organization secret. This is legitimate setup guidance but still creates a real local secret exposure risk.","verdict":"confirmed","severity":"medium","confidence":0.88},{"id":"filesystem:SKILL.md:121:hidden-file-access","reason":"The skill directs use of screenci/.env for SCREENCI_SECRET, which is a hidden environment file containing an organization secret. This is legitimate setup guidance but still creates a real local secret exposure risk.","verdict":"confirmed","severity":"medium","confidence":0.88},{"id":"filesystem:SKILL.md:122:hidden-file-access","reason":"The skill directs use of screenci/.env for SCREENCI_SECRET, which is a hidden environment file containing an organization secret. This is legitimate setup guidance but still creates a real local secret exposure risk.","verdict":"confirmed","severity":"medium","confidence":0.88},{"id":"sensitive:SKILL.md:119:environment-file-access","reason":"The referenced text handles SCREENCI_SECRET and stores or copies it into screenci/.env. Account organization secrets are sensitive credentials, so this is a real security concern even when user-authorized.","verdict":"confirmed","severity":"high","confidence":0.9},{"id":"sensitive:SKILL.md:121:environment-file-access","reason":"The referenced text handles SCREENCI_SECRET and stores or copies it into screenci/.env. Account organization secrets are sensitive credentials, so this is a real security concern even when user-authorized.","verdict":"confirmed","severity":"high","confidence":0.9},{"id":"sensitive:SKILL.md:122:environment-file-access","reason":"The referenced text handles SCREENCI_SECRET and stores or copies it into screenci/.env. Account organization secrets are sensitive credentials, so this is a real security concern even when user-authorized.","verdict":"confirmed","severity":"high","confidence":0.9},{"id":"sensitive:SKILL.md:78:certificate-key-files","reason":"The token narration.key is a ScreenCI fixture method name, not a certificate, private key, or key file path.","verdict":"false_positive","confidence":0.96}],"semantic_findings":[{"title":"Autonomous Screen Recording Upload Without Confirmation","severity":"high","locations":[{"file":"SKILL.md","line_end":130,"line_start":130},{"file":"references/record.md","line_end":37,"line_start":33}],"confidence":0.93,"description":"The skill tells the agent to run npx screenci record itself and says the command uploads immediately with or without SCREENCI_SECRET. This can send captured browser content to ScreenCI before a user reviews the final recording.","confidence_reasoning":"The reviewed files explicitly say record uploads every successful recording and instruct the agent not to ask the user to run it. That makes the privacy risk clear and intentional, not a scanner artifact."}],"subject_marketplace_commit_sha":null,"subject_content_hash":null,"subject_tree_hash":null,"subject_plugin_path":null,"audit_payload_hash":null,"confirmed_risk_level":null,"scanner_version":null,"policy_version":null,"subject":{"marketplaceCommitSha":null,"contentHash":null,"treeHash":null,"pluginPath":null,"auditPayloadHash":null},"scannerVersion":null,"policyVersion":null},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"not_attestable","url":null,"status":null,"reason":"confirmed_risk_level does not match the canonical trust resolver"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"high","confirmedFindingCount":10,"capabilityReviewCount":10,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"confirmation_required","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"not_attestable","verificationState":"not_verified"},"isLatest":false}}