Vol. III · Issue 14 · NOV 2026 · Established MMXXIV
Technical Overview··11 min read
We Hill-Climbed This Blog's SEO With Our Own Agent. The Score Rose to 92. Search Hasn't Noticed Yet.
We scored its-boris.com, ran our platform's SEO agent on it and kept only changes that raised the score with nothing worse. The score went from 77.3 to 92.4, mostly on unproven checks. Agents found answers a little more often. AI search still found us for 1 of 20 questions.
BB
Boris BarashBuilder of things with AI. Creator of curate-me.ai.
Landscape 3:2 editorial illustration in a risograph print style, two inks (deep navy and warm orange) on warm cream paper, visible grain, generous empty space, clean shapes, calm witty New Yorker-like humour. Absolutely no text, no letters, no numbers, no logos, no brand marks, no real people. Scene: a small robot with a clipboard climbs a long grassy hill, hammering small survey stakes into the ground behind it. Each stake is a little higher than the last. At the top of the hill stands a large calm lighthouse whose beam points firmly the other way, out over the sea, not at the robot.
AI Collaboration
§ Colophon
Agent-led. Agents ran the research, tests, grading and drafting. No human graders were involved.
Claude (Opus 5.5) via Claude Code, Research, the scorecard and agent eval, the rounds, captures and drafting
seo_research on our platform, Audited the live site in three runs
Claude Haiku 5.5, Claude Sonnet 5.5, GPT-5 search, GPT-4o mini, The agents and models we measured
We ran our platform's own SEO agent on this blog, built a scorecard of the live site, and kept a change only if the score rose and nothing else got worse. Six rounds took the score from 77.3 to 92.4 out of 100, mostly on checks nobody has shown matter. A second test asked real agents 20 questions about the site: they answered 30 of 40 attempts correctly at the start and 32 after one change, which is close to the noise. AI search still found the site for 1 of 20 real questions, the same as before. Whether any of this brings readers won't be known until we measure again on Dec 14.
The site is small. Google sent it 23 visits in the 90 days before we started, 11 of them to one post. So this is a note on what you can measure about SEO, agent readability and LLM visibility on a small site, what our own agent got right and wrong, and what the experiment taught us about our platform.
77.3 to 92.4ScorecardOut of 100. It measures the site, not results
30 to 32 of 40Agents answering from the siteHaiku 5.5 starting from llms.txt. Noise is about 2
1 of 20, still 1AI search citing usReal questions, models with web search
$12.99Spent on runs and testsInside a $75 limit
How the climb works
A hill climb makes one change at a time and keeps it only if a measure improves. Ours had five steps:
Read the research and sort each claim by how strong the evidence is: documented by the search engine or crawler operator, measured in a study, or our guess.
Score the live site with a fixed list of pass-or-fail checks. Each check says which of those three tiers it rests on.
Pick changes, some from our own agent's audit of the site.
Ship them to the blog in a pull request, and score the live site again once the deploy is up.
Keep or revert. Keep only if the overall score rose and no check failed on more pages than before.
The loop. The box behind the dashed line is the only part that can show whether it worked.Prompt · Codex image generation, Nov 2026
Desktop version
A detailed production-quality diagram, landscape 3:2, in a risograph print style: two inks, deep navy and warm orange, on warm cream paper, light grain. Clean geometric shapes, straight orthogonal arrows, consistent line weight, generous spacing, one clean bold sans-serif typeface, large text that stays readable when shrunk. No title. Spell every label exactly as written, nothing added, no extra words.
Layout, read left to right. Far left column, top to bottom, two navy-outlined boxes joined by a downward arrow: "Read the research" then "Score the live site". One arrow runs right from "Score the live site" into the top left box of a loop.
The loop is a clockwise rectangle in the middle of the page. Top left box "Run our SEO agent", arrow right to top right box "Pick the best changes", arrow down to right middle box "Ship to the blog", arrow down to bottom right box "Score the live site again", arrow left to a large orange filled diamond at bottom left of the loop with the label "Better, and nothing worse?" fully inside it. Above the diamond, one short arrow labelled "Yes" goes up to a solid navy box "Keep it", and an arrow goes up from "Keep it" into "Run our SEO agent". Below the diamond, one short arrow labelled "No" goes down to a solid navy box "Revert it", and a thin line goes from "Revert it" left and up the outside of the loop, ending with an arrowhead in the left side of "Run our SEO agent".
Far right column, separated from the loop by a tall dashed vertical line, a single box with a dashed navy outline: "Re-measure in weeks: rankings and citations".
Orange fills only the diamond.
Phone version
A detailed production-quality diagram for a phone screen, portrait 9:16, in a risograph print style: two inks, deep navy and warm orange, on warm cream paper, light grain. Clean geometric shapes, straight orthogonal arrows, consistent line weight, generous spacing, one clean bold sans-serif typeface. Very large text that stays readable on a phone. No title. Spell every label exactly as written, nothing added, no extra words.
Layout: one vertical column of navy-outlined boxes joined by short downward arrows, in this order: "Read the research", "Score the live site", "Run our SEO agent", "Pick the best changes", "Ship to the blog", "Score the live site again". Then a wide orange filled diamond with plenty of room around its label "Better, and nothing worse?", the label fully inside the diamond. Below the diamond two solid navy boxes side by side with cream text: left "Yes: keep it", right "No: revert it", each reached by a short arrow from the diamond. One line collects both boxes and runs up the right edge of the page, ending with an arrowhead pointing left into "Run our SEO agent". At the very bottom, below a dashed horizontal line, one box with a dashed navy outline: "Re-measure in weeks: rankings and citations".
Orange fills only the diamond.
Round 3 shows every step, including the first reading after a deploy, which nearly fooled us.
Fig. 2 · How the climb works
One round, worked through: round 3, PR #357
The rule for every round: keep a change only if the overall score rises and no check fails on more pages than before. Scores are out of 100, from 82 pass-or-fail checks on 55 pages of the live site.
1 · Measure the live site The scorecard after round 2 read 90.5. Lighthouse runs three times a page; the median counts.
2 · Pick a change 51 citations in 8 posts, 32 links in the prose, ledes and descriptions. Why: a lab study measured citations helping. The links are our guess.
3 · Ship it Shipped as PR #357. Cut first, by hand: 7 generated links that matched a word, not a meaning.
4 · Read it once 91.3. Home page speed 0.94 to 0.89, a slow first byte, old descriptions: pages still cached.
5 · Read it again Same deploy: 91.6. Home page back to 0.94. The harness post fell 0.90 to 0.80 with no code change to it.
Overall up, and no check worse?
Keep · 90.5 to 91.6 One check was worse: speed 0.9+ on 2 of 5 pages, was 3. We called it noise.
Since then Read twice after every deploy. Judge speed on the median of five pages, never one.
yes
no
The next round measures from the new reading
Round 3, check by check, second reading
3 to 10 of 40posts cite 3 or more outside sourcesbetter
17 to 28 of 40posts get a link from another postbetter
8 to 20 of 40posts link out to two other postsbetter
49 to 52 of 54pages have a 70 to 180 character descriptionbetter
37 to 40 of 40posts open with a 20 to 60 word ledebetter
3 to 2 of 5pages score 0.9+ on Lighthouse speedworse
Fig. 2 · How the climb works
One round, worked through: round 3
Keep a change only if the overall score rises and no check fails on more pages than before.
1 · Measure the live site
The scorecard after round 2 read 90.5.
2 · Pick a change
51 citations in 8 posts, 32 links in the prose, ledes and descriptions. Why: a lab study measured citations helping; the links are our guess.
3 · Ship it
PR #357. 7 generated links that matched a word, not a meaning, were cut by hand first.
4 · Read it once
91.3. Home page speed 0.94 to 0.89, a slow first byte, old descriptions still cached.
5 · Read it again
Same deploy: 91.6. Home page back to 0.94. The harness post fell 0.90 to 0.80 with no code change.
Overall up, and no check worse?
Overall 90.5 to 91.6. One check worse: speed 0.9+ on 2 of 5 pages, was 3. We called it noise.
Keep
Every scorecard round was kept. Since then we read twice after every deploy.
The next round measures from the new reading
Round 3, check by check
3 to 10 of 40posts cite 3 or more outside sources
17 to 28 of 40posts get a link from another post
8 to 20 of 40posts link out to two other posts
49 to 52 of 54pages have a 70 to 180 character description
37 to 40 of 40posts open with a 20 to 60 word lede
3 to 2 of 5 · worsepages score 0.9+ on Lighthouse speed
Round 3 from start to decision. Two readings of one deploy differed by 0.3, and the only check that got worse was speed, on pages where the round changed no code.Round 3 from start to decision. Two readings of one deploy differed by 0.3.
What the research supports
We read the primary sources before changing anything. A lot of what's written about AEO and GEO doesn't hold up.
What we found, by how strong the evidence is
Claim
Verdict
Source
AI Overviews and AI Mode have no special requirements
Documented
Google: "nor other special optimizations necessary"
Being indexed with a snippet is the entry bar
Documented
Google, same page
Adding citations, quotes and statistics raises visibility
Measured, in a lab
GEO paper, KDD 2024: 30 to 40% on its own metric, smaller on Perplexity
Referring domains and traffic predict citations
Measured, as a correlation
SE Ranking, 500,000+ prompts
llms.txt gets you cited
Folklore
Ahrefs logs: 97% of files got no requests in a month
Schema gets you cited
Mostly folklore
Ahrefs, 1,885 pages: no measurable lift in AI Mode or ChatGPT
FAQ markup is a shortcut
Folklore
Google stopped showing FAQ rich results on May 7, 2026
Chunk posts into short sections
Folklore
Google: no requirement
Bump the date for freshness
Harmful
Google lists it as a warning sign
The studies mostly agree that authority counts for more than anything on the page, and authority builds slowly, off the site. We shipped llms.txt anyway, because it's cheap and helps when someone hands the site to an agent, but we didn't expect it to move citations.
The scorecard
The scorecard fetches every page in the sitemap and runs checks a script can decide on its own. Anything it can't measure stays unknown and out of the score, which includes field Core Web Vitals, because the site doesn't get enough Chrome visits to have them.
What the scorecard checks, with examples
Category
Example checks
Evidence
Technical
Pages return 200, one canonical pointing at itself, posts render without JavaScript, sitemap valid
Mostly documented
Metadata and entities
Unique titles and descriptions, valid JSON-LD, an author with a profile link, dates with a zone
Mostly documented
Internal links
No broken links, every page reachable, posts linked from other posts' text
Mixed
Crawler access
Each AI and search crawler allowed by robots.txt, served the same page as a browser
Documented, plus one guess
Agent readability
llms.txt, a markdown copy of each post with every paragraph the page has, full-text feed, corrections as data
Mostly our guess; the feed and same-text checks are documented
Content signals
A summary up top, three outside sources, a visible date and byline
Documented, a study, or a guess
Speed, lab only
Lighthouse on a simulated phone: LCP, layout shift, blocking time
Documented thresholds
The scorecard's real output after round 6, Nov 3, replayed line by line. The last lines are checks still failing.
The overall score after each round. After round 3 every step is smaller than the swing Lighthouse alone can cause, so they read as a plateau, not a climb.
Each category before the first change and after round 6. Agent readability and crawler access went to 100 because we added files and named crawlers; no crawler gained access it didn't have.
The studied tier rests on three checks; about half its rise came from moving one dated line under each lede and half from outside sources. The bottom row rose almost as much, on things we think help and nobody has shown.
Crawler access went to 100 without any crawler gaining access it didn't already have. They could all read the site before. Naming each one turns an accident into a decision, but it isn't a gain in reach.
Each round
SEO roundAgent roundDocumentedStudiedOur guess why we expected it to help
Round 1#355
Kept
Author entity, crawler policy, dated timestamps
Person and ProfilePage, WebSite, a group per crawler in robots.txt, dates with a time zone, <time>, Open Graph urls, one redirecting link.
DocumentedGoogle's Article docs ask for a time zone and an author url
Our guessnaming each crawler and WebSite markup
0 to 1 of 1author as structured data
3 to 40 of 40posts with a time zone on dates
0 to 1 of 1WebSite markup on home
2 to 1internal links that go through a redirect
52 to 54 of 54pages with complete Open Graph
0 to 40 of 40posts with a <time> tag
0 to 12 of 12crawlers named in robots.txt
Speed readings reused from the baseline.
77.3 to 84.6
+7.3
Round 2#356
Kept
Files for agents
llms.txt, a markdown copy of every post at /blog/<slug>.md, a full-text feed, /changes.json, IndexNow.
Our guessAhrefs' logs: 97% of llms.txt files got no requests in a month; Google says it needs no AI text files
0 to 1 of 1corrections as JSON
0 to 1 of 1full text in the feed
0 to 1 of 1llms.txt exists
0 to 40 of 40pages pointing to their markdown
0 to 40 of 40posts with a markdown copy
Expected to help agents already on the site, not citations. Speed reused.
84.6 to 90.5
+5.9
Round 3#357
Kept
Citations and links
51 citations to primary sources in 8 posts, 32 links in the prose, the series method paragraph, notes on 2 older posts, ledes and descriptions.
Studiedthe GEO paper measured citations raising visibility, in a lab
Our guessinternal links
3 to 10 of 40posts citing 3+ outside sources
49 to 52 of 54descriptions of 70 to 180 characters
3 to 2 of 5pages at speed 0.9+ (Lighthouse) worse, noise
17 to 28 of 40posts linked from another post
8 to 20 of 40posts linking to two others
37 to 40 of 40ledes of 20 to 60 words
First reading 91.3 with pages still cached; the second, 91.6. One check worse: speed, on pages where the round changed no code. Not shipped: 7 generated links that matched a word, not a meaning.
90.5 to 91.6
+1.1
Round 4#358
Kept
The home page's own title
A title and description for the home page (its title was 13 characters), and a paragraph citing two eval guides in the audit post.
Our guessa title length band
10 to 11 of 40posts citing 3+ outside sources
0 to 1 of 5pages with LCP under 2.5 s (lab) noise
37 to 38 of 54titles of 15 to 75 characters
No check worse than round 3.
91.6 to 92.1
+0.5
Round 5#360
Kept
A dead demo link
Removed a pointer to the deleted Runner Spotlight demo.
Documentedlinks that skip a redirect
1 to 0internal links that go through a redirect
Speed reused from round 4.
92.1 to 92.2
+0.1
Round 6#361
Kept, one check worse
Dated notes, shorter titles, more citations
Moved the italic dated note under the lede on 14 posts, shortened title tags, 17 more citations.
Studiedfirst paragraphs of 20 to 90 words, outside sources
Our guesstitle length
11 to 15 of 40posts citing 3+ outside sources
25 to 37 of 40first paragraphs of 20 to 90 words
31 to 26 of 40first paragraphs stating a number or claim worse
1 to 0 of 5pages with LCP under 2.5 s (lab) worse, noise
30 to 31 of 40openings sharing words with the title
38 to 49 of 54titles of 15 to 75 characters
The italic line had passed "states a number" on its year. The real first paragraphs never did, so that check fell; we kept the round and recorded it.
92.2 to 92.4
+0.2
Judged on the agent test, not the scorecard
Agent round 1#362
Kept
A search page for agents
/search?q=words returns matching posts and paragraphs as markdown; llms.txt links to it with each post's date.
Our guessno rigorous study of agent readability exists
30 to 32 of 40Navigator from llms.txt correct; fetches a task 2.7 to 2.1
30 to 31 of 40Navigator from the home page correct; fetches a task 2.95 to 3.15
34 to 32 of 40Claude with web search correct; fetches a task 2.4 to 2.1
Claude with web search moved by two without using the page, so two is about the noise. Cost for the navigator's 40 tries $0.096 to $0.068.
30 to 32
+2.0
Agent round 2#363
Ranking reverted, sentence kept
Better ranking, a clearer sentence
Rank by the single paragraph holding most of the query, with simple word stems. Rewrote the series method sentence, which read as "76 of 149 runs passed" when it meant the opposite.
Our guessno rigorous study of agent readability exists
32 to 31 of 40Navigator from llms.txt correct; fetches a task 2.1 to 2.02
31 to 32 of 40Navigator from the home page correct; fetches a task 3.15 to 3.1
32 to 34 of 40Claude with web search correct; fetches a task 2.1 to 2.4
The right post now ranked first for one question, but our gateway's scanner refused the search page that held it. The ranking was reverted in PR #364.
32 to 31
-1.0
Not shipped
7 internal linksNot shipped
From the generated link plan, round 3. Each matched a word but not a meaning. Cut by hand before the PR.
The agent's top findingNot shipped
Run 2 said post titles held chart labels. It had read a <title> inside an inline chart. The head title is right for Chrome, Googlebot, ClaudeBot, GPTBot, OAI-SearchBot, Claude-User and curl.
Two speed fixesNot shipped
Inlining the CSS (median LCP 2,933 to 3,083 ms) and preloading only the headline font (2,936 ms, first paint 150 ms later). Tried on a local build, three runs on three pages. Neither was better.
Re-read, not a round
After the agent roundsNov 3, 04:02 UTC. Every category the same as round 6 except speed, 73.3 to 80.0, with no speed change shipped. Lighthouse noise.92.4 to 93.3
SEO roundAgent roundDocumentedStudiedOur guess why we expected it to help
Round 1#355
77.3 to 84.6
+7.3
Author entity, crawler policy, dated timestamps
Person and ProfilePage, WebSite, a group per crawler in robots.txt, dates with a time zone, <time>, Open Graph urls, one redirecting link.
DocumentedGoogle's Article docs ask for a time zone and an author url
Our guessnaming each crawler and WebSite markup
0 to 1 of 1author as structured data
3 to 40 of 40posts with a time zone on dates
0 to 1 of 1WebSite markup on home
2 to 1internal links that go through a redirect
52 to 54 of 54pages with complete Open Graph
0 to 40 of 40posts with a <time> tag
0 to 12 of 12crawlers named in robots.txt
Speed readings reused from the baseline.
Kept
Round 2#356
84.6 to 90.5
+5.9
Files for agents
llms.txt, a markdown copy of every post at /blog/<slug>.md, a full-text feed, /changes.json, IndexNow.
Our guessAhrefs' logs: 97% of llms.txt files got no requests in a month; Google says it needs no AI text files
0 to 1 of 1corrections as JSON
0 to 1 of 1full text in the feed
0 to 1 of 1llms.txt exists
0 to 40 of 40pages pointing to their markdown
0 to 40 of 40posts with a markdown copy
Expected to help agents already on the site, not citations. Speed reused.
Kept
Round 3#357
90.5 to 91.6
+1.1
Citations and links
51 citations to primary sources in 8 posts, 32 links in the prose, the series method paragraph, notes on 2 older posts, ledes and descriptions.
Studiedthe GEO paper measured citations raising visibility, in a lab
Our guessinternal links
3 to 10 of 40posts citing 3+ outside sources
49 to 52 of 54descriptions of 70 to 180 characters
3 to 2 of 5pages at speed 0.9+ (Lighthouse) worse, noise
17 to 28 of 40posts linked from another post
8 to 20 of 40posts linking to two others
37 to 40 of 40ledes of 20 to 60 words
First reading 91.3 with pages still cached; the second, 91.6. One check worse: speed, on pages where the round changed no code. Not shipped: 7 generated links that matched a word, not a meaning.
Kept
Round 4#358
91.6 to 92.1
+0.5
The home page's own title
A title and description for the home page (its title was 13 characters), and a paragraph citing two eval guides in the audit post.
Our guessa title length band
10 to 11 of 40posts citing 3+ outside sources
0 to 1 of 5pages with LCP under 2.5 s (lab) noise
37 to 38 of 54titles of 15 to 75 characters
No check worse than round 3.
Kept
Round 5#360
92.1 to 92.2
+0.1
A dead demo link
Removed a pointer to the deleted Runner Spotlight demo.
Documentedlinks that skip a redirect
1 to 0internal links that go through a redirect
Speed reused from round 4.
Kept
Round 6#361
92.2 to 92.4
+0.2
Dated notes, shorter titles, more citations
Moved the italic dated note under the lede on 14 posts, shortened title tags, 17 more citations.
Studiedfirst paragraphs of 20 to 90 words, outside sources
Our guesstitle length
11 to 15 of 40posts citing 3+ outside sources
25 to 37 of 40first paragraphs of 20 to 90 words
31 to 26 of 40first paragraphs stating a number or claim worse
1 to 0 of 5pages with LCP under 2.5 s (lab) worse, noise
30 to 31 of 40openings sharing words with the title
38 to 49 of 54titles of 15 to 75 characters
The italic line had passed "states a number" on its year. The real first paragraphs never did, so that check fell; we kept the round and recorded it.
Kept, one check worse
Judged on the agent test, not the scorecard
Agent round 1#362
30 to 32
+2.0
A search page for agents
/search?q=words returns matching posts and paragraphs as markdown; llms.txt links to it with each post's date.
Our guessno rigorous study of agent readability exists
30 to 32 of 40Navigator from llms.txt correct; fetches a task 2.7 to 2.1
30 to 31 of 40Navigator from the home page correct; fetches a task 2.95 to 3.15
34 to 32 of 40Claude with web search correct; fetches a task 2.4 to 2.1
Claude with web search moved by two without using the page, so two is about the noise. Cost for the navigator's 40 tries $0.096 to $0.068.
Kept
Agent round 2#363
32 to 31
-1.0
Better ranking, a clearer sentence
Rank by the single paragraph holding most of the query, with simple word stems. Rewrote the series method sentence, which read as "76 of 149 runs passed" when it meant the opposite.
Our guessno rigorous study of agent readability exists
32 to 31 of 40Navigator from llms.txt correct; fetches a task 2.1 to 2.02
31 to 32 of 40Navigator from the home page correct; fetches a task 3.15 to 3.1
32 to 34 of 40Claude with web search correct; fetches a task 2.1 to 2.4
The right post now ranked first for one question, but our gateway's scanner refused the search page that held it. The ranking was reverted in PR #364.
Ranking reverted, sentence kept
Not shipped
7 internal linksNot shipped
From the generated link plan, round 3. Each matched a word but not a meaning. Cut by hand before the PR.
The agent's top findingNot shipped
Run 2 said post titles held chart labels. It had read a <title> inside an inline chart. The head title is right for Chrome, Googlebot, ClaudeBot, GPTBot, OAI-SearchBot, Claude-User and curl.
Two speed fixesNot shipped
Inlining the CSS (median LCP 2,933 to 3,083 ms) and preloading only the headline font (2,936 ms, first paint 150 ms later). Tried on a local build, three runs on three pages. Neither was better.
Re-read, not a round
After the agent roundsNov 3, 04:02 UTC. Every category the same as round 6 except speed, 73.3 to 80.0, with no speed change shipped. Lighthouse noise.92.4 to 93.3
Every round, in order. Each was kept on the scorecard; the one revert came from the agent test. Checks marked noise are speed readings that moved without a code change.
Three things nearly fooled us:
Round 2's check that the markdown copy has every paragraph the page has. It guards against showing agents different text from readers, which comes close to what Google's spam policies call cloaking. Its first version compared word counts and failed 11 posts. Every missing paragraph turned out to be an image prompt, which the copy rightly leaves out, so we replaced it with a paragraph check.
Round 3's first reading. It said 91.3, with the home page's Lighthouse score down from 0.94 to 0.89 and old descriptions on pages the round had just changed: the site was still refreshing cached pages. After that we measured twice after every deploy and judged speed on the median of five pages.
Round 5's deploy, which failed three times on flaky builds while the site kept serving round 4. We caught it because the health page reports which commit is live, and discarded a reading taken too early.
Five things didn't move:
Speed. After round 6, LCP was over 2.5 seconds on all five sample pages; the median went from 3,415 to 3,311 ms, within the noise. The slow element is the lede's text, and most of its time is render delay on a simulated slow phone. Our two CSS and font fixes didn't help.
First paragraphs. Fourteen posts open on a scene rather than a number. Rewriting them to pass a crude check would make them worse to read.
Sources. 25 of 40 posts still have fewer than three outside links. Most are about our own systems, and two passes found nothing honest to cite.
www. It has no DNS record. The redirect waits for the owner to add one.
AI search. The same 1 of 20 questions at the start, after round 4 and at the end.
A last reading with no site change came out at 93.3, entirely from Lighthouse. We report 92.4.
How it changed for a reader, Google, an AI search engine and an agent
A reader
Before14 posts opened on an italic line, "This post describes the fleet as it ran in March 2026". The series page said "76 of 149 runs passed" when it meant the opposite.
AfterThe dated line sits under the lede as a status note (round 6). The series sentence says what it means (agent round 2). 68 citations to primary sources added in rounds 3 and 6.
Still unknownWhether anyone reads more. We didn't measure reading.
Google
BeforeThe home page title was 13 characters. 37 of 40 posts gave dates with no time zone. 17 of 54 titles fell outside 15 to 75 characters.
AfterHome: "Boris Barash on running AI agents in production | its-boris.com". All 40 posts dated with a zone; 5 titles still long. Author as structured data.
Still unknownRankings. Google sent 23 visits in the 90 days before. We read Search Console again on Dec 14 and Feb 1.
An LLM with web search
BeforeAsked "How do you build an AI gateway with budgets and PII scanning for OpenClaw?", Claude's search returned /blog/building-ai-gateway, and the answer didn't name the site. 1 of 20 questions; GPT-5 search 0 of 20.
After round 4The same 1 of 20, the same question, still unnamed in the answer.
Still unknownWhether it moves. The final run on Nov 3 found the same 1 of 20. We ask again on Dec 14.
An agent
BeforeOnly the page: 112,218 characters of HTML for the gateway post, 10,182 of them before the headline. No llms.txt, no markdown.
Afterllms.txt (12,880), then /search for the words (7,679), then the post as markdown (13,795). On the agent test the navigator from llms.txt went from 30 to 32 of 40, 2.7 to 2.1 fetches a task.
Still a problemOur gateway's scanner refused 4 or 5 of the 20 tasks in each run, mostly on posts that quote attacks or use the word "leak". Platform #4045.
A reader
Before14 posts opened on an italic line, "This post describes the fleet as it ran in March 2026". The series page said "76 of 149 runs passed" when it meant the opposite.
AfterThe dated line sits under the lede as a status note (round 6). The series sentence says what it means (agent round 2). 68 citations to primary sources added in rounds 3 and 6.
Still unknownWhether anyone reads more. We didn't measure reading.
Google
BeforeThe home page title was 13 characters. 37 of 40 posts gave dates with no time zone. 17 of 54 titles fell outside 15 to 75 characters.
AfterHome: "Boris Barash on running AI agents in production | its-boris.com". All 40 posts dated with a zone; 5 titles still long. Author as structured data.
Still unknownRankings. Google sent 23 visits in the 90 days before. We read Search Console again on Dec 14 and Feb 1.
An LLM with web search
BeforeAsked "How do you build an AI gateway with budgets and PII scanning for OpenClaw?", Claude's search returned /blog/building-ai-gateway, and the answer didn't name the site. 1 of 20 questions; GPT-5 search 0 of 20.
After round 4The same 1 of 20, the same question, still unnamed in the answer.
Still unknownWhether it moves. The final run on Nov 3 found the same 1 of 20. We ask again on Dec 14.
An agent
BeforeOnly the page: 112,218 characters of HTML for the gateway post, 10,182 of them before the headline. No llms.txt, no markdown.
Afterllms.txt (12,880), then /search for the words (7,679), then the post as markdown (13,795). On the agent test the navigator from llms.txt went from 30 to 32 of 40, 2.7 to 2.1 fetches a task.
Still a problemOur gateway's scanner refused 4 or 5 of the 20 tasks in each run, mostly on posts that quote attacks or use the word "leak". Platform #4045.
One concrete example for each kind of visitor, from the live site. Only the agent's change was measured as a result; the rest are changes to the site whose effect is still unknown.
The agent track
The scorecard lists what the site does. It can't tell you whether an agent sent to the site comes back with the right answer, so we tested that directly with 20 fixed questions: 13 about a number, 3 single facts, 2 that need two pages and 2 about the newest post. Each answer is checked against the post's own text. Real agents answered through our gateway, twice each:
Navigator from llms.txt: Claude Haiku 5.5 with one tool, fetch, told to start at /llms.txt.
Navigator from the home page: the same agent starting where a generic agent lands.
Claude with web search: Anthropic's own search and fetch tools, limited to this site.
GPT-5 search: searches the web but can't open a page it's given. Measured once.
Before, Nov 2After, Nov 3
/llms.txt round 240412,880 characters: every post, the series, the search page
The post as markdown round 240413,795 characters: title, source, author, dates, AI cost
Page points to its markdown round 2noyes, on all 40 posts
Full text in the feed round 2noyes
Author as structured data round 1Article and breadcrumb onlyplus Person on About, WebSite on home
Dates a machine can read round 1no time zone on 37 of 40 postszone and a <time> tag on all 40
Beforeone group for allAfter12 named groups, the same access as before
Before the rounds an agent got only the page. After, it can read the site's index, search it and fetch a post as markdown at an eighth of the page's size. None of this has been shown to win citations; it helps once an agent is already here.
What an agent gets from another post, the harness post, on Nov 3: the page, its markdown copy and the site index. The HTML opens with font and image preloads; the copy opens with the title, summary, date and cost.
Navigator from llms.txtBeforeRound 1Round 2
Cited the right URL303231
Fetches per task2.72.12.02
Tokens in, 40 tries864K602K535K
Cost, 40 tries$0.096$0.068$0.061
No answer (refused or failed)989
Navigator from the home pageBeforeRound 1Round 2
Cited the right URL283030
Fetches per task2.953.153.1
Tokens in, 40 tries960K1,050K999K
Cost, 40 tries$0.107$0.117$0.112
No answer (refused or failed)444
Claude with web searchBeforeRound 1Round 2
Cited the right URL312931
Fetches per task2.42.12.4
Tokens in, 40 tries1,294K1,390K1,166K
Cost, 40 tries$0.408$0.458$0.405
No answer (refused or failed)000
GPT-5 search, before only: 8 of 40, 5 citing the right URL, 19 with no answer, $0.861 by the gateway's estimate. It searches but can't open a page it's given, so it wasn't rerun.
Navigator from llms.txtBeforeRound 1Round 2
Cited the right URL303231
Fetches per task2.72.12.02
Tokens in, 40 tries864K602K535K
Cost, 40 tries$0.096$0.068$0.061
No answer (refused or failed)989
Navigator from the home pageBeforeRound 1Round 2
Cited the right URL283030
Fetches per task2.953.153.1
Tokens in, 40 tries960K1,050K999K
Cost, 40 tries$0.107$0.117$0.112
No answer (refused or failed)444
Claude with web searchBeforeRound 1Round 2
Cited the right URL312931
Fetches per task2.42.12.4
Tokens in, 40 tries1,294K1,390K1,166K
Cost, 40 tries$0.408$0.458$0.405
No answer (refused or failed)000
GPT-5 search, before only: 8 of 40, 5 citing the right URL, 19 with no answer, $0.861 by the gateway's estimate. It searches but can't open a page it's given, so it wasn't rerun.
Each mark is 40 tries; the whisker spans the two tries, doubled. Claude with web search moved by two with no change it used, so a change of two is about the noise. Round 1 cut the navigator's fetches and cost; round 2 changed nothing that held.
Claude with web search moved by two between runs with no change it could see, and its two tries differed by two at the start. So a change of two is noise.
Agent round 1, kept. A search page for agents: /search?q=words returns matching posts and paragraphs as markdown, and llms.txt links to it. The navigator from llms.txt went from 30 to 32, from 2.7 to 2.1 fetches a task, and from $0.096 to $0.068 for 40 attempts. The gain is at the edge of the noise, but it cost less and took fewer steps, so we kept it.
Agent round 2, reverted. Round 1's search put the wrong post first for one question, so we ranked by the single paragraph matching most of the query. The right post came first, but the navigator went from 32 to 31, so by the rule it came out. The revert kept one sentence fix from the same pull request.
One task before and after agent round 1, replayed from the recorded tool calls. Before, the agent fetched the post's markdown and our own gateway refused the request. After, it used the search page and answered correctly.
The replay shows the biggest problem the agent test found, and it wasn't on the blog. Our gateway's security scanner refused the navigator on 4 or 5 of the 20 tasks in each run. One post quotes real prompt-injection strings, so refusing it is the scanner working. But it also refused a post with the heading "The OpenRouter cost leak", and a table with the word "Leak" in it: the bare word was enough. Round 1 cut the refused tasks from 5 to 4. In round 2 the scanner refused the search page that held the right answer; the gateway doesn't record which rule fired.
Running our own agent on it
seo_research had one run on record, from May, for $11.46. It was built to outline a new page, and its reviewer rejected any report without keyword volumes from a named source. We have no Ahrefs or SEMrush, so in May both workers were sent back and no outline came out. This time:
Three runs of the deployed template in the blog's own org
Run
Cost
What happened
XP
Asked for $4
$0
Refused: a new seat is level 1, and level 1 allows $1 a run
0
1, at $1
$0.95
Two workers did the same audit twice. The budget ran out, so no review. The report was too long for the judge
0
2, at $1
$0.84
One worker, our scorecard in the brief. The reviewer asked for keyword volumes. The judge's reply couldn't be read
1
3, at $1, same brief
$0.68
The same again. The judge hit a gateway error
1
The judge graded none of the three runs. The XP came only from the seat's own checks passing.
We also gave one Claude Sonnet 5.5 call the same brief plus nine pages from the live site, then had a fresh agent grade all three reports finding by finding, against the site as it was when each was written, without being told which was which.
Three audits of the same site, graded blind
Report
Cost
Findings
False or partly false
Our agent, run 2
$0.84
9
2
Our agent, run 3, same brief
$0.68
9
1
One Sonnet 5.5 call, same brief and nine pages
$0.24, including a first try that spent all its tokens thinking
11
4
None gave harmful advice. Run 2's top finding was the worst: it said our post titles were chart labels, having read a <title> inside an inline chart as the page's title. The real title comes first in the page for every crawler we tried. The single call found the most useful thing, the series sentence that read as "76 of 149 runs passed", and that sentence was ours. Three reports can't rank the approaches. They do show that every finding needs checking against the live page.
What we changed in the platform. #4043 has merged; the other two wait for review:
#4044, the template. An audit mode with one worker, so a run fits $1 with room for review. The reviewer accepts "volumes unavailable" and rejects anything on Google's spam list. One required check fails a search volume with no named source, another requires the report to name the pages it checked, and the workers lose their shell, so text on a fetched page can't run a command. An independent review held the first version: an honest report could fail it, an invented number could pass, and a one-word report earned XP. Each is fixed with a test.
#4043, the gateway. The blog org's key had no key_id, so every LLM call made with it failed with a 500.
#4045, the scanner. Our first fix for the "leak" rule was too loose: review found about 45 attacks it would let through. The revised fix lets none of them through.
The Office. The seat showed as "Seo Research", with a $6 bar where its level allows $1. The fix in #4044 uses the template's own name and shows the level's limit.
Two smaller ones: the gateway's cost header is an estimate (for GPT-5 search, about twice the recorded cost), and its PII scan refused our audit evidence because the About page shows a contact address.
In the Office
The seat sits on the floor of our Agent Office like the other agents. This is run 3 finishing, captured from the live Office for the blog's org:
Run ap_dcb666e5520d, Nov 3 between 03:29 and 03:30 UTC: the seat working and in review at $0.68, then idle at level 1 with 2 of 25 XP.
The ask was to move the Office up a couple of levels through real work. That hasn't happened, and we didn't force it.
0 to 2 XP, level 1SEO seatLevel 2 needs 25
201 to 203 XP, level 2Blog org officeLevel 3 at 300
262 XP, level 2Platform org officeNot touched here
A run that meets its own objective earns 1 XP. The first run in a new seat earns nothing, because the seat's objective is adopted by an hourly sweep after it. A thumbs-up is worth 10, and that's the owner's to give. At one run a week the seat reaches level 2 in about 23 weeks. The blog org earned 34 XP in its last seven days, all from checks, which puts its level 3 around Nov 23. That date comes from the agents already running, not from this work. A weekly schedule for the seat was refused because our API key isn't an admin key, which is the right answer, so it's on the owner's list.
Picking this up
If you want to repeat this on your own site:
The rule: one change at a time, measured on the live site, kept only if its measure rises and no check gets worse. Judge site changes on the scorecard and agent changes on an agent test, never the other way round.
The noise: measure twice after every deploy, read Lighthouse as ±0.1 per page and judge speed on a median, and treat a change of 2 in 40 agent attempts as noise. Report each try, not only the total.
The agent test: fixed questions with answers you can check against your own text, a mix of numbers, multi-step questions and "what's newest", run twice on at least two kinds of agent. Count blocks and errors separately from wrong answers.
The scorecard: the seven categories in the scorecard table, each check tagged with its evidence, so a high score can't hide that most of it is guesswork.
Our next experiments, in order: rerun the same brief on the new template once it merges, and grade it blind against the old; retry the search ranking once the scanner fix lands; earn links by sharing the audit numbers where people write about evals; and measure Perplexity and Gemini, which we couldn't reach this time.
What we'll know on Dec 14
Each square is one question asked twice of one model. Six rounds of changes moved nothing here yet: one question found the site in Claude's search results, in all three runs, and no answer named it.
Almost everything that matters is still unproven. Rankings and citations take weeks to move, and so far we've only shown that the site does what our checks ask and that agents answer a little better. We wrote down in advance what would count as working: by Feb 1, 3 or more of the 20 questions on either model with web search, with the same question on two dates, and 50 or more Google visits per 90 days, across more than one post. If those numbers don't move, the likely reason is the one the research gave us at the start: other sites have to link here, and nothing on this one can do that.
We measure again on Dec 14 and Feb 1, with the same questions and the same scripts.
Where we pick this up
Handover sheet · Nov 3
Our notes for the next shift. If you're trying this on a small site too, this list may save you a lap.
Waiting
Re-measure on Dec 14 and Feb 1Same questions, same scripts, plus Search Console and Bing once they're set up.
the scorecard, the agent test and the LLM test
Waiting
Review the two open platform fixes, then rerun the same briefThe comparison we couldn't make: the old template against the new one, on the same input, graded blind.
#4044, #4045
Waiting
Search Console, Bing, the www record and a weekly scheduleAll need the owner's sign-in. Bing's AI Performance report is the one first-party citation report we can get.
owner
Open
Give the seat a promotion testIt only takes agents that work from server-side facts. A version reading the scorecard and the agent test would fit.
the Office
Open
Check an iOS privacy claimA citation pass found Apple's docs suggest on-device speech recognition can fall back to the server, which our first-time iOS post says it doesn't.
How We Built Family Manager
Keep
Check every agent finding against the live pageOur agent's top finding in run 2 came from reading a chart label as a page title.
any audit run
What the runs and tests cost, by line: $12.99 inside the $75 limit. GPT-5 search was most of the gateway bill.