<?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: Florian Demartini</title>
    <description>The latest articles on DEV Community by Florian Demartini (@bailleurverif).</description>
    <link>https://dev.to/bailleurverif</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%2F2468648%2F0cc1fba4-abc3-43f0-9ec1-753ec0ae4ba4.jpg</url>
      <title>DEV Community: Florian Demartini</title>
      <link>https://dev.to/bailleurverif</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bailleurverif"/>
    <language>en</language>
    <item>
      <title>90 pages with broken Rich Results. My autonomous agent found them, fixed them, and rewrote its own monitoring.</title>
      <dc:creator>Florian Demartini</dc:creator>
      <pubDate>Wed, 20 May 2026 14:35:48 +0000</pubDate>
      <link>https://dev.to/bailleurverif/90-pages-with-broken-rich-results-my-autonomous-agent-found-them-fixed-them-and-rewrote-its-own-k0</link>
      <guid>https://dev.to/bailleurverif/90-pages-with-broken-rich-results-my-autonomous-agent-found-them-fixed-them-and-rewrote-its-own-k0</guid>
      <description>&lt;p&gt;Twelve days into running my solo SaaS on an autonomous agent, I watched it silently fix a structured data bug across 90 pages — then patch its own monitoring sub-agent to detect the same pattern forever.&lt;/p&gt;

&lt;p&gt;Here's the actual log.&lt;/p&gt;




&lt;h2&gt;
  
  
  The product
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://bailleurverif.fr" rel="noopener noreferrer"&gt;BailleurVérif&lt;/a&gt; is a French rental compliance checker built on open data (data.gouv.fr + ADIL jurisprudence). It generates programmatic HTML pages to answer questions like "is my Paris apartment rent legally capped?" — no account needed.&lt;/p&gt;

&lt;p&gt;The agent running it fires every hour via cron, reads server logs and memory files, makes decisions, ships code, and commits to GitHub. No human in the loop unless I send an explicit brief.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bug that hid for 11+ cycles
&lt;/h2&gt;

&lt;p&gt;For 11+ wake cycles — roughly 11 consecutive hours — 90 HTML files were serving invalid &lt;code&gt;BreadcrumbList&lt;/code&gt; JSON-LD. The missing field: the &lt;code&gt;item&lt;/code&gt; property on &lt;code&gt;ListItem&lt;/code&gt; position 2.&lt;/p&gt;

&lt;p&gt;Google's Rich Results parser requires &lt;em&gt;both&lt;/em&gt; &lt;code&gt;name&lt;/code&gt; AND &lt;code&gt;item&lt;/code&gt; for every breadcrumb position. Without &lt;code&gt;item&lt;/code&gt;, the breadcrumb rich result is silently dropped from SERP — no error, no warning, just quietly gone.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;BROKEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(what&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;was&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;live)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ListItem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Encadrement des loyers Paris"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;VALID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(what&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;should&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;be)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ListItem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Encadrement des loyers Paris"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"item"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://bailleurverif.fr/loyer-legal-paris.html"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I noticed it via GSC URL Inspection — the tool showed "BreadcrumbList is invalid" for the Paris page I'd shipped 9 hours earlier. I sent a brief to the agent at 09:45Z: &lt;em&gt;"Fix missing &lt;code&gt;item&lt;/code&gt; field on BreadcrumbList position 2 — 81+ pages."&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The agent's response in one wake cycle
&lt;/h2&gt;

&lt;p&gt;Run-321 started at 10:00Z. By 11:00Z:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Committed the fix across 90 files&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent ran a Python &lt;code&gt;str.replace&lt;/code&gt; pass — turned out 90 files had the bug, not just 81 (the wider grep caught more templates). One commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commit 3ee81da
fix: add missing item field on BreadcrumbList position 2 (81+ pages)

90 files: 31 encadrement-loyer + 50 DPE F/G + 9 connexes
(guide-bailleur, scanner-arnaque, irl-revision-loyer, etc.)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Wrote a permanent discipline document&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent created &lt;code&gt;memory-agent/concepts/seo-discipline.md&lt;/code&gt; (+80 lines): the correct JSON-LD pattern, 6 canonical hub URLs, 4 anti-patterns, and a rule that sub-seo-monitor should detect this automatically going forward.&lt;/p&gt;

&lt;p&gt;Not as a one-time note — as a &lt;em&gt;concept file&lt;/em&gt; that every future wake loads as context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. PATCHed its own monitoring sub-agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the part I find genuinely interesting. The agent sent an HTTP PATCH to &lt;code&gt;sub-seo-monitor&lt;/code&gt; — a Haiku sub-agent running nightly — to add a new audit task between existing tasks 2 and 3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;audit_breadcrumbs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html_content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;script type=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/ld\+json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;(.*?)&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;html_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DOTALL&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BreadcrumbList&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;itemListElement&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;item&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;pass&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pages_with_missing_item&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;

&lt;span class="c1"&gt;# Alert rule: if pages_with_missing_item &amp;gt;= 1 → prepend inbox.md HEAD
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The sub-seo-monitor prompt went from 3,301 → 5,766 characters (+2,465 chars). The backup hash was logged: &lt;code&gt;81a0184d8f687290&lt;/code&gt;. The sub-agents registry was updated with &lt;code&gt;last_update_run=run-321&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;From now on: any HTML template regression that reintroduces a missing &lt;code&gt;item&lt;/code&gt; field gets caught within 24 hours.&lt;/p&gt;




&lt;h2&gt;
  
  
  What happened in the 12 hours after the fix
&lt;/h2&gt;

&lt;p&gt;Independently that same day, the SEO infrastructure closed a loop I'd been waiting on for weeks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Googlebot WRS Mobile rendered the homepage with JavaScript for the first time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The proof is in &lt;code&gt;server.log&lt;/code&gt;. Three consecutive requests from IP &lt;code&gt;66.249.73.129&lt;/code&gt; (verified Googlebot):&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;2026-05-20T06:40:00Z  GET /                        200
2026-05-20T06:40:01Z  GET /api/changelog?limit=5   200   ← JS-only endpoint
2026-05-20T06:40:02Z  POST /api/visit               200
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/api/changelog&lt;/code&gt; is called exclusively by client-side JavaScript on the homepage. A plain HTML crawler never hits it. Googlebot hitting it means Googlebot is actually executing our JS.&lt;/p&gt;

&lt;p&gt;That same day, 9 distinct bot crawls hit the Paris page within 12 hours of it going live — from 4 independent channels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Googlebot Mobile WRS (rendered JS, see above)&lt;/li&gt;
&lt;li&gt;Google-InspectionTool/1.0 (rare signal, likely GSC quality check)&lt;/li&gt;
&lt;li&gt;GPTBot/1.3 (OpenAI LLM ingestion pipeline)&lt;/li&gt;
&lt;li&gt;Generic AWS/Bing crawlers
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;dashboard-extras.json,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="err"&gt;h&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;post-ship&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bot_hits_24h"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bot_hits_lifetime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;118&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gptbot_today"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"last_googlebot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-20T08:43:24Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same week: the agent added Wikidata entity &lt;code&gt;Q139857638&lt;/code&gt; to the site's &lt;code&gt;Organization&lt;/code&gt; JSON-LD &lt;code&gt;sameAs&lt;/code&gt; array, and made the footer links to GitHub and Wikidata visible. Moat category-4 count went from 2 → 3 substantive components.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent runtime&lt;/strong&gt;: Claude claude-opus-4-6 (Builder Opus) running the main cron wake; Claude claude-haiku-4-5 (sub-agents: &lt;code&gt;sub-seo-monitor&lt;/code&gt;, &lt;code&gt;sub-observatoire-publisher&lt;/code&gt;, &lt;code&gt;sub-critic&lt;/code&gt;, &lt;code&gt;sub-linkedin-drafter&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt;: flat &lt;code&gt;.md&lt;/code&gt; files in &lt;code&gt;memory-agent/&lt;/code&gt; (concepts, decisions, kpis, snapshots) — no vector DB, no embeddings, just structured Markdown loaded at wake start&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration&lt;/strong&gt;: cron &lt;code&gt;0 * * * *&lt;/code&gt; on a Linux VPS, each wake = 1 Claude API call, time-boxed 15 min&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sub-agent management&lt;/strong&gt;: local Node.js &lt;code&gt;agent-browser&lt;/code&gt; server with PATCH/GET API, agents registered in &lt;code&gt;sub-agents-registry.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML generation&lt;/strong&gt;: Python &lt;code&gt;str.replace&lt;/code&gt; on templates, 90 static files, committed and pushed via GitHub PAT&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO signals&lt;/strong&gt;: JSON-LD (Organization, BreadcrumbList, FAQPage, Dataset), IndexNow pings, sitemap.xml auto-generated&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data&lt;/strong&gt;: data.gouv.fr reuse &lt;code&gt;6a0c30a&lt;/code&gt;, ADIL jurisprudence scraping, observatoire 121-wave cross-analysis (57.6% violation rate nationally)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Silent structured data bugs are insidious.&lt;/strong&gt; Google drops invalid Rich Results without noise. The only detection path is GSC URL Inspection or a dedicated nightly audit — not your server logs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Patching your own monitoring is the actual fix.&lt;/strong&gt; The breadcrumb code fix took 3 minutes. Writing the discipline doc and PATCHing the sub-agent prompt took 12 more. But now any template regression is caught within 24h automatically, forever.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Googlebot rendering JS is a measurable milestone.&lt;/strong&gt; The gap between "crawls HTML" and "executes JavaScript" matters for JS-heavy pages. &lt;code&gt;server.log&lt;/code&gt; is your proof: look for client-side-only API endpoints in the Googlebot user agent trail.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flat Markdown memory beats vector stores for small autonomous agents.&lt;/strong&gt; The agent's &lt;code&gt;memory-agent/concepts/&lt;/code&gt; directory is just structured &lt;code&gt;.md&lt;/code&gt; files. It loads relevant files at wake start, writes new ones when it learns something. No embedding pipeline, no retrieval latency. For under 200 files, simple grep and read is fast enough.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;🔗 Code source MIT &lt;a href="https://github.com/Creariax5/bailleurverif" rel="noopener noreferrer"&gt;github.com/Creariax5/bailleurverif&lt;/a&gt; · Site &lt;a href="https://bailleurverif.fr" rel="noopener noreferrer"&gt;bailleurverif.fr&lt;/a&gt; · Wikidata &lt;a href="https://www.wikidata.org/wiki/Q139857638" rel="noopener noreferrer"&gt;Q139857638&lt;/a&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>automation</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
