{"data":{"skill":{"slug":"internet-court-altllm-portal-api-keys","name":"altllm-portal-api-keys","icon":"📦","repo":"https://github.com/internet-court/internet-court-skill/tree/main/vendored/altlayer/altllm-portal-api-keys","status":"approved","author":"internet-court","authorVersion":null,"skillstoreRevision":null},"audit":{"id":"cfbbc200-a21e-48fb-bdca-c2b74e5e1367","skill_id":"7dd0603e-9b53-4f38-9a94-8257dae06127","version":1,"content_hash":"46e1c3d6a28bbc5a67ee858d0158ab67","risk_level":"medium","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"Most backtick execution and system reconnaissance alerts are Markdown false positives. The hardcoded URLs are confirmed low-risk external network references, and the parent-directory setup references are confirmed high-risk unreviewed instruction dependencies. Additional review found operational risks around API key confirmation, secret output handling, and production cleanup limits.","remediation":[{"issue":"Parent-directory shared instruction files are referenced from SKILL.md.","severity":"high","suggestion":"Inline the required setup guidance or vendor the shared files inside the skill package so reviewers can audit all instructions."},{"issue":"API key create, update, disable, and revoke flows change credential state.","severity":"medium","suggestion":"Require explicit confirmation of the Portal account, target environment, action, and key ID before any state-changing command."},{"issue":"Create responses can include full API key secrets.","severity":"medium","suggestion":"Redact full key values in chat and logs, and tell users to store the one-time secret outside the conversation."},{"issue":"Single-key production routes are documented as broken.","severity":"medium","suggestion":"Mark get, update, and revoke as unavailable until fixed, and avoid creating temporary production keys without an approved cleanup path."},{"issue":"Reference commands use a hardcoded production API endpoint.","severity":"low","suggestion":"Confirm the base URL and environment with the user before running networked Portal API commands."}],"risk_factor_evidence":[{"factor":"network","evidence":[{"file":"references/cli-reference.md","line_end":9,"line_start":9},{"file":"references/cli-reference.md","line_end":18,"line_start":18},{"file":"references/cli-reference.md","line_end":28,"line_start":28},{"file":"references/cli-reference.md","line_end":51,"line_start":51},{"file":"references/cli-reference.md","line_end":65,"line_start":65},{"file":"references/cli-reference.md","line_end":76,"line_start":76}]},{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":9,"line_start":9},{"file":"SKILL.md","line_end":13,"line_start":13},{"file":"SKILL.md","line_end":14,"line_start":14},{"file":"SKILL.md","line_end":15,"line_start":15},{"file":"SKILL.md","line_end":21,"line_start":21},{"file":"SKILL.md","line_end":22,"line_start":22},{"file":"SKILL.md","line_end":23,"line_start":23},{"file":"SKILL.md","line_end":24,"line_start":24},{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":29,"line_start":29},{"file":"SKILL.md","line_end":32,"line_start":32},{"file":"SKILL.md","line_end":33,"line_start":33},{"file":"SKILL.md","line_end":34,"line_start":34},{"file":"SKILL.md","line_end":35,"line_start":35},{"file":"SKILL.md","line_end":41,"line_start":41},{"file":"SKILL.md","line_end":42,"line_start":42},{"file":"SKILL.md","line_end":43,"line_start":43},{"file":"SKILL.md","line_end":45,"line_start":45},{"file":"SKILL.md","line_end":46,"line_start":46},{"file":"SKILL.md","line_end":47,"line_start":47}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":14,"line_start":14},{"file":"SKILL.md","line_end":15,"line_start":15}]}],"critical_findings":[],"high_findings":[{"title":"Path traversal sequence","locations":[{"file":"SKILL.md","line_end":14,"line_start":14}],"confidence":0.84,"description":"> - `../_shared/preflight.md`","review_kind":"capability","source_category":"filesystem","source_severity":"high","confidence_reasoning":"The skill instructs agents to read ../_shared/preflight.md, which crosses out of the skill directory. This can pull unreviewed instructions into the trusted workflow."},{"title":"Path traversal sequence","locations":[{"file":"SKILL.md","line_end":15,"line_start":15}],"confidence":0.84,"description":"> - `../_shared/session-and-target.md`","review_kind":"capability","source_category":"filesystem","source_severity":"high","confidence_reasoning":"The skill instructs agents to read ../_shared/session-and-target.md, which crosses out of the skill directory. This can pull unreviewed instructions into the trusted workflow."}],"medium_findings":[{"title":"Credential Lifecycle Actions Lack Explicit Confirmation","locations":[{"file":"SKILL.md","line_end":25,"line_start":21},{"file":"SKILL.md","line_end":34,"line_start":33}],"confidence":0.86,"description":"The skill covers creating, updating, disabling, and permanently revoking Portal API keys. It warns that revoke is permanent, but it does not require explicit user confirmation before state-changing actions.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The command table and rules clearly describe state-changing credential operations. No reviewed line adds a confirmation gate before those operations."},{"title":"Full API Key Output Can Expose Secrets","locations":[{"file":"SKILL.md","line_end":29,"line_start":29},{"file":"references/cli-reference.md","line_end":44,"line_start":36}],"confidence":0.81,"description":"The reference output includes a full API key field, and the skill notes that the full key is returned only once. Agents could expose real secrets if they relay command output verbatim into chat or logs.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The reviewed files explicitly show and describe full key output. The sample value appears synthetic, but the workflow handles real one-time secrets."},{"title":"Production Backend Limitation Can Leave Keys Without Cleanup","locations":[{"file":"SKILL.md","line_end":47,"line_start":37},{"file":"references/cli-reference.md","line_end":59,"line_start":55}],"confidence":0.9,"description":"The skill says single-key routes for get, update, and revoke are broken in production. Creating temporary production keys while revoke is unavailable can leave credentials active without a tested cleanup path.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"Both files describe the broken production routes and explicitly warn against temporary production smoke keys without cleanup. The risk follows directly from the documented limitation."}],"low_findings":[{"title":"Hardcoded URL","locations":[{"file":"references/cli-reference.md","line_end":9,"line_start":9}],"confidence":0.86,"description":"--base-url https://platform-api.altllm.ai","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The reference command targets the production AltLLM Portal API at https://platform-api.altllm.ai. This is intended, but it causes external network requests for account and API key management."},{"title":"Hardcoded URL","locations":[{"file":"references/cli-reference.md","line_end":18,"line_start":18}],"confidence":0.86,"description":"--base-url https://platform-api.altllm.ai \\","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The reference command targets the production AltLLM Portal API at https://platform-api.altllm.ai. This is intended, but it causes external network requests for account and API key management."},{"title":"Hardcoded URL","locations":[{"file":"references/cli-reference.md","line_end":28,"line_start":28}],"confidence":0.86,"description":"--base-url https://platform-api.altllm.ai \\","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The reference command targets the production AltLLM Portal API at https://platform-api.altllm.ai. This is intended, but it causes external network requests for account and API key management."},{"title":"Hardcoded URL","locations":[{"file":"references/cli-reference.md","line_end":51,"line_start":51}],"confidence":0.86,"description":"--base-url https://platform-api.altllm.ai \\","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The reference command targets the production AltLLM Portal API at https://platform-api.altllm.ai. This is intended, but it causes external network requests for account and API key management."},{"title":"Hardcoded URL","locations":[{"file":"references/cli-reference.md","line_end":65,"line_start":65}],"confidence":0.86,"description":"--base-url https://platform-api.altllm.ai \\","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The reference command targets the production AltLLM Portal API at https://platform-api.altllm.ai. This is intended, but it causes external network requests for account and API key management."},{"title":"Hardcoded URL","locations":[{"file":"references/cli-reference.md","line_end":76,"line_start":76}],"confidence":0.86,"description":"--base-url https://platform-api.altllm.ai \\","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The reference command targets the production AltLLM Portal API at https://platform-api.altllm.ai. This is intended, but it causes external network requests for account and API key management."}],"dangerous_patterns":[],"files_scanned":2,"total_lines":138,"audit_model":"codex","audited_at":"2026-07-09T23:39:47.598+00:00","created_at":"2026-07-10T07:43:46.670169+00:00","static_findings":[{"id":"network:references/cli-reference.md:9:hardcoded-url","file":"references/cli-reference.md","pattern":"Hardcoded URL","snippet":"--base-url https://platform-api.altllm.ai","category":"network","line_end":9,"severity":"low","line_start":9},{"id":"network:references/cli-reference.md:18:hardcoded-url","file":"references/cli-reference.md","pattern":"Hardcoded URL","snippet":"--base-url https://platform-api.altllm.ai \\","category":"network","line_end":18,"severity":"low","line_start":18},{"id":"network:references/cli-reference.md:28:hardcoded-url","file":"references/cli-reference.md","pattern":"Hardcoded URL","snippet":"--base-url https://platform-api.altllm.ai \\","category":"network","line_end":28,"severity":"low","line_start":28},{"id":"network:references/cli-reference.md:51:hardcoded-url","file":"references/cli-reference.md","pattern":"Hardcoded URL","snippet":"--base-url https://platform-api.altllm.ai \\","category":"network","line_end":51,"severity":"low","line_start":51},{"id":"network:references/cli-reference.md:65:hardcoded-url","file":"references/cli-reference.md","pattern":"Hardcoded URL","snippet":"--base-url https://platform-api.altllm.ai \\","category":"network","line_end":65,"severity":"low","line_start":65},{"id":"network:references/cli-reference.md:76:hardcoded-url","file":"references/cli-reference.md","pattern":"Hardcoded URL","snippet":"--base-url https://platform-api.altllm.ai \\","category":"network","line_end":76,"severity":"low","line_start":76},{"id":"blocker:references/cli-reference.md:52:system-reconnaissance","file":"references/cli-reference.md","pattern":"System reconnaissance","snippet":"--key-id <id>","category":"blocker","line_end":52,"severity":"low","line_start":52},{"id":"blocker:references/cli-reference.md:57:system-reconnaissance","file":"references/cli-reference.md","pattern":"System reconnaissance","snippet":"- The current production Portal backend rejects valid key IDs on single-key routes.","category":"blocker","line_end":57,"severity":"low","line_start":57},{"id":"blocker:references/cli-reference.md:59:system-reconnaissance","file":"references/cli-reference.md","pattern":"System reconnaissance","snippet":"- Avoid creating temporary production smoke keys while `revoke-api-key` is unavailable unless an app","category":"blocker","line_end":59,"severity":"low","line_start":59},{"id":"blocker:references/cli-reference.md:66:system-reconnaissance","file":"references/cli-reference.md","pattern":"System reconnaissance","snippet":"--key-id <id> \\","category":"blocker","line_end":66,"severity":"low","line_start":66},{"id":"blocker:references/cli-reference.md:77:system-reconnaissance","file":"references/cli-reference.md","pattern":"System reconnaissance","snippet":"--key-id <id>","category":"blocker","line_end":77,"severity":"low","line_start":77},{"id":"external_commands:SKILL.md:9:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Portal API key lifecycle management for the local `altllm` CLI.","category":"external_commands","line_end":9,"severity":"medium","line_start":9},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> Before the first `altllm` command in a fresh checkout, read and follow:","category":"external_commands","line_end":13,"severity":"medium","line_start":13},{"id":"external_commands:SKILL.md:14:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> - `../_shared/preflight.md`","category":"external_commands","line_end":14,"severity":"medium","line_start":14},{"id":"external_commands:SKILL.md:15:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> - `../_shared/session-and-target.md`","category":"external_commands","line_end":15,"severity":"medium","line_start":15},{"id":"external_commands:SKILL.md:21:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `list-api-keys` | List active and disabled keys |","category":"external_commands","line_end":21,"severity":"medium","line_start":21},{"id":"external_commands:SKILL.md:22:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `create-api-key` | Create a new key, optionally with a model allowlist |","category":"external_commands","line_end":22,"severity":"medium","line_start":22},{"id":"external_commands:SKILL.md:23:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `get-api-key` | Inspect one key |","category":"external_commands","line_end":23,"severity":"medium","line_start":23},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `update-api-key` | Rename a key, change status, or replace the model allowlist |","category":"external_commands","line_end":24,"severity":"medium","line_start":24},{"id":"external_commands:SKILL.md:25:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `revoke-api-key` | Permanently revoke a key |","category":"external_commands","line_end":25,"severity":"medium","line_start":25},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `create-api-key` returns the full key only once.","category":"external_commands","line_end":29,"severity":"medium","line_start":29},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Flex users can allowlist normal AltLLM models and Flex-only `altllm-flex-*` models; backend access","category":"external_commands","line_end":32,"severity":"medium","line_start":32},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `update-api-key --status disabled` is reversible.","category":"external_commands","line_end":33,"severity":"medium","line_start":33},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `revoke-api-key` is permanent.","category":"external_commands","line_end":34,"severity":"medium","line_start":34},{"id":"external_commands:SKILL.md:35:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `keys` is an alias for `list-api-keys`.","category":"external_commands","line_end":35,"severity":"medium","line_start":35},{"id":"external_commands:SKILL.md:41:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `get-api-key`","category":"external_commands","line_end":41,"severity":"medium","line_start":41},{"id":"external_commands:SKILL.md:42:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `update-api-key`","category":"external_commands","line_end":42,"severity":"medium","line_start":42},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `revoke-api-key`","category":"external_commands","line_end":43,"severity":"medium","line_start":43},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `list-api-keys`","category":"external_commands","line_end":45,"severity":"medium","line_start":45},{"id":"external_commands:SKILL.md:46:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `create-api-key`","category":"external_commands","line_end":46,"severity":"medium","line_start":46},{"id":"external_commands:SKILL.md:47:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Do not create temporary production smoke keys unless `revoke-api-key` is healthy or an approved cl","category":"external_commands","line_end":47,"severity":"medium","line_start":47},{"id":"filesystem:SKILL.md:14:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"> - `../_shared/preflight.md`","category":"filesystem","line_end":14,"severity":"high","line_start":14},{"id":"filesystem:SKILL.md:15:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"> - `../_shared/session-and-target.md`","category":"filesystem","line_end":15,"severity":"high","line_start":15}],"finding_verdicts":[{"id":"network:references/cli-reference.md:9:hardcoded-url","reason":"The reference command targets the production AltLLM Portal API at https://platform-api.altllm.ai. This is intended, but it causes external network requests for account and API key management.","verdict":"confirmed","severity":"low","confidence":0.86},{"id":"network:references/cli-reference.md:18:hardcoded-url","reason":"The reference command targets the production AltLLM Portal API at https://platform-api.altllm.ai. This is intended, but it causes external network requests for account and API key management.","verdict":"confirmed","severity":"low","confidence":0.86},{"id":"network:references/cli-reference.md:28:hardcoded-url","reason":"The reference command targets the production AltLLM Portal API at https://platform-api.altllm.ai. This is intended, but it causes external network requests for account and API key management.","verdict":"confirmed","severity":"low","confidence":0.86},{"id":"network:references/cli-reference.md:51:hardcoded-url","reason":"The reference command targets the production AltLLM Portal API at https://platform-api.altllm.ai. This is intended, but it causes external network requests for account and API key management.","verdict":"confirmed","severity":"low","confidence":0.86},{"id":"network:references/cli-reference.md:65:hardcoded-url","reason":"The reference command targets the production AltLLM Portal API at https://platform-api.altllm.ai. This is intended, but it causes external network requests for account and API key management.","verdict":"confirmed","severity":"low","confidence":0.86},{"id":"network:references/cli-reference.md:76:hardcoded-url","reason":"The reference command targets the production AltLLM Portal API at https://platform-api.altllm.ai. This is intended, but it causes external network requests for account and API key management.","verdict":"confirmed","severity":"low","confidence":0.86},{"id":"blocker:references/cli-reference.md:52:system-reconnaissance","reason":"The text is a placeholder API key identifier for a CLI argument, not local host or system enumeration. No reconnaissance command or discovery workflow is shown.","verdict":"false_positive","confidence":0.93},{"id":"blocker:references/cli-reference.md:57:system-reconnaissance","reason":"This line documents a production backend limitation for API key routes. It does not instruct the agent to enumerate systems, services, or host details.","verdict":"false_positive","confidence":0.94},{"id":"blocker:references/cli-reference.md:59:system-reconnaissance","reason":"This is operational safety guidance against creating temporary production keys without cleanup. It is not reconnaissance or system discovery.","verdict":"false_positive","confidence":0.94},{"id":"blocker:references/cli-reference.md:66:system-reconnaissance","reason":"The text is a placeholder API key identifier for a CLI argument, not local host or system enumeration. No reconnaissance command or discovery workflow is shown.","verdict":"false_positive","confidence":0.93},{"id":"blocker:references/cli-reference.md:77:system-reconnaissance","reason":"The text is a placeholder API key identifier for a CLI argument, not local host or system enumeration. No reconnaissance command or discovery workflow is shown.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:9:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.92},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.92},{"id":"external_commands:SKILL.md:14:ruby-shell-backtick-execution","reason":"This is a Markdown file path reference, not shell execution. The separate filesystem finding covers the parent-directory reference risk.","verdict":"false_positive","confidence":0.89},{"id":"external_commands:SKILL.md:15:ruby-shell-backtick-execution","reason":"This is a Markdown file path reference, not shell execution. The separate filesystem finding covers the parent-directory reference risk.","verdict":"false_positive","confidence":0.89},{"id":"external_commands:SKILL.md:21:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:22:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:23:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:25:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:35:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:41:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:42:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:46:ruby-shell-backtick-execution","reason":"The flagged text is Markdown inline code or prose naming CLI commands, not executable Ruby or shell backtick execution. No command substitution or dynamic execution appears in SKILL.md.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:47:ruby-shell-backtick-execution","reason":"This line is Markdown safety guidance about when not to create production smoke keys. It is not executable shell or Ruby backtick code.","verdict":"false_positive","confidence":0.93},{"id":"filesystem:SKILL.md:14:path-traversal-sequence","reason":"The skill instructs agents to read ../_shared/preflight.md, which crosses out of the skill directory. This can pull unreviewed instructions into the trusted workflow.","verdict":"confirmed","severity":"high","confidence":0.84},{"id":"filesystem:SKILL.md:15:path-traversal-sequence","reason":"The skill instructs agents to read ../_shared/session-and-target.md, which crosses out of the skill directory. This can pull unreviewed instructions into the trusted workflow.","verdict":"confirmed","severity":"high","confidence":0.84}],"semantic_findings":[{"title":"Credential Lifecycle Actions Lack Explicit Confirmation","severity":"medium","locations":[{"file":"SKILL.md","line_end":25,"line_start":21},{"file":"SKILL.md","line_end":34,"line_start":33}],"confidence":0.86,"description":"The skill covers creating, updating, disabling, and permanently revoking Portal API keys. It warns that revoke is permanent, but it does not require explicit user confirmation before state-changing actions.","confidence_reasoning":"The command table and rules clearly describe state-changing credential operations. No reviewed line adds a confirmation gate before those operations."},{"title":"Full API Key Output Can Expose Secrets","severity":"medium","locations":[{"file":"SKILL.md","line_end":29,"line_start":29},{"file":"references/cli-reference.md","line_end":44,"line_start":36}],"confidence":0.81,"description":"The reference output includes a full API key field, and the skill notes that the full key is returned only once. Agents could expose real secrets if they relay command output verbatim into chat or logs.","confidence_reasoning":"The reviewed files explicitly show and describe full key output. The sample value appears synthetic, but the workflow handles real one-time secrets."},{"title":"Production Backend Limitation Can Leave Keys Without Cleanup","severity":"medium","locations":[{"file":"SKILL.md","line_end":47,"line_start":37},{"file":"references/cli-reference.md","line_end":59,"line_start":55}],"confidence":0.9,"description":"The skill says single-key routes for get, update, and revoke are broken in production. Creating temporary production keys while revoke is unavailable can leave credentials active without a tested cleanup path.","confidence_reasoning":"Both files describe the broken production routes and explicitly warn against temporary production smoke keys without cleanup. The risk follows directly from the documented limitation."}],"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":"medium","confirmedFindingCount":3,"capabilityReviewCount":8,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"not_attestable","verificationState":"not_verified"},"isLatest":false}}