Visuals Adversarial Skill
Phase 3 of PLEAA-392 (PLEAA-418, 2026-05-06; rebalanced PLEAA-499, 2026-05-07). Two failure modes are now in scope: decorative over-density (visuals that don't carry information) and flat under-density (articles below the density target with low type diversity, leaving the reader staring at long unbroken prose). The bar shifted in PLEAA-499: the reference is the ahrefs-style article — ~10 high-value visuals across 4–7 sections, with type diversity. This skill enforces both directions of the rule.
The orchestrator dispatches this skill after stage 9 (/generate-visuals)
writes the manifest and before stage 10 (/preview). Stage 11
(/capture-visuals) may run between — if so, the adversarial reads the
post-capture manifest. On FAIL with budget remaining, the orchestrator
re-dispatches /generate-visuals with the critique (specifically: which
visuals to strip and which to add) and re-runs this skill.
Dependency on PLEAA-417
This skill is most useful after PLEAA-417 (visuals broadening) lands. Until then, most external visuals fall to manual capture, so the adversarial mostly flags decorative auto-captured screenshots — still useful, but the full value shows up once Reddit / news / competitor-UI captures are real assets the adversarial can judge on its own merits.
In degraded mode (PLEAA-417 not landed yet), the adversarial should still:
- Strip decorative auto-captures of pleasur.ai pages.
- Flag manual-capture entries that the editorial rule says don't earn a visual
at all (so they drop, not move from
manualtonone). - Skip the "is this external screenshot the right crop" question — the assets don't exist yet.
Input
For slug {slug}:
content-pipeline/4-outlines-annotated/{slug}.md(the annotated outline — source of truth for which sections asked for which visuals)content-pipeline/6-drafts-cited/{slug}.md(the cited draft, post-visuals rewrite — to see where visuals actually landed)content-pipeline/images/{slug}/manifest.json(status of each visual)content-pipeline/images/{slug}/manual-capture.md(if present — entries routed to manual)templates/editorial-principles-visuals.md(THE rule)templates/visual-types.md
Process
- Spawn a
Tasksub-agent with the brief below. - Combine into
content-pipeline/quality-checks/{slug}-visuals-adversarial.md. - Print the verdict + CRITICAL count.
Adversarial sub-agent brief
You are a skeptical art director reviewing the visual placement for
{slug}. The principle is intemplates/editorial-principles-visuals.md: the article should feel like the ahrefs reference — high density of high-value visuals (concept-illustrationimages, screenshots, charts, external citations, occasional video/gif), with type diversity. Two failure modes: decorative visuals that add nothing (strip), and low-density / monotype articles that leave the reader staring at unbroken prose (add).Read in order:
templates/editorial-principles-visuals.mdtemplates/visual-types.mdcontent-pipeline/4-outlines-annotated/{slug}.mdcontent-pipeline/6-drafts-cited/{slug}.mdcontent-pipeline/images/{slug}/manifest.jsoncontent-pipeline/images/{slug}/manual-capture.md(if it exists)Compute first:
- Article word count (cited draft).
- Density target from the table in
editorial-principles-visuals.md(5 / 8 / 10 / 12 for <1.2k / 1.2–2k / 2–3k / >3k word articles).- Actual non-
nonevisual count from manifest (status=capturedonly).- Distinct type count (target ≥3).
Push back on six questions:
- Density. Is the captured visual count below the target band? If yes, this is the headline issue — the article reads thin. List specifically which sections deserve a visual but currently have none, and what type each should be.
- Type diversity. Are fewer than 3 distinct types present? If the article is all
screenshotor allchart, it reads narrow. Suggest which type to add (most oftenimagesub=concept-illustration for explanatory diagrams, orexternalfor citing real-world sources).- Decorative visuals. For each visual that landed, ask: does it carry information the prose doesn't? A screenshot of a static marketing page when the prose already describes it is decorative. A lifestyle
imagewith no specific labels is decorative. List specific decorative entries — these should be stripped or upgraded to a more informative type.- Wrong type. Is any visual the wrong type? (A screenshot where a
chartwould carry the data; achartwhere a side-by-sideimagesub=comparison would beat it; a vagueimagelifestyle prompt where aimageconcept-illustration with labels would be far better.)- Crop / framing. For captured assets, does the crop highlight the moment that adds value, or is it a full-page screenshot with the relevant detail buried? Be specific by file path.
- Manual fallthrough. Any entries in
manual-capture.mdthat, by the rule, shouldn't have been requested at all? These should drop rather than be chased.Output:
- 4–10 findings tagged
CRITICAL,HIGH,MEDIUM,LOW.
CRITICAL= the article ships either (a) below the density target by 2+ visuals (reads thin / monotype), or (b) with a visual that actively hurts (decorative in a serious section; chart whose data contradicts the prose; comparison forced into paragraph form). Each missing-densityCRITICALshould name a specific H2 + the suggested type so the revision loop has a placeholder to add.HIGH= density is exactly 1 below target (within the acceptable range floor but tight), or a visual is low-value but not actively harmful.- At least 2 visuals that genuinely earn their place (call out the good).
- A one-line Verdict: PASS or Verdict: FAIL. FAIL if density is below target by 2+ OR if any CRITICAL is open. The FAIL and CRITICAL thresholds are deliberately aligned: a 2-below-target FAIL always carries at least one CRITICAL density finding, so the revision loop's Add step has something concrete to act on.
Do NOT capture replacement visuals or rewrite the draft. Under 700 words.
Output
content-pipeline/quality-checks/{slug}-visuals-adversarial.md. Same skeleton
as the other adversarial skills. ## Verdict: line must be exact.
How the orchestrator handles FAIL
Same loop as the other adversarial skills with stage key visuals:
python scripts/adversarial_runlog.py can-revise {slug} visuals- If budget remains: increment, dispatch a revision pass.
- The revision is two operations rather than re-running stage 9 wholesale:
- Strip: for each
CRITICALdecorative finding, editcontent-pipeline/6-drafts-cited/{slug}.mdto remove theline and merge the surrounding paragraphs. Mark the corresponding manifest entrystatus=strippedwith the adversarial finding ID as the reason. - Add: for each
CRITICALmissing-visual / density finding, append new typed[VISUAL:...]placeholders to the cited draft at the named H2(s) and re-run/generate-visualsfor those placeholders. Preferimage(sub=concept-illustration) for "section needs explanation" gaps — fastest to generate and adds the most type diversity. Useexternalfor "section quotes a real source but has no visual evidence". Usechartfor "section cites a stat but has no chart".
- Strip: for each
- The revision is two operations rather than re-running stage 9 wholesale:
- If exhausted: write
9-needs-review/{slug}.mdand HALT.
Why this skill exists
A draft can fail visually in two ways: (1) ship with 8 decorative
screenshots that read like AI slop, or (2) ship with only 2 lonely visuals
clustered at the bottom and 2,500 words of unbroken prose between them.
Both fail the reader. The editorial principles in
templates/editorial-principles-visuals.md set the bar (ahrefs density,
type diversity, every visual carrying information) but nobody enforces it
after the visuals land — the orchestrator advances if the manifest shows
everything captured, regardless of whether half are wallpaper or whether
the article is 4 visuals short of target. This skill enforces the rule in
both directions.
Historical note (PLEAA-499, 2026-05-07): earlier framing of this skill biased it toward stripping. Pre-PLEAA-499 articles routinely shipped with 2/4 visuals stripped on aesthetic grounds, leaving 1–2 captures total — materially below the editorial bar. The rebalanced version strips the bias: missing visuals at the density target are a CRITICAL finding equal in weight to a decorative visual that hurts.