From oblique-cowork
Write blog articles that read as human-written under AI-detection tools (target QuillBot ≤10% AI), researched from primary sources, paired with a 4-image bundle (hero + 2 inline photographic + 1 data infographic) and a per-article handoff doc. Default mode is pillar long-form (1,500–2,500 words). A `--short` flag reverts to 800–1,000 word SEO/GEO mode. Use whenever Sean asks to "write a blog", "draft a blog post", "write an article", "blog post about [topic]", "pillar article on", "long-form blog about", "anti-ai blog on", "we need a blog about", "blog for [client/site]", "write SEO content", or any variant of long-form web article writing. Replaces the older `blog-writing` skill. Always use this skill — never freeform a blog post without it.
How this skill is triggered — by the user, by Claude, or both
Slash command
/oblique-cowork:anti-ai-blog-writerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Produces blog articles that pass AI-detection tools while remaining strong at SEO and GEO. The skill orchestrates research, drafting (under the Oblique Copywriting Framework), image generation, AI-detector verification with rewrite loop, and markdown plus handoff delivery.
Produces blog articles that pass AI-detection tools while remaining strong at SEO and GEO. The skill orchestrates research, drafting (under the Oblique Copywriting Framework), image generation, AI-detector verification with rewrite loop, and markdown plus handoff delivery.
These seven rules are non-negotiable on every blog, in every mode. The detailed mechanics live in the workflow sections below; this is the always-on subset.
--no-images is set.Claude Outputs/Blog Articles/ using the [NN]-[slug].md convention; respect --client-facing provenance (no visible Claude markers).Before asking Sean for a brief, run a silent vault check so the run starts from what already exists. Do not announce the search; only surface what you found when you state the run plan.
10 - Oblique/Clients/ and check 10 - Oblique/Clients/Client Index.md.Claude Outputs/Blog Articles/ for prior articles on the same site for the cross-link map, house voice and the topic taxonomy already in use.10 - Oblique/Oblique Brand.md if the blog is Oblique's own.If nothing is found, proceed and ask only for what is genuinely missing.
Trigger phrases:
Also trigger when Sean uploads a topic brief, a discovery call note, or a competitive-research output and asks to turn it into a blog.
Do NOT use for:
copywriting)docx for Word, or write directly)copywriting to revise specific sectionsState a brief numbered plan to Sean before generating the article (per Karpathy Principle 4 in CLAUDE.md). Pause for redirect at step 1 if anything is ambiguous.
Confirm or infer:
--short flag: 800–1,000 words.--no-images flag: skip.quillbot. Options: zerogpt, both.--client-facing strips visible Claude markers).State the plan in numbered form:
1. Research: [list of primary sources you'll consult] → verify all numbers current
2. Outline: [list of section headings, word-count targets, cross-link slots]
3. Draft: [length target] under Oblique Copywriting Framework
4. Generate images (in background): hero + 2 inline + 1 infographic
5. AI-detector loop: target ≤10% on [detector]. Rewrite flagged passages up to 3x.
6. Deliver markdown to Claude Outputs/Blog Articles/ + handoff doc.
Wait briefly for Sean to redirect. If silent or "go", proceed.
Apply research-sourcing skill rules: every factual claim cited, sources logged at the draft footer.
What counts as primary:
.gov, .gov.sg, .edu, .edu.sg, .org for established institutionsWhat does NOT count:
Cross-check every number against at least one secondary source. If they disagree, surface the disagreement in the draft (don't pick silently).
Verify gate: every numeric claim has a primary-source URL. Sources dated within the last 18 months unless the fact is historical (e.g., a policy change date).
Write the outline before drafting. The outline should list:
Verify gate: outline word count totals to within ±10% of the target range.
Apply the Oblique Copywriting Framework hard bans below. Write the body. The opening hook is the most-flagged passage in AI detection — give it the most rhythm variation and the most specificity.
Verify gate: scan the full draft against the 10-point hard ban list before moving to step 5. Reject and rewrite any violation.
Skip entirely if --no-images.
The 4-image standard bundle:
gpt-image-2-text-to-image, 16:9, quality: high, size 1792x1024). The article's central data point rendered as clean typography on cream off-white. No clip art, no decorative icons, just text and minimal layout. Use muted terracotta highlights for emphasis.Use the batch script at templates/generate-images.js. Run with run_in_background: true so the AI-detector loop can proceed in parallel.
Verify gate: all 4 files exist at Claude Outputs/Blog Articles/images/[slug]/ and each is >100 KB.
Run the body through the chosen detector (default QuillBot via Chrome MCP). The plain-text body for testing should be:
## headers, no | table delimiters, no ** bold markers)Claude Outputs/Blog Articles/images/[slug]/quillbot-body.txt for repeatabilityQuillBot flow (full mechanics in templates/quillbot-detection-flow.md):
templates/split-body-for-quillbot.js into Chunk A (≤1,050 words) and Chunk B (remainder).Get-Content [path] -Raw | Set-Clipboard.https://quillbot.com/ai-content-detector. Click the editor textbox (coordinate-based click, around the centre of the visible textbox). Send Ctrl+V. Wait 3 seconds.Detect AI button. Wait 6–8 seconds. Read the score from the result panel.localStorage.clear(); sessionStorage.clear(); plus a cookie-loop deletion), reload the page, retry.https://www.zerogpt.com/ (full-body, 15,000 char limit).Rewrite loop:
Note on detector calibration:
--detector zerogpt is explicitly chosen.Verify gate: the final AI score is ≤10% on the primary detector. Score is logged in the frontmatter ai_detector_score field.
Save the article to Claude Outputs/Blog Articles/[NN]-[slug].md where [NN] is a two-digit batch number (use 01 for single articles).
The frontmatter must include:
---
title: "..."
slug: ...
topic: ... # one of the available topics on the target site
excerpt: "..." # ~160 chars
publishedAt: YYYY-MM-DDTHH:MM:SSZ
coverImage: images/[slug]/hero.jpg
inlineImages:
- images/[slug]/inline-1.jpg
- images/[slug]/inline-2.jpg
- images/[slug]/infographic-[descriptor].png
generated_by: claude
generated_date: DD/MM/YYYY
source_skill: anti-ai-blog-writer
ai_detector_score: "X% (QuillBot v7.1.0, DD/MM/YYYY, [details])"
---
Write a per-article handoff at Claude Outputs/Blog Articles/[NN]-HANDOFF.md using templates/handoff.md as the base. Include:
Verify gate: article markdown opens cleanly, all 4 image references resolve to existing files, handoff doc is in the same folder.
| Flag | Default | Effect |
|---|---|---|
| length | pillar (1,500–2,500 words) | --short = 800–1,000 words |
| images | on (4 images) | --no-images skips image generation entirely |
| detector | quillbot | --detector zerogpt or --detector both |
| AI gate | ≤10% AI | hardcoded, do not relax without Sean's explicit override |
| output | Claude Outputs/Blog Articles/ | per CLAUDE.md Output Conventions |
| provenance | internal markers in frontmatter | --client-facing strips visible markers, keeps metadata only |
| Failure | Fallback |
|---|---|
| QuillBot rate-limited / login modal blocks | Clear cookies + localStorage, reload, retry. If still blocked, switch to ZeroGPT and log both that QuillBot was unreachable and the ZeroGPT score with the calibration caveat. |
| Image gen network blip (one or more files fail) | Re-run the generate-images.js script. It skips files that already exist on disk and only retries the missing ones. |
| AI score stays above 10% after 3 rewrite attempts | Stop. Escalate to Sean with: the current score, the highlighted passages, the rewrite history. Do not silently lower the gate. |
| Primary source unavailable for a key claim | Surface the gap. Either rewrite around it or ask Sean for guidance. Do not fabricate a citation. |
| Length undershoots after first draft | Add depth via worked examples, additional context, expanded methodology — not filler. If you can't reach the target without filler, the topic isn't pillar-sized; recommend --short. |
| Length overshoots | Cut the weakest section. Pillar quality matters more than hitting 2,500 exactly. |
Internal-only files (drafts staying in the vault): YAML frontmatter is fine. generated_by: claude, generated_date, source_skill: anti-ai-blog-writer.
Client-facing deliverables (--client-facing flag): NO visible "Built by Claude" markers anywhere — not in body, not in footers, not in signatures. Use document metadata (the YAML frontmatter is internal; if the body is being copied into a CMS like WordPress or aiproperty.sg admin, the frontmatter doesn't ship). Folder location (Claude Outputs/) and filename convention provide the system-level marker.
This skill orchestrates rather than reinvents. Layer 1 primitives and meta/gate skills it calls:
imagery and nano-banana (Layer 1) — image generation, invoked via the batch script. The hero and inline photos use Nano Banana 2; the data infographic uses imagery. Don't manually call them per-image; let the script orchestrate.research-sourcing (meta/gate) — automatically applied when web research is performed; every claim cited.copywriting (meta/gate) — voice and Oblique rule enforcement; the Step 4 hard bans are the inline always-on subset. Scope: the full article body, headlines and excerpt are customer-facing copy and pass this gate.claude-in-chrome MCP (tooling, not a skill) — QuillBot / ZeroGPT detection automation.Do not duplicate these skills' logic. If something in this skill's spec drifts from theirs, update this one to align.
All in templates/ next to this SKILL.md:
frontmatter.yaml — YAML frontmatter template with required and optional fieldshandoff.md — per-article handoff doc templategenerate-images.js — Kie.ai image batch script (Node.js). Customise ITEMS per article. Run via node generate.js with KIE_API_KEY env var set.split-body-for-quillbot.js — body chunker. Splits at a paragraph boundary near the 1,050-word mark.quillbot-detection-flow.md — step-by-step Chrome MCP flow for the QuillBot detector, with screenshots of common UI states (login modal, rate-limit spinner, result panel layout) and the recovery patterns.ai-tell-ban-list.md — full Oblique Copywriting Framework hard bans, copy of the inline list above plus extended examples.Dated history and migration/validation notes live in CHANGELOG.md.
Per CLAUDE.md, after modifying this skill, keep Skills Map.md and AI Vault Map.md in sync.
If QuillBot's model version changes or their UI changes such that the Chrome MCP flow breaks, update templates/quillbot-detection-flow.md accordingly. If ZeroGPT or any successor detector becomes the new authority, the AI-detector loop in step 6 changes; everything else stays.
npx claudepluginhub seanng23/oblique-power-skills --plugin oblique-coworkSets up isolated workspaces using native worktree tools or git worktree fallback. Use before starting feature work to protect the current branch.