<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: doodoolove</title>
    <description>The latest articles on DEV Community by doodoolove (@doodoolove).</description>
    <link>https://dev.to/doodoolove</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3903443%2Fadecfe92-4be1-4b6d-a848-25e87727ac48.png</url>
      <title>DEV Community: doodoolove</title>
      <link>https://dev.to/doodoolove</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/doodoolove"/>
    <language>en</language>
    <item>
      <title>Why We Banned 'Within the Realm of...' From Our AI Game Descriptions</title>
      <dc:creator>doodoolove</dc:creator>
      <pubDate>Wed, 29 Apr 2026 05:00:44 +0000</pubDate>
      <link>https://dev.to/doodoolove/why-we-banned-within-the-realm-of-from-our-ai-game-descriptions-2cb2</link>
      <guid>https://dev.to/doodoolove/why-we-banned-within-the-realm-of-from-our-ai-game-descriptions-2cb2</guid>
      <description>&lt;p&gt;&lt;em&gt;A small portal's accidental brush with Google's scaled-content-abuse algorithm — and the 11-rule prompt change that fixed it.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;We run a 6,800-game HTML5 portal where every game description is generated by GPT-4.1-mini using a prompt that tries to sound editorial. Last week we caught the prompt mid-disaster: &lt;strong&gt;56% of descriptions across our entire corpus opened with the same six words&lt;/strong&gt; ("What separates casual from committed play..."), 38% used the same skill-tier framing ("Veterans of [genre] recognize..."), and 86% violated our internal jargon budget by stuffing four or more of &lt;em&gt;hitbox&lt;/em&gt;, &lt;em&gt;frame-pacing&lt;/em&gt;, &lt;em&gt;tick rate&lt;/em&gt;, &lt;em&gt;RNG floor&lt;/em&gt; into a single page.&lt;/p&gt;

&lt;p&gt;A wedding-dress-up game on our site discussed &lt;em&gt;tick-rate&lt;/em&gt;. &lt;strong&gt;Dress-up games don't have a tick-rate.&lt;/strong&gt; That's when we knew we'd built a textbook scaled-doorway pattern straight into the GPT prompt — exactly what Google's March 2024 spam-policy update &lt;a href="https://developers.google.com/search/blog/2024/03/core-update-spam-policies" rel="noopener noreferrer"&gt;explicitly called out&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Scaled content abuse is when many pages are generated for the primary purpose of manipulating search rankings... It does not matter if you use generative AI, manual means, or a mix to produce this scaled content."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Our indexing rate was 18.6%. The pattern was both the cause and the diagnostic.&lt;/p&gt;

&lt;p&gt;This post is what we found, what we changed, and the verification script we now run in CI to prevent regression.&lt;/p&gt;




&lt;h2&gt;
  
  
  How a "neutral expert" prompt becomes a doorway pattern
&lt;/h2&gt;

&lt;p&gt;The original prompt was good-faith. We wanted descriptions that read like a reviewer wrote them, not like a marketer. To anchor the model away from generic Adventure-of-a-lifetime copy, we provided positive examples of "neutral-expert voice patterns" the model could draw from. Six of them, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;"Veterans of [X] recognize..."&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Serious players of the genre find..."&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"What separates casual from committed play is..."&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"A commonly overlooked mechanic..."&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"The game rewards a counter-intuitive approach..."&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also asked for a tail line &lt;code&gt;Expert Tip: ...&lt;/code&gt;, a counter-intuitive truth, and "genre jargon used unapologetically" with examples of &lt;em&gt;hitbox&lt;/em&gt;, &lt;em&gt;tick rate&lt;/em&gt;, &lt;em&gt;frame-pacing&lt;/em&gt;, &lt;em&gt;metagame&lt;/em&gt;, &lt;em&gt;RNG floor&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;What happened: the model picked the path of least resistance. Each of the six voice patterns is high-quality on its own. But across 6,800 generations, the model converged on a tiny subset. It's the LLM equivalent of giving a student six sample answers and being surprised they only ever quote the first three.&lt;/p&gt;

&lt;p&gt;We discovered the problem when we wrote a homogeneity check (more on that below) and learned that &lt;strong&gt;3,797 of our 6,728 entries opened with the same eleven-word sentence&lt;/strong&gt;. We had effectively templated 56% of our content corpus.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this looks like to Google
&lt;/h2&gt;

&lt;p&gt;Google's structured-content classifier doesn't need to "understand" voice patterns — n-gram fingerprinting is enough. When 56% of pages on a domain share an opener of &amp;gt;40 characters, that domain pattern-matches with the documented "scaled content" spam category from the March 2024 update. The algorithmic response is documented and predictable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Google still crawls each page (the URLs are in our sitemap).&lt;/li&gt;
&lt;li&gt;Google evaluates the content quality signal at the domain level.&lt;/li&gt;
&lt;li&gt;Pages that fingerprint as "templated content" land in &lt;strong&gt;"Crawled — currently not indexed"&lt;/strong&gt; in Search Console.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;a href="https://indexcheckr.com/resources/google-indexing" rel="noopener noreferrer"&gt;16-million-page IndexCheckr study&lt;/a&gt; puts the cross-web indexing average at 37%. We were at 18.6%. &lt;a href="https://www.gsqi.com/marketing-blog/google-december-2024-spam-update-case-studies/" rel="noopener noreferrer"&gt;GSQI's December 2024 spam-update case studies&lt;/a&gt; include a directory site with 140k programmatic URLs at 12% effective indexing rate — same shape, larger scale.&lt;/p&gt;

&lt;p&gt;The diagnostic is unambiguous: when &lt;em&gt;Crawled, not indexed&lt;/em&gt; dominates your index report and your domain-wide content shares a structural fingerprint, the algorithm has evaluated and rejected your content, not failed to find it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 11-rule v3 prompt
&lt;/h2&gt;

&lt;p&gt;We rewrote the system prompt with anti-doorway constraints as first-class. Here's the structure (full prompt is in our open-source repo):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hard constraints&lt;/strong&gt; (kept from v2):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No first-person pronouns — write as a critic, not a player.&lt;/li&gt;
&lt;li&gt;No em-dashes (we sanitize these but reject if they leak past).&lt;/li&gt;
&lt;li&gt;No marketing filler ("amazing", "unbelievable adventure", "dive into", "embark on").&lt;/li&gt;
&lt;li&gt;No AI connector words ("In summary", "Furthermore", "It is worth noting").&lt;/li&gt;
&lt;li&gt;No invented numbers or personal events ("scored 4,500", "on level 7").&lt;/li&gt;
&lt;li&gt;Game name appears max 3 times in 180 words.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Anti-doorway diversity&lt;/strong&gt; (new in v3):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;BANNED OPENING TEMPLATES&lt;/strong&gt; — the description must NOT begin with: &lt;em&gt;"Within the realm of..."&lt;/em&gt;, &lt;em&gt;"Within the crowded field of..."&lt;/em&gt;, &lt;em&gt;"Within the niche of..."&lt;/em&gt;, &lt;em&gt;"Across the field of..."&lt;/em&gt;, &lt;em&gt;"Among browser-based..."&lt;/em&gt;, &lt;em&gt;"In the world of..."&lt;/em&gt;, or any near-paraphrase of &lt;em&gt;"[Prep] the [realm/field/niche/world] of [genre]"&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;BANNED VOICE PATTERNS&lt;/strong&gt; — do NOT use &lt;em&gt;anywhere&lt;/em&gt;: &lt;em&gt;"Veterans of [X] recognize..."&lt;/em&gt;, &lt;em&gt;"Veterans of the genre..."&lt;/em&gt;, &lt;em&gt;"Serious players of the genre find..."&lt;/em&gt;, &lt;em&gt;"What separates casual from committed play..."&lt;/em&gt;, &lt;em&gt;"Players of [X] often discover..."&lt;/em&gt;. The same ideas may be expressed, but rephrased every time using the game's specific mechanics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JARGON BUDGET&lt;/strong&gt; — across the entire description, use AT MOST 2 of: &lt;em&gt;hitbox&lt;/em&gt;, &lt;em&gt;tick rate&lt;/em&gt;, &lt;em&gt;frame-pacing&lt;/em&gt;, &lt;em&gt;metagame&lt;/em&gt;, &lt;em&gt;RNG floor&lt;/em&gt;, &lt;em&gt;input lag&lt;/em&gt;. Default to 0–1. Pick only what is actually visible in the game.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OPENING ANCHOR&lt;/strong&gt; — the first sentence anchors on something CONCRETE and game-specific (not generic genre framing). Pick one of six modes: (a) Concrete action/mechanic, (b) Visual/scene specifics, (c) Input/control feel, (d) Design-choice observation, (e) Physics/numerical constraint, (f) Contrast/contradiction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NAME ANCHORING&lt;/strong&gt; — the game name must appear in the first 80 characters.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Server-side rejection&lt;/strong&gt;: after generation, we regex-test the output against the banned openings/voices and the jargon-count budget. Any violation is rejected and the generation retried.&lt;/p&gt;




&lt;h2&gt;
  
  
  What v3 actually produces
&lt;/h2&gt;

&lt;p&gt;A handful of side-by-side examples (real games, real outputs):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Game&lt;/strong&gt;: &lt;code&gt;urban-echo&lt;/code&gt; (parkour runner)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v2&lt;/strong&gt;: &lt;em&gt;"Within the realm of stylized urban runner-platformers, this title positions itself as a deceptively straightforward exercise in rooftop momentum. Veterans of the genre recognize that what separates casual from committed play..."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v3&lt;/strong&gt;: &lt;em&gt;"Sliding under a low-hanging pipe in Urban Echo requires split-second timing that often outweighs raw speed. This browser-based parkour game challenges players to navigate a series of urban rooftops..."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Game&lt;/strong&gt;: &lt;code&gt;bazooka-survivors&lt;/code&gt; (bullet-hell arena)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v2&lt;/strong&gt;: &lt;em&gt;"Among browser-based bullet hell shooters, this title stands out by combining relentless enemy waves with surprisingly deliberate pacing..."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v3&lt;/strong&gt;: &lt;em&gt;"Swarms of enemies press relentlessly in Bazooka Survivors, forcing rapid decisions amid chaotic bullet patterns. This arcade shooter demands not only quick reflexes but also strategic positioning..."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Game&lt;/strong&gt;: &lt;code&gt;granny-the-game&lt;/code&gt; (stealth horror)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v2&lt;/strong&gt;: &lt;em&gt;"Within the claustrophobic confines of a decrepit house, players face a tense stealth challenge that hinges on sound as much as sight..."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v3&lt;/strong&gt;: &lt;em&gt;"Granny: 5-day stealth horror in a creepy house. Find the keys, avoid Granny's hearing radius, escape before sundown. Browser play, no download required."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The v3 outputs share &lt;em&gt;no&lt;/em&gt; opening fingerprint across pages of different genres. They mention specific game mechanics (low-hanging pipe, hearing radius, 5-day timer) that the model could only emit by actually engaging with the prompt's reference to the source material.&lt;/p&gt;




&lt;h2&gt;
  
  
  The verification script (run this in CI)
&lt;/h2&gt;

&lt;p&gt;We open-sourced the homogeneity check. It does five things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Counts banned-opening hits across the corpus&lt;/li&gt;
&lt;li&gt;Counts banned-voice phrase occurrences&lt;/li&gt;
&lt;li&gt;Builds a normalized 50-character prefix per entry (strips game name + digits) and reports duplicates&lt;/li&gt;
&lt;li&gt;Counts jargon-term overuse per entry (&amp;gt;2 = budget exceeded)&lt;/li&gt;
&lt;li&gt;Optional &lt;code&gt;--strict&lt;/code&gt; mode that exits 1 if any threshold fails — perfect for CI gates&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sample output on our v2 corpus before the fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[1] Banned opening frequency (target: each &amp;lt; 5% of corpus)
  FAIL Within the realm of: 1576 / 6728 (23.42%)
  FAIL Within the crowded field of: 428 / 6728 (6.36%)

[2] Banned voice phrase frequency (target: each &amp;lt; 5%)
  FAIL Veterans of [X] recognize: 2571 (38.21%)
  FAIL What separates casual from committed play: 3804 (56.54%)

[3] Top 12 normalized prefixes:
  (70x | 1.04%) "within the realm of browser puzzle games this titl"
  (56x | 0.83%) "within the realm of browser based games this title"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same script on the v3 entries we've migrated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;--strict: PASSED
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's a subtle lesson in step 3 of that script. When we first wrote it, the prefix-uniqueness test fired a false positive on small samples — every prefix in an 11-entry test set hit &lt;code&gt;1/11 = 9.09%&lt;/code&gt;, which our naïve threshold flagged as failure. The fix is to require &lt;em&gt;actual duplication&lt;/em&gt; (count &amp;gt;= 2) before any percentage threshold matters. Single occurrence is unique by definition. We learned this on a real CI failure that wasted ~$2 of API calls — not catastrophic, but a nice reminder that homogeneity checks need to distinguish "same prefix" from "small sample size".&lt;/p&gt;




&lt;h2&gt;
  
  
  What this hasn't fixed yet (honesty section)
&lt;/h2&gt;

&lt;p&gt;The v3 prompt is correct. But only a small fraction of our 6,820-entry corpus has been migrated as of writing. We're running batched migration via GitHub Actions (~$0.30 per 100-slug batch). At our current cadence we'll hit 50% v3 coverage in about three weeks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not all-at-once?&lt;/strong&gt; Two reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: ~$30 to redo the whole corpus + es/pt/fr translations. Manageable, but not casual.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk&lt;/strong&gt;: a single all-at-once rewrite means a single deploy where the entire site's content changes. If the v3 prompt has any latent issue we haven't found, it would ship to all 6,820 pages simultaneously. Batched migration gives us four daily checkpoints to verify the v3 corpus's homogeneity score before committing to the next batch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We're also not naïvely expecting a linear recovery. Google's domain-level quality assessment is built from the pages it has crawled. To shift the assessment, we need to change &lt;em&gt;enough&lt;/em&gt; of the corpus that the next time Google re-evaluates the domain, the n-gram fingerprint has measurably moved. The literature suggests 4–8 weeks after the corpus reaches &amp;gt;50% v3 before the indexing rate visibly responds.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we'd do differently
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bake banned patterns into the prompt from day one, not as positive examples.&lt;/strong&gt; The mistake we made was thinking &lt;em&gt;"giving the model six varied voice patterns will produce variety"&lt;/em&gt;. The model doesn't pick uniformly from six options across 6,800 generations — it picks the easiest one. The fix is to &lt;em&gt;prevent&lt;/em&gt; high-frequency openers, not to &lt;em&gt;suggest&lt;/em&gt; alternatives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat the homogeneity check as a CI gate, not a post-hoc audit.&lt;/strong&gt; If we'd had this in place at v2, we would have caught the 56% same-opener rate after generation #500, not after #6,728. Cheap dollars vs expensive ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't trust LLM "creativity" claims.&lt;/strong&gt; The v2 prompt was 480 words long and produced a 56%-identical opener. The v3 prompt is 730 words long, with 11 explicit constraints. Most of those constraints are negative ("don't do X"). LLMs need negative space defined; positive examples are not enough.&lt;/p&gt;




&lt;h2&gt;
  
  
  Read more
&lt;/h2&gt;

&lt;p&gt;If your portal or content site uses an LLM-driven descriptions pipeline, run a homogeneity check on your corpus today. Three minutes. If it passes, great. If it fails the way ours did, you have a working diagnosis before the next core update.&lt;/p&gt;

&lt;p&gt;The site this lesson came from: &lt;a href="https://doodoo.love" rel="noopener noreferrer"&gt;DooDoo.Love&lt;/a&gt; — a free HTML5 browser games portal with 6,800+ titles.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;About the author: Steuber Alberto is the editor at &lt;a href="https://doodoo.love" rel="noopener noreferrer"&gt;DooDoo.Love&lt;/a&gt;. Reach me at &lt;a href="mailto:support@doodoo.love"&gt;support@doodoo.love&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>seo</category>
      <category>webdev</category>
      <category>programmatics</category>
    </item>
  </channel>
</rss>
