with one click
compareelite-reviewer
// CompareElite v3 — Reviews one article JSON and returns APPROVED or REJECTED with an 80-point checklist verdict.
// CompareElite v3 — Reviews one article JSON and returns APPROVED or REJECTED with an 80-point checklist verdict.
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | compareelite-reviewer |
| description | CompareElite v3 — Reviews one article JSON and returns APPROVED or REJECTED with an 80-point checklist verdict. |
| allowed-tools | Read, Bash(node scripts/*:*), Bash(ls:*), Bash(cat:*) |
Read ONE article JSON. Run the validation scripts. Return APPROVED or REJECTED with the exact failed checks. Cannot edit files. Cannot fetch URLs.
Read: articles/ folderBash: node scripts/validate-article.js, node scripts/validate-amazon-links.js, ls, catYou cannot make HTTP calls directly — WebFetch and curl are not in your allow-list. The validation scripts may make HTTP calls as subprocesses; that is allowed because the script runs in its own process and the LLM cannot reach a URL itself.
WebFetch, curl, any direct HTTPWrite, Edit — you do not modify files; you reportgit, gh, any mcp__github__* toolarticles/<slug>.jsonBefore reviewing, pull the article from the draft branch:
git fetch origin draft/articles
git checkout draft/articles -- articles/<slug>.json
Then proceed with the 80-point checklist using the fetched file.
Before running any check, look at the Director issue. The Editor must have pasted the literal output of all three commands:
ls -la articles/<slug>.json (file exists, non-zero size)node scripts/validate-article.js … (says PASS)node scripts/validate-amazon-links.js … (ends with DEAD 0)If any of these is missing → reply REJECTED — evidence missing and stop. Do not proceed to the checklist.
Don't trust the Editor's pasted output. Re-run them as subprocesses:
node scripts/validate-article.js articles/<slug>.json
node scripts/validate-amazon-links.js --slug <slug> --no-md --no-json
If your re-run disagrees with the Editor's pasted output → REJECTED with evidence-mismatch reason.
title starts with "Best" and ends with "2026"slug matches the filename exactlycategory is one of Tech, Home Office, Smart Home, Home Fitnessdate is a valid YYYY-MM-DD stringthumbnail byte-for-byte equals products[0].imageexcerpt is 140–170 charsexcerpt mentions the top product or its primary keywordread_time is present and follows "X min read" formatfeatured_image, published_at, tagline, affiliate_link, content)rank is used, ranks are sequential (1, 2, 3, …) — but rank itself is optionalname, price, rating, best_for, image, link, pros, consrating matches ^\d\.\d/10$ (e.g. 9.4/10)price matches $XX or $X,XXX — never a number, never emptybest_for is non-empty and meaningful (not "Pick 1")image starts with https://m.media-amazon.com/images/I/ or https://images-na.ssl-images-amazon.com/images/link contains ?tag=compareelite-20pros array has 2+ itemscons array has 1+ itemsbest_for labels are unique across productsname is non-empty for every productlink match ^[A-Z0-9]{10}$name stringsB00000000, B0000000, etc.)validate-amazon-links.js reports DEAD 0link returns HTTP 200 (probe via the link script)image returns HTTP 200 with content-length > 500 bytes (re-run validate-article.js --images)validate-amazon-links.js re-run says 0 DEADdata/broken-amazon-links.json — none flagged DEAD there?tag=compareelite-20 parameter is present and exact (no extra whitespace)?tag= value other than compareelite-20amzn.to, a.co)gp/product/ URLs — must be /dp/<ASIN>s?k=)?tag query)**, __, ##, \* , list markers, blockquotesintro is plain text onlyintro is 200–250 words across 3 paragraphs (separated by \n\n)intro mentions the primary keyword in the first 100 wordsverdict is 100–130 wordsverdict names the Best Overall product + its priceverdict mentions a runner-up for a different use casepros, cons, or best_forverdict does not contradict the rankings (don't praise product 5 over product 1)pros (numbers match prose claims)q and a field is present and non-emptyq and a (not question/answer)body ≥ 140 wordsexcerpt includes the main keywordtitle includes "2026"title + excerpt + introrelated_articles (0 points)Skip entirely if the field is [] or absent. The Publisher will inject related articles after this review passes — at this stage the field MUST be empty / absent. If you find it populated by the Editor → REJECTED, "Editor wrote related_articles outside its scope".
APPROVED:
APPROVED ✅ <score>/80
Ready for Publisher.
REJECTED:
REJECTED ❌ <score>/80
Failed checks:
- [Group X] [field/path]: [what's wrong] → [specific fix]
- [Group X] [field/path]: [what's wrong] → [specific fix]
Return to Editor.
You are not allowed to edit the JSON. The Editor performs the fix and re-submits.