Author: Organic Agent

  • SEO Experiments You Can Run in 30 Days (With Kill Criteria)

    SEO Experiments You Can Run in 30 Days (With Kill Criteria)

    A real SEO experiment needs four things decided before you touch anything: the exact change, the metric it should move, the measurement window, and the condition under which you’ll call it wrong. We run this pattern on our own site for every on-page fix we ship – six proposals on file, six pre-registered wrong-if conditions – and this article walks through what we changed, what we said would prove us wrong, and what actually happened when we checked. Two of the six are still open. One taught us that a low-traffic site can go a month without enough search data to call a result either way.

    Most SEO advice tells you what to change. It rarely tells you how you’d know if the change didn’t work. We run organic-os, the AI SEO agent that proposes and applies fixes on this site, under a rule borrowed from science before marketing: no proposal gets approved without a falsifiability section stating the exact condition that would prove it wrong. Here’s what that looks like run six times, with the results as they actually stand today.

    Why most SEO tests fail before they start

    A test without a pre-registered wrong-if condition isn’t an experiment – it’s a change you’ll rationalize afterward. If rankings go up, you credit the change. If they don’t, you blame seasonality, a core update, or “these things take time.” Nothing was ever falsifiable, so nothing was ever actually tested. The fix is small and unglamorous: write down, before you ship, the specific number and the specific window that would make you reverse the change or admit it didn’t help. Every proposal on this site does that in a section literally titled “Falsifiability.” It’s the only part of the process that keeps a fix from becoming a permanent, unverified belief.

    Five experiments we’ve actually run, with exact setups

    1. Title-length trim. Two posts had auto-templated titles running 69 and 73 characters, past the roughly 60-character point where SERPs start truncating. Change: set an explicit title override on each post, dropping the auto-appended site-name suffix. Metric: whether the full title renders untruncated. Window: next snippet inspection, no fixed day count. Wrong-if: a snippet check still shows truncation 7+ days after apply. Result: applied and verified live against both URLs’ rendered title tag – full titles render, wrong-if condition not triggered.

    2. Meta-description trim. Two pages had descriptions at 177 and 170 characters, past the roughly 160-character truncation point. Change: cut only the redundant closing clause from each – no new claims added. Wrong-if: either description still over 160 characters after apply, or truncation still visible 7+ days later. Result: applied and verified; one check briefly looked like a mismatch until we accounted for RankMath HTML-entity-encoding the apostrophe in the live output – the underlying text matched exactly once decoded.

    3. Homepage H1, schema, and keyword fix. Three changes bundled into one proposal: remove a duplicate H1 (the theme’s masthead was rendering as a second H1 alongside the hero), add the primary keyword to visible body copy (it appeared zero times outside meta fields), and remove an incorrectly-typed schema node. Wrong-if: any of the three still present on re-fetch. Result: partial. The keyword and hero-copy change landed and verified. The duplicate H1 and the schema-type change hit a hard wall – both live only in places the connected WordPress role can’t reach over the REST API – and remain open. Checking the live page again while writing this, more than a month later, the homepage still renders two H1 elements.

    4. Homepage title and meta rewrite. The homepage title and description were both over length and contained none of this site’s tracked keyword targets. Change: shorten both and add a focus keyword. Wrong-if: average search position for the target queries showing no improvement, or click-through dropping on any query the page already ranked for, 30 days out. This is the experiment with the most instructive result – see the next section, because the honest answer isn’t pass or fail.

    5. Blank metadata on three orphaned posts. A whole-site scan found three published posts with every RankMath field – title, description, focus keyword – completely empty. Change: set all three fields on each post, paraphrased directly from each post’s own opening paragraph so no new claim was introduced. Wrong-if: search impressions for the three URLs showing no change 30 days after apply, or RankMath silently overriding the explicit values with its own fallback. Result: still mid-flight, and worth reading honestly rather than rounding up – see below.

    Reading results honestly on a low-traffic site

    Experiment 4’s 30-day window closed before this article was written, so we pulled the actual Search Console data for the homepage over that exact span. The result: search impressions on 8 of the 32 days, ranging from 0 to 4 per day, zero clicks across the entire window, and a position that swung from as good as 2.25 to as poor as 6 depending on which of those 8 days you look at. A broader pull for any query containing the target phrase over roughly the same period turned up exactly one matching row in the whole month.

    That’s not a failed experiment. It’s a sample size too small to call anything. A site with this little query volume can’t distinguish a real ranking shift from a single day’s noise, and treating either the up-swing or the down-swing as the answer would be exactly the kind of unfalsifiable storytelling we’re trying to avoid. The honest read is: inconclusive, re-check in another 30 days once more query data has accumulated. We also know applied fixes on this site have been silently reverted by unattributed bulk edits before – one incident touched six pages within a four-second window – so a clean 30-day read requires checking that the change is still live, not just that a metric moved.

    Our own open experiments and their current state

    Two of the six are unresolved right now, and we’re naming both rather than letting them quietly age out. The homepage’s duplicate H1 and incorrect schema type are still live, more than a month past the original proposal, blocked on capability rather than decision – both changes live in places our connected WordPress role can’t write to. And the three-post metadata fix is genuinely between states: checking post 6 directly today shows its description field is now set, but to different wording than the proposal specified, while its title and focus keyword are still blank. That’s neither the “applied” nor the “untouched” outcome the wrong-if condition anticipated – it’s a third state the experiment template didn’t account for, and it’s a more useful thing to log than to smooth over.

    The pattern across all six: kill criteria only work if you actually go back and check them, on a fixed schedule, against live data – not against your memory of what you meant to ship. That discipline matters more on a small site than a large one, precisely because there’s less data to lean on and more temptation to read a coincidence as a result. It’s the same evidence-first habit behind how we test whether AI-assisted content actually ranks, the review boundary we draw in what still needs a human in this pipeline, the log we keep on who’s actually reading our pages before a person does, the keyword grouping described in how we structure a B2B SaaS keyword portfolio, and the approval loop documented in what an AI SEO agent actually does.

    Frequently asked questions

    What four things does a real SEO experiment need before you start?

    The exact change, the metric it should move, a fixed measurement window, and a wrong-if condition – the specific result that would prove the change didn’t work. Without that last part, a test can’t fail, which means it was never really a test.

    Why can’t a low-traffic site trust a 30-day ranking check?

    Because a handful of impressions spread across a month is noise, not signal. One real 30-day check on our own homepage found search impressions on only 8 of 32 days and zero clicks the entire window – too sparse to call the result a pass or a fail either way.

    What happens when an experiment only partially lands?

    It gets recorded as partial, not rounded up to done. One of our own fixes landed two of three changes and left the third blocked on a capability wall; the record still names the exact remaining step rather than marking the whole thing applied.

    What’s the biggest risk to a clean experiment result?

    An unattributed revert. Applied fixes on this site have been silently reverted by external bulk edits before, in one case within four seconds of a batch operation. A results check needs to confirm the change is still live, not just that a metric moved.


    About the author: Shivaa Tripathi leads digital and performance marketing at Exotel, focused on demand generation, martech, and applying AI to SEO. He built organic-os, the AI SEO agent used to draft this article and to run the falsifiable-experiment process described above in production on this site.

  • Human-in-the-Loop Content Workflows That Actually Scale

    Human-in-the-Loop Content Workflows That Actually Scale

    The design rule behind this site’s publishing pipeline is one sentence: humans review judgment, automation handles hygiene. Word counts, banned-phrase checks, HTML escaping, and duplicate-slug lookups run unattended every time. Anything that requires a judgment call – is this claim actually verified, does this reply mean yes, does the rendered page match what we meant to ship – waits for a person. Every real incident that has shaped this system, including a label that leaked into seven live posts and a rendering bug that got past an API-level check, happened at a judgment boundary, not a hygiene one. That is the whole case for where the line goes.

    We run organic-os, the AI SEO agent that drafts and publishes articles on this site, under a human-approved gate at every step that changes something live. This isn’t a framework pitch. It’s a report from our own logs: what’s gone wrong, what got caught, and where we drew the review line.

    What humans catch that pipelines do not

    Two incidents shaped most of the rules we run today. The first: seven published posts opened with a visible “In short:” label sitting inside what was supposed to read as natural prose, because no custom excerpt had been set on any of them – WordPress fell back to auto-generating one from the same labeled text, so the leak showed up twice, once in the article body and once in every listing page. An automated word-count or banned-phrase check would have passed all seven; nothing in that check list was looking for a stray label. A human read caught it in one pass. The fix became a standing rule: article bodies contain only reader-facing prose, never label text, and the excerpt field is always set explicitly.

    The second, more instructive incident: a single post shipped with eighteen backslash-escaped Gutenberg block comments, the result of a shell-escaping bug during the build step. The API-level content check – reading the post back through content.raw and confirming it matched what we submitted – passed cleanly, because the escaped text was exactly what got sent. The live rendered page told a different story: WordPress couldn’t parse the escaped comments, so they printed as literal garbage text mid-article. An API response matching what you sent isn’t the same claim as a page rendering correctly. That gap is why every publish here now ends with a fetch of the actual rendered HTML, not just a re-read of the API field, and why that exact bug class has recurred at least twice more since the rule was written – each time caught by the render check before the page was left broken.

    Neither bug was a hygiene failure in the sense of a missed word-count limit. Both were the pipeline confidently reporting success on a check that was, in hindsight, checking the wrong thing – not “did the script run,” but “does this actually look right.”

    Batch approvals vs. per-item approvals

    We use both patterns, deliberately, for different kinds of decisions. This article itself is a batch case: it was one of six topics approved together in a single Cowork-session decision, “approve all,” rather than reviewed one at a time. A prior batch of topics was approved the same way, and that single approval record was treated as covering the full produce-through-publish pipeline for each separate article produced from it afterward – no new per-item approval required at draft, at QA, or at publish. Batch approval fits here because the review question is the same for every item in the batch: is this topic worth writing about at all. Once that’s answered once, it doesn’t need re-answering per article.

    Per-item approval earns its cost when the review question differs for each item. In one run, a single on-page fix was proposed alongside two other pending items in the same Telegram thread. A reply of “Approved,” sent directly to that one proposal, parsed and recorded a decision. Two sibling items – one replied to with “Wait for now,” another with “Go ahead” – correctly did not parse as decisions at all, since neither matched the approve/reject vocabulary the parser recognizes, even though “Go ahead” clearly reads as intent to a person. Those items stayed pending rather than getting guessed at. That’s the trade-off: a strict grammar produces fewer false approvals, at the cost of leaving genuine affirmative replies stuck until someone replies again in the expected shape – a documented gap, left in the log rather than smoothed over, because a gap that keeps causing friction eventually forces the fix.

    The escalation path: what pauses the pipeline entirely

    Some failures don’t get quietly retried. An approval record missing its decision field is treated as an illegal state, not a soft error – it blocks downstream steps like publish outright, by design, and that exact gap has recurred four times in one week before being caught and repaired each time. A background function that rebuilds the approvals queue crashes outright on a set of leftover scratch files with an unexpected schema; that crash has been reproduced live on three separate dates and worked around per-run, because it’s never been fixed at the source. And when an applied fix only reaches part of what it set out to do – one proposal changed the two things reachable through the WordPress REST API, but two more changes needed a human in the Site Editor UI, since no REST-writable field exists for them – the record stays open as “partially applied,” with the exact remaining steps named, rather than marked done.

    None of those three are hygiene bugs with a quick automated fix. Each is a wall the pipeline genuinely cannot get past on its own: a broken state it shouldn’t guess through, a bug nobody’s patched yet, or a capability WordPress doesn’t expose over the API. The pipeline’s job there isn’t to route around the wall. It’s to say exactly where the wall is and stop.

    Measuring whether your review gate is adding value or just latency

    We don’t have a timing number for how long review adds per item – no run log tracks that, and inventing one wouldn’t be honest. What we do track is whether the same class of incident keeps recurring after it’s supposedly fixed. Every lesson in this site’s internal lessons log carries an evidence label (strong, moderate, or anecdotal) and a last-confirmed date, and gets re-checked, not just written once and left alone. Some lessons have stayed clean for weeks. Others, like the queue-rebuild crash, have been re-confirmed broken on three separate occasions with the identical trigger – useful information either way: it tells us the gate is catching a real, unresolved problem rather than a one-off. A gate that never surfaces a repeat incident might mean the process is solid, or it might mean nobody’s checking hard enough to find the repeats. A gate that surfaces the same incident twice, with the same root cause named both times, is doing its job, even with the underlying bug still open. That’s a different measure than speed, and it’s the one that tells you whether a gate is worth the friction it adds.

    The pattern generalizes past this one pipeline. A review step that only re-checks something a script already checked correctly is pure latency and should be automated away – the same line we’ve drawn elsewhere for what stays automated in our content operations and for the mechanical parts of reading our own crawler logs. A step that catches the gap between “the check passed” and “this is actually right” earns its keep – the same reasoning behind how we scope what the agent can touch, inside the observe-propose-approve-apply-verify loop this site runs on, and the same evidence-first habit behind separating GEO, SEO, and AEO instead of blurring them together.

    Frequently asked questions

    What’s the one-sentence rule for what needs human review?

    Review judgment, automate hygiene. Word counts, banned-phrase checks, escaping bugs, and duplicate-slug lookups run unattended. Anything requiring a judgment call – is a claim actually verified, does a reply mean yes, does the rendered page match intent – waits for a person.

    Why did an API-level content check miss a real rendering bug?

    Because the API check only confirmed the submitted content matched what came back – it did too. The submitted content itself contained backslash-escaped Gutenberg comments that WordPress couldn’t parse, so the live page rendered garbage text even though the API-level comparison passed cleanly. Only a fetch of the actual rendered HTML caught it.

    When does batch approval make sense instead of per-item approval?

    When the review question is identical across every item in the batch – such as “is this topic worth covering” – one approval can cover the whole batch through to publish. Per-item approval earns its cost when each item carries a different, specific judgment call that a blanket yes can’t answer.

    What actually pauses this pipeline completely, rather than getting worked around?

    An approval record missing its required decision field, a known unfixed crash in the queue-rebuild step, and a fix that only reaches what’s writable through the WordPress REST API and leaves the rest for a human in the wp-admin UI. Each gets logged with the exact remaining step named, rather than marked done.


    About the author: Shivaa Tripathi leads digital and performance marketing at Exotel, focused on demand generation, martech, and applying AI to SEO. He built organic-os, the AI SEO agent used to draft this article under the same human-approved publishing gate described above, and runs it in production on this site.

  • AI Crawler Analytics: Who Is Actually Hitting Your Site

    AI Crawler Analytics: Who Is Actually Hitting Your Site

    Crawler evidence on your site lives in three places: raw server logs, your CDN’s edge analytics, and whatever a WordPress plugin can parse from those logs. Google Analytics 4 is not one of them. GA4 fires through a tag that runs as JavaScript in a visitor’s browser, and every documented AI crawler – GPTBot, ClaudeBot, PerplexityBot, and the rest – fetches raw HTML without running that script, so none of their visits ever reach a GA4 report. Below is the current, vendor-documented roster of AI crawlers, where to actually find their hits, and what crawl frequency can and cannot tell you about whether an AI answer engine is likely to cite you.

    Site owners keep asking a version of the same question: which AI crawlers are actually hitting my site, and how often. It is a fair question, and a different one from measuring whether you’re being cited in AI answers. Citation tracking asks what AI systems say about you. Crawler analytics asks what they’ve already read. Both matter, and neither substitutes for the other.

    Why your analytics dashboard is blind to crawlers

    GA4’s standard web measurement depends on the Google tag running client-side. Google’s own documentation on server-side tagging describes the default setup this way: without a server container in between, “the browser” sends “events directly to Google’s analytics servers.” That single sentence is the whole explanation. A hit only exists if a browser executes the tag and calls out to Google. AI crawlers, as documented by every vendor covered below, fetch pages to read their HTML content. None of the vendor documentation we could find describes any of these crawlers executing page JavaScript the way a browser does. No script execution means no gtag call, and no gtag call means GA4 has nothing to log. This isn’t a GA4 configuration mistake you can fix with a setting. It’s the measurement model working exactly as designed, for a use case – human browser sessions – that doesn’t include crawlers.

    The current AI crawler roster

    Four organizations publish documented, named user agents for content-related crawling. OpenAI documents four: GPTBot, used “to crawl content that may be used in training our generative AI foundation models,” which respects robots.txt; OAI-SearchBot, used “to surface websites in search results in ChatGPT’s search features,” also robots.txt-compliant; OAI-AdsBot, which only visits pages submitted as ads rather than crawling generally; and ChatGPT-User, which fires for live user actions inside ChatGPT and Custom GPTs – OpenAI states plainly that “because these actions are initiated by a user, robots.txt rules may not apply.”

    Anthropic documents three: ClaudeBot, which “collects web content that could potentially contribute to” training Anthropic’s models; Claude-User, which fetches a page “when individuals ask questions to Claude”; and Claude-SearchBot, which “navigates the web to improve search result quality for users.” Anthropic states all three “respect ‘do not crawl’ signals by honoring industry standard directives in robots.txt.”

    Perplexity documents two, split the same way OpenAI splits theirs: PerplexityBot “surface[s] and link[s] websites in search results on Perplexity” and is not used for AI training, and Perplexity’s own docs recommend allowing it in robots.txt; Perplexity-User fires when “a user requested the fetch” and “generally ignores robots.txt rules” for that reason. Common Crawl’s CCBot rounds out the list – not an AI company itself, but the open dataset several foundation models are trained on, identifiable by the literal string “CCBot/2.0” and blockable with a two-line robots.txt rule.

    The pattern across every vendor is the same split: a crawling bot that respects robots.txt and feeds training or search indexes, and a live-fetch bot that acts on a specific user’s request and may not check robots.txt at all, because the fetch was requested by a person, not scheduled by a crawler.

    Reading server logs and CDN analytics for bot traffic

    Server logs are the most complete record available, because every HTTP request lands in them regardless of whether it came from a browser, a script, or a crawler, and each entry carries the user-agent string these vendors document. The trade-off is access and tooling: raw logs require either shell access to grep them or a log-analysis tool pointed at them, and most shared WordPress hosts don’t expose raw logs by default.

    CDN-level analytics sit a level up. Cloudflare, as one documented example, explicitly avoids collapsing everything into a single “AI bot” label – its own docs state that it “classifies bots by behavior,” using categories like search, agent, and training crawls, rather than one bucket. At the zone level, Cloudflare’s Bot Analytics (Business and Enterprise plans) shows traffic segmented by automated versus likely-automated type and the detection source behind that call; the Enterprise Bot Management tier adds a bot-score distribution across every request. Cloudflare also runs a public, aggregate dashboard – Radar’s AI Insights page – that tracks the top AI crawlers globally, but that’s industry-wide data, not your site’s own log.

    WordPress plugins that surface “bot traffic” sit a layer above both: at best, they’re parsing the same access-log or CDN-log data described above and filtering it down to known user-agent strings, which is useful for a quick read but only as complete as the log source feeding it. None of that changes the underlying fact from the section above – whatever tool you use, you’re reading logs or edge data, never GA4.

    What crawl frequency does and does not tell you about citation odds

    It is tempting to treat crawl frequency as a leading indicator: more GPTBot hits should mean better odds of a ChatGPT citation. We looked for a published study or vendor statement tying crawl frequency to citation likelihood and found none. That gap is worth stating plainly rather than filling with a guess. What crawl logs can tell you, honestly, is narrower: whether a given crawler has access to a page at all, how recently it last fetched that page, and whether your robots.txt is blocking a crawler you didn’t mean to block. What they cannot tell you is whether that crawl turned into an answer, a citation, or nothing. That gap is exactly why crawler analytics and citation tracking are separate jobs, not one measurement done twice – our own citation-tracking method runs a query panel against live AI answers precisely because crawl logs can’t answer that question.

    Turning the data into decisions: allow, block, or optimize

    Once you can see who’s actually crawling, the decision splits into three options, not two. Allow a crawler when you want inclusion in that system’s answers or search index – PerplexityBot and OAI-SearchBot are both explicitly built for that and both vendors ask you to allow them. Block a crawler when you specifically object to your content training a model, understanding that a robots.txt rule only stops the crawlers that honor it; live-fetch bots like ChatGPT-User and Perplexity-User may bypass it entirely because a person, not a schedule, triggered the request. We’ve written the full mechanics of that trade-off, including working robots.txt lines for every crawler above, in our guide to blocking AI crawlers. The third option is easy to skip past: optimize instead of choosing allow-or-block at all, by making sure the pages you do allow are actually structured for a crawler to read cleanly, the same groundwork covered when we compared GEO, SEO, and AEO as distinct disciplines. This site runs that exact loop – observe crawl and GA4 data, propose a change, get human approval, apply it – as the same AI SEO agent process described elsewhere on this site, and we track our own referral side of this with AI referral traffic in GA4, which is the one piece of this picture GA4 actually can see, since a referral click comes from a browser.

    Frequently asked questions

    Why doesn’t Google Analytics show AI crawler visits?

    GA4 measurement runs through a tag that executes as JavaScript in a visitor’s browser and then calls out to Google’s servers. AI crawlers fetch a page’s raw HTML without running that script, so no measurement call ever fires. GA4 can still show AI referral clicks, because those come from a real browser session, just not the crawl itself.

    Which AI crawlers should I actually look for in my logs?

    The vendor-documented list currently covers OpenAI’s GPTBot, OAI-SearchBot, OAI-AdsBot, and ChatGPT-User; Anthropic’s ClaudeBot, Claude-User, and Claude-SearchBot; Perplexity’s PerplexityBot and Perplexity-User; and Common Crawl’s CCBot, whose data feeds multiple foundation models.

    Does more crawling mean a better chance of being cited?

    There’s no published study or vendor statement tying crawl frequency to citation odds. Crawl logs can confirm a page was fetched and how recently; they can’t tell you whether that fetch produced an answer or a citation. Those are measured separately, through a citation-tracking method rather than a log.

    Can a robots.txt rule stop every AI crawler?

    No. Crawling bots like GPTBot, ClaudeBot, and PerplexityBot are documented as robots.txt-compliant. Live-fetch bots like ChatGPT-User and Perplexity-User are explicitly documented as sometimes ignoring robots.txt, because a specific user’s question triggered the fetch rather than a scheduled crawl.


    About the author: Shivaa Tripathi leads digital and performance marketing at Exotel, focused on demand generation, martech, and applying AI to SEO. He built organic-os, the AI SEO agent used to draft this article under a human-approved publishing gate, and runs it in production on this site.

  • Should You Disclose AI-Drafted Content? Here’s Why We Do

    Should You Disclose AI-Drafted Content? Here’s Why We Do

    Google does not require you to disclose that content was AI-drafted. Its own guidance asks creators a self-assessment question instead: is the use of automation “self-evident to visitors through disclosures or in other ways,” and would a reader reasonably expect to know? We disclose on every post here anyway, in an author box and on our About page, because the trust case is stronger than the compliance case. Below is what Google’s documentation actually says, why we disclose regardless, the fair version of the argument against it, and the exact wording you’re free to copy.

    Every article on this site carries a line disclosing how it was made. That is not a legal requirement. It is a choice, and this post is our attempt to justify it with sources rather than assumption, following the same evidence policy we used when asking whether AI content ranks at all.

    What Google actually requires

    Google’s spam policies define “scaled content abuse” as pages “generated for the primary purpose of manipulating search rankings and not helping users,” and they name “using generative AI tools or other similar tools to generate many pages without adding value for users” as a direct example. The violation is the manipulative intent and the lack of value, not the use of AI itself.

    Google’s documentation on generative AI content is more direct still: “If you use automation, including AI-generation, to produce content for the primary purpose of manipulating search rankings, that’s a violation of our spam policies.” Nothing in that sentence is about disclosure. It is about purpose.

    On disclosure specifically, Google frames it as a self-assessment question rather than a rule: “Is the use of automation, including AI-generation, self-evident to visitors through disclosures or in other ways?” and separately, “AI or automation disclosures are useful for content where someone might think ‘How was this created?’ Consider adding these when it would be reasonably expected.” That is guidance about reader expectations, not a ranking requirement. A companion page adds one more sentence worth keeping: “Sharing information about how a piece of content was created can help give your readers more context,” again offered as a benefit, not a mandate.

    What Google’s ranking systems reward is described separately, through E-E-A-T: “experience, expertise, authoritativeness, and trustworthiness,” of which, in Google’s own words, “trust is most important. The others contribute to trust, but content doesn’t necessarily have to demonstrate all of them.” Disclosure is not one of the four letters. It is, at most, one input into the trust component, and Google never states that omitting it costs you anything in rankings.

    The trust case for disclosure, with this site as the example

    If Google does not require disclosure, the reason to do it has to come from somewhere else. Ours comes from what this site actually is. Our About page states plainly that articles are “drafted by organic-os (bylined ‘Organic Agent’ where the agent drafted them), fact-checked against live sources under an evidence contract that drops any claim it cannot verify, and reviewed and approved by Shivaa before publishing.” That is a fuller answer than most people mean when they ask what an AI SEO agent actually is: not just software that drafts text, but a named process with a disclosed owner. Every published post also carries an author box naming who built the system and disclosing that they run it in production, including its failures.

    That last phrase matters more than the disclosure itself. A generic “AI helped write this” notice tells a reader almost nothing useful. Ours names the specific evidence contract in place: every claim traces to a source or gets dropped, exactly the standard applied to what it actually takes to make AI content rank. Readers who want to check that claim can. That is the actual trust mechanism, not the disclosure sentence on its own.

    There is also a practical argument distinct from trust: an undisclosed automated pipeline is a liability the moment it fails once, publicly. Naming the process before anything goes wrong costs a sentence. Explaining it after something goes wrong costs credibility. We would rather pay the sentence up front.

    The case against, stated fairly

    The strongest counterargument is the one Google’s own documentation implies: if disclosure carries no ranking weight and readers rarely act on it, it is optional overhead with an unclear return. A publisher optimizing purely for search performance has a defensible reason to skip it, since nothing in Google’s spam policy or E-E-A-T guidance ties disclosure to rankings.

    A second, more cynical version of the same argument holds that disclosure invites scrutiny a piece of content might not survive, and that silence is simply lower risk. We think that argument proves too much: if a piece of content cannot survive a reader knowing how it was made, the problem is the content’s evidence quality, not the disclosure. That is exactly why our evidence contract exists as a separate, checkable step, not a substitute for one.

    A third version is narrower and harder to dismiss: disclosure language can be clumsy enough to distract from the content itself, especially when it reads like a label instead of a sentence. That is a real formatting risk, and it is the reason we treat the wording of the disclosure as part of the editorial pass, not an afterthought bolted onto a template.

    A disclosure pattern you can copy

    Two places carry the disclosure here, and neither uses “AI-generated” as a badge or a warning label. The first is the About page, which states the process once, plainly, without hedging: articles are drafted by the system, fact-checked against live sources, and approved by a named human before anything goes live.

    The second sits at the bottom of every article, after a horizontal rule, in a short author-box paragraph. It names the person, states what the system is, and says it runs in production on this exact site. It reads as a sentence, not a stamp: something like “[Author] built [the system], the AI SEO agent [or process] used in this article, and runs it in production on this site, including its failures.” Swap in your own names and system. The structural choices that make it work are the same regardless of what you’re disclosing, and they map closely onto how we run automated content operations generally: state it once on a persistent page, restate it briefly on every piece it applies to, name a specific accountable person, and avoid vague catch-all language like “this post may have used AI” that discloses nothing checkable.

    Where this leaves you

    Google will not penalize you for staying silent about AI drafting, and it will not reward you for disclosing it either. Rankings are decided by the quality bar in the spam policy and by E-E-A-T, not by a disclosure line. Whether to disclose is a trust decision you make for your readers, not a ranking decision you make for Google. We made ours, we can point at exactly how we phrase it, and now you can compare that against the argument for staying quiet and decide which fits your own site.

    Frequently asked questions

    Does Google require you to disclose AI-generated content?

    No. Google’s own guidance frames disclosure as a self-assessment question about whether automation use is “self-evident to visitors” and “reasonably expected,” not a stated requirement. Its spam policy targets content “generated for the primary purpose of manipulating search rankings and not helping users,” including at-scale generative AI use, but that is a quality-and-intent standard, not a disclosure rule.

    Does disclosing AI use hurt your rankings?

    There is no statement from Google tying disclosure, one way or the other, to ranking outcomes. Rankings are described as depending on E-E-A-T and on whether content serves the primary purpose of helping users, not on whether a disclosure sentence is present.

    Why does this site disclose AI-drafted content if it isn’t required?

    Because the trust case is separate from the compliance case. Our About page states the process directly, and every article’s author box repeats it briefly, naming a specific accountable person and an evidence contract that drops unverifiable claims rather than a vague catch-all disclosure.

    What should a disclosure sentence actually say?

    Enough to be checkable: who is accountable, what produced the content, and what review step it passed through before publishing. A vague line like “this post may have used AI” discloses a possibility, not a process, and gives a reader nothing to verify.


    About the author: Shivaa Tripathi leads digital and performance marketing at Exotel, focused on demand generation, martech, and applying AI to SEO. He built organic-os, the system that drafted this article under a human-approved publishing gate, and runs it in production on this site, disclosure included.

  • What Access Should You Give an AI SEO Agent?

    What Access Should You Give an AI SEO Agent?

    I let an AI agent publish directly to this site, and the access I grant it is narrower than most people assume. It authenticates with a WordPress application password tied to a limited-role account, not my admin login. Every mutation — a new post, an edited meta field, a status change — passes through a recorded approval step first. The credential lives in a local file outside version control, and I can revoke it in one click without touching anything else. That is the actual model: gated authority and revocable credentials, not blind trust.

    The access tiers I actually use

    Before I gave an agent any access to this site, I split the possible actions into four tiers. I did this on paper first, then matched each tier to a real WordPress capability, because “the agent can help with SEO” is not a permission — it is a marketing phrase. A permission is something you can name, log, and revoke.

    • Read-only audit. Pulling Search Console data, crawling live pages, checking status codes, comparing what is indexed against what is published. No write access anywhere. This is the largest share of what the agent actually does day to day.
    • Content draft. Writing a post or editing a meta field, saved as a draft. Nothing goes live from this tier alone.
    • Publish-with-approval. The agent can request a status change from draft to published, but the request is logged and requires a recorded decision before WordPress executes it.
    • Never-grant. Site settings, user management, plugin installation, database access, billing. The agent has no path to any of these, by account role, not by instruction.

    That last tier matters more than the first three combined. An instruction like “don’t touch billing” is a suggestion I could forget to include in a prompt. An account role that was never granted `manage_options` capabilities is a wall the agent cannot talk its way past, regardless of what any prompt says.

    How this site scopes it

    WordPress application passwords, a core feature since version 5.6, let you generate a unique password for a specific integration without exposing your main account password. That password authenticates API requests — it cannot be used to log into wp-admin through the normal login screen. Each one can be reviewed by name and revoked individually, without disturbing any other credential on the account.

    Here is the part most people miss: WordPress does not scope an application password to specific endpoints or actions. The password inherits the full role and capability set of the user account it belongs to. There is no native setting that says “this password can publish posts but not delete pages.” The scoping has to happen one layer up, at the account itself.

    So the agent on this site runs under a dedicated account with the Editor role, not Administrator. An Editor can create, edit, and publish posts and manage their own meta fields, but cannot install plugins, change site settings, add users, or touch anything requiring `manage_options` — the capability WordPress checks before administrative actions. I confirmed this the concrete way: the account’s password returned a 403 `rest_forbidden` error when a task tried to purge a sitemap cache, because that action needs `manage_options` and the account does not have it. That failure is a feature, not a bug I patched around.

    The password itself lives in a local environment file, outside this repository. It is never written into a prompt, a log line, or a committed file. And the agent does not phone home with usage data beyond what WordPress itself logs against the account — no separate telemetry channel reporting what it read or drafted.

    If you are setting this up yourself: create a new WordPress user, assign it Editor (or a role with even fewer capabilities if your workflow allows it), generate an application password on that account under Users → Profile → Application Passwords, and hand that credential to your agent. Never generate an application password on your own administrator account for this purpose. The password will carry every capability you have, and there is no dial to turn that down after the fact.

    The approval gate is the real boundary

    Role-based access answers “what could the agent technically do.” It does not answer “what did the agent actually do, and did a human agree to it.” That second question needs a separate mechanism, and on this site it is an approval gate that sits in front of every content mutation, not just the risky ones.

    The pattern is consistent: a proposed change — a new brief, a draft ready to publish, a meta field edit — gets written to a record with a `status: proposed` field. Nothing executes from that state alone. A decision has to arrive through an approval channel and get recorded with who decided, when, and through what channel, before the record’s status can legally change to `approved`. Only then does the corresponding WordPress action run. If that decision record is missing any of those fields, the downstream publish step refuses to proceed rather than guessing at intent.

    What makes this a security boundary and not just a workflow nicety is that it is enforced by the code path, not by convention. An agent that skipped the approval check and called the publish endpoint directly would still not be blocked at the WordPress layer — the Editor-role account has publish capability regardless. The gate is a rule this system’s own logic enforces before reaching the WordPress API, and it produces a persistent, append-only decision log as evidence: exactly which human approved which change, and when. Nothing in it gets edited after the fact — corrections are appended as new entries, never rewritten into old ones.

    This brief and article are themselves an instance of the pattern: a proposal was written, a human approved it in a recorded session, and only that recorded approval unlocked drafting and publishing. You are reading the output of a gate, not a bypass of one.

    Revocation and rotation

    The value of scoping access this way shows up when something goes wrong, or looks like it might. Because the agent’s credential is a standalone application password on a limited-role account, the response to “something feels off” is one action: open Users → Profile → Application Passwords in wp-admin, find that password by name, and revoke it. Revocation is immediate and does not require changing the account’s main password or touching any other integration.

    That is a meaningfully different recovery path than an agent running under a shared admin login, where revoking access means resetting a password used everywhere else too, then re-authenticating every legitimate integration that also relied on it. Narrow credentials are not just safer day to day. They are cheaper to cut off when you need to.

    I do not treat “nothing has gone wrong yet” as a reason to leave a credential untouched indefinitely. Rotating the password on a schedule, and re-checking that the account role still matches only the tiers I want granted, costs a few minutes and closes the gap between “correct when I set it up” and “still correct now.” If you already monitor drift on your published content, extend that habit to the credential and role that produced it.

    None of this makes an AI agent risk-free. It makes the risk boundaries explicit, narrow, and something you can point to. That is the standard I would want from any integration touching a production site, agent or not.

    For more on what an AI SEO agent actually does day to day, see what is an AI SEO agent. For the difference between an agent like this and a rules-based automation tool, see AI SEO agent vs. SEO automation tool. If you want the mechanics of how this site’s agent actually publishes to WordPress, see WordPress SEO autopilot. And for how ongoing changes get caught after publish, see SEO drift monitoring.

    What is a WordPress application password?

    It is a unique, per-integration password, a core WordPress feature since version 5.6, that authenticates API requests without exposing your main account password. It cannot be used to log into wp-admin through the normal login form, and it can be individually reviewed and revoked without affecting any other credential on the account.

    Can you limit exactly what an AI agent’s WordPress password can do?

    Not directly. WordPress does not scope an application password to specific endpoints or actions — it inherits the full role and capabilities of the user account it belongs to. The way to limit it is to put the password on a dedicated, reduced-privilege account, such as Editor instead of Administrator, rather than trying to restrict the password itself.

    Should an AI agent be able to publish content without human approval?

    On this site, no. Every status change from draft to published passes through a recorded approval step with a named decision, actor, channel, and timestamp before it executes. The publish capability exists at the account-role level, but the approval gate is a separate, enforced check in front of it.

    What should you never grant an AI SEO agent access to?

    Site settings, user management, plugin installation, database access, and billing. These sit outside what a content-focused Editor role can touch, so the boundary is enforced by account role rather than by instruction alone.


    About the author: Shivaa Tripathi leads digital and performance marketing at Exotel, focused on demand generation, martech, and applying AI to SEO. He built organic-os, the AI SEO agent producing this site, and writes about what worked, what didn’t, and what he verified before publishing.

  • Canonry Alternative: An Honest, Verified Comparison

    Canonry Alternative: An Honest, Verified Comparison

    I run organic-os, one of the two systems in this comparison, so weigh that against everything below. Canonry is a real, verifiable open source AEO and analytics platform: self-hosted, licensed under the Functional Source License rather than a permissive license like MIT, free to run yourself, with paid Embedded, Custom, and Managed tiers that don’t publish a price. organic-os is not a downloadable product at all. It’s the operator system running this specific site, with no public repository or license of its own. If you want a platform you can install today and inspect the code of, Canonry is the more complete answer. If you’re trying to understand what a narrower, single-site operator system looks like in production instead, keep reading, but this comparison only has one side with verifiable licensing and pricing terms.

    Most “alternative” pages compare feature lists lifted from marketing copy. This one only uses claims I could confirm directly from Canonry’s own site and GitHub repository, plus what I can verify about organic-os from the system I operate. I’ve compared other AI SEO agents before, including five in AI SEO Agents Compared, and written separately about running Claude as an SEO tool. This one is narrower: one open source platform, one single-site operator, and an explicit conflict of interest to disclose up front.

    What Canonry actually is, verified from its own docs

    Canonry describes itself as “An agent first AEO + web analytics monitoring and execution platform. Open source and self-hosted, with CLI, REST, MCP, webhooks, and agent workflows.” That’s a direct quote from Canonry’s own homepage. The core platform installs via Homebrew, npm, or Docker; the command-line tool is called cnry, installed with npm install -g @canonry/canonry.

    Canonry frames answer-engine optimization as resting on four layers, in its own words: “SEO fundamentals, technical on-site signals (the 16-factor model), content depth and clarity, and off-site corroboration.” Its built-in agent, named Aero, follows a stated workflow: “Measure → diagnose → approve action → measure change.” That’s an approval step before changes ship, though Canonry’s pages don’t spell out the approval mechanics beyond that phrase.

    On integrations, Canonry’s README lists a wide, named set: for answer-engine tracking, Gemini, ChatGPT, Claude, Perplexity, and OpenAI-compatible local models; for search and business signals, Google Search Console, Google Analytics 4, Bing Webmaster Tools, and Google Business Profile; for server-side data, Cloudflare, Cloud Run, Vercel, and WordPress; plus Common Crawl for backlink data and OpenAI Ads Manager. Architecturally, Canonry is self-hosted and single-tenant. Its own docs state that by default “its project data lives in one SQLite file on your machine or server,” meaning you hold your own provider keys, backups, and deployment.

    The license question: source-available, not MIT

    Canonry’s GitHub repository names its license precisely: Functional Source License, Version 1.1, ALv2 Future License (FSL-1.1-ALv2), copyright 2026 Arber X. That’s worth spelling out, because “open source” gets used loosely in comparison posts. FSL-1.1-ALv2 grants use, copying, modification, and redistribution for any “Permitted Purpose,” but it explicitly excludes “Competing Use,” meaning you can’t offer Canonry itself as a commercial substitute for Canonry. Internal use, non-commercial education and research, and professional services are explicitly allowed. The restriction isn’t permanent: the license converts irrevocably to the Apache License 2.0, “effective on the second anniversary” of each release. That’s a real, source-available license with a delayed open-source conversion clause, not the permissive MIT terms some comparison posts assume when they say “open source.”

    organic-os has no equivalent claim to make here, and I’m not going to invent one. There is no public GitHub repository, license file, or published license statement for organic-os that I could locate this session. It isn’t a downloadable or installable product with its own terms; it’s the operator system running this one site. A licensing comparison between the two only has one side with verifiable terms, and that side is Canonry’s.

    Pricing: one tier is free and public, three are not

    Canonry Platform, the open source self-hosted tier, is free. You run it on your own infrastructure, with your own provider keys. Canonry also lists three other tiers in its own words: Canonry Embedded (“Live client-scoped AI visibility evidence for marketing and SEO agency portals, installed with one iframe URL”), Canonry Custom (“A dedicated Canonry application UI and agent-first deployment”), and Canonry Managed (“Ongoing AEO monitoring and execution for businesses”). None of the three publishes a price on Canonry’s site. A direct fetch of Canonry’s pricing page returned a 404, and the only pricing signal present anywhere on the site is a generic “$$” schema-markup range with no dollar figures attached. That’s a confirmed absence, not evidence anything is being hidden.

    organic-os isn’t priced, because it isn’t sold. It’s the system running this specific site, and this article is a product of that system, which is the conflict of interest disclosed at the top.

    Who should actually pick Canonry

    If you want a platform you can install today, with a CLI, REST API, MCP, and webhook interfaces, self-host on infrastructure you control, and inspect the source under a real, if not fully permissive, license, Canonry’s open source Platform tier is a legitimate and verifiable option, and it costs nothing to start. If you run an agency and want a client-facing embed, or want someone else to operate the monitoring for you, Canonry’s Embedded and Managed tiers exist, per the vendor’s own pages, though you’ll need to contact them directly for pricing on any of the three paid tiers.

    Where organic-os is different, and where that’s a limitation

    organic-os is not a general-purpose platform you can install on your own site. It’s a single-site operator, purpose-built for this site’s own content pipeline: drift monitoring against stored Search Console and Analytics baselines, gated drafting and publishing behind a recorded human approval with an actor, channel, decision, and timestamp, and post-publish render verification, which exists because an earlier version of this system once let escaped code syntax render as visible text on a live page. That’s a narrower design than Canonry’s Platform tier, and unlike Canonry, it isn’t something you can download and run on your own site, because it isn’t a product. It’s this one site’s operator, and comparing it to an installable platform is an asymmetric comparison by nature.

    If you’re evaluating either one

    1. Ask for the license file directly, not a marketing page. Canonry’s is in its GitHub repository; read the FSL-1.1-ALv2 terms yourself before assuming “open source” means permissive.
    2. Try the free tier first. Canonry’s Platform tier costs nothing to self-host, so you can test the CLI, REST, and MCP surfaces before any paid-tier conversation with the vendor.
    3. Ask what runs without a human and what needs approval. Canonry’s own docs describe an “approve action” step in Aero’s workflow; ask the vendor what that gate actually blocks and what it lets through automatically.
    4. Don’t assume any comparison, including this one, covers both sides symmetrically. This one doesn’t: only Canonry publishes a license and a set of named tiers. organic-os is disclosed here as the tool that wrote the comparison, not as a competing product with its own terms.

    Canonry is a verifiable, installable platform with a real license and a free tier. organic-os is the system that produced this page. Those are different kinds of things to evaluate, and the honest answer to “which should I pick” depends on whether you’re looking for software to install or trying to understand how one specific site runs its own pipeline.

    Frequently asked questions

    Is Canonry actually open source?

    Canonry’s core Platform tier is published under the Functional Source License, Version 1.1, ALv2 Future License (FSL-1.1-ALv2), per its GitHub repository. That’s source-available rather than a permissive license like MIT: it allows use, copying, and modification for any purpose except “Competing Use,” and converts irrevocably to the Apache License 2.0 two years after each release.

    Does Canonry publish its pricing?

    Only partially. The self-hosted Platform tier is free. Canonry Embedded, Custom, and Managed all exist, described in the vendor’s own words, but none lists a public price, and Canonry’s pricing page returns a 404 on direct request.

    Is organic-os open source or licensed like Canonry?

    No. organic-os has no public GitHub repository, license file, or published license terms that could be located this session. It isn’t a downloadable product; it’s the operator system running this specific site, and this article was produced by that same system, which is the conflict of interest disclosed at the top.

    What does Canonry’s Aero agent actually do?

    Per Canonry’s own docs, Aero follows a stated workflow: “Measure → diagnose → approve action → measure change.” That includes an approval step before changes ship, though Canonry’s pages don’t specify the approval mechanics in more detail than that phrase.

    Who should pick Canonry over organic-os?

    Anyone who wants an installable, self-hostable AEO and analytics platform with CLI, REST, MCP, and webhook interfaces should look at Canonry; it’s a verifiable, running product you can install today. organic-os isn’t an alternative in that sense. It’s a single site’s own operator system, not something available for anyone else to install.


    About the author: Shivaa Tripathi leads digital and performance marketing at Exotel, focused on demand generation, martech, and applying AI to SEO. He built organic-os, one of the two systems compared in this article, and runs it in production on this site, conflict of interest disclosed.

  • AI SEO Agents Compared: An Honest Field Guide

    AI SEO Agents Compared: An Honest Field Guide

    I run organic-os, one of the tools in this comparison, so read the rest of this with that in mind. I am comparing five real category entrants (Alli AI, AIOSEO, Writesonic, Surfer SEO, and organic-os) on four things you can actually check yourself: how much runs without a human, whether there is a real approval gate before a live change ships, whether the vendor publishes any evidence or fact-checking policy, and whether pricing is public or hidden behind a sales call. Every price and quote below comes from the vendor’s own site, fetched directly. One tool I looked at, SEOBotAI, is left out of the detailed comparison because its site would not render through my research tools, so I could not verify anything about it first-hand.

    “AI SEO agent” gets used for three different things, and most comparison posts do not separate them. That matters more than any single feature, because it changes what you are actually paying for.

    Agents, automation tools, and point solutions are not the same category

    An AI SEO agent reads your data, makes a decision, and (in the more autonomous ones) acts on your site without you writing the change yourself. An automation tool executes a change you configure, on a schedule or trigger you set, but does not decide what to do. A point solution does one job well, usually content generation, and leaves distribution, publishing, and technical SEO to you. The distinction I cover in more depth in AI SEO agent vs. SEO automation tool is the same one that separates the five tools below: some read and act, some read and wait for you, and one is a plugin that never claims to decide anything.

    Alli AI: on-page automation with a stated approval gate

    Alli AI’s own pricing page lists a Business plan at $299 a month (5 sites, 5 team members, 500 keywords, 1,250 pages) and an Agency plan at $599 a month (15 sites, 15 team members, 2,000 keywords, 5,000 pages), with an Enterprise tier at custom pricing. Paying annually drops those to $2,990 and $5,990 a year. All of that is public, no sales call required to see a number.

    On approval gates, Alli AI’s own FAQ page states plainly that “no code change will ever be live on your site until you approve it first.” That is a real, checkable claim, not marketing language, and it is the same design principle organic-os uses for publishing. I did not find any published evidence or fact-checking policy on the pages I checked, so I am not claiming one exists.

    AIOSEO: a plugin, not an agent

    AIOSEO’s pricing page shows a free Lite tier and paid tiers at $49.60, $99.60, $199.60, and $299.60 a year for Basic, Plus, Pro, and Elite, confirmed directly from the structured pricing data on the page. AIOSEO handles the mechanical layer of what I’d call WordPress SEO automation: meta fields, sitemaps, schema markup, redirects. It does not claim to draft content or make autonomous publishing decisions, and I found nothing on its site suggesting otherwise. That makes it a fair, useful tool, but not a comparable entry on autonomy or approval-gate criteria, because it is not built to act on those axes at all.

    Writesonic: content generation, priced by article volume

    Writesonic’s pricing page lists Starter at $79 a month (15 AI articles a month), Basic at $199 a month (25 articles), and Growth at $399 a month (50 articles), all billed annually, with an Enterprise tier at custom pricing. That is a content-volume pricing model, not a per-site or per-keyword one, which changes the math depending on how much content you actually need. I did not find any statement on the pages I checked about whether generated articles are reviewed before publishing, or any fact-checking or sourcing policy, so I am not asserting either one exists.

    Surfer SEO: an agent that is not shipped yet

    Surfer’s own pricing page lists Standard at $99 a month billed yearly ($119 month-to-month), Pro at $182 a month billed yearly ($219 month-to-month), and Peace of Mind at $299 a month billed yearly ($359 month-to-month). The current product, described on Surfer’s own homepage as “Write & Optimize with Live Guidelines,” is a human-in-the-loop content editor: you write, it scores and suggests. Surfer’s homepage also promotes a “Surfy Agent (soon)” that it says will “create competitor-specific strategies, generate reports, write, optimize, and even publish for you — at scale.” That is a real, sourced quote, and it is explicitly marked as not yet shipped. Today’s Surfer is not an autonomous agent by its own description; a future version might be.

    organic-os: what actually runs without me, on this site

    This is the tool I built and the one publishing this article, so treat this section with the same skepticism as the rest. On this site, a daily job pulls Google Analytics and Search Console data, checks for drift against a stored baseline for tracked pages, and flags anomalies, all without me. Drafting a brief into an article also runs without me, up to a point. Publishing does not. Every brief carries a recorded approval with an actor, a channel, a decision, and a timestamp before drafting starts, and an editor-level WordPress account on this site was correctly rejected when it tried to purge a sitemap cache, because that action needs a permission level the automation account does not have. After every publish, a script fetches the live rendered page and checks it against the API response, because an earlier version of this system once let escaped code syntax render as visible text on a published page, and that incident is what produced the rule.

    Where organic-os is not the right choice

    If you manage SEO across many client sites and need one dashboard with seat-based permissions, Alli AI or a comparable multi-site tool is a better fit; organic-os is built for one site’s own operator, not agency account management. If your primary need is fast on-page fixes across an existing WordPress site’s meta and schema, AIOSEO alone may be enough, and buying an agent on top of it is unnecessary. If you need a high volume of drafted articles fast and plan to run your own editorial review before anything ships, a volume-priced tool like Writesonic will produce more raw drafts per dollar. organic-os is a narrower bet: one operator, gated publishing, and a public incident log instead of a support ticket queue.

    How to run a two-week evaluation yourself

    1. Pick one page or one small content set you can watch closely, not your whole site, for the first two weeks.
    2. Ask the vendor directly, in writing, what runs without a human and what requires approval. Alli AI answers this in its own FAQ; ask the others the same question and see what you get back.
    3. Check pricing against your actual site count, keyword count, or content volume, not the headline number on the pricing page.
    4. After any automated or AI-assisted change goes live, check the actual rendered page yourself, not just a dashboard confirmation inside the tool.
    5. Ask what happens when the tool cannot complete a task, whether it stops and tells you, or silently skips the step. That answer tells you more about reliability than any feature list.

    None of these five tools are wrong for every use case, including the ones I did not build. The honest comparison is not which one is best; it is which one matches how much you actually want to happen without you in the loop.

    Frequently asked questions

    Is any of these five tools fully autonomous today?

    No. Alli AI states changes go live only after a human approves them. AIOSEO and Writesonic are not built to publish decisions autonomously in the first place. Surfer’s autonomous “Surfy Agent” is marked “soon” on its own homepage, meaning not yet shipped. organic-os, the tool behind this site, gates publishing and live-page edits behind a recorded human approval by design.

    Which of these tools is cheapest?

    By list price, AIOSEO is the cheapest, starting free with paid tiers from $49.60 a year, but it is a WordPress plugin handling meta, sitemaps, and schema, not an agent that drafts or decides. Among the tools positioned as agents or content generators, Writesonic’s Starter tier at $79 a month is the lowest entry price, though it is priced by article volume rather than by site or keyword count like Alli AI and Surfer SEO.

    Why is SEOBotAI not in this comparison?

    Its website would not render through the research tools used for this article on two separate attempts, returning only stylesheet content with no readable page text. Rather than repeat unverified third-party claims about its pricing or features, it is left out of the detailed comparison entirely.

    Do any of these vendors publish a fact-checking or evidence policy?

    Not on the pages checked for this article. Alli AI, AIOSEO, Writesonic, and Surfer SEO all publish pricing pages and product descriptions, but none of the pages fetched during this research stated a policy for how claims, generated content, or automated changes get verified before they reach a live site. organic-os documents its own version of that policy, including its failures, in the public repository behind this site.


    About the author: Shivaa Tripathi leads digital and performance marketing at Exotel, focused on demand generation, martech, and applying AI to SEO. He built organic-os, the AI SEO agent compared in this article, and runs it in production on this site, including its failures.

  • WordPress SEO on Autopilot: What Is Real in 2026

    WordPress SEO on Autopilot: What Is Real in 2026

    WordPress SEO autopilot means two different things at once: autonomous execution and gated authority. A system can pull search data, watch for drift, and draft content on its own every day. It should not publish that content, or change a live page, without a person signing off first. Anything that skips the second half of that sentence is not autopilot. It is a liability.

    I run this site, organicos.shivaatripathi.com, as a working example of that split. A daily job pulls Google Analytics and Search Console data, classifies where the site stands, checks for unauthorized changes, and flags problems. None of that requires me. Publishing a new post, editing a live page, or purging a cache does. I want to walk through exactly where that line sits here, because most “SEO autopilot” pitches blur it on purpose.

    What actually runs without me

    Every day, a scheduled job pulls session data from GA4 and impressions and clicks from Search Console for this site. It compares the new numbers against a trailing window and checks whether anything moved more than a set threshold. On a recent run, impressions moved from 109 to 114 day over day, a 9.6% change against the trailing median. That is below the alert threshold, so nothing gets escalated. The job also classifies the site’s lifecycle stage from the same data. With zero clicks across the tracked pages, the stage comes back as early, and the report says so directly rather than guessing at a number that is not there yet.

    The same daily run checks for drift: it re-fetches title, slug, status, canonical URL, and SEO metadata for a fixed set of tracked pages and compares them against a stored baseline. On one recent run, five of six tracked pages matched exactly. One showed an apparent difference in a title field, but the job did not treat it as confirmed drift. It flagged that the difference matched a known rendering artifact, WordPress’s own text conversion turning a straight apostrophe into a smart-quote character, and left the baseline unchanged pending a cleaner check. That distinction, between “something is different” and “something is wrong,” is the part that has to run unattended for autopilot to be useful instead of noisy.

    It also runs a straightforward P1 check: has any tracked page lost more than 30% of its clicks against a real baseline. With clicks still at zero across tracked URLs in this window, there is nothing to compare, so the check reports that plainly instead of inventing a false alarm.

    What stays gated, and why

    Three categories never run unattended here: publishing, live-page edits, and anything that needs elevated WordPress permissions.

    Publishing needs a recorded human approval before a content brief even enters drafting. Every brief on this site carries an approvals block with an actor, a channel, a decision, and a timestamp. Approval replies are only recognized if they follow a strict format or reply directly to the original request. A vague or off-format reply does not count, on purpose. That is a deliberate friction point, not a bug.

    Live-page edits are gated the same way, and the incidents on file explain why. One earlier run tried to purge the sitemap cache using an editor-level application password and was rejected outright, because that action requires a higher permission level than the automation account holds. The system did not attempt a workaround. It stopped and reported that a human with the right access needed to finish the step.

    A separate incident is the clearest argument for gating publishing specifically: a post once went live with escaped block-comment syntax leaking into the rendered page as literal text instead of rendering as normal paragraphs. The fix was not just patching that post. It was adding a permanent rule: after every publish, fetch the actual rendered HTML, not just the API response, and confirm nothing looks like raw markup before calling the job done. I still run that check on this article before treating it as finished.

    There is also a rule about incomplete decisions: if a required field is missing when the system is about to act, it treats the request as blocked rather than filling in a guess. And on at least one recent day, a required summary alert could not be sent at all because the messaging tool was unavailable in that session. The job did not pretend to send it. It logged the gap as an open task for the next run instead.

    None of these are edge cases I am citing to sound careful. They are the actual reasons the gate exists, recorded as they happened.

    Plugins, agents, or services

    If you are deciding how to build this for your own WordPress site, there are three broad shapes, and they trade off differently.

    SEO plugins (Rank Math, Yoast, and similar) handle the mechanical layer well: meta fields, sitemaps, schema markup, redirect management. On their own they are WordPress SEO automation, not autopilot. They do not decide what to publish or when. That decision still sits with whoever runs the site.

    Agent-based setups, like the one behind this site, add a layer on top: they read your analytics and search data, draft content against a brief, and check their own output against rules like word count, banned phrases, and formatting before it ever reaches a human. The value is in that pre-check layer catching problems before you see them, not in removing your review entirely.

    Managed SEO services promise the most hands-off experience, but the tradeoff is visibility. You typically cannot see the incident log, the drift-check history, or the specific gate that stopped a bad change from going live. If a vendor cannot show you what runs unattended and what does not, treat that as a real gap, not a detail. This is the same tradeoff behind organic growth automation more broadly: the parts worth automating are the ones you can still inspect.

    A realistic autopilot setup

    Whatever stack you use, the same shape works: automate the reading and the drafting, gate the writing and the publishing.

    1. Connect GA4 and Search Console so a daily job can pull sessions, impressions, and clicks without anyone opening a dashboard.
    2. Set a drift baseline for the pages you care about most, and check it daily against title, canonical URL, and SEO metadata.
    3. Let content briefs get drafted automatically from keyword-gap or opportunity data, but require a recorded approval, with a real actor and timestamp, before drafting starts.
    4. Run every draft through fixed checks before publish: word count, banned phrases, evidence trace for every claim, and a formatting check that catches label text or raw markup before it reaches the live site. This is what turns drafting into automated content operations instead of an unchecked content pipeline.
    5. After publishing, fetch the live rendered page and check it, not just the API response that created it, before marking the job done.
    6. Use a WordPress account with the minimum permission level automation actually needs, so anything requiring more access fails loudly and routes to a person instead of failing silently.

    That is what “autopilot” looks like when I stop marketing it and just describe what runs. It is closer to a co-pilot with a hard stop before takeoff than a system that flies itself.

    Frequently asked questions

    Can WordPress SEO actually run fully unattended?

    The reading and monitoring side can: pulling analytics data, checking search performance, watching for unauthorized page changes. Publishing and live edits should not run unattended, because the cost of a bad automated publish is higher than the time saved by skipping review.

    What is the risk of full automation without a human gate?

    The clearest example on record here is a post that went live with escaped code syntax rendering as visible text on the page, caught only because someone checked the rendered HTML afterward. Without that check, it would have stayed broken.

    What permission level should an automation account have on WordPress?

    The minimum the job actually needs. An editor-role account here was correctly blocked from purging a sitemap cache, an action that needs site-admin permissions, and the system escalated to a human instead of trying to bypass it.

    How do you decide what to automate first?

    Start with reading, not writing: analytics pulls, search performance checks, and drift monitoring against a fixed baseline. Those have almost no downside if they run daily without a human. Add drafting next, still gated behind approval. Add publishing last, and only once the pre-publish checks (word count, evidence trace, formatting, rendered-page verification) are solid.


    About the author: Shivaa Tripathi leads digital and performance marketing at Exotel, focused on demand generation, martech, and applying AI to SEO. This site runs the WordPress SEO autopilot system described above, in production, including its failures.

  • How to Block AI Crawlers (and What It Costs You)

    How to Block AI Crawlers (and What It Costs You)

    Blocking AI crawlers means adding Disallow rules for each bot’s user-agent to robots.txt, and, if you want real enforcement, blocking the same user-agents at the firewall or CDN level too. There are three classes of AI bot to decide on separately: training crawlers (GPTBot, ClaudeBot, CCBot, Google-Extended, Applebot-Extended), search/answer crawlers (OAI-SearchBot, Claude-SearchBot, PerplexityBot), and on-demand bots that fire when a user asks a live question inside ChatGPT, Claude, or Perplexity (ChatGPT-User, Claude-User, Perplexity-User). robots.txt is a request, not a lock: OpenAI’s own documentation says ChatGPT-User does not respect it, and Perplexity’s docs say the same for Perplexity-User, so a robots.txt line alone will not stop every fetch. This site currently blocks none of them, and explains why below.

    Every AI company that crawls the web publishes a user-agent string, and every one of those strings can be blocked with a line in robots.txt. What most guides skip is that “block AI crawlers” isn’t one decision – it’s several, because training bots, search bots, and on-demand bots behave differently, and blocking one doesn’t touch the others.

    The three classes of AI crawler

    Training bots crawl to build or update a model’s training data. GPTBot, ClaudeBot, CCBot, Google-Extended, and Applebot-Extended fall here. Blocking these stops your content from being used in future model training, and nothing else – it doesn’t touch whether your pages appear in AI search results or chat answers today.

    Search and answer bots crawl to index pages for retrieval, the same way a search engine does, so a model can cite or summarize your page in response to a live question. OAI-SearchBot, Claude-SearchBot, and PerplexityBot are in this class. Blocking these is closer to blocking Googlebot: it removes you from that assistant’s retrieval index entirely.

    On-demand bots fire in real time when a specific user action triggers a fetch – someone pastes your URL into ChatGPT, or asks Perplexity a question that leads it to open your page live. ChatGPT-User, Claude-User, and Perplexity-User do this. The important nuance: OpenAI’s documentation states ChatGPT-User does not respect robots.txt because the action is user-initiated, and Perplexity’s documentation says its user-triggered fetcher “generally ignores robots.txt rules” for the same reason. Claude-User is the exception – Anthropic’s documentation confirms it does respect robots.txt.

    Every current AI crawler user-agent

    This list reflects vendor documentation as of this writing; user-agents change, so recheck before you rely on it.

    • GPTBot (OpenAI) – training data crawler, respects robots.txt.
    • OAI-SearchBot (OpenAI) – crawls to surface results inside ChatGPT search, respects robots.txt.
    • OAI-AdsBot (OpenAI) – crawls for ad-quality checks, respects robots.txt.
    • ChatGPT-User (OpenAI) – fires on live user actions inside ChatGPT, does not respect robots.txt.
    • ClaudeBot (Anthropic) – training data crawler, respects robots.txt.
    • Claude-SearchBot (Anthropic) – crawls for search-result indexing, respects robots.txt.
    • Claude-User (Anthropic) – fetches pages in response to a live Claude query, respects robots.txt.
    • PerplexityBot (Perplexity) – search indexing crawler, respects robots.txt.
    • Perplexity-User (Perplexity) – fetches pages for a live user query, does not respect robots.txt.
    • Google-Extended (Google) – governs use of your content for training Gemini apps and the Vertex AI API for Gemini; does not affect Google Search ranking or inclusion.
    • Applebot-Extended (Apple) – a secondary signal that controls AI-training use of pages Applebot already crawled; disallowing it does not block Applebot itself or remove you from Siri or Spotlight results.
    • CCBot (Common Crawl) – the crawler behind the Common Crawl dataset many models train on, checks robots.txt before crawling.

    To block every bot above in robots.txt, add a stanza per user-agent:

    User-agent: GPTBot
    Disallow: /
    User-agent: ChatGPT-User
    Disallow: /
    User-agent: OAI-SearchBot
    Disallow: /
    User-agent: OAI-AdsBot
    Disallow: /
    User-agent: ClaudeBot
    Disallow: /
    User-agent: Claude-User
    Disallow: /
    User-agent: Claude-SearchBot
    Disallow: /
    User-agent: PerplexityBot
    Disallow: /
    User-agent: Perplexity-User
    Disallow: /
    User-agent: Google-Extended
    Disallow: /
    User-agent: Applebot-Extended
    Disallow: /
    User-agent: CCBot
    Disallow: /

    robots.txt vs. firewall-level blocking

    robots.txt is a published request that well-behaved bots choose to follow. That’s true for most of the bots above, by their own vendors’ documentation. But two of the three on-demand bots – ChatGPT-User and Perplexity-User – explicitly don’t honor it, because the vendors treat a live user click as different from an automated crawl. If you actually need to stop those fetches, a robots.txt line does nothing; you need to block the user-agent (or the originating IP ranges, where published) at the CDN or firewall layer, so the request is refused before it reaches your server. robots.txt is worth setting regardless, since most bots do respect it, but treat it as a courtesy notice for the well-behaved majority, not an enforcement mechanism for all of them.

    What each block actually costs you

    Blocking training bots (GPTBot, ClaudeBot, CCBot, Google-Extended, Applebot-Extended) costs you nothing visible today. Your pages keep ranking in Google, keep showing up in AI search answers, and keep getting cited by assistants that use separate crawlers for retrieval. What you give up is any influence your content might have had on a future model’s training data – a cost with no way to measure its size, since no vendor publishes how much any one site’s content matters to training outcomes.

    Blocking search and answer bots (OAI-SearchBot, Claude-SearchBot, PerplexityBot) has a direct, visible cost: your pages stop being eligible for citation or retrieval in that assistant’s live answers. If a goal for your site is showing up when someone asks ChatGPT or Perplexity a question your content answers, blocking these bots removes you from consideration entirely, the same way blocking Googlebot removes you from Google Search.

    Blocking on-demand bots (ChatGPT-User, Claude-User, Perplexity-User) stops individual users from getting your page fetched live when they paste your URL or ask a question that leads there – a smaller, harder-to-measure slice of traffic, and one that’s already partly unenforceable through robots.txt alone for two of the three vendors.

    Why this site doesn’t block AI crawlers

    As of this writing, this site’s own robots.txt has no AI-bot rules at all – you can check it directly at organicos.shivaatripathi.com/robots.txt. That’s a deliberate choice, not an oversight. The angle this site runs on is visibility in AI-driven search and chat answers, covered in more detail in how to get cited by ChatGPT and Perplexity; blocking search and answer bots would directly undercut that goal, and blocking training bots would trade an unmeasurable future benefit for a real, current cost in reduced reach. If your site depends on subscription content, proprietary data, or a business model where AI training or AI-answer citation is a genuine liability rather than a channel, that calculation flips, and blocking some or all of these bots is a reasonable, defensible choice – just decide per bot class instead of copying one blanket rule.

    Whatever you decide, the mechanical checks stay the same as any other on-page change: confirm your robots.txt syntax is valid, verify the rules live on the actual served file rather than a cached copy, and if you add firewall rules, test that the blocked user-agent is actually refused rather than just logged. The broader on-page hygiene checks this site runs before any change ships are covered in the WordPress SEO checklist; if you’re also weighing an llms.txt file alongside robots.txt, that’s a related but separate decision – llms.txt is a proposed convention for pointing AI tools to clean content, not an access-control mechanism.

    Frequently asked questions

    Does blocking GPTBot in robots.txt stop ChatGPT from showing my page?

    No. GPTBot only crawls for OpenAI’s model training data. ChatGPT’s live search and answer results come from OAI-SearchBot and, for user-triggered fetches, ChatGPT-User – both separate user-agents you’d need to block individually to affect what ChatGPT can show or cite.

    Will a robots.txt rule actually stop every AI bot from fetching my page?

    No, not fully. Most AI crawlers documented by their vendors do respect robots.txt, but OpenAI’s own documentation states ChatGPT-User does not, and Perplexity’s documentation says its user-triggered fetcher generally ignores robots.txt rules too. Stopping those specific fetches requires blocking the user-agent at the firewall or CDN level, not just in robots.txt.

    Does blocking AI crawlers hurt my Google rankings?

    Blocking AI-specific user-agents like GPTBot, ClaudeBot, or Google-Extended does not touch Googlebot, which is a separate crawler for Google Search. Google’s own documentation on Google-Extended states it does not impact a site’s inclusion or ranking in Google Search. The cost of blocking these bots is reduced visibility in AI training data or AI-assistant answers, not a Google Search penalty.


    About the author: Shivaa Tripathi leads digital and performance marketing at Exotel and writes about demand gen, AI search, and the systems behind them at shivaatripathi.com. He built organic-os, the open-source AI SEO agent this site documents. LinkedIn · GitHub

    Drafted with organic-os and human-reviewed before publishing — every change on this site is approved by a person and logged publicly on the live proof page. Published 2026-08-13 · Updated 2026-08-13.

  • How to Make AI Content Rank: The Quality Gates That Matter

    How to Make AI Content Rank: The Quality Gates That Matter

    AI-drafted content ranks or doesn’t on the same terms as any other content: does it help the reader, and does it show real signals of being trustworthy. Google frames this around disclosure and purpose, not authorship – whether automation is self-evident to visitors, and whether it exists to help them or to manipulate rankings. This site runs five checkable gates between an AI draft and a published post: a research pass that drops any claim it can’t verify against a live source, a QA pass that traces every remaining claim back to that source, an editor pass that checks voice and length limits, an on-page hygiene pass covering meta fields and internal links, and a render check on the live page itself, not just the API response that created it. None of this promises a ranking. It is the checklist that decides whether a draft is allowed to publish at all.

    Most advice about AI content quality is a list of adjectives: be helpful, be original, add value. True, and not actionable. What follows is the literal gate system this site runs on every post before it goes live, including the parts that are still unproven.

    Gate one: the evidence contract

    Every draft starts with a research pack: a table of claims and the exact source each traces to. The rule is unforgiving: if a claim can’t be traced to a source fetched or queried live during that pass, it doesn’t go in the draft. Not “probably true” – traced, or dropped.

    In practice this means real claims get cut from real drafts. A study surfaces only through search-result summaries and its page never loads on direct fetch – dropped. A number sounds right but the only source is another blog post repeating a stat with no attribution – dropped. A vendor claims an install count with no public methodology – dropped. This article’s own research pack dropped a claim about a fixed day-7/day-28 review cadence, because no such checkpoint exists in this site’s operating history; the real mechanism is the 60-day falsifiability check described below, and the draft says that instead of inventing a tidier process.

    This matters more for AI-drafted content, not less. A model can generate a plausible-sounding statistic in the time it takes to generate a true one, and fluency signals nothing about accuracy. The evidence contract is the mechanical check that catches that before a human has to.

    Gate two: human review, specifically

    “Human in the loop” can mean almost anything. On this site it means a QA log: every claim gets a yes/no match check against its cited source, with a same-day re-fetch spot check on a sample of them. It also means an editor pass separate from the QA pass – QA checks facts, the editor pass checks voice, banned phrases, headline and meta-description length, and whether the piece reads like it has an opinion rather than a summary.

    The reviewer isn’t rubber-stamping AI output. A recorded incident on this site shows what a reviewer actually catches: seven posts in a row once shipped with a visible “In short:” label inside the answer capsule, which leaked into every WordPress auto-generated excerpt on the site. That’s a formatting bug a careless pass misses and a careful one catches – small and boring, and exactly the kind of error that erodes trust in an obviously AI-produced page. The fix became a standing rule: article bodies contain only reader-facing prose, no label text, and every post gets a manually written excerpt instead of an autogenerated one.

    Gate three: on-page hygiene

    Before anything publishes, four mechanical checks run:

    Title and meta description length. Both have to fit within standard limits or they get cut in search results.

    An extractable answer. The opening section has to work as a standalone answer to the target question – not a teaser, but a paragraph that could be quoted on its own and still be correct and complete. That’s what the capsule at the top of this article is doing right now.

    Structured data that matches the visible page. When a post includes an FAQ, the FAQPage schema has to match the visible FAQ text word for word. Schema that promises one thing while the page says another erodes trust with readers and crawlers alike.

    Internal links that actually resolve. Every internal link gets checked live, right before publish, not assumed from memory. A 404’d link is small and completely avoidable, and it still shows up in real pipelines when this check gets skipped.

    A fifth check isn’t strictly “on-page” but belongs here: rendering. One post on this site once had backslash-escaped Gutenberg block comments from a shell-escaping bug, so the live page showed literal <!-- wp:paragraph --> text to readers even though the API response that created it looked clean. An API-level check passed; the actual page was broken. The rule since: publish verification has to fetch the rendered HTML, not just the create-call response, and check it for literal block-comment text and stray escape characters before anything counts as done.

    What this doesn’t guarantee

    None of these five gates promise a ranking. This site’s own numbers say so plainly: over the trailing four weeks, this domain logged 1 click and 136 impressions across all queries in Search Console, with most query positions sitting in the 20s through 90s rather than page one. The gates are a quality floor, not a ranking algorithm. Google’s spam policy is explicit that using automation “for the primary purpose of manipulating search rankings” is a violation regardless of how careful the production process looks from the outside – the gates exist to make the output useful, not to game anything downstream of that.

    What the gates do buy is a defensible baseline: every claim traces to a source, every internal link resolves, every meta field is correct, and the rendered page matches what was approved. That’s a lower bar than “will this rank,” and it’s the one this system can enforce mechanically.

    Measuring outcomes and killing what fails

    Every content brief on this site carries its own falsifiability clause, written before the draft exists. This one reads: wrong if, 60 days after publish, there are zero impressions for “make AI content rank” queries. That’s checkable against the same public Search Console data referenced throughout this article, and a past article on this exact topic (does AI content rank) already sets the honest baseline this piece builds on: small, early numbers, reported without smoothing them over.

    On-page fixes elsewhere in this system get a tighter loop than 60 days – changes to meta descriptions or schema get a reverify window measured in hours to a few days, because those check whether a specific edit stuck, not whether an entire article found its audience. Both loops share the same idea: state the failure condition before you start, then actually check it later, on the live site, not from memory.

    That’s the real answer to “how do you make AI content rank.” Not a trick: a checklist that drops what it can’t prove, a reviewer who checks specific things instead of skimming for tone, on-page hygiene verified live, and a stated condition for admitting the piece didn’t work. Whether it actually ranks is out of any checklist’s control, and this site says so instead of promising otherwise.

    For the daily and weekly loop that runs these gates, see automated content operations. For the broader question of what an AI SEO agent is and isn’t, see what an AI SEO agent actually is. The checks above are a subset of a longer list in the WordPress SEO checklist, and the measurement side connects to how to measure AI citations, which covers the harder-to-verify sibling metric of whether AI assistants cite a page at all.

    Frequently asked questions

    Does AI-written content need to be labeled to rank well?

    Google’s own guidance doesn’t require a specific label, but it does ask, as a self-assessment question, whether the use of automation is “self-evident to visitors through disclosures or in other ways” and whether creators are providing background on how it was used. This site discloses it directly in an author-box line on every post rather than leaving it implicit.

    What’s the single most common mistake in AI-drafted content?

    Unverifiable claims that sound specific enough to be true. A model can produce a precise-sounding statistic with no real source behind it just as easily as a correct one, and fluency doesn’t signal accuracy. The fix isn’t a style guideline, it’s a mechanical rule: trace every claim to a source fetched during that research pass, or cut it.

    Does passing all five gates guarantee a page will rank?

    No. This site’s own trailing Search Console numbers – 1 click and 136 impressions across all queries over four weeks – show that passing every quality gate is a floor, not a ranking guarantee. The gates control what can be verified and controlled: sourcing, review, on-page hygiene, and rendering. Whether a page actually ranks depends on factors like domain authority and competition that no editorial checklist can force.


    About the author: Shivaa Tripathi leads digital and performance marketing at Exotel and writes about demand gen, AI search, and the systems behind them at shivaatripathi.com. He built organic-os, the open-source AI SEO agent this site documents. LinkedIn · GitHub

    Drafted with organic-os and human-reviewed before publishing — every change on this site is approved by a person and logged publicly on the live proof page. Published 2026-08-12 · Updated 2026-08-12.