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.00073 | $0.09123 |
| Opus 5.5 | $0.00029 | $0.03649 |
| Sonnet 5.5 | $0.00015 | $0.01825 |
| Haiku 4.5 | $0.00007 | $0.00912 |
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 — 689 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. findings.json holds three typed buckets —
code, dependency, security. Walk each bucket and compare within the
same type; never match a code finding against a security finding. If its
schema_version is 2, migrate it to v3 in memory first (see Migration
v2 → v3 under Persistence).
- Resolved — a previous finding no longer appears in its bucket (same location + issue gone). Mark it ✅.
- Recurring — same bucket, same location, same issue still present. Mark it 🔁.
- Regression — a new finding in a location that was previously clean. Mark it 🔴.
A recurring security finding inherits the previous triage — its class,
its measurement set (severity/cvss/cvss_score/cvss_nomenclature, or
efficacy/cwe), its status, and its title carry forward rather than
being re-derived. A finding triaged down to hardening must not re-report as a
scored vulnerability on the next scan. Say so on the row's delta line when it
happened:
🔁 recurring — triaged as hardening, Efficacy: Medium; the deployment's management network closes the path the original score assumed
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
Break-risk — applies to all three passes
Break-risk is confidence that the fix could break functionality, based on what static review can verify. It is orthogonal to severity and efficacy, and every finding in every pass carries one — code, dependency, and security alike.
- Low — additive, or provably-unused removal (nothing references it). Apply freely.
- Medium — tightening that may reject real inputs/flows not visible in the read.
- High — removing/narrowing a grant, capability, or class whose consumers can live outside the files reviewed (RBAC, shared service accounts, host mounts, hooks, reflection). Static review is blind here.
Medium/High findings of any type carry the ⚠️ validate-at-runtime line below.
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.
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 Changed · +12 lines 83ec1e7d266b
- 12d ago Changed · +156 lines 03da1394396d
- 24d ago Changed · +18 lines e611e3484592
- 1mo ago Changed · +215 lines · -1 tokens per session fa0e66ca2e6b
- 2mo 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 (12 stars, last pushed 6d ago), licensed MIT. It adds 73 tokens to every session and 9,123 once invoked, about $0.0003 per session on Opus 5.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.