{"data":{"skill":{"slug":"aaron-he-zhu-consent-registry","name":"consent-registry","icon":"📦","repo":"https://github.com/aaron-he-zhu/aaron-marketing-skills/tree/main/protocol/consent-registry","status":"approved","author":"aaron-he-zhu","authorVersion":"19.0.0","skillstoreRevision":2},"audit":{"id":"5152ca2e-1136-41d7-963c-c77facb51c57","skill_id":"8d20a115-b746-4678-b14e-ef7b9ab209bf","version":7,"content_hash":"v3:adcb3549b15782055d0beb6d29f113d20de08f92:c0052b642cc7fc5edd60f474e74a1e32292b09faddc3f6cca8d9cdf26d02c62c:c38d6f26963a2aa3e973c26ccbb9363d3f32418199203289219dfd2032f5c248:736b696c6c732f6161726f6e2d68652d7a68752f636f6e73656e742d7265676973747279:734207e6617e437b4dceb5b9b775518b","risk_level":"safe","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"Most detections are Markdown formatting, fixed documentation links, or fixed local path resolution. One documented shell invocation accepts a supplied subject ID without showing quoting or argument-array handling, which can create command-injection risk if copied into a shell. No prompt-injection or data-exfiltration intent was found.","remediation":[{"issue":"Unquoted subject ID in documented shell invocation","severity":"medium","suggestion":"Validate subject IDs against a strict allowlist and invoke the script through an argument array or quote the argument safely."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":26,"line_start":22},{"file":"SKILL.md","line_end":30,"line_start":26},{"file":"SKILL.md","line_end":30,"line_start":30},{"file":"SKILL.md","line_end":32,"line_start":32},{"file":"SKILL.md","line_end":50,"line_start":50},{"file":"SKILL.md","line_end":52,"line_start":51},{"file":"SKILL.md","line_end":52,"line_start":52},{"file":"SKILL.md","line_end":53,"line_start":53},{"file":"SKILL.md","line_end":54,"line_start":54},{"file":"SKILL.md","line_end":55,"line_start":55},{"file":"SKILL.md","line_end":57,"line_start":56},{"file":"SKILL.md","line_end":57,"line_start":57},{"file":"SKILL.md","line_end":65,"line_start":63},{"file":"SKILL.md","line_end":50,"line_start":50},{"file":"SKILL.md","line_end":50,"line_start":50}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":10,"line_start":10},{"file":"SKILL.md","line_end":13,"line_start":13}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":50,"line_start":50},{"file":"SKILL.md","line_end":69,"line_start":69},{"file":"SKILL.md","line_end":70,"line_start":70},{"file":"SKILL.md","line_end":71,"line_start":71},{"file":"SKILL.md","line_end":72,"line_start":72},{"file":"SKILL.md","line_end":76,"line_start":76},{"file":"SKILL.md","line_end":77,"line_start":77},{"file":"SKILL.md","line_end":78,"line_start":78},{"file":"SKILL.md","line_end":79,"line_start":79},{"file":"SKILL.md","line_end":50,"line_start":50}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":52,"line_start":51}],"confidence":0.76,"description":"2. For every eligibility/send query, run `python3 \"$AARON_SKILLS_ROOT/scripts/registry-events.py\" is","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The documented shell command inserts a supplied subject ID as an unquoted argument. An unsafe invocation could permit shell metacharacter injection unless the host uses argument arrays or validates the ID."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":1,"total_lines":80,"audit_model":"claude","audited_at":"2026-07-26T10:02:56.218+00:00","created_at":"2026-07-28T02:01:23.022522+00:00","static_findings":[{"id":"external_commands:SKILL.md:22:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```text","category":"external_commands","line_end":26,"severity":"medium","line_start":22},{"id":"external_commands:SKILL.md:26:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":30,"severity":"medium","line_start":26},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Unit:** one pseudonymous subject ID supplied by the user's system. **Reads:** `memory/events/conse","category":"external_commands","line_end":30,"severity":"medium","line_start":30},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Opt-in/upsert/restore approval requires a request-bound host-capability `consent-registry` principal","category":"external_commands","line_end":32,"severity":"medium","line_start":32},{"id":"external_commands:SKILL.md:50:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. Read [`registry-event-protocol.md`](../../references/registry-event-protocol.md) and [`runtime-in","category":"external_commands","line_end":50,"severity":"medium","line_start":50},{"id":"external_commands:SKILL.md:51:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. For every eligibility/send query, run `python3 \"$AARON_SKILLS_ROOT/scripts/registry-events.py\" is","category":"external_commands","line_end":52,"severity":"medium","line_start":51},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"3. New opt-in facts use request/root-bound host-capability `owner-append` with an `upsert`, source, ","category":"external_commands","line_end":52,"severity":"medium","line_start":52},{"id":"external_commands:SKILL.md:53:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"4. Unsubscribe, complaint, or hard bounce emits direct `suppress` immediately through ordinary `appe","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":"5. Restore is host-capability-only and requires `subscription_status: subscribed`, a non-empty strin","category":"external_commands","line_end":54,"severity":"medium","line_start":54},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"6. Erasure uses `safety-append consent` after the host verifies the data subject and issues a capabi","category":"external_commands","line_end":55,"severity":"medium","line_start":55},{"id":"external_commands:SKILL.md:56:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"7. Ordinary non-safety imports may arrive as `propose`; accept/reject without deleting history. Neve","category":"external_commands","line_end":57,"severity":"medium","line_start":56},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"8. Regenerate any per-subject human view from accepted projection, then `verify consent` and re-run ","category":"external_commands","line_end":57,"severity":"medium","line_start":57},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Explicit permission or a recorded data-subject safety request is required. Append only through the r","category":"external_commands","line_end":65,"severity":"medium","line_start":63},{"id":"external_commands:SKILL.md:50:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"1. Read [`registry-event-protocol.md`](../../references/registry-event-protocol.md) and [`runtime-in","category":"external_commands","line_end":50,"severity":"medium","line_start":50},{"id":"external_commands:SKILL.md:50:template-literal-with-command-substitution","file":"SKILL.md","pattern":"Template literal with command substitution","snippet":"1. Read [`registry-event-protocol.md`](../../references/registry-event-protocol.md) and [`runtime-in","category":"external_commands","line_end":50,"severity":"medium","line_start":50},{"id":"network:SKILL.md:10:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"homepage: \"https://github.com/aaron-he-zhu/aaron-marketing-skills\"","category":"network","line_end":10,"severity":"low","line_start":10},{"id":"network:SKILL.md:13:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"metadata: {\"author\": \"aaron-he-zhu\", \"version\": \"19.0.0\", \"discipline\": \"protocol\", \"phase\": \"protoc","category":"network","line_end":13,"severity":"low","line_start":13},{"id":"filesystem:SKILL.md:50:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"1. Read [`registry-event-protocol.md`](../../references/registry-event-protocol.md) and [`runtime-in","category":"filesystem","line_end":50,"severity":"high","line_start":50},{"id":"filesystem:SKILL.md:69:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- [Registry event protocol](../../references/registry-event-protocol.md)","category":"filesystem","line_end":69,"severity":"high","line_start":69},{"id":"filesystem:SKILL.md:70:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- [SEND benchmark](../../references/send-benchmark.md)","category":"filesystem","line_end":70,"severity":"high","line_start":70},{"id":"filesystem:SKILL.md:71:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- [Privacy policy](../../PRIVACY.md)","category":"filesystem","line_end":71,"severity":"high","line_start":71},{"id":"filesystem:SKILL.md:72:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- [Security](../../SECURITY.md)","category":"filesystem","line_end":72,"severity":"high","line_start":72},{"id":"filesystem:SKILL.md:76:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- **Apply exclusions:** [list-segment-builder](../../email/setup/list-segment-builder/SKILL.md)","category":"filesystem","line_end":76,"severity":"high","line_start":76},{"id":"filesystem:SKILL.md:77:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- **Audit SEND:** [email-quality-auditor](../../email/deliver/email-quality-auditor/SKILL.md)","category":"filesystem","line_end":77,"severity":"high","line_start":77},{"id":"filesystem:SKILL.md:78:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- **Deliverability incident:** [deliverability-qa](../../email/setup/deliverability-qa/SKILL.md)","category":"filesystem","line_end":78,"severity":"high","line_start":78},{"id":"filesystem:SKILL.md:79:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- **Erase/archive:** [memory-management](../memory-management/SKILL.md)","category":"filesystem","line_end":79,"severity":"high","line_start":79},{"id":"filesystem:SKILL.md:50:standard-device-file-access","file":"SKILL.md","pattern":"Standard device file access","snippet":"1. Read [`registry-event-protocol.md`](../../references/registry-event-protocol.md) and [`runtime-in","category":"filesystem","line_end":50,"severity":"low","line_start":50},{"id":"blocker:SKILL.md:12:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"argument-hint: \"<pseudonymous subject-id and consent/suppression event>\"","category":"blocker","line_end":12,"severity":"low","line_start":12}],"finding_verdicts":[{"id":"external_commands:SKILL.md:22:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for consent requests. It does not execute Ruby or shell code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:26:ruby-shell-backtick-execution","reason":"This closes the Markdown example block. It contains no executable command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","reason":"Backticks format filenames and program names in documentation. They are not shell execution syntax.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","reason":"Backticks identify capability names and actions in prose. No command is invoked.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:50:ruby-shell-backtick-execution","reason":"The line documents local reference files and a fixed git-root resolution command. It contains no user-controlled command fragment.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:51:ruby-shell-backtick-execution","reason":"The documented shell command inserts a supplied subject ID as an unquoted argument. An unsafe invocation could permit shell metacharacter injection unless the host uses argument arrays or validates the ID.","verdict":"confirmed","confidence":0.76},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","reason":"Backticks format capability and event names in policy prose. No shell or Ruby command is executed.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:53:ruby-shell-backtick-execution","reason":"The detected backticks label protocol actions and handoff names. This is documentation, not executable shell syntax.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:54:ruby-shell-backtick-execution","reason":"The backticks label data fields and event names in documentation. No command execution is present.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","reason":"The backticks label a runtime action and data fields in prose. No shell instruction is executed.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:56:ruby-shell-backtick-execution","reason":"The backticks identify event states in Markdown prose. They do not invoke an external command.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","reason":"The backticks label verification actions in documentation. They are not executable shell syntax.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"Backticks format cache and stream paths in policy prose. No command runs on this line.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:50:shell-command-substitution","reason":"The command substitution only resolves a local Git project root and suppresses Git errors. No untrusted value is executed.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:50:template-literal-with-command-substitution","reason":"The shell expansion is a documented fixed local path-resolution pattern, not a template constructed from user content.","verdict":"false_positive","confidence":0.95},{"id":"network:SKILL.md:10:hardcoded-url","reason":"This is a repository homepage in front matter. It does not perform a network request.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:13:hardcoded-url","reason":"This is homepage metadata only. The skill contains no network operation on this line.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:50:path-traversal-sequence","reason":"These are fixed relative links to packaged reference documents. They are not derived from user input or used for arbitrary file access.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:69:path-traversal-sequence","reason":"This is a fixed Markdown reference link. It is not runtime path traversal.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:70:path-traversal-sequence","reason":"This is a fixed Markdown reference link. It is not runtime path traversal.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:71:path-traversal-sequence","reason":"This is a fixed Markdown reference link. It is not runtime path traversal.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:72:path-traversal-sequence","reason":"This is a fixed Markdown reference link. It is not runtime path traversal.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:76:path-traversal-sequence","reason":"This is a fixed link to a related skill. It is not user-controlled filesystem access.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:77:path-traversal-sequence","reason":"This is a fixed link to a related skill. It is not user-controlled filesystem access.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:78:path-traversal-sequence","reason":"This is a fixed link to a related skill. It is not user-controlled filesystem access.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:79:path-traversal-sequence","reason":"This is a fixed link to a related skill. It is not user-controlled filesystem access.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:50:standard-device-file-access","reason":"The redirection suppresses git error output during fixed project-root discovery. It does not access a device file for data collection.","verdict":"false_positive","confidence":0.97},{"id":"blocker:SKILL.md:12:system-reconnaissance","reason":"The argument hint requests a pseudonymous subject ID and event. It does not inspect the system or collect host information.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[],"subject_marketplace_commit_sha":"adcb3549b15782055d0beb6d29f113d20de08f92","subject_content_hash":"c0052b642cc7fc5edd60f474e74a1e32292b09faddc3f6cca8d9cdf26d02c62c","subject_tree_hash":"c38d6f26963a2aa3e973c26ccbb9363d3f32418199203289219dfd2032f5c248","subject_plugin_path":"skills/aaron-he-zhu/consent-registry","audit_payload_hash":"734207e6617e437b4dceb5b9b775518b","confirmed_risk_level":"safe","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"adcb3549b15782055d0beb6d29f113d20de08f92","contentHash":"c0052b642cc7fc5edd60f474e74a1e32292b09faddc3f6cca8d9cdf26d02c62c","treeHash":"c38d6f26963a2aa3e973c26ccbb9363d3f32418199203289219dfd2032f5c248","pluginPath":"skills/aaron-he-zhu/consent-registry","auditPayloadHash":"734207e6617e437b4dceb5b9b775518b"},"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/aaron-he-zhu-consent-registry/audits/7/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"safe","confirmedFindingCount":0,"capabilityReviewCount":1,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}