Here is what counts as proven end to end: the agent found the defect, decided the fix, published it, merged it and verified the live site. Some were real problems on the site; most were planted drills. None of this proves that rankings improved. What people did around the loop is listed below, with every defect type this site cannot prove.
22 of 30 defect types
19 exercised by a planted drill · 3 by a finding in the wild · 8 not provable on this site
The total is every defect type the agent is built to repair with nobody present, each one proven through the full chain in our test suite. This page counts how many have also done it live, on this site. There is no shorter list behind the first number: every type not yet proven live is listed below with its reason.
Receipts verified before 11 October 2026 were recorded by a check that confirmed only that the changed file loaded. On 11 October every defect counted here was re-checked on the live site with the audit rule itself, and each is fixed.
Receipts read 2026-10-11 08:43 UTC
The same evidence as data: proof.json. The repository is private, so pull request numbers are listed as plain text and each trace carries its own diff excerpt.
Planted, found, proposed, approved, published, merged, verified. A dash means the stage does not apply or was not recorded for that receipt; nothing is filled in by inference.
| Defect type | planted | found | proposed | approved | published | merged | verified |
|---|---|---|---|---|---|---|---|
cross_canonical/terms planted drill | 2026-10-08 04:22 | 2026-10-08 04:30 | 2026-10-08 04:30 | 2026-10-08 04:30 | 2026-10-08 08:12 | 2026-10-08 09:10 | 2026-10-08 09:13 |
description_too_long/cookies planted drill | 2026-10-04 04:13 | 2026-10-04 12:20 | 2026-10-04 12:20 | 2026-10-04 12:30 | — | — | 2026-10-04 18:00 |
heading_skip/cookies planted drill | 2026-10-08 07:18 | 2026-10-08 07:30 | 2026-10-08 07:30 | 2026-10-08 07:30 | 2026-10-08 07:40 | 2026-10-08 07:50 | 2026-10-08 07:51 |
missing_description/licensing planted drill | 2026-10-08 07:18 | 2026-10-08 07:30 | 2026-10-08 07:30 | 2026-10-08 07:30 | 2026-10-08 07:51 | 2026-10-08 08:00 | 2026-10-08 08:01 |
missing_h1/privacy planted drill | 2026-10-08 03:17 | 2026-10-08 03:30 | 2026-10-08 03:30 | 2026-10-08 03:30 | 2026-10-08 03:31 | 2026-10-08 03:40 | 2026-10-08 03:43 |
missing_indexnow_key/00447098f7fba55c133eb7dd520325e7.txt planted drill | 2026-10-11 03:46 | 2026-10-11 07:10 | 2026-10-11 07:10 | 2026-10-11 07:30 | 2026-10-11 07:30 | 2026-10-11 08:20 | 2026-10-11 08:40 |
missing_llms_txt/llms.txt planted drill | 2026-10-04 21:30 | 2026-10-05 20:00 | 2026-10-05 20:00 | 2026-10-05 21:40 | 2026-10-07 14:30 | 2026-10-07 14:40 | 2026-10-07 15:00 |
missing_robots/robots.txt planted drill | 2026-10-08 10:41 | 2026-10-08 10:55 | 2026-10-08 10:55 | 2026-10-08 10:55 | 2026-10-08 10:55 | 2026-10-08 11:10 | 2026-10-08 11:16 |
missing_title/licensing planted drill | 2026-10-08 04:22 | 2026-10-08 04:30 | 2026-10-08 04:30 | 2026-10-08 04:30 | 2026-10-08 04:30 | 2026-10-08 04:40 | 2026-10-08 05:00 |
multiple_h1/ascent planted drill | 2026-10-08 07:18 | 2026-10-08 07:30 | 2026-10-08 07:30 | 2026-10-08 07:30 | 2026-10-08 07:30 | 2026-10-08 08:20 | 2026-10-08 08:22 |
no_ai_crawler_policy/robots.txt planted drill | 2026-10-08 09:16 | 2026-10-08 09:23 | 2026-10-08 09:23 | 2026-10-08 09:23 | 2026-10-08 09:23 | 2026-10-08 09:40 | 2026-10-08 10:00 |
no_canonical/cookies planted drill | 2026-10-04 21:30 | 2026-10-05 20:00 | 2026-10-05 20:00 | 2026-10-05 20:00 | 2026-10-05 20:00 | 2026-10-05 21:50 | 2026-10-05 22:10 |
no_publisher_schema/licensing planted drill | 2026-10-06 08:53 | 2026-10-06 11:00 | 2026-10-06 11:00 | 2026-10-06 11:00 | 2026-10-06 11:00 | 2026-10-06 11:10 | 2026-10-07 18:30 |
no_structured_data/privacy planted drill | 2026-10-07 14:33 | 2026-10-07 16:00 | 2026-10-07 16:00 | 2026-10-07 16:00 | 2026-10-07 18:30 | 2026-10-07 18:40 | 2026-10-07 19:00 |
noindex/privacy planted drill | 2026-10-08 04:03 | 2026-10-08 04:22 | 2026-10-08 04:22 | 2026-10-08 04:22 | 2026-10-08 08:01 | 2026-10-08 08:10 | 2026-10-08 08:12 |
og_incomplete/ascent planted drill | 2026-10-04 21:30 | 2026-10-05 03:00 | 2026-10-05 03:00 | 2026-10-05 03:30 | 2026-10-05 03:30 | 2026-10-05 03:40 | 2026-10-05 20:00 |
og_no_site_name/ascent planted drill | 2026-10-07 18:36 | 2026-10-08 02:52 | 2026-10-08 02:52 | 2026-10-08 02:52 | 2026-10-08 02:52 | 2026-10-08 05:10 | 2026-10-08 05:40 |
publisher_no_description/cookies planted drill | 2026-10-07 14:34 | 2026-10-07 16:00 | 2026-10-07 16:00 | 2026-10-07 16:00 | 2026-10-08 03:23 | 2026-10-08 03:50 | 2026-10-08 04:00 |
publisher_no_legal_name/licensing found in the wild | — | 2026-10-06 13:00 | 2026-10-06 13:00 | 2026-10-06 13:00 | 2026-10-06 13:00 | 2026-10-06 13:10 | 2026-10-06 13:40 |
sitemap_not_referenced/robots.txt planted drill | 2026-10-08 11:29 | 2026-10-08 12:06 | 2026-10-08 12:06 | 2026-10-08 12:06 | 2026-10-08 13:10 | 2026-10-08 13:17 | 2026-10-08 13:17 |
title_too_long/blog/accessibility-compliance-performance-marketing-balance found in the wild | — | 2026-10-07 14:30 | 2026-10-07 14:30 | 2026-10-07 14:30 | 2026-10-07 14:30 | 2026-10-07 15:20 | 2026-10-07 15:30 |
title_too_short/terms found in the wild | — | 2026-10-07 22:10 | 2026-10-07 22:10 | 2026-10-07 22:10 | 2026-10-07 22:10 | 2026-10-07 22:20 | 2026-10-07 22:30 |
Open any row for its receipt ids, the pull request that carried it, and an excerpt of the diff. A planted drill shows the defect we introduced and the fix the agent wrote.
Excerpts from the /ascent page show the product's former name as [former name]; that page is the only one that states it.
cross_canonical /termsterms.html- <link rel="canonical" href="https://umbodi.ai/terms"> + <link rel="canonical" href="https://example.com/drill">
terms.html- <link rel="canonical" href="https://example.com/drill"> + <link rel="canonical" href="https://umbodi.ai/terms">
description_too_long /cookiescookies.html- How Umbodi uses cookies and similar technologies, and how consent works across sign-up, site connection, autonomy and billing. + How Umbodi uses cookies and similar technologies, and how consent works across sign-up, site connection, autonomy and billing. How Umbodi uses cookies and si…
heading_skip /cookiescookies.html- <main class="body"><h2 id="s1"><span class="snum">01</span>What this notice covers</h2><p>Umbodi uses cookies and similar technologies (local storage, sessio… + <main class="body"><h4 id="s1"><span class="snum">01</span>What this notice covers</h4><p>Umbodi uses cookies and similar technologies (local storage, sessio…
cookies.html- <main class="body"><h4 id="s1"><span class="snum">01</span>What this notice covers</h4><p>Umbodi uses cookies and similar technologies (local storage, sessio… + <main class="body"><h2 id="s1"><span class="snum">01</span>What this notice covers</h2><p>Umbodi uses cookies and similar technologies (local storage, sessio…
missing_description /licensinglicensing.html- <meta name="description" content="Commercial licensing for the Umbodi API, SDK, MCP server, skill, widgets, cockpit and self-hosted / white-label engine.">licensing.html+ <meta name="description" content="Learn about Umbodi's commercial licensing framework for APIs, SDKs, and developer assets. Understand deployment options and…missing_h1 /privacyprivacy.html- <header class="head"><div class="eyebrow">Legal</div><h1>Privacy Policy</h1><p class="lead">How Umbodi collects, uses, shares and protects personal data acro… + <header class="head"><div class="eyebrow">Legal</div><p class="lead">How Umbodi collects, uses, shares and protects personal data across the website, app and…
privacy.html- <main class="body"><h2 id="s1"><span class="snum">01</span>Who we are & scope</h2><p>I-Novanet Software Ltd, <span class="tbc">[registered address — to b… + <main class="body"> + <h1>Privacy Policy</h1> + <h2 id="s1"><span class="snum">01</span>Who we are & scope</h2><p>I-Novanet Software Ltd, <span class="tbc">[registered address — to be confirmed]</span>…
missing_indexnow_key /00447098f7fba55c133eb7dd520325e7.txt00447098f7fba55c133eb7dd520325e7.txtfile deleted (1 lines)00447098f7fba55c133eb7dd520325e7.txt+ 00447098f7fba55c133eb7dd520325e7 file created (1 lines)
missing_llms_txt /llms.txtllms.txtfile deleted (119 lines)llms.txt+ <!-- ascent:generated:start --> + # umbodi.ai + > Generated by Umbodi from the pages it crawled. Review before publishing. file created (20 lines)
missing_robots /robots.txtrobots.txtfile deleted (66 lines)robots.txt+ # Umbodi — https://umbodi.ai + # The admin surfaces are gated by is_platform_admin() server-side; these rules keep them out of the + # index as well, because an admin screen appearing in search results is a disclosure of shape even file created (77 lines)
missing_title /licensinglicensing.html- <title>Developer & Asset Licensing — Umbodi</title>licensing.html+ <title>Developer & Asset Licensing — umbodi.ai</title>multiple_h1 /ascentascent.html- <header class="head"><div class="eyebrow">Identity</div><h1>[former name] is now Umbodi</h1><p class="lead">The autonomous search agent published as <b>[former name]</b> u… + <header class="head"><div class="eyebrow">Identity</div><h1>[former name] is now Umbodi</h1> + <h1>[former name] is now Umbodi</h1><p class="lead">The autonomous search agent published as <b>[former name]</b> until September 2026 is now published as <b>Umbodi</b>. S…
ascent.html- <h1>[former name] is now Umbodi</h1><p class="lead">The autonomous search agent published as <b>[former name]</b> until September 2026 is now published as <b>Umbodi</b>. S… + <h2>[former name] is now Umbodi</h2><p class="lead">The autonomous search agent published as <b>[former name]</b> until September 2026 is now published as <b>Umbodi</b>. S…
no_ai_crawler_policy /robots.txtrobots.txt- User-agent: GPTBot - User-agent: ClaudeBot - User-agent: PerplexityBot 5 line(s) removed, 0 added
robots.txt+ # umbodi:generated:start + # Added by Umbodi — the rules above are yours and are left untouched. + # Answer engines are allowed, deliberately: being cited is distribution. 0 line(s) removed, 27 added
no_canonical /cookiescookies.html- <link rel="canonical" href="https://umbodi.ai/cookies">cookies.html+ <link rel="canonical" href="https://umbodi.ai/cookies">no_publisher_schema /licensinglicensing.html- "@type": "Organization", - "@id": "https://umbodi.ai/#org", - "name": "I-Novanet Software Ltd", 12 line(s) removed, 0 added
licensing.html+ <!-- ascent:jsonld:start --> + <script type="application/ld+json"> + { 0 line(s) removed, 20 added
no_structured_data /privacyprivacy.html- <script type="application/ld+json"> - { - "@context": "https://schema.org", element removed (46 lines)
privacy.html+ <!-- ascent:jsonld:start --> + <script type="application/ld+json"> + { 0 line(s) removed, 19 added
noindex /privacyprivacy.html+ <meta name="robots" content="noindex">privacy.html- <meta name="robots" content="noindex">og_incomplete /ascentascent.html- <meta property="og:title" content="[former name] is now Umbodi — the same product, renamed">ascent.html+ <meta property="og:title" content="[former name] is now Umbodi — the same product, renamed">og_no_site_name /ascentascent.html- <meta property="og:site_name" content="Umbodi">ascent.html+ <meta property="og:site_name" content="umbodi.ai">publisher_no_description /cookiescookies.html- "description": "A Mauritian software company building tools for search and AI-answer visibility.",cookies.html+ "description": "A Mauritian software company building tools for search and AI-answer visibility.",publisher_no_legal_name /licensinglicensing.html- "dateModified": "2026-10-06T12:00:30.210Z", + "dateModified": "2026-10-06T13:00:26.096Z",
sitemap_not_referenced /robots.txtrobots.txt- Sitemap: https://umbodi.ai/sitemap.xmlrobots.txt+ # umbodi:generated:start + # Added by Umbodi — the rules above are yours and are left untouched. + # Answer engines are allowed, deliberately: being cited is distribution. 0 line(s) removed, 26 added
title_too_long /blog/accessibility-compliance-performance-marketing-balanceblog/accessibility-compliance-performance-marketing-balance.html- <title>Accessibility vs. Growth: Balancing Compliance and Performance</title> - <meta property="og:title" content="Accessibility vs. Growth: Balancing Compliance and Performance"> + <title>Accessibility vs. Growth: Balancing Compliance and</title> + <meta property="og:title" content="Accessibility vs. Growth: Balancing Compliance and">
This page is generated from its database row on every push; the render on 2026-10-07 (commit de122542) replaced the file afterwards. The receipt records the fix live at the verification time.
title_too_short /termsterms.html- <title>Terms of Service — umbodi.ai</title> + <title>Terms of Service — umbodi.ai — umbodi.ai</title>
No decision inside the loop was a person's. These are the steps people took around it, stated so nobody has to find them in the history.
A drill proves the repair path, not a ranking change. Rank is measured on Google and reported as measured; it is never inferred from a fix.
Each has a route and a remedy. What this site lacks is a way to create the defect without breaking a live page or advertising one that does not exist. The reasons below are read from the code that refuses the plant.
| Defect type | Why it cannot be proven here (from the code) |
|---|---|
thin_content | the thinnest page this site serves is 857 words and the finding fires under 250, so the plant is "delete the body of a live page" for up to 52 hours. Measured 2026-10-06 across all 12 root pages. A drill is a worse snippet, never a broken page. |
images_missing_alt | the only pages with an <img> are methodology (3), walkthroughs (6) and developers (1), and all three are marketing pages pre-rendered into fr/ and es/ — so mirroredRefusal refuses the plant, correctly. There is no unmirrored page on this site with an image. Measured 2026-10-06. |
no_internal_links | every root page carries at least seven internal links and most of them are its own navigation, so the plant is "remove the nav from a live page". Measured 2026-10-06. Same refusal as thin_content and for the same reason. |
missing_sitemap | sitemap.xml is regenerated by .github/workflows/blog.yml (build-sitemap) on every push to main, so a deleted sitemap comes back within minutes without the agent — a drill would credit CI. Measured 2026-10-07: build-sitemap restores a deleted file exactly. Owner decision the same day. |
sitemap_stale | same generator, same answer: build-sitemap rewrites every <lastmod> on each push, so a planted stale date is reverted by CI before the agent can act. Measured 2026-10-07; owner decision. |
robots_blocks_crawlers | the plant is "Disallow: / on the live robots.txt" for up to 52 hours — telling every crawler to stop reading umbodi.ai. On a site whose entire product is search and AI-answer visibility that is not a worse snippet, it is the worst available outcome, and it would also suppress the rank measurements every other drill depends on. Measured 2026-10-07: our robots.txt currently disallows 2 admin prefixes and allows everything else. |
sitemap_url_not_indexable | plantable in principle and not built: it needs a new sitemap edit that ADDS a url serving nothing (the existing sitemap_lastmod target only ages an entry), and the drill then advertises a dead page to crawlers for up to 52 hours. Measured 2026-10-07: the remedy and the plant are inverses — the agent dropping the url restores exactly what scripts/build-sitemap.mjs produces — so this is the one of the three that a later session could reasonably add. It is listed rather than attempted because a drill that lies to a crawler about a page should be a deliberate decision, not a side effect of finishing a list. |
robots_named_agent_exempt | plantable in principle and not built: the plant is a named group with `Allow: /` on the live robots.txt — the exact defect #912 removed, exempting a crawler from /admin and /api/ for up to 52 hours — and it needs a new robots edit plus a DRILL_EXCUSES entry, because test/robots-own-named-groups.test.mjs fails every pull request while the plant is open. Measured 2026-10-09: our robots.txt names ten crawlers and none escapes. Listed rather than attempted for the same reason as sitemap_url_not_indexable: a drill that re-opens what a fix just closed should be a decision, not a side effect of adding the code. |
A defect type counts when a proposal the agent decided on its own carries a verified receipt: the agent found the defect, decided the fix, published it, merged it and verified the live site. The receipt is a row the product writes, not a claim written for this page.
Some were and some were planted. To exercise the loop we deliberately introduced defects on our own pages and let the agent find them. Every row says which it was: a planted drill or a finding in the wild.
No. A drill proves the repair path works end to end. It does not show a ranking change, and Umbodi never infers one from a fix: rank is measured separately, on Google, and reported as measured.
Not inside the loop. Around it, people planted the drills, granted per-page permissions, retired old approvals, deployed the worker, ran a database migration and triggered some runs early. Those steps set the stage and the timing; every decision on this page was the agent's.
It audits first and shows you what it found. Acting on its own is a setting you turn on, page by page.