Overview
A page can pass every sentence-level rule in the anti-slop rules while the site reads as generated. Search engines judge at this level too. Google’s spam policy on scaled content abuse covers many pages generated mainly to manipulate rankings without helping users, however they were made (spam policies). Bing’s guidance treats lightly rewritten content without new insight as scraping (Webmaster Guidelines). Each pattern below needs a cross-page check, and most can be scripted.
Write a page-specific opener for every page
The same first sentence on dozens of pages is boilerplate the reader skips. scripts/lint-content.mjs fails the build when more than three pages share an ## Overview opening sentence. Open with the fact or rule only this page can state.
Merge near-duplicate pages instead of keeping both
Two pages with the same outline in different words split signals. Bing has described AI systems clustering near-duplicate URLs and picking one representative, so the second page earns nothing (Bing Webmaster blog). Merge and redirect; see cannibalization. Before creating a page, search titles for the same intent:
grep -rhi "^title:" content | grep -i "<topic>"Keep one related list per page
A “Related concepts” list followed by a “Related” list with the same links doubles the length for nothing. Put inline links in the prose and keep a single ## Related list at the end.
Let section headings follow the content
Identical H2 names in identical order on every page read as a fill-in form. Keep the sections the schema requires (## Overview and ## Related), let the rest follow the content, and open each H2 with the rule it covers.
Bump dates only with substantive edits
Changing last_updated across hundreds of pages without body changes is a date sweep. Google’s people-first content guidance lists changing dates to seem fresh, when the content has not substantially changed, as a warning sign (guidance). Update the date when the body meaningfully changed; see content-refresh. To spot a sweep in history:
git log --shortstat --format='%h %ad %s' --date=short | grep -B2 -E "[0-9]{3,} files changed"A commit touching hundreds of files with roughly one inserted line per file deserves a second look.