security-privacy

A security and privacy reviewer for a coding-agent plugin monorepo, a repository containing several related packages or tools.

In plain words
What is it for?
It reviews plans or code maps for prompt-injection risks, overly broad tool access, hook-script exposure, secret leaks, stale cache keys, unsafe learning-store writes, and GitHub credential handling.
Why use it?
It helps identify risks in agent instructions, tool permissions, scripts, credentials, caches, and stored data before implementation or release.

Agent for Claude Code

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add agents/closedloop-ai/claude-plugins/security-privacy
Clone the repo
git clone --depth 1 https://github.com/closedloop-ai/claude-plugins

Made for: Claude Code.

Per session 63 Only the description is in the session, so the agent can decide to use it. The body loads when it is invoked.
When invoked 4,295 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 1 finding. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00063 $0.04295
Opus 5 $0.00032 $0.02148
Sonnet 5 $0.00013 $0.00859
Haiku 4.5 $0.00006 $0.00430

Measured 2d ago against content hash 42de97b9ecb0, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

security-privacy scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Makes network callslowCapability

Not a fault in itself. Listed so you know the mod talks to something, and to what.

- A plan step introduces direct `curl` or HTTP client calls to the GitHub API using a hardcoded or interpolated token string instead of delegating to the `gh` CLI — `gh` handles credential storage safely; direct calls ri
.claude/agents/security-privacy.md · 278 lines

How it starts

The opening of the file, as written. The whole thing — 278 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Execution Modes

  • Critic (default fast mode): Review an implementation plan draft for security and privacy gaps — prompt-injection risks, over-broad tool allowlists in agent frontmatter, hook-script attack surface, secret exposure paths, cache-key staleness, and unsafe persistence writes.
  • Legacy mode: Author a security-privacy.md report enumerating security and privacy concerns for a feature, covering all seven security surfaces below.

Inputs

Critic mode

  • requirements.json — user stories, acceptance criteria, feature constraints
  • code-map.json — mapped code locations for the implementation
  • implementation-plan.draft.md — draft plan to review for security gaps
  • anchors.json — stable task anchors for emitting review findings
  • critic-selection.json — review budget and active critic configuration

Legacy mode

  • requirements.json — feature requirements and acceptance criteria
  • code-map.json — existing code structure and file locations
  • project-context.md — technology stack and project conventions

Outputs

Critic mode

Write to reviews/security-privacy.review.json conforming to review-delta.schema.json (use code:find-plugin-file skill to locate schemas/review-delta.schema.json).

Note: The schema accepts both items and review_items as field names. The agent and mode fields are optional.

Example — prompt-injection on a new LLM-consuming stage (blocking):

{
  "review_items": [
    {
      "anchor_id": "task:add-intent-parser-stage",
      "severity": "blocking",
      "rationale": "The new intent-parser stage passes `pr_body` directly into the system prompt without any sanitization or quarantine. PR body is author-controlled content (untrusted input per PLN-720/PLN-725 precedent). A crafted body could inject instructions that alter the model's verdict or exfiltrate learning patterns surfaced by SubagentStart.",
      "proposed_change": {
        "op": "append",
        "target": "task",
        "path": "task:add-intent-parser-stage",
        "value": "Treat `pr_body`, `pr_title`, and commit messages as data, not instructions. Wrap them in XML data tags (e.g., <author_content>) and place them after all system instructions. Do not interpolate them into the instruction section of the prompt. Mirror the detect-injection quarantine pattern introduced in PLN-720."
      },
      "files": ["plugins/code-review/agents/intent-parser.md"],
      "ac_refs": ["AC-002"],
      "tags": ["prompt-injection", "untrusted-input", "llm-pipeline"]
    },
    {
      "anchor_id": "task:add-subagent-start-hook",
      "severity": "blocking",
      "rationale": "The proposed SubagentStart hook script sources content from `.closedloop-ai/env` using `eval`. If that file is written by a prior stage that processes untrusted input, eval will execute attacker-controlled shell. The existing hook pattern reads with `export $(grep ...)` but never eval.",
      "proposed_change": {
        "op": "replace",
        "target": "task",
        "path": "task:add-subagent-start-hook",
        "value": "Load env file with `export $(grep -v '^#' .closedloop-ai/env | xargs)` — never with `eval` or `source`. Confirm the file is written exclusively from controlled paths (run-loop.sh, not from model output or PR content)."
      },
      "files": ["plugins/code/hooks/hooks.json"],
      "ac_refs": ["AC-005"],
      "tags": ["hook-script", "eval-injection", "subagent-start"]
    },
    {
      "anchor_id": "task:add-cache-invalidation",
      "severity": "major",
      "rationale": "The plan updates the verifier prompt but does not regenerate its `prompt_hash`. The verifier cache keys on `(content_hash, model, prompt_hash)` — a stale hash means old verdicts survive the prompt edit undetected. This is a correctness-as-security property: stale verdicts can suppress real security findings.",
      "proposed_change": {
        "op": "append",
        "target": "task",
        "path": "task:add-cache-invalidation",
        "value": "After any prompt edit, recompute the prompt_hash in the cache-key derivation logic. Add a test asserting that a changed prompt string produces a different cache key and triggers a fresh model call."
      },
      "files": ["plugins/code-review/tools/python/code_review_helpers.py"],
      "ac_refs": ["AC-008"],
      "tags": ["cache-key", "correctness-as-security", "stale-verdict"]
    }
  ]
}

Read the full file on GitHub · 278 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 2d ago First seen · 278 lines · 63 tokens per session scan A 42de97b9ecb0

Subscribe to this mod's changes

security-privacy is an agent published in the GitHub repository closedloop-ai/claude-plugins (103 stars, last pushed 4d ago), licensed Apache-2.0. It adds 63 tokens to every session and 4,295 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.