devils-advocate — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited devils-advocate (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Get a critique from an outside model (Google Gemini 3.1 Pro by default) to pressure-test work before it ships. The whole reason this skill exists is that Claude and the user may share the same blind spots after working on a piece of content together. Sending the work to a model in a different lineage surfaces weaknesses that neither of you will catch alone.
Never substitute your own critique for this tool. If you find yourself about to write "here's what I think the weak points are" without running the script, stop — you are defeating the entire purpose of the skill.
Use it when the user explicitly asks for a second opinion, a devil's advocate read, or to poke holes in something. Also proactively suggest it when:
Do NOT reach for this skill for quick copy edits, tactical wordsmithing, or requests the user clearly wants done inside Claude. This is a heavier tool meant for moments where an outside critique has real value.
GOOGLE_AI_STUDIO_API_KEY is already in the repo .env (shared with image-gen and youtube-thumbnail).If the key is missing, the script will exit with a clear error and a link to create one.
The script lives at .claude/skills/devils-advocate/scripts/challenge.py.
Most common case. Pass one or more files you want challenged:
python3 .claude/skills/devils-advocate/scripts/challenge.py \
--files marketing/plans/pipeline-growth-strategy.mdMultiple files are fine — the critic reads them together and judges them as one body of work:
python3 .claude/skills/devils-advocate/scripts/challenge.py \
--files marketing/landing-pages/trial/hero.html marketing/landing-pages/trial/proof.htmlpython3 .claude/skills/devils-advocate/scripts/challenge.py \
--statement "We should move our LinkedIn cadence from 3x/week to daily because engagement rose 18% in Q1."cat draft.md | python3 .claude/skills/devils-advocate/scripts/challenge.py --stdinThis is where the skill gets sharp. The critic produces much better work when it knows the positioning, the ICP, and the brief. For branded work, pass the relevant brain files as context so the critique is judged against our actual strategy and audience:
python3 .claude/skills/devils-advocate/scripts/challenge.py \
--files marketing/plans/newsletter-monthly.md \
--context-files brain/positioning-and-messaging.md brain/audience-language.md \
--note "Audience: platform engineers at 500-5000 employee companies. Goal: signups for the newsletter as a pipeline top-of-funnel. Cadence: monthly."Rules of thumb for --context-files:
brain/positioning-and-messaging.md for any marketing content — it keeps the critic inside our ICP and message pillars.brain/truth.md when the work makes product claims, so the critic can flag invented facts.brain/audience-language.md when voice/tone is part of the critique.marketing/plans/pipeline-growth-strategy.md) if the target work should tie into it.brain/ as context. Pick the files that actually apply.python3 .claude/skills/devils-advocate/scripts/challenge.py \
--files marketing/plans/newsletter-monthly.md \
--context-files brain/positioning-and-messaging.md \
--out marketing/reviews/newsletter-monthly-devils-advocate.mdDefault location for saved critiques: marketing/reviews/<target-name>-devils-advocate.md.
Default is gemini-3.1-pro-preview. Other text-capable models on our key include gemini-3-pro-preview, gemini-2.5-pro, gemini-pro-latest. Use a different model only if the user asks, or if the default times out / fails.
python3 .claude/skills/devils-advocate/scripts/challenge.py \
--files plan.md --model gemini-2.5-proThe script auto-detects a target-type hint from the file extensions and paths, but you can set it explicitly with --target-type:
| Value | When to use |
|---|---|
content | Blog posts, landing pages, emails, social posts, case studies, datasheets |
code | HubSpot templates, HTML/CSS/JS, scripts |
plan | Strategy docs, campaign plans, roadmaps, launch plans |
assumption | A belief the team is acting on ("LinkedIn is our best channel") |
decision | A choice the team is about to make ("We should kill the free tier") |
statement | A one-line claim, hypothesis, or framing |
Set this explicitly when the default guess would be wrong. For example, if you pass a .html file from marketing/templates/ and you want it judged as rendered content (not code), pass --target-type content.
The critic always returns Markdown with these sections, in order:
The top of the file is a comment tag identifying which model produced the critique and what target type was assumed, so reviews stay traceable.
Do not silently accept every point the critic makes. It is an outside voice, not an oracle. Your job after running it is:
If the critic returns SHIP, that's a useful signal — but still read the weaknesses section. Good critiques say SHIP with caveats; bad critiques either rubber-stamp or gratuitously complain. Treat suspicious uniformity (all SHIP, all KILL) as a signal to re-run with different context.
A blog draft:
python3 .claude/skills/devils-advocate/scripts/challenge.py \
--files marketing/blog/2026-04-monitoring-is-dead.md \
--context-files brain/positioning-and-messaging.md brain/audience-language.md \
--note "Author: CTO voice. Goal: drive inbound demo requests from security engineers."A positioning statement (inline):
python3 .claude/skills/devils-advocate/scripts/challenge.py \
--statement "[Company] is the only platform that detects AI agent attacks in real time without instrumenting the agent itself." \
--context-files brain/positioning-and-messaging.md brain/truth.md \
--target-type positioningA HubSpot template:
python3 .claude/skills/devils-advocate/scripts/challenge.py \
--files marketing/templates/email-templates/newsletter-monthly-email.html \
--target-type code \
--note "Must render in Outlook 2019, dark mode iOS Mail, and Gmail web."A campaign plan with full context:
python3 .claude/skills/devils-advocate/scripts/challenge.py \
--files marketing/plans/pipeline-growth-strategy.md \
--context-files brain/positioning-and-messaging.md brain/customer-journey.md \
--out marketing/reviews/pipeline-growth-strategy-devils-advocate.md--model gemini-2.5-pro as a fallback.--note "do NOT rewrite prose; challenge logic, evidence, and risk only."brain/positioning-and-messaging.md and brain/truth.md to --context-files and re-run.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.