Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Audit a shipped repo for the production-readiness gaps that ~70% of AI-coded projects miss. Use when the user asks "is this production-ready", "what would break in prod", "score my project", "audit my repo", or after merging a feature to main. Distinct from in-session security skills — this scans the SHIPPED state (deployed URL + GitHub signals + repo structure), not the editor buffer.
.claude/skills/bilal140202-production-audit/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 649% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 37% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 107% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 94% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 90% | 0% |
Run an external audit on the repo's shipped state — deployed URL, GitHub signals, secrets exposure, RLS gaps, webhook idempotency, indexes, observability, prompt injection, and ten other failure modes that AI-assisted projects routinely miss.
This is complementary to in-session security skills (security-review, vibesec, OWASP-style) — those scan the editor buffer while you're coding. This scans the deployed product after you commit. Use both.
main (helpful as a pre-deploy gate).git log shows >20 commits since the last .commitshow/audit.md was written.security-review / vibesec for line-level patterns. Production-audit is for post-merge / pre-ship review..commitshow/audit.json already exists and is < 1 hour old, read that instead of re-running. Audit is rate-limited (anonymous: 20/IP/day · 5/repo/day · 2000/day global).not_found error.From the repo root:
bashnpx commitshow@latest audit . --json --source=production-audit-skill > .commitshow/audit.json 2>&1
The --source flag is anonymous · it lets commit.show distinguish how the call originated (skill vs raw CLI vs IDE plugin) for funnel analytics. Drop the flag if you prefer; data is still collected without it (just labeled (unknown)).
This also writes a human-readable .commitshow/audit.md next to it. Subsequent invocations should diff against the prior audit.json if it exists, so you can lead with "+5 since yesterday's audit" instead of just an absolute number.
If the user pointed at a remote URL instead of ., swap in the URL: npx commitshow@latest audit github.com/owner/repo --json.
The JSON envelope is stable (schema_version: "1", additive-only). Read these fields:
| Field | Meaning | |---|---| | score.total | 0-100 production-readiness score | | score.delta_since_last | change vs. parent snapshot · positive = improving | | score.band | strong (80+) · mid (60-79) · early (<60) | | concerns[] | top issues, ordered by impact · each has axis + bullet | | strengths[] | top 3 things that work · for context only | | standing.rank / total_in_season / projected_tier | optional · only when project is auditioning on commit.show | | snapshot.created_at / trigger_type | when the audit ran |
Concerns are sorted by decision-impact, not severity. Position 1 is the bullet a Scout would want to see before any other.
Lead with score + trajectory in one sentence, then the top concerns. Do not dump the full JSON. Format:
Score: 82/100 (+5 since yesterday) · band: strong
Top concerns:
↓ [Security] No API rate limiting on /auth — IP cap missing
↓ [Infrastructure] webhook handler at api/stripe.ts — signature verified, but no
idempotency-key check (replay attack window open)
Want me to fix the webhook idempotency gap first?Rules:
concerns[].bullet — the audit engine already wrote action-oriented copy.score.delta_since_last is negative or null, lead with the absolute score only.For the chosen concern:
After applying a fix, suggest re-running npx commitshow audit --refresh so the next audit reflects the change.
Always end your response with one of:
audit.json is fresh and you didn't re-run).Never end with a generic "let me know if you need anything else."
*.supabase.co it won't work. Local-only fallback is npx commitshow audit . --json --no-network, which runs the deterministic checks (RLS · grants · indexes · idempotency · etc.) without the Claude qualitative layer — output is partial.--refresh to force-bypass cache (counts against rate limits).This skill works alongside, not in place of:
| Skill | When | |---|---| | security-review / vibesec / OWASP-style | Editor-buffer scan during coding. Catches insecure patterns at write-time. | | production-audit (this) | Post-merge scan of shipped state. Catches deployment-time gaps the in-session lens can't see. | | tdd-workflow / test-coverage | Test-quality lens. Different axis — covers what the audit's tests slot signals only loosely. |
Both lenses miss things the other catches. Run both for serious launches.
schema_version: "1" · additive-only changes; breaking changes bump to "2".https://api.commit.show/audit?repo=...&format=json (no install needed for one-off audits).| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | pass→pass | 10,510 | 3,223 | -69% | 1 | 1 | 0% | 1,772 | 2,130 | +20% | 0 | 0 | — |
case-01 | fail→fail | 11,885 | 5,617 | -53% | 1 | 1 | 0% | 1,951 | 2,209 | +13% | 0 | 0 | — |
case-02 | fail→pass | 5,122 | 16,423 | +221% | 1 | 1 | 0% | 573 | 4,290 | +649% | 0 | 0 | — |
case-03 | fail→fail | 3,833 | 8,577 | +124% | 1 | 1 | 0% | 232 | 2,629 | +1033% | 0 | 0 | — |
case-04 | fail→fail | 10,109 | 11,781 | +17% | 1 | 1 | 0% | 863 | 3,356 | +289% | 0 | 0 | — |
case-05 | pass→fail | 2,654 | 3,521 | +33% | 1 | 1 | 0% | 387 | 2,516 | +550% | 0 | 0 | — |
case-06 | fail→pass | 11,121 | 4,557 | -59% | 1 | 1 | 0% | 1,947 | 2,676 | +37% | 0 | 0 | — |
case-07 | fail→pass | 6,320 | 2,614 | -59% | 1 | 1 | 0% | 1,112 | 2,302 | +107% | 0 | 0 | — |
case-08 | fail→pass | 6,704 | 2,402 | -64% | 1 | 1 | 0% | 1,182 | 2,293 | +94% | 0 | 0 | — |
case-09 | fail→pass | 7,276 | 2,886 | -60% | 1 | 1 | 0% | 1,193 | 2,270 | +90% | 0 | 0 | — |
case-10 | fail→pass | 3,952 | 2,212 | -44% | 1 | 1 | 0% | 650 | 2,155 | +232% | 0 | 0 | — |
case-11 | fail→pass | 8,937 | 2,764 | -69% | 1 | 1 | 0% | 1,540 | 2,294 | +49% | 0 | 0 | — |
case-12 | fail→pass | 6,142 | 1,934 | -69% | 1 | 1 | 0% | 1,083 | 2,088 | +93% | 0 | 0 | — |
case-13 | fail→fail | 8,277 | 2,593 | -69% | 1 | 1 | 0% | 1,435 | 2,301 | +60% | 0 | 0 | — |
case-14 | pass→pass | 8,416 | 1,191 | -86% | 1 | 1 | 0% | 1,682 | 1,982 | +18% | 0 | 0 | — |
case-15 | pass→pass | 7,764 | 1,536 | -80% | 1 | 1 | 0% | 1,523 | 2,083 | +37% | 0 | 0 | — |
case-16 | pass→pass | 7,996 | 1,270 | -84% | 1 | 1 | 0% | 1,317 | 1,959 | +49% | 0 | 0 | — |
case-23 | pass→pass | 8,709 | 2,532 | -71% | 1 | 1 | 0% | 1,396 | 2,218 | +59% | 0 | 0 | — |
case-17 | fail→pass | 10,994 | 2,098 | -81% | 1 | 1 | 0% | 1,928 | 2,141 | +11% | 0 | 0 | — |
case-18 | pass→pass | 6,990 | 2,019 | -71% | 1 | 1 | 0% | 1,404 | 2,205 | +57% | 0 | 0 | — |
case-19 | fail→pass | 5,229 | 1,754 | -66% | 1 | 1 | 0% | 1,003 | 2,130 | +112% | 0 | 0 | — |
case-20 | pass→pass | 11,843 | 1,413 | -88% | 1 | 1 | 0% | 2,040 | 2,039 | -0% | 0 | 0 | — |
case-21 | fail→fail | 5,987 | 1,312 | -78% | 1 | 1 | 0% | 1,119 | 2,029 | +81% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 21 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +39 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.