Security Skill Purpose: Find and report security weaknesses in code, scripts, authorized binaries, and repo-managed prompt surfaces, with honest coverage. Use this skill for a caller-requested security review of code or of a plan or design before code exists, a repository scan, authorized binary assurance, dependency risk, secrets, or offline prompt-surface redteam. Critical Constraints - Scan only repositories, binaries, and prompt surfaces the operator owns or is explicitly authorized to assess. Why: a security review does not grant access to third-party systems or proprietary material. - K…

\"$SKILL\"\n\n# effects must be DECLARED, not the copied-default empty array. This gate used\n# to pin `effects: []`; that pin mechanically enforced a false contract (the\n# skill writes scan artifacts). The check is now inverted: an empty effects\n# array fails.\nif grep -q '^ effects: \\[\\]

Security Skill Purpose: Find and report security weaknesses in code, scripts, authorized binaries, and repo-managed prompt surfaces, with honest coverage. Use this skill for a caller-requested security review of code or of a plan or design before code exists, a repository scan, authorized binary assurance, dependency risk, secrets, or offline prompt-surface redteam. Critical Constraints - Scan only repositories, binaries, and prompt surfaces the operator owns or is explicitly authorized to assess. Why: a security review does not grant access to third-party systems or proprietary material. - K…

\"$SKILL\"; then\n echo 'security effects must be declared (the skill writes scan artifacts); effects: [] is a false contract' >&2\n exit 1\nfi\n\n[[ \"$(awk '/^---$/{n++;next} n==2 && /^## /{print;exit}' \"$SKILL\")\" == \"## Critical Constraints\" ]]\ngrep -Fq '**Artifact directory:**' \"$SKILL\"\ngrep -Fq '**Validator command:**' \"$SKILL\"\ngrep -Fq 'report stops after evidence' \"$SKILL\"\nif grep -Eiq 'AUTO-REDO|ONE-HELPER|HELPER-ESCALATE|ao (pawl|land)|next_action' \"$SKILL\"; then\n echo 'security contract contains retired lifecycle vocabulary' >&2\n exit 1\nfi\n\n# The skill-local security-gate.sh duplicate was unrunnable: its REPO_ROOT\n# resolved to skills/security, so it looked for a nonexistent skill-local\n# toolchain-validate.sh and exited 1. The canonical gate is the repo-root\n# scripts/security-gate.sh (documented in SKILL.md). Guard against the\n# duplicate coming back.\nif [[ -e \"$SKILL_DIR/scripts/security-gate.sh\" ]]; then\n echo 'skill-local scripts/security-gate.sh duplicate is back — it is unrunnable; use the repo-root gate' >&2\n exit 1\nfi\n\n[[ -s \"$SKILL_DIR/references/policy-example.json\" ]]\n[[ -s \"$SKILL_DIR/references/agentops-redteam-pack.json\" ]]\n[[ -s \"$SKILL_DIR/references/security-suite-runbook.md\" ]]\n\n# Syntax-check the shipped Python without writing __pycache__/*.pyc into the\n# package (py_compile writes the default cfile even with cfile=None); ast.parse\n# validates syntax and writes nothing.\npython3 - \"$SKILL_DIR/scripts/security_suite.py\" \"$SKILL_DIR/scripts/prompt_redteam.py\" \u003c\u003c'PY'\nimport ast\nimport sys\nfor path in sys.argv[1:]:\n with open(path, encoding=\"utf-8\") as fh:\n ast.parse(fh.read(), filename=path)\nPY\npython3 -c 'import json, pathlib, sys; root=pathlib.Path(sys.argv[1]); [json.loads((root/name).read_text()) for name in (\"policy-example.json\", \"agentops-redteam-pack.json\")]' \"$SKILL_DIR/references\"\n\n# Seeded suite cases: Cobra grouped help must yield commands (it yielded none,\n# so the documented ao policy example failed), the starter deny list must match\n# the remote side of an lsof row, and lsof must AND its selectors (-a) so other\n# processes' sockets are not recorded.\npython3 -I - \"$SKILL_DIR/scripts/security_suite.py\" \"$SKILL_DIR/references/policy-example.json\" \u003c\u003c'PY'\nimport importlib.util, json, re, sys\nsys.dont_write_bytecode = True\nspec = importlib.util.spec_from_file_location(\"security_suite\", sys.argv[1])\nsuite = importlib.util.module_from_spec(spec)\nsys.modules[\"security_suite\"] = suite\nspec.loader.exec_module(suite)\ngrouped = (\"Usage:\\n ao [command]\\n\\nGetting Started:\\n init Create\\n\\n\"\n \"Core Commands:\\n status Show\\n\\nFlags:\\n -h, --help help\\n\\n\"\n 'Use \"ao [command] --help\" for more information about a command.\\n')\nassert suite._parse_subcommands(grouped) == [\"init\", \"status\"], \"grouped help parse\"\nassert suite._parse_subcommands(\"Usage: t FILE\\n\\nNotes:\\n Read once.\\n\") == [], \"prose parsed as commands\"\ndeny = json.load(open(sys.argv[2]))[\"deny_network_endpoint_patterns\"]\nassert any(re.search(p, \"TCP 203.0.113.5:5000->10.0.0.1:443\") for p in deny), \"remote private missed\"\nassert not any(re.search(p, \"TCP 192.168.1.5:5000->203.0.113.9:443\") for p in deny), \"local LAN flagged\"\nassert '\"lsof\", \"-nP\", \"-a\", \"-i\", \"-p\"' in open(sys.argv[1]).read(), \"lsof selectors not ANDed\"\nPY\n\n# Behavioral redteam: run the attack pack against the live repo surfaces and\n# require verdict PASS. This is what keeps the pack honest — a stale target glob\n# or pattern (the \"fails against its own tree\" defect) turns this red. It is\n# only meaningful when the governance surfaces the pack targets are present, so\n# it is gated on the real repo; an isolated skill copy or standalone install\n# (which lacks AGENTS.md and docs/) skips it with a disclosed note rather than\n# failing on absent, unscannable surfaces.\nif [[ -f \"$REPO_ROOT/AGENTS.md\" && -f \"$REPO_ROOT/docs/CI-CD.md\" ]]; then\n redteam_out=\"$(mktemp -d \"${TMPDIR:-/tmp}/security-redteam.XXXXXX\")\"\n trap 'rm -rf \"$redteam_out\"' EXIT\n if python3 \"$SKILL_DIR/scripts/prompt_redteam.py\" scan \\\n --repo-root \"$REPO_ROOT\" \\\n --pack-file \"$SKILL_DIR/references/agentops-redteam-pack.json\" \\\n --out-dir \"$redteam_out\" >/dev/null 2>&1; then\n echo \"security redteam: PASS (attack pack holds against the live tree)\"\n else\n echo 'security redteam FAILED against the live tree — a target glob or pattern is stale, or a control regressed' >&2\n jq -r '.failed_cases[]?' \"$redteam_out/redteam/redteam-results.json\" 2>/dev/null \\\n | sed 's/^/ failed case: /' >&2 || true\n exit 1\n fi\nelse\n echo \"security redteam: SKIP (repo governance surfaces absent; not the AgentOps repo)\"\nfi\n\necho \"security contract: PASS\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":5521,"content_sha256":"fa8fed7a7bfcacb64d5fff1b6b823f02923c108d820634765c858b69241496e0"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Security Skill","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"Purpose:","type":"text","marks":[{"type":"strong"}]},{"text":" Find and report security weaknesses in code, scripts, authorized binaries, and repo-managed prompt surfaces, with honest coverage.","type":"text"}]}]},{"type":"paragraph","content":[{"text":"Use this skill for a caller-requested security review of code or of a plan or design before code exists, a repository scan, authorized binary assurance, dependency risk, secrets, or offline prompt-surface redteam.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Critical Constraints","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Scan only repositories, binaries, and prompt surfaces the operator owns or is explicitly authorized to assess. ","type":"text"},{"text":"Why:","type":"text","marks":[{"type":"strong"}]},{"text":" a security review does not grant access to third-party systems or proprietary material.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keep collection read-only by default; do not exfiltrate secrets, execute destructive payloads, or mutate policy/baselines to manufacture green. ","type":"text"},{"text":"Why:","type":"text","marks":[{"type":"strong"}]},{"text":" the assessment must not become the incident or erase its evidence.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Treat missing/error scanners as a coverage gap, never a clean finding; use ","type":"text"},{"text":"--require-tools","type":"text","marks":[{"type":"code_inline"}]},{"text":" when complete tool coverage is required. ","type":"text"},{"text":"Why:","type":"text","marks":[{"type":"strong"}]},{"text":" absent evidence is not evidence of absence.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use the current agent and local shell; do not start another runtime or orchestration substrate unless explicitly requested. ","type":"text"},{"text":"Why:","type":"text","marks":[{"type":"strong"}]},{"text":" repository scanning is a bounded operation, not permission to fan out.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report findings and coverage gaps, then stop. Remediation, risk acceptance, reruns, promotion, and any ship or merge call are caller decisions. Asked whether to ship, merge or deploy, give the findings and coverage, then say in one line that the go/no-go on that evidence is the caller's; recommending ship, hold or block in any wording is that decision. Name each finding's remediation class in a few words; do not write the patch, a plan, an owner, or a priority.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"What every review reports","type":"text"}]},{"type":"paragraph","content":[{"text":"Apply these to every review, scripted or manual. They are the rules most often skipped:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Fail-open paths.","type":"text","marks":[{"type":"strong"}]},{"text":" For every guard, check, timeout, and exception handler on the surface, ask what happens when it errors or hangs. A control that grants access, skips a check, or continues as success on error is a finding even when its happy path is correct.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Borrowed identity.","type":"text","marks":[{"type":"strong"}]},{"text":" Trace the effective identity at each hop (user, service, token, default, hook). A hop where identity is assumed, defaulted, or inherited instead of verified is the ","type":"text"},{"text":"borrowed identity","type":"text","marks":[{"type":"strong"}]},{"text":" failure mode and a finding.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Per-class coverage ledger.","type":"text","marks":[{"type":"strong"}]},{"text":" Walk every applicable class in ","type":"text"},{"text":"the class checklist","type":"text","marks":[{"type":"link","attrs":{"href":"references/owasp-checklist.md","title":null}}]},{"text":", plus fail-open, identity and any class the surface needs that the list lacks, and give each a result: finding, clean, or not assessed. An unvisited class is a gap, never a clean. Chasing one lead to the exclusion of the taxonomy is the ","type":"text"},{"text":"first-scent fixation","type":"text","marks":[{"type":"strong"}]},{"text":" failure mode.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Proven versus suspected.","type":"text","marks":[{"type":"strong"}]},{"text":" A finding is proven only when you ran a concrete input, request, or command and observed the behavior; capture it. A finding reasoned from the code is suspected, even with a candidate input; give that input and rank it below proven findings.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Snapshot scope.","type":"text","marks":[{"type":"strong"}]},{"text":" Name the exact snapshot (commit, working tree on a stated HEAD, or document revision) and the path scope. List inputs you did not read separately as unread, deleted or outside scope; none of them counts as clean. Keep impact inside the snapshot: a finding that needs absent code, a future change or an unread path is a hypothesis and is labeled so. When the remaining budget cannot finish another full pass, stop opening new leads and report the hunt as unconverged.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Shipped scope for a share or publish question.","type":"text","marks":[{"type":"strong"}]},{"text":" When asked whether content is safe to make public or hand to another party (a repository, an export, a package), the snapshot is what the recipient will receive: the built artifact or output tree, every commit reachable in the history that travels with it, and derived copies such as indexes, caches and generated files. Content removed at HEAD is still exposed in earlier commits. Report history exposure with its fix class (credential rotation, fresh history or an owner-authorized rewrite) and perform none of them.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"For each finding, explain the attacker path and relevant protective control in the fields below. Read ","type":"text"},{"text":"attacker-path evidence","type":"text","marks":[{"type":"link","attrs":{"href":"references/attacker-path-evidence.md","title":null}}]},{"text":" only when reachability, control effectiveness, or claimed test completion needs closer support for that finding.","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"text"},"content":[{"text":"target: \u003cpaths, endpoints, or binary>; authorization: \u003cboundary>\nsnapshot: \u003ccommit | working tree on HEAD | document revision>; unread: \u003cpaths> | deleted: \u003cpaths> | outside scope: \u003cpaths>\nfindings: \u003cid> \u003cseverity> \u003cfile:line> \u003cclass>: \u003cwhat>\n proven: \u003cinput run> | suspected: \u003ccandidate input, why not run>\n path: \u003cattacker input> -> \u003creachable behavior> -> \u003ctrust boundary> -> \u003cimpact>\n control: \u003crelevant protection challenged and outcome, or none identified>\n fix class: \u003ca few words>\ncoverage: \u003cclass> -> finding \u003cids> | clean | not assessed (\u003cwhy>)\ntools: \u003cscanner or command> -> ran | missing | error\nhunt: converged after \u003cn> passes | unconverged | not run","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Manual hunt","type":"text"}]},{"type":"paragraph","content":[{"text":"Code-level review and redteam passes work in any repository, with or without AgentOps tooling. Walk the ledger against the full surface and probe fail-open behavior where that is safe. Repeat full passes until one complete pass adds no new finding and no new coverage gap; that quiet round is the stop condition. If the budget ends first, report the hunt as unconverged. The quiet-round rule applies only to the manual hunt.","type":"text"}]},{"type":"paragraph","content":[{"text":"A plan, spec or design with no code yet gets the same hunt, aimed at what the document proposes. List the endpoints, data stores, integrations and inputs it adds, then report only weaknesses an attacker could use if it is built as written, such as a capability with no named actor or access decision; sensitive data whose handling in transit, at rest, in logs or at deletion is unstated; a third party or secret whose trust, storage, rotation or compromise behavior is unstated; or a stated choice, including how an input is handled, that is itself unsafe. Cite the section. A weakness in what the document proposes is inside its revision, not a rule-5 hypothesis; with nothing to run, each is suspected.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Scripted scans","type":"text"}]},{"type":"paragraph","content":[{"text":"Each selected scan runs once per request; a rerun is a new caller decision.","type":"text"}]},{"type":"paragraph","content":[{"text":"\u003cskill-dir>","type":"text","marks":[{"type":"code_inline"}]},{"text":" is the directory that contains this SKILL.md. Claude Code shows it as \"Base directory for this skill\"; Codex lists this skill's SKILL.md path; in an AgentOps source checkout it is ","type":"text"},{"text":"skills/security","type":"text","marks":[{"type":"code_inline"}]},{"text":". Replace ","type":"text"},{"text":"\u003cskill-dir>","type":"text","marks":[{"type":"code_inline"}]},{"text":" with that absolute path before running a command. The working directory stays the user's repository. If the host did not show where this skill is installed, use the directory of the SKILL.md you read. If you cannot determine it, do not guess a path or run a same-named script from the current repository; say the bundled script is unavailable and run the scanners the project already uses, record the suite or redteam scan as a coverage gap, and do the manual hunt.","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Surface","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Entry point","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Location","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Repository gate (quick or full)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bash scripts/security-gate.sh","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"AgentOps repository root only","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Composable suite for authorized binaries","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"python3 \"\u003cskill-dir>/scripts/security_suite.py\"","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bundled with this skill","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Offline prompt-surface redteam","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"python3 \"\u003cskill-dir>/scripts/prompt_redteam.py\"","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bundled with this skill","type":"text"}]}]}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No gate script","type":"text","marks":[{"type":"strong"}]},{"text":" (any other repository): run the scanners the project already uses, such as a dependency audit, secret scan, or static analyzer, record each one that is absent as a coverage gap, and do the manual hunt.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Redteam pack:","type":"text","marks":[{"type":"strong"}]},{"text":" the bundled ","type":"text"},{"text":"attack pack","type":"text","marks":[{"type":"link","attrs":{"href":"references/agentops-redteam-pack.json","title":null}}]},{"text":" targets AgentOps control surfaces. In another repository its cases fail with \"no files matched target globs\"; that is a pack mismatch, not a finding. A PASS shows the controls are written down, not that an agent resists them.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"the suite runbook","type":"text","marks":[{"type":"link","attrs":{"href":"references/security-suite-runbook.md","title":null}}]},{"text":" before gate, binary, policy, baseline, or redteam work. It holds the commands, the gate's exit codes, the artifact contracts, and the limits of the dynamic run, which is sampled and not isolated.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Triage","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Open the latest artifact and identify scanner, severity, file, and coverage gaps.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reproduce the finding with the narrowest safe command; an unreproduced hit stays suspected.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Rank concrete findings and preserve coverage gaps.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Stop. Remediation, risk acceptance, and any later scan are new caller decisions. Do not downgrade, suppress, or update a baseline merely to pass.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Output Specification","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Artifact directory:","type":"text","marks":[{"type":"strong"}]},{"text":" suite and redteam runs write under their explicit ","type":"text"},{"text":"--out-dir","type":"text","marks":[{"type":"code_inline"}]},{"text":"; the repository gate's directory is in the runbook.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Filename convention:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"security-gate-summary.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" (gate), ","type":"text"},{"text":"suite-summary.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" (suite), ","type":"text"},{"text":"redteam/redteam-results.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" (redteam).","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Serialization/schema format:","type":"text","marks":[{"type":"strong"}]},{"text":" JSON. ","type":"text"},{"text":"Validator command:","type":"text","marks":[{"type":"strong"}]},{"text":" the gate summary's field contract and ","type":"text"},{"text":"jq","type":"text","marks":[{"type":"code_inline"}]},{"text":" check are in the runbook; a summary that fails it makes the result incomplete.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Downstream handoff:","type":"text","marks":[{"type":"strong"}]},{"text":" the review report above; for scripted scans also the artifact path, command and exit code, mode, and gate status. The report stops after evidence: no owner, next action, approval, release, ship, or retry decision, and no newly exposed secret or unredacted sensitive payload.","type":"text"}]}]},"metadata":{"date":"2026-11-02","name":"security","author":"@skillopedia","source":{"stars":453,"repo_name":"agentops","origin_url":"https://github.com/boshu2/agentops/blob/HEAD/skills/security/SKILL.md","repo_owner":"boshu2","body_sha256":"003ab6b7a2fa707409696587df94bafacd9889e7e1dead046ede42a5f9d983cc","cluster_key":"0c89d4527ea513ee8dcb4e28707d0234b60fe97c3e753831727804c4606b6914","clean_bundle":{"format":"clean-skill-bundle-v1","source":"boshu2/agentops/skills/security/SKILL.md","text_bytes":79052,"source_commit":"7547dab37a18f36def54b25e0c81eb39ef9dffef","skills_sh_rank":10367,"attachment_count":8,"text_attachments":8,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"skills/security/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"security","category_label":"Security"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"security","consumes":["repo-context"],"metadata":{"tier":"product","effects":["write_scan_artifacts"],"graph_root":true,"disposition":"keep_specialist","capabilities":["security"],"dependencies":[],"canonical_status":"canonical"},"produces":["security-gate-summary.json","suite-summary.json","redteam-results.json"],"practices":["supply-chain-integrity","design-by-contract","sre"],"import_tag":"skills-sh-top20k-2026-11","context_rel":[{"kind":"supplier-to","with":"validate"}],"description":"Review code for security problems; scan for vulnerabilities, secrets, dependency and prompt risks. Use when: asked whether code is safe to ship, even one small handler.","hexagonal_role":"driven-adapter","user-invocable":true,"output_contract":"stdout: security scan report","skill_api_version":1}},"renderedAt":1793661663465}

Security Skill Purpose: Find and report security weaknesses in code, scripts, authorized binaries, and repo-managed prompt surfaces, with honest coverage. Use this skill for a caller-requested security review of code or of a plan or design before code exists, a repository scan, authorized binary assurance, dependency risk, secrets, or offline prompt-surface redteam. Critical Constraints - Scan only repositories, binaries, and prompt surfaces the operator owns or is explicitly authorized to assess. Why: a security review does not grant access to third-party systems or proprietary material. - K…