LLM-as-judge quality gate. Before any deliverable ships, spawn an independent critic subagent (or N critics with distinct lenses) that ADVERSARIALLY grades the artifact against an explicit rubric, returns PASS/FAIL + a prioritized fix list, and loops (build → critique → fix) until it passes or N rounds hit. The builder must NOT grade its own work. Critic defaults to FAIL on uncertainty. Output is a scorecard + prioritized fixes + a hard ship/no-ship verdict. Domain rubrics baked in for SkynetLabs work: client website, content/copy, automation/n8n, Upwork/Fiverr proposal. Generic mode takes any artifact + rubric. Multi-critic mode runs 3 lenses + majority vote (ties to fanout-ship pattern). Trigger when user says: "critic loop", "/critic-loop", "judge this", "grade this before I send", "is this good enough to ship", "quality gate", "have a critic review", "second-agent review", or before ANY billable deliverable leaves. Auto-trigger heuristic: a deliverable (site, copy, workflow, proposal, audit) is about to b
LLM-as-judge quality gate. Operationalizes the "2nd agent grades/self-corrects
before you accept" lesson (claude-code-mastery, video 8). SkynetLabs only had the
manual /review; this is the automated gate that runs before a deliverable ships.
Core principle
The builder never grades its own work. A model that wrote an artifact is biased
toward approving it. Spawn a SEPARATE critic agent with a clean context, give it the
artifact + rubric + adversarial framing, and let IT decide. Loop until PASS.
build → spawn critic (FAIL-biased) → PASS? ship : apply fixes → re-critique
↑________________________________________|
max N rounds (default 3)
When to use
USE before:
A client deliverable is sent (website, copy, audit, proposal, automation)
Type — one of: website | copy | automation | proposal | generic
Rubric — auto-selected from type (below), or user-supplied for generic
Mode — single (1 critic, default) | multi (3 lenses, majority vote)
Max rounds — default 3
Pass bar — default: ZERO blockers + score ≥ 85/100
If type unclear → ASK before spawning. Wrong rubric = useless verdict.
The recipe
1. Classify + load rubric
Detect artifact type. Load the matching rubric from rubrics/<type>.md (or the
inline blocks below). For generic, demand a rubric from the user — never invent
acceptance criteria silently.
2. Snapshot the artifact
Code/diff: git diff <base> > .critic/round-N.diff
Site: capture URL + run /browse or /qa to gather live evidence (CWV, links)
Copy: save the exact text to .critic/round-N.txt
Proposal: save text + the original JD it answers
Critic grades the SNAPSHOT, not a moving target.
3. Spawn critic(s) — ONE message
single mode: 1 Agent call with the critic prompt.
multi mode: 3 Agent calls IN ONE MESSAGE (true parallel), each a distinct lens:
Lens A — Correctness/Function: does it work, is it true, no broken parts
Lens B — Standards/Craft: meets the domain rubric, polish, brand
Lens C — Adversary/Risk: what breaks in prod, secrets, legal, edge cases
Each critic gets a CLEAN context (subagent_type: general-purpose) and the
adversarial prompt below. Critics do NOT see each other's verdicts.
4. Collect verdicts
single: that verdict is final.
multi: majority vote. 2/3 PASS → PASS. Tie/any blocker → FAIL (default to
caution). ANY critic raising a SECURITY blocker → FAIL regardless of vote.
5. Loop or ship
PASS → emit final scorecard + ship verdict. Done.
FAIL → take the prioritized fix list, apply fixes (builder context), bump round,
go to step 2. Stop at max rounds.
Hit max rounds still failing → STOP. Emit scorecard + remaining blockers +
NO-SHIP verdict. Escalate to human. Do NOT ship a failing artifact.
6. Hard security gate
If the artifact touches secrets / credentials / deploy / payment / PII, run
/security-review (or a dedicated Lens C security pass) as a NON-NEGOTIABLE gate
BEFORE the ship verdict, even if all critics passed. Exposed secret = auto NO-SHIP.
Adversarial critic prompt (the heart of it)
Each spawned critic gets THIS (vars filled):
You are an INDEPENDENT critic. You did NOT build this artifact. Your job is to
REFUTE it — find every fault, not to praise it. You are the last line before this
reaches a paying client. A miss costs the agency its reputation.
ARTIFACT TYPE: <type>
ARTIFACT: <path / url / inline text / diff>
LENS (multi-mode only): <A correctness | B craft | C adversary>
RUBRIC (grade against EACH line, cite evidence):
<rubric criteria>
RULES:
- Default to FAIL. Approve ONLY if you cannot find a real fault.
- Every claim of a fault MUST cite the exact line / element / sentence.
- Do NOT invent praise to soften. No "looks great overall."
- Severity each finding: BLOCKER (cannot ship) | MAJOR | MINOR | NIT.
- If you are UNCERTAIN whether something is correct → treat as a fault and FAIL.
- Check the artifact against the rubric ONLY. No scope creep.
OUTPUT (exactly this shape):
## Verdict: PASS | FAIL
## Score: <0-100>
## Blockers (must fix to ship)
1. [location] problem → required fix
## Major
...
## Minor / Nits
...
## Evidence checked
<what you actually inspected: ran links? viewed render? grepped secrets?>
ultrathink before grading. Be specific. Be harsh. Be fair.
Baked-in domain rubrics
Full versions in rubrics/. Summaries:
(a) website — rubrics/website.md
Responsive: no horizontal scroll / broken layout at 375 / 768 / 1440px
Zero broken links (internal + external) — critic must actually check
SEO meta present: unique <title>, meta description, OG tags per page
Schema.org JSON-LD present + valid for page type (LocalBusiness/Article/etc)
Core Web Vitals: LCP < 2.5s, CLS < 0.1, no render-blocking obvious sins
NO lorem ipsum, NO placeholder text, NO # dead hrefs, NO TODO comments
All images have alt text + are not broken
Favicon + 404 page exist
Forms submit somewhere real (not action="")
BLOCKER if: any lorem/placeholder, broken link, missing title/meta, layout break
(b) content / copy — rubrics/copy.md
Run /humanizer check — no AI tells (em-dash overuse, rule-of-three,
"in today's fast-paced", negative parallelisms, inflated symbolism)
NO fabricated claims, fake stats, invented testimonials, or unverifiable numbers
Brand voice matches (for the author: contrarian hook → reframe → arrow lines →
vulnerability beat → CTA; 1 local authenticity anchor; 1 real client win)
Reading level + length fit the channel
CTA present and singular
No spelling/grammar errors; no broken markdown/links
Default to caution: when the vote is ambiguous, FAIL.
Cost model
single mode: ~1 critic agent per round × rounds. Cheap. Default for most work.
multi mode: ~3 critic agents per round (parallel). Use for high-stakes / large
deliverables (flagship site, big proposal, client-facing automation).
Loop converges fast: most artifacts PASS by round 2-3. If round 3 still fails,
the artifact has a structural problem — rebuild, don't keep patching.
Break-even: any billable deliverable. One caught lorem-ipsum or exposed key pays
for a year of critic runs.
Integration with existing skills
Use AFTER builder skills: skynet-site, flagship-build, social-stack,
upwork-proposal, aeo-daily, n8n builds — critic-loop is the gate they exit through.
Complements /review (pre-landing PR) — /review is for code diffs; critic-loop
is for finished deliverables of any type.
Pairs with fanout-ship: fan out N builds → critic-loop each before integration.
Failure modes + fixes
Failure
Cause
Fix
Critic rubber-stamps everything
Not adversarial / builder graded itself
Use the FAIL-default prompt; spawn SEPARATE agent
Loop never converges
Same blocker re-introduced each round
Stop at max rounds → rebuild, don't patch
Critic invents fake faults
Hallucinated criteria
Pin rubric; "grade against rubric ONLY, cite evidence"
Passed but broke in prod
Critic didn't actually check (links/render)
Force "Evidence checked" section; run /qa /browse for real
Secret shipped despite PASS
No security gate
Hard gate step 6 — auto NO-SHIP on any secret
Multi-critic all agree wrongly
Same blind spot, same context
Give each a DISTINCT lens; one is pure adversary
Anti-patterns
❌ Builder grading its own artifact (bias = false PASS)
❌ Critic with a soft/balanced prompt (must default to FAIL)
❌ Vague rubric / no rubric (verdict is meaningless)
❌ Shipping after max rounds while still failing (escalate instead)
❌ Skipping the security gate because "critics passed"
❌ Spawning the 3 multi-critics in separate messages (loses parallelism)
❌ Letting the critic grade a moving target (snapshot first)
1---2name: critic-loop3description: LLM-as-judge quality gate. Before any deliverable ships, spawn an independent critic subagent (or N critics with distinct lenses) that ADVERSARIALLY grades the artifact against an explicit rubric, returns PASS/FAIL + a prioritized fix list, and loops (build → critique → fix) until it passes or N rounds hit. The builder must NOT grade its own work. Critic defaults to FAIL on uncertainty. Output is a scorecard + prioritized fixes + a hard ship/no-ship verdict. Domain rubrics baked in for SkynetLabs work: client website, content/copy, automation/n8n, Upwork/Fiverr proposal. Generic mode takes any artifact + rubric. Multi-critic mode runs 3 lenses + majority vote (ties to fanout-ship pattern). Trigger when user says: "critic loop", "/critic-loop", "judge this", "grade this before I send", "is this good enough to ship", "quality gate", "have a critic review", "second-agent review", or before ANY billable deliverable leaves. Auto-trigger heuristic: a deliverable (site, copy, workflow, proposal, audit) is about to b4license: MIT5---67# critic-loop89LLM-as-judge quality gate. Operationalizes the "2nd agent grades/self-corrects10before you accept" lesson (claude-code-mastery, video 8). SkynetLabs only had the11manual `/review`; this is the automated gate that runs before a deliverable ships.1213## Core principle1415**The builder never grades its own work.** A model that wrote an artifact is biased16toward approving it. Spawn a SEPARATE critic agent with a clean context, give it the17artifact + rubric + adversarial framing, and let IT decide. Loop until PASS.1819```20build → spawn critic (FAIL-biased) → PASS? ship : apply fixes → re-critique21 ↑________________________________________|22 max N rounds (default 3)23```2425## When to use2627USE before:2829- A client deliverable is sent (website, copy, audit, proposal, automation)30- A deploy / publish / `git push` to production31- Anything with secrets, credentials, or money flow3233SKIP when:3435- Throwaway scratch work, internal notes, exploratory spikes36- Already passed critic this session AND artifact unchanged37- Time-critical hotfix where the fix is trivial + reversible (still log it)3839## Inputs required40411. **Artifact** — path(s), URL, pasted text, or git diff (`git diff main`)422. **Type** — one of: `website` | `copy` | `automation` | `proposal` | `generic`433. **Rubric** — auto-selected from type (below), or user-supplied for `generic`444. **Mode** — `single` (1 critic, default) | `multi` (3 lenses, majority vote)455. **Max rounds** — default 3466. **Pass bar** — default: ZERO blockers + score ≥ 85/1004748If type unclear → ASK before spawning. Wrong rubric = useless verdict.4950## The recipe5152### 1. Classify + load rubric5354Detect artifact type. Load the matching rubric from `rubrics/<type>.md` (or the55inline blocks below). For `generic`, demand a rubric from the user — never invent56acceptance criteria silently.5758### 2. Snapshot the artifact5960- Code/diff: `git diff <base> > .critic/round-N.diff`61- Site: capture URL + run `/browse` or `/qa` to gather live evidence (CWV, links)62- Copy: save the exact text to `.critic/round-N.txt`63- Proposal: save text + the original JD it answers6465Critic grades the SNAPSHOT, not a moving target.6667### 3. Spawn critic(s) — ONE message6869`single` mode: 1 `Agent` call with the critic prompt.70`multi` mode: 3 `Agent` calls IN ONE MESSAGE (true parallel), each a distinct lens:7172- **Lens A — Correctness/Function:** does it work, is it true, no broken parts73- **Lens B — Standards/Craft:** meets the domain rubric, polish, brand74- **Lens C — Adversary/Risk:** what breaks in prod, secrets, legal, edge cases7576Each critic gets a CLEAN context (`subagent_type: general-purpose`) and the77adversarial prompt below. Critics do NOT see each other's verdicts.7879### 4. Collect verdicts8081- `single`: that verdict is final.82- `multi`: majority vote. 2/3 PASS → PASS. Tie/any blocker → FAIL (default to83 caution). ANY critic raising a SECURITY blocker → FAIL regardless of vote.8485### 5. Loop or ship8687- PASS → emit final scorecard + ship verdict. Done.88- FAIL → take the prioritized fix list, apply fixes (builder context), bump round,89 go to step 2. Stop at max rounds.90- Hit max rounds still failing → STOP. Emit scorecard + remaining blockers +91 **NO-SHIP** verdict. Escalate to human. Do NOT ship a failing artifact.9293### 6. Hard security gate9495If the artifact touches secrets / credentials / deploy / payment / PII, run96`/security-review` (or a dedicated Lens C security pass) as a NON-NEGOTIABLE gate97BEFORE the ship verdict, even if all critics passed. Exposed secret = auto NO-SHIP.9899## Adversarial critic prompt (the heart of it)100101Each spawned critic gets THIS (vars filled):102103```104You are an INDEPENDENT critic. You did NOT build this artifact. Your job is to105REFUTE it — find every fault, not to praise it. You are the last line before this106reaches a paying client. A miss costs the agency its reputation.107108ARTIFACT TYPE: <type>109ARTIFACT: <path / url / inline text / diff>110LENS (multi-mode only): <A correctness | B craft | C adversary>111112RUBRIC (grade against EACH line, cite evidence):113<rubric criteria>114115RULES:116- Default to FAIL. Approve ONLY if you cannot find a real fault.117- Every claim of a fault MUST cite the exact line / element / sentence.118- Do NOT invent praise to soften. No "looks great overall."119- Severity each finding: BLOCKER (cannot ship) | MAJOR | MINOR | NIT.120- If you are UNCERTAIN whether something is correct → treat as a fault and FAIL.121- Check the artifact against the rubric ONLY. No scope creep.122123OUTPUT (exactly this shape):124## Verdict: PASS | FAIL125## Score: <0-100>126## Blockers (must fix to ship)1271. [location] problem → required fix128## Major129...130## Minor / Nits131...132## Evidence checked133<what you actually inspected: ran links? viewed render? grepped secrets?>134135ultrathink before grading. Be specific. Be harsh. Be fair.136```137138## Baked-in domain rubrics139140Full versions in `rubrics/`. Summaries:141142### (a) website — `rubrics/website.md`143144- [ ] Responsive: no horizontal scroll / broken layout at 375 / 768 / 1440px145- [ ] Zero broken links (internal + external) — critic must actually check146- [ ] SEO meta present: unique `<title>`, meta description, OG tags per page147- [ ] Schema.org JSON-LD present + valid for page type (LocalBusiness/Article/etc)148- [ ] Core Web Vitals: LCP < 2.5s, CLS < 0.1, no render-blocking obvious sins149- [ ] NO lorem ipsum, NO placeholder text, NO `#` dead hrefs, NO TODO comments150- [ ] All images have alt text + are not broken151- [ ] Favicon + 404 page exist152- [ ] Forms submit somewhere real (not `action=""`)153- BLOCKER if: any lorem/placeholder, broken link, missing title/meta, layout break154155### (b) content / copy — `rubrics/copy.md`156157- [ ] Run `/humanizer` check — no AI tells (em-dash overuse, rule-of-three,158 "in today's fast-paced", negative parallelisms, inflated symbolism)159- [ ] NO fabricated claims, fake stats, invented testimonials, or unverifiable numbers160- [ ] Brand voice matches (for the author: contrarian hook → reframe → arrow lines →161 vulnerability beat → CTA; 1 local authenticity anchor; 1 real client win)162- [ ] Reading level + length fit the channel163- [ ] CTA present and singular164- [ ] No spelling/grammar errors; no broken markdown/links165- BLOCKER if: fabricated claim, fails humanizer hard-fail, wrong brand for channel166167### (c) automation / n8n — `rubrics/automation.md`168169- [ ] Error handling on every external call (retry / error branch / no silent fail)170- [ ] NO exposed secrets — keys in credentials store, not in node params / code / URLs171- [ ] Idempotent: re-running won't double-charge / double-send / duplicate records172- [ ] Webhook auth / signature verification where applicable173- [ ] Rate-limit + timeout handling on HTTP nodes174- [ ] Validated via n8n-mcp `validate_workflow` (no orphan nodes, valid expressions)175- [ ] Timezone correct (America/New_York for GHL, NOT America/Cancun — known trap)176- [ ] Logging / observability on failure path177- BLOCKER if: any exposed secret, no error handling on money/send action, non-idempotent178179### (d) Upwork / Fiverr proposal — `rubrics/proposal.md`180181- [ ] Mirrors the JD: echoes the client's exact words / stack / outcome in first 2 lines182- [ ] Price anchored (a number or range stated with rationale, not "let's discuss")183- [ ] Real proof woven in (named relevant SkynetLabs win, not generic flattery)184- [ ] 2-3 sharp questions that prove expertise + qualify the client185- [ ] Presumptive CTA (assumes next step: "I can start Monday — want the Loom?")186- [ ] 120-180 words, no AI-template smell, no "I am writing to express my interest"187- [ ] Red flags in JD surfaced (scope creep, low budget, vague deliverable)188- BLOCKER if: doesn't mirror JD, no price anchor, no questions, generic/templated189190## Scorecard output (final)191192Emit exactly this when the loop ends:193194```195═══ CRITIC-LOOP SCORECARD ═══196Artifact: <name/path> Type: <type> Mode: <single|multi>197Rounds run: <n>/<max> Pass bar: 0 blockers + ≥85198199Round history:200 R1: FAIL (score 62) — 3 blockers, 5 major201 R2: FAIL (score 79) — 0 blockers, 2 major202 R3: PASS (score 91) — 0 blockers, 1 nit (accepted)203204Multi-critic vote (if multi): A PASS · B PASS · C PASS → 3/3 PASS205Security gate: PASS (no secrets) | N/A | FAILED206207Remaining (non-blocking):208 - [MINOR] <thing> — optional polish209210VERDICT: ✅ SHIP | ⛔ NO-SHIP (escalate)211```212213## Files214215- `rubrics/website.md` — full client-site rubric (responsive/links/SEO/schema/CWV/placeholder)216- `rubrics/copy.md` — content rubric (humanizer + no-fake-claims + brand voice)217- `rubrics/automation.md` — n8n rubric (error handling/secrets/idempotency/tz)218- `rubrics/proposal.md` — Upwork/Fiverr rubric (mirror JD/price/questions/CTA)219- `rubrics/generic.md` — template: how to author a one-off rubric220- `prompts/critic.md` — full adversarial critic prompt (copy-fill)221- `prompts/lenses.md` — the 3 multi-critic lens definitions (A/B/C)222- `scripts/snapshot.sh` — capture diff/text/url evidence into `.critic/round-N.*`223- `scripts/spawn-block.md` — copy-paste Agent call block (1 or 3 critics)224- `scripts/tally-votes.md` — majority-vote + security-veto decision logic225- `templates/scorecard.md` — final scorecard template226227## Decision logic (multi-mode)228229| Critics | Blocker raised? | Security blocker? | Verdict |230| ---------------------- | --------------- | ----------------- | ------------------------------ |231| 3/3 PASS | no | no | SHIP |232| 2/3 PASS | no | no | SHIP |233| 2/3 PASS | yes (1 critic) | no | FAIL — fix blocker, re-loop |234| 1/3 PASS | — | — | FAIL |235| any | — | yes | NO-SHIP (auto, overrides vote) |236| max rounds, still FAIL | — | — | NO-SHIP — escalate to human |237238Default to caution: when the vote is ambiguous, FAIL.239240## Cost model241242- `single` mode: ~1 critic agent per round × rounds. Cheap. Default for most work.243- `multi` mode: ~3 critic agents per round (parallel). Use for high-stakes / large244 deliverables (flagship site, big proposal, client-facing automation).245- Loop converges fast: most artifacts PASS by round 2-3. If round 3 still fails,246 the artifact has a structural problem — rebuild, don't keep patching.247248Break-even: any billable deliverable. One caught lorem-ipsum or exposed key pays249for a year of critic runs.250251## Integration with existing skills252253- Use AFTER builder skills: `skynet-site`, `flagship-build`, `social-stack`,254 `upwork-proposal`, `aeo-daily`, n8n builds — critic-loop is the gate they exit through.255- Critic CAN call: `/humanizer` (copy), `/qa` + `/browse` (site), n8n-mcp256 `validate_workflow` (automation), `/security-review` (secrets gate).257- Complements `/review` (pre-landing PR) — `/review` is for code diffs; critic-loop258 is for finished deliverables of any type.259- Pairs with `fanout-ship`: fan out N builds → critic-loop each before integration.260261## Failure modes + fixes262263| Failure | Cause | Fix |264| ------------------------------- | ------------------------------------------- | ---------------------------------------------------------- |265| Critic rubber-stamps everything | Not adversarial / builder graded itself | Use the FAIL-default prompt; spawn SEPARATE agent |266| Loop never converges | Same blocker re-introduced each round | Stop at max rounds → rebuild, don't patch |267| Critic invents fake faults | Hallucinated criteria | Pin rubric; "grade against rubric ONLY, cite evidence" |268| Passed but broke in prod | Critic didn't actually check (links/render) | Force "Evidence checked" section; run /qa /browse for real |269| Secret shipped despite PASS | No security gate | Hard gate step 6 — auto NO-SHIP on any secret |270| Multi-critic all agree wrongly | Same blind spot, same context | Give each a DISTINCT lens; one is pure adversary |271272## Anti-patterns273274- ❌ Builder grading its own artifact (bias = false PASS)275- ❌ Critic with a soft/balanced prompt (must default to FAIL)276- ❌ Vague rubric / no rubric (verdict is meaningless)277- ❌ Shipping after max rounds while still failing (escalate instead)278- ❌ Skipping the security gate because "critics passed"279- ❌ Spawning the 3 multi-critics in separate messages (loses parallelism)280- ❌ Letting the critic grade a moving target (snapshot first)
Run npx skillmds@latest add waseemnasir2k26/critic-loop in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
LLM-as-judge quality gate. Before any deliverable ships, spawn an independent critic subagent (or N critics with distinct lenses) that ADVERSARIALLY grades the artifact against an explicit rubric, returns PASS/FAIL + a prioritized fix list, and loops (build → critique → fix) until it passes or N rounds hit. The builder must NOT grade its own work. Critic defaults to FAIL on uncertainty. Output is a scorecard + prioritized fixes + a hard ship/no-ship verdict. Domain rubrics baked in for SkynetLabs work: client website, content/copy, automation/n8n, Upwork/Fiverr proposal. Generic mode takes any artifact + rubric. Multi-critic mode runs 3 lenses + majority vote (ties to fanout-ship pattern). Trigger when user says: "critic loop", "/critic-loop", "judge this", "grade this before I send", "is this good enough to ship", "quality gate", "have a critic review", "second-agent review", or before ANY billable deliverable leaves. Auto-trigger heuristic: a deliverable (site, copy, workflow, proposal, audit) is about to b It is listed under AI & ML on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free. This skill is licensed under MIT.
waseemnasir2k26 (@waseemnasir2k26) published this skill. Their other Agent Skills are listed on their SkillMD profile.