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.
npx skills add andypitcher/ponytail-sec --skill ponytail-sec-auditgit clone --depth 1 https://github.com/andypitcher/ponytail-secWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/andypitcher/ponytail-sec/ponytail-sec-audit)<a href="https://agentmods.dev/skills/andypitcher/ponytail-sec/ponytail-sec-audit"><img src="https://agentmods.dev/badge/skills/andypitcher/ponytail-sec/ponytail-sec-audit/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/andypitcher/ponytail-sec/ponytail-sec-audit"><img src="https://agentmods.dev/badge/skills/andypitcher/ponytail-sec/ponytail-sec-audit.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector warn
SkillSpector: 1 finding, up to medium
These are SkillSpector’s own severities. On a checked sample its high-severity flags on skills were ~96% false positives — a documented command, a public API, a “never do X” rule — so we show them as a caution to read, not a verdict. Why →
- medium Tool Misuse · line 42 Tool defaults are unsafe or overly permissive (e.g. disabled TLS verification, no authentication, world-writable permissions). Unsafe defaults widen the attack surface.Fix: Override unsafe defaults with secure settings (verify=True, auth required, restrictive permissions). Review and harden all tool configurations.
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.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00074 | $0.03282 |
| Opus 5 | $0.00037 | $0.01641 |
| Sonnet 5 | $0.00015 | $0.00656 |
| Haiku 4.5 | $0.00007 | $0.00328 |
Grade A, and why
ponytail-sec-audit scanned grade A with 0 findings 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 10d 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.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 288 lines — stays where its author put it; the contents beside it link to each section on GitHub.
The lazy senior security engineer. The best vuln is the one you make unreachable with the smallest change.
Existing Findings
- Previous audit reports (newest first): !
find .ponytail-sec -maxdepth 1 -type d -name "audit-*" -print 2>/dev/null | sort -r
When previous reports exist, read the most recent findings.json and compare
with the current scan results:
- Resolved — a previous finding no longer appears (same location + issue gone). Mark it ✅.
- Recurring — same location and same issue still present. Mark it 🔁.
- Regression — a new finding in a location that was previously clean. Mark it 🔴.
Open the report with a delta summary line when a previous scan exists:
Delta since last audit (
audit-<previous-timestamp>): X resolved, Y recurring, Z new.
If no previous reports exist, skip the delta summary and proceed normally.
Scope
The entire project. All source files, Dockerfiles, manifests, config, and dependency declarations. If the project is large, prioritise: auth paths, TLS configuration, shell exec, dependency resolvers, and shipped config.
Ranking model
Fix lower layers first. A network control does not excuse skipping a code fix.
Layer 4 · Code verify=False, InsecureSkipVerify ← must-fix
Layer 3 · Auth OAuth 2.1, JWT audience / issuer / alg ← must-fix
Layer 2 · Transport TLS with verified CA ← must-fix
Layer 1 · Network NetworkPolicy (default-deny) ← should-do
Layer 0 · Mesh Istio mTLS ← additive only
Three passes, in order
Pass 1 — Code review
Does this code need to exist at all? YAGNI, stdlib first, remove over refactor. Fewer lines = smaller attack surface. Dead code and unrequested abstractions are security debt.
Pass 2 — Dependency assessment
Every dependency is supply-chain surface — any language (npm, PyPI, Maven, Cargo, Go modules, etc.). For each, web-search the registry page and OpenSSF Scorecard before judging — do not assess from name alone. Check: last release date, number of contributors, individual vs. company/org maintainer, presence of SECURITY.md, and OpenSSF Scorecard maintained score.
- Does stdlib or the platform already do this? → remove.
- Solo maintainer, low OpenSSF Scorecard, stale commits, no security policy? → fork or vendor and flag the risk.
- Brings more than it costs, healthy upstream? → keep, pin immutably: exact version + lockfile for package deps, commit hash for VCS deps, digest for container images.
Prefer: remove > stdlib > vendor/fork > immutable pin > keep floating.
Pass 3 — Hardening
Kill-chain stages in order. A Stage 1 break voids all downstream defences. Rank within a stage by attacker leverage removed ÷ lines changed.
- Stage 1 · Trust: TLS cert bypass, token validation gaps, auth bypass modes.
- Stage 2 · Authz: RBAC wildcards, server-side claim validation, write/read separation.
- Stage 3 · Exec: container escape surface, supply chain, shell injection, deserialization.
- Stage 4 · Data: hardcoded secrets, debug endpoints, missing TLS, verbose logging.
Tags: auth rbac isolate dep inject secret expose
Output format
Emit three sections. No cap on findings — this is the full audit.
Pass 1 · Code
Prose commentary, one paragraph per file with findings. Clean. for files
with nothing to remove. State the security consequence, not just the smell.
Example:
ProcessManager.scala: The interactivebash -iactor (lines 17–56) exists solely to shell-exec commands replaceable withProcessBuilder. Every string reaching its mailbox executes verbatim — delete the class.
ClientSslConfig.scala: Clean.
Pass 2 · Dependencies
One sentence if clean. One line per dep if not, with verdict and reason.
Example:
build.sbtHTTP resolvers (spray.io, bintray, sonatype staging, download.java.net, geomajas) → remove: all 5 on Maven Central over HTTPS;withAllowInsecureProtocol(true)is live MITM surface on the build network.
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.
- 10d ago First seen · 288 lines · 74 tokens per session scan A 538a60d44361
ponytail-sec-audit is a skill published in the GitHub repository andypitcher/ponytail-sec (8 stars, last pushed 9d ago), licensed MIT. It adds 74 tokens to every session and 3,282 once invoked, about $0.0004 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
prowler-compliance
Creates, syncs, audits and manages Prowler compliance frameworks end-to-end. Covers the two supported JSON schemas (universal multi-provider and legacy per-provider), the SDK model tree (legacy attribute classes, universal ComplianceFramework, ConfigRequirements guardrails), output formatters (legacy per-framework +…
prowler-attack-paths-query
Creates Prowler Attack Paths openCypher queries using the Cartography schema as the source of truth for node labels, properties, and relationships. Covers Prowler-specific additions (Internet node, ProwlerFinding, internal isolation labels), $provideruid scoping, and list-property item nodes with typed HAS edges that…
django-drf
Django REST Framework patterns. Trigger: When implementing generic DRF APIs (ViewSets, serializers, routers, permissions, filtersets). For Prowler API specifics (RLS/RBAC/Providers), also use prowler-api.
django-migration-psql
Reviews Django migration files for PostgreSQL best practices specific to Prowler. Trigger: When creating migrations, running makemigrations/pgmakemigrations, reviewing migration PRs, adding indexes or constraints to database tables, modifying existing migration files, or writing data backfill migrations. Always use…
prowler-api
Prowler API patterns: RLS, RBAC, providers, Celery tasks. Trigger: When working in api/ on models/serializers/viewsets/filters/tasks involving tenant isolation (RLS), RBAC, or provider lifecycle.
framework-compliance-triage
Make a cloud account compliant with a security or industry framework using Prowler Cloud.