<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: turva.dev</title>
    <description>The latest articles on DEV Community by turva.dev (turva-dev).</description>
    <link>https://dev.to/turva-dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F13730%2Fe189536f-8936-4ce4-9c25-505b15a2f108.png</url>
      <title>DEV Community: turva.dev</title>
      <link>https://dev.to/turva-dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/turva-dev"/>
    <language>en</language>
    <item>
      <title>I rebuilt turva.dev around the report</title>
      <dc:creator>Erik Rekola</dc:creator>
      <pubDate>Mon, 07 Sep 2026 08:09:58 +0000</pubDate>
      <link>https://dev.to/turva-dev/i-rebuilt-turvadev-around-the-report-531m</link>
      <guid>https://dev.to/turva-dev/i-rebuilt-turvadev-around-the-report-531m</guid>
      <description>&lt;p&gt;I have rewritten turva.dev and rebuilt the pages around the work a buyer receives. The home page now leads into two services and their sample reports. Each report shows how an observation becomes a finding, a correction and a check that the correction worked.&lt;/p&gt;

&lt;p&gt;That is the part I want someone to be able to inspect before buying an audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed on the site
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://turva.dev/" rel="noopener noreferrer"&gt;home page&lt;/a&gt; separates the focused Shopify storefront check from the broader website and API audit. Each has its own scope and a public example of the deliverable. The process is written out too: agree the question and scope, receive the findings, then make and verify the corrections.&lt;/p&gt;

&lt;p&gt;The pages share a common layout. Headings, navigation and report sections follow the same structure across the site. The reports put the summary or decision before the contents and engagement details. Someone opening a long report can see the recommended action first, then follow the evidence behind it.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://turva.dev/guides" rel="noopener noreferrer"&gt;guides&lt;/a&gt; are grouped by what a reader is trying to do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit, visibility and priorities.&lt;/li&gt;
&lt;li&gt;Content and crawl access.&lt;/li&gt;
&lt;li&gt;Discovery and authentication.&lt;/li&gt;
&lt;li&gt;Commerce and agent operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Their source-check dates are separate from the layout update. A redesigned page does not, by itself, establish that its technical advice is current.&lt;/p&gt;

&lt;p&gt;This rewrite changed the pages, not the service scopes or the prices.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the report template has to carry
&lt;/h2&gt;

&lt;p&gt;The useful unit in the template is a finding with enough information for someone else to act on it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What was checked, under which conditions, and what came back.&lt;/li&gt;
&lt;li&gt;Why the result matters to the business question agreed at the start.&lt;/li&gt;
&lt;li&gt;Which correction comes first and who owns the work.&lt;/li&gt;
&lt;li&gt;What must be available before that work can begin.&lt;/li&gt;
&lt;li&gt;How to check the result afterwards, including anything still unresolved.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The website and API report keeps scanner readings, manual observations and answers from AI assistants identifiable as separate sources of evidence. They answer different questions. A reachable interface can return incorrect data. An assistant can repeat an old address even when the current page is accessible.&lt;/p&gt;

&lt;p&gt;The report also names the boundary of a correction. Changing a response at the edge can correct what a client receives while leaving the underlying source unchanged. The person responsible for the source needs to know that, and the acceptance check needs to cover the surfaces that matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The finding that changes no scanner points
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://turva.dev/samples/audit-report" rel="noopener noreferrer"&gt;sample website and API audit&lt;/a&gt; uses an invented fastener wholesaler. Every company detail, reading and date in it is fictional.&lt;/p&gt;

&lt;p&gt;In that example, the visible product pages show real prices, while the structured data says the products cost zero and are in stock. The API provides another inconsistent representation. Correcting those facts comes before the fixes that improve the scanner result.&lt;/p&gt;

&lt;p&gt;That ordering is deliberate. The company's question concerns what a buyer's assistant will read about its products. The report has to follow that question through the evidence and the correction plan, even where the scanner awards no points for the fix.&lt;/p&gt;

&lt;p&gt;The sample shows the format and reasoning. It provides no evidence of a result achieved for a real client.&lt;/p&gt;

&lt;h2&gt;
  
  
  A smaller report for a Shopify question
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://turva.dev/samples/shopify-agent-storefront-check" rel="noopener noreferrer"&gt;Shopify sample report&lt;/a&gt; uses a second invented business. It compares selected product variants across the storefront and the agent-shopping surfaces available in the example.&lt;/p&gt;

&lt;p&gt;One fictional product has different prices in the storefront and the remote catalog. Another has conflicting availability. The report records the market, variant and session conditions, then gives each mismatch a correction and a retest condition.&lt;/p&gt;

&lt;p&gt;It also records where the buyer journey stops. Reaching a checkout handoff does not establish that payment or order creation succeeded. The sample describes no paid order.&lt;/p&gt;

&lt;p&gt;This is a narrower deliverable than the website and API audit. Its structure follows the merchant's immediate question: whether the tested interfaces agree about the products, and what the supported journey actually permits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I can claim about the update
&lt;/h2&gt;

&lt;p&gt;The site now makes the report structure, service boundaries and next steps explicit. The two samples let a reader inspect the evidence format and correction instructions before contacting me.&lt;/p&gt;

&lt;p&gt;I have not measured whether the redesign improves sales or AI citations. Those would need their own observations. Both sample reports remain synthetic, and neither is a certification of a real business.&lt;/p&gt;

&lt;p&gt;For someone considering the work, the most useful place to start is the sample for their situation. It shows what I mean by an audit more precisely than a list of protocol names can.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What should an agent-readiness audit report include beyond a scanner score?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agreed scope, dated evidence, manual findings, priorities, correction owners and acceptance checks. If AI answers are included, the questions and measurement conditions should be documented separately from the technical scan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are the public sample reports real client work?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Both use invented businesses and observations to demonstrate the deliverable. They do not show measured client outcomes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a team use the report without buying implementation?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. The correction instructions and acceptance checks are part of the report. Implementation is a separate purchase, with access requirements and responsibilities agreed for that work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/choosing-an-agent-readiness-audit" rel="noopener noreferrer"&gt;How to choose an agent-readiness audit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/samples/audit-report" rel="noopener noreferrer"&gt;Sample website and API audit report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/samples/shopify-agent-storefront-check" rel="noopener noreferrer"&gt;Sample Shopify storefront check report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/services" rel="noopener noreferrer"&gt;Audit scope and pricing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://turva.dev/blog/i-rebuilt-turva-dev-around-the-report" rel="noopener noreferrer"&gt;https://turva.dev/blog/i-rebuilt-turva-dev-around-the-report&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
    <item>
      <title>What 19 identity vendors publish for agents</title>
      <dc:creator>Erik Rekola</dc:creator>
      <pubDate>Sat, 05 Sep 2026 09:16:44 +0000</pubDate>
      <link>https://dev.to/turva-dev/what-19-identity-vendors-publish-for-agents-bin</link>
      <guid>https://dev.to/turva-dev/what-19-identity-vendors-publish-for-agents-bin</guid>
      <description>&lt;p&gt;I measured 19 companies that build digital identity and trust products, wallets and verifiable credential infrastructure, the parts of the stack meant to let one machine prove something to another machine. Then I asked the simplest question I could think of about them. Can an agent find out anything at all about these companies without a human in the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  How this was measured
&lt;/h2&gt;

&lt;p&gt;The measurement ran on 2026-09-05. One full scan per company with the isitagentready.com scanner on its default profile, run one target at a time, plus my own reads with curl against the same hosts. Sixteen checks applied that day. I am not naming the companies, and I come back to why below.&lt;/p&gt;

&lt;p&gt;Levels first. Fifteen came out at Level 1, three at Level 0 and one at Level 2. Nothing above that. The average was 2,8 checks passed out of 16.&lt;/p&gt;

&lt;h2&gt;
  
  
  The column where every one of them scored zero
&lt;/h2&gt;

&lt;p&gt;The scanner has a group for API, auth, MCP and A2A discovery, nine checks in all: apiCatalog, oauthDiscovery, oauthProtectedResource, authMd, mcpServerCard, a2aAgentCard, agentSkills, webMcp and ard. Every company scored zero of nine. Not one of the 19 publishes an API catalog, an OAuth discovery document, an MCP server card, an A2A agent card or an ARD manifest. One authMd check failed with a 500 rather than a 404, which is a broken answer and not evidence of a missing file, and that is the only nuance in the whole column. These are companies whose product is machine to machine verifiable identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The smaller readings
&lt;/h2&gt;

&lt;p&gt;Two of the 19 serve no robots.txt at all. A third serves one with no wildcard rule, so the file exists and says nothing about most crawlers. Content Signals, the line where a site declares whether it wants its text used for AI training, appeared exactly once in the set. That company says ai-train=no and search=yes. Markdown content negotiation worked on one company as well, though that is a single reading and I have not repeated it. The same check moved on me within one day on a different site, from 406 to 200 to 200, so I treat it as provisional.&lt;/p&gt;

&lt;p&gt;Seven of the 19 have an llms.txt an agent can fetch, and one of those seven is a redirect to a file parked on a marketing platform host. Twelve have nothing there. One of the seven announces in its own first line that a SEO plugin generated it, which makes it the publishing system talking rather than a decision anyone made. Seven of the 19 serve no JSON-LD at all on the front page.&lt;/p&gt;

&lt;h2&gt;
  
  
  One site where 200 means nothing
&lt;/h2&gt;

&lt;p&gt;One company was different in a way worth describing. I asked for eight paths on that domain and all eight returned HTTP 200 with the same 3021 byte body and an identical sha256. The front page, a real subpage, a path I invented on the spot, llms.txt and four well-known addresses. So the agent addresses answer 200 with a page that is not what was asked for. I opened the site in a browser and the content renders fine, it just arrives after JavaScript has run. An agent that does not execute scripts cannot tell an existing page from one that does not exist. The other 18 answered 404 to the same addresses, which is the correct answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not say
&lt;/h2&gt;

&lt;p&gt;I read front pages and root paths and nothing else, so none of it is a statement about anyone's documentation, product API or MCP endpoint. Three of the passing Link header readings come from WordPress serving its own rel=alternate, which is the platform and not the company. Each company was scanned once, and a level from a single run is a snapshot. I tested no products. A site can be hard for an agent to read while the software behind it is excellent, and in this set I would expect that to be the common case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the companies are not named
&lt;/h2&gt;

&lt;p&gt;The finding is not that one company forgot a file. All 19 landed on zero in the same column, which makes this a property of the category rather than of anyone's diligence. I have also not contacted any of them, and a list of names published before that would be a different kind of document than the one I wanted to write. I should be straight about the limit of this though. Every reading above comes from a public surface, so a reader who guesses the set and runs the same scan will work out who is who. Withholding the names is not protection, it is a statement about what the piece is for.&lt;/p&gt;

&lt;h2&gt;
  
  
  One last thing, and it cuts against me
&lt;/h2&gt;

&lt;p&gt;These checks come from one scanner and the rules move every month. The set of applicable checks grows as new ones are added, so a count from an older run is not comparable with today's. My own site reads Level 5 on that same scanner today, with all 16 applicable checks passing, and that is a snapshot from one instrument on one day, exactly like every number above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does a Level 1 reading mean the company builds bad software?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, and nothing here measures the software. The scan reads what a website publishes for an automated visitor. A company can run excellent credential infrastructure behind a site that tells an agent nothing about it, and in this set that is the likely case for most of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why would an identity vendor need an MCP server card or an agent card?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because the thing being sold is machine to machine trust, and a machine that arrives at the site has no way to find the interfaces without one. The gap is not that the file is mandatory. The gap is that these nine addresses are where an agent looks first, and in this set they were empty every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I get the reading for my own site?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are in this set and want your own reading, email me and I will send you the scanner output for your own domain. That is the whole promise, one scan and the raw result, and it is not the paid work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://turva.dev/blog/agent-readiness-code-hosts" rel="noopener noreferrer"&gt;I scanned fourteen code hosts. Not one served an MCP server card.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/well-known-for-agents" rel="noopener noreferrer"&gt;Well-known files for agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/mcp-server-card" rel="noopener noreferrer"&gt;Publishing an MCP server card&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://turva.dev/blog/agent-readiness-identity-vendors" rel="noopener noreferrer"&gt;https://turva.dev/blog/agent-readiness-identity-vendors&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>webdev</category>
      <category>security</category>
    </item>
    <item>
      <title>Two files called auth.md, and they disagree on the field names</title>
      <dc:creator>Erik Rekola</dc:creator>
      <pubDate>Fri, 04 Sep 2026 13:44:08 +0000</pubDate>
      <link>https://dev.to/turva-dev/two-files-called-authmd-and-they-disagree-on-the-field-names-2hk2</link>
      <guid>https://dev.to/turva-dev/two-files-called-authmd-and-they-disagree-on-the-field-names-2hk2</guid>
      <description>&lt;p&gt;WorkOS shipped Agent Auth for AuthKit on 2 September, a way to give the agents you build into your own product short-lived scoped tokens instead of a long-lived API key. Next to it in the same product menu sits something else with a wider blast radius, and it is a month older: an open protocol called auth.md, shipped into AuthKit on 4 August, in which a service publishes a markdown file at its own root telling outside agents how to register on behalf of a user. This site has served a file at that same address since June. The two are not the same document, I read both on 4 September to find out how far apart they are.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each document asks for
&lt;/h2&gt;

&lt;p&gt;The scanner this site is measured by publishes its own recipe for the check it calls authMd, at &lt;a href="https://isitagentready.com/.well-known/agent-skills/auth-md/SKILL.md" rel="noopener noreferrer"&gt;https://isitagentready.com/.well-known/agent-skills/auth-md/SKILL.md&lt;/a&gt;, which answered 200 with 2 112 bytes. It asks for a markdown file at the service root with an H1 containing auth.md, protected resource metadata carrying resource, authorization_servers, scopes_supported and bearer_methods_supported, and an agent_auth block in the authorization server metadata. It names that block's fields: skill, register_uri, claim_uri, revocation_uri, identity_types_supported, identity_assertion.assertion_types_supported and anonymous.credential_types_supported.&lt;/p&gt;

&lt;p&gt;The WorkOS file format at &lt;a href="https://workos.com/auth-md/docs/auth-md" rel="noopener noreferrer"&gt;https://workos.com/auth-md/docs/auth-md&lt;/a&gt; asks for the same two-hop discovery walk and the same agent_auth block. It names the block's fields identity_endpoint, claim_endpoint and events_endpoint.&lt;/p&gt;

&lt;p&gt;So the two documents agree on the path, the file name, the H1 and the discovery order, and they nearly agree on the protected resource metadata: the scanner asks for four fields in it and WorkOS for those four plus resource_name. They disagree on what to call the registration endpoint, the claim endpoint and the revocation surface inside the block both of them require.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why that is worth knowing before you implement
&lt;/h2&gt;

&lt;p&gt;A site built from the scanner recipe and a site built from the WorkOS specification both serve a file called auth.md at the root, both publish an agent_auth block, and both can be described as having implemented auth.md. An agent that fetches one and looks for the other's field names finds nothing where it expects an endpoint. Nothing in either document warns you, because each is internally complete and neither cites the other.&lt;/p&gt;

&lt;p&gt;The gap is easy to walk into in one direction in particular. If you build against the specification and then test with the scanner, the check reports the file as missing rather than as differently named, and the natural reading of that result is that the file is not being served.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this site does
&lt;/h2&gt;

&lt;p&gt;This site follows the scanner's naming, because that is what was measurable when the file was written and because a rename would drop a check this site's own score rests on. The file is at &lt;a href="https://turva.dev/auth.md" rel="noopener noreferrer"&gt;https://turva.dev/auth.md&lt;/a&gt;, served as text/markdown, and the protected resource metadata carries all five fields the WorkOS discovery step names.&lt;/p&gt;

&lt;p&gt;What this site does not implement is both of the WorkOS ceremonies. Agent verified needs an identity provider to vouch for a user, and user claimed needs a device-code confirmation. Neither exists here for the same reason: there are no user accounts, every resource is public and read only, and nothing on the domain answers 401, so there is no challenge for an agent to bootstrap from. The file now says that in its own words rather than describing a flow that is not there, and it names the protocol so a reader can see the difference for themselves.&lt;/p&gt;

&lt;p&gt;The word claim is its own trap. On this site it means proving control of an identifier you already corresponded under. In the protocol it means a ceremony where the agent shows the user a code to confirm in a browser. Same word, two mechanisms, and the file now separates them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I am not claiming
&lt;/h2&gt;

&lt;p&gt;I have no view on which naming should win, and this is not a prediction that either one becomes a standard. I did not measure how many sites serve an auth.md of either kind, so nothing here says which is more common. What I read is two published documents on one day, and what I can show is that they name the same three positions differently. Anyone implementing from one and verifying against the other will find that out the hard way, and it seemed worth writing down before more sites are built either way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is auth.md a standard?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. It is a convention published by two parties who do not agree on the field names inside it. The underlying pieces it composes are standards, OAuth protected resource metadata in RFC 9728 and authorization server metadata in RFC 8414, and those two are the parts an agent can rely on today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which field names should I use?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That depends on what will read your site. If a scanner grades you, use the names its recipe publishes and verify with the scanner. If a specific agent platform will consume the file, use the names its specification publishes. There is no third answer that satisfies both, and the honest thing is to say in the file which one you followed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does a site need an auth.md at all?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Only if an agent could ever need permission to do something there. A site that is entirely public and issues no credentials can publish one to say exactly that, which is what this site does, but there is nothing dishonest about not having the file when there is nothing to authenticate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/agent-authentication" rel="noopener noreferrer"&gt;Agent authentication and authorisation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/well-known-for-agents" rel="noopener noreferrer"&gt;Well-known files for agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/blog/honesty-and-the-checker" rel="noopener noreferrer"&gt;When honesty and the checker disagree&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://turva.dev/blog/two-auth-md-dialects" rel="noopener noreferrer"&gt;https://turva.dev/blog/two-auth-md-dialects&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>webdev</category>
      <category>security</category>
    </item>
    <item>
      <title>What four AI assistants call an agent readiness audit</title>
      <dc:creator>Erik Rekola</dc:creator>
      <pubDate>Fri, 04 Sep 2026 04:57:08 +0000</pubDate>
      <link>https://dev.to/turva-dev/what-four-ai-assistants-call-an-agent-readiness-audit-4mfh</link>
      <guid>https://dev.to/turva-dev/what-four-ai-assistants-call-an-agent-readiness-audit-4mfh</guid>
      <description>&lt;p&gt;On 3 September 2026 fifty buyer questions were put to ChatGPT, Gemini, Perplexity and Google AI Mode from an anonymous browser session, one run per question, 193 answers in all. The questions are the ones a buyer types: what an agent readiness audit is, what it costs, who does it in Finland, how it differs from SEO. Claude was not measured, because its answers sit behind a login and the instrument runs logged out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two products share the words
&lt;/h2&gt;

&lt;p&gt;Eleven of the fifty questions use the words agent readiness, or agenttivalmius in Finnish, without saying whether they mean a website or a company. Those eleven got 41 answers. Eighteen of the 41 described the readiness of an organisation to deploy AI agents: its data, its governance, whether its teams are prepared. Thirteen described what this site means by the words, whether a website and its APIs can be read and acted on by an agent. Six described both, and four could not be placed.&lt;/p&gt;

&lt;p&gt;The split is not even across assistants. Gemini gave the organisational reading in eight of its eleven answers and Google AI Mode in six of nine. Perplexity was the only one that leaned the other way, five of eleven for the website reading, and it was also the one that named this site most often, five times against three for ChatGPT and one each for the other two. ChatGPT split evenly, three answers for each reading and three for both, with one unclear.&lt;/p&gt;

&lt;h2&gt;
  
  
  The words are the problem, not the assistants
&lt;/h2&gt;

&lt;p&gt;Two Finnish questions in the set name the website outright or avoid the word agenttivalmius. All seven answers to those two read the question as being about the website. The assistants have no trouble with the concept once the question carries it. What drifts is the bare term, and it drifts toward the organisational meaning. The likely reason is what the assistants have read, because that meaning appears in far more published text, but this run does not measure that, and the control set is seven answers, so read it as the direction and not the proof.&lt;/p&gt;

&lt;p&gt;That shows in who gets named. Thirty-five of the 41 answers named at least one provider, 112 different names between them, and almost none repeated. Both kinds of answer named a long tail of small consultancies and scanners with agent readiness in the brand, most of them once. The organisational answers also named large consultancies, and the Finnish questions a few Finnish agencies. Across all 193 answers this site was named in 27, and 23 of those carried a link to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What follows from it
&lt;/h2&gt;

&lt;p&gt;For a buyer, one question settles it: ask the provider what the report reads. If the answer is the organisation, its data and its teams, that is a strategy engagement. If the answer is the website and the API, the files an agent fetches and the data it gets back, that is the audit this site sells, and the report should name the checks. Both are real work. They are not the same work, and a proposal that does not say which one it is has not said much.&lt;/p&gt;

&lt;p&gt;For this site, the same finding turned into one sentence. The FAQ on the services page and the home page now says that the audit reads the website and its APIs and not the organisation's readiness to adopt agents, and llms.txt says the same in its summary, so an assistant that reads either gets the distinction in the first lines. Whether that moves the answers is what the next run of the same fifty questions will show, and it will be reported the same way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is an agent readiness audit about the company or the website?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both services exist under the same words. The audit on this site reads the website and its APIs with an independent scanner and reports per check. An organisational agent readiness assessment reads a company's data and governance and how prepared its teams are. Ask a provider which report they deliver.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do AI assistants describe the organisational version more often?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a measurement of 41 answers on 3 September 2026, 18 described the organisational reading and 13 the website reading. When a question names the website, all seven answers in the control set read it that way, so the drift sits in the bare term and not in the assistants' ability to read the website meaning. Why the bare term drifts was not measured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How was this measured?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fifty buyer questions, four assistants, one anonymous run per question on 3 September 2026, 193 answers. Each answer was read for how it interpreted the term, whom it named and whether it named this site. Claude was not measured because it requires a login.&lt;/p&gt;

&lt;p&gt;Corrected 2026-09-04. The version served for the first seven hours said Perplexity was the only assistant that named this site more than once and offered an unmeasured reason for the drift of the term. Perplexity named it most often, five times against three for ChatGPT, and the reason is now stated as unmeasured. The counts did not change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/agent-readiness-audit" rel="noopener noreferrer"&gt;What an agent-readiness audit is&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/choosing-an-agent-readiness-audit" rel="noopener noreferrer"&gt;Choosing an agent-readiness audit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/agent-readiness-aeo-geo" rel="noopener noreferrer"&gt;Agent-readiness, AEO and GEO: how they relate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/blog/website-agent-readiness-567-sites" rel="noopener noreferrer"&gt;Website agent readiness, measured on 567 company sites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://turva.dev/blog/what-ai-assistants-call-an-agent-readiness-audit" rel="noopener noreferrer"&gt;https://turva.dev/blog/what-ai-assistants-call-an-agent-readiness-audit&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>seo</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Thirty days after the brief: 210 sites rescanned, four moved</title>
      <dc:creator>Erik Rekola</dc:creator>
      <pubDate>Fri, 04 Sep 2026 04:56:44 +0000</pubDate>
      <link>https://dev.to/turva-dev/thirty-days-after-the-brief-210-sites-rescanned-four-moved-47hj</link>
      <guid>https://dev.to/turva-dev/thirty-days-after-the-brief-210-sites-rescanned-four-moved-47hj</guid>
      <description>&lt;p&gt;Every brief I send, a short written reading of one company's website that goes out unasked, carries the same promise. Thirty days later I run the same scanner on the same site again and send back what changed, whether or not anyone answered. Between 19 August and 3 September that promise came due for 210 sites, first measured between 18 July and 6 August, and this is the first time the rescans are read as one set.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was measured
&lt;/h2&gt;

&lt;p&gt;The scanner is isitagentready.com, which grades a site from Level 0 to Level 5, run against the same host with the same default profile as the first time, twice per site, and a pair that disagrees is run again until the reading settles or is recorded as unstable. A site counts as moved when its level changed. A check that started passing while the level held is recorded in the file but not counted here, because the level is what the recipient was told in July and what the rescan message reports.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;210 sites rescanned. 201 gave a reading that can be compared with the first one.&lt;/li&gt;
&lt;li&gt;Nine could not be compared. Two hosts answered the scanner with 403 and one answered 500, and two of those three had done the same in July, so they never had a first reading either. Four runs did not settle into a reading, one of them because a single header check stalled four times out of four. Two were not rescanned at all, because the record had no address to send the result to.&lt;/li&gt;
&lt;li&gt;197 of the 201 read the same level as in July. Three moved up and one moved down, 2,0 percent.&lt;/li&gt;
&lt;li&gt;Seven of the 210 had replied to the brief by the time of this count, 3,3 percent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The four that moved
&lt;/h2&gt;

&lt;p&gt;Three went up. A site whose sitemap answered 404 in July answers 200 now, and reads Level 1 instead of Level 0. A site whose robots.txt redirected to itself and whose sitemap returned 500 has both working, Level 0 to Level 1. A site that now declares Content Signals in its robots.txt reads Level 2 instead of Level 1. One went down: its sitemap answered in July and answers 404 now, Level 1 to Level 0, confirmed with a request outside the scanner so that a scanner artefact is ruled out.&lt;/p&gt;

&lt;p&gt;None of the three that moved up had replied to the brief. So the brief cannot claim them, and I am not going to. The likelier explanation is ordinary maintenance, a CMS update or a plugin that started generating a sitemap, and that is worth writing down because a rescan series is the exact place where a consultant is tempted to count every improvement as an effect.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scanner moved too
&lt;/h2&gt;

&lt;p&gt;During the series the scanner added a check named ard to its API group. The twelve sites measured in the first days of September were read against a larger check set than in July without their sites changing. A rescan therefore compares the denominator first and the passes second, and the message the recipient gets names the checks rather than a percentage, because a percentage over a moving denominator says nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this says and what it does not
&lt;/h2&gt;

&lt;p&gt;The sample is my own prospecting list, sites I chose to write to, not a random draw. So 2,0 percent is a fact about these 210 sites and not a rate for the web. Zero movement in thirty days is also the expected result when nobody has decided to act. The fixes are small, a sitemap line, a robots.txt group, a header, but they need a person who owns the website to schedule them, and one unsolicited email rarely does that inside a month.&lt;/p&gt;

&lt;p&gt;What the series does show is narrower and still useful. The promise has been kept for these 210 sites. The scanner is stable enough to compare across a month for 201 of them, and where it is not, the reason can be named, on the host side for most of the nine and in my own records for the two that had no address. And the one site that went down is a reminder that agent readiness is not a state a site reaches once: a sitemap that disappears in an update takes the level with it, and nobody notices until something reads the site as a machine.&lt;/p&gt;

&lt;p&gt;292 promises are still open, the next of them due on 9 September. When the set is larger the same reading will be repeated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does the 30 day rescan promise mean?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every brief turva.dev sends says that the same scanner will be run on the same site thirty days later and the result sent back, whether or not the recipient answered. The rescan message names the checks that changed rather than a percentage, because the scanner's check set can change in between.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did the briefs change anything in thirty days?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Four of 201 comparable sites changed level, three up and one down, and none of the three that moved up had replied to the brief, so the change cannot be attributed to it. Ordinary maintenance is the likelier cause.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why could nine sites not be compared?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two hosts answered the scanner with 403 and one with 500, four runs did not settle into a reading, and two were not rescanned because the record had no address to send the result to. A rescan compares two readings, and where one of them is missing there is nothing to compare.&lt;/p&gt;

&lt;p&gt;Corrected 2026-09-04. The version served for the first seven hours said the first measurements began on 13 July, described the nine unreadable sites less precisely, and claimed the promise "can be kept at this volume". The earliest first measurement was 18 July, the nine are now broken down as measured, and the claim is limited to these 210 sites. The counts did not change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://turva.dev/blog/website-agent-readiness-567-sites" rel="noopener noreferrer"&gt;Website agent readiness, measured on 567 company sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/sitemaps-and-robots-for-agents" rel="noopener noreferrer"&gt;Sitemaps, robots.txt and agent access&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/measurement-led-agent-readiness" rel="noopener noreferrer"&gt;Why agent-readiness should be measured, not asserted&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://turva.dev/blog/thirty-days-after-the-brief" rel="noopener noreferrer"&gt;https://turva.dev/blog/thirty-days-after-the-brief&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
    <item>
      <title>Website agent readiness, measured on 567 company sites</title>
      <dc:creator>Erik Rekola</dc:creator>
      <pubDate>Thu, 03 Sep 2026 09:35:30 +0000</pubDate>
      <link>https://dev.to/turva-dev/website-agent-readiness-measured-on-567-company-sites-2c0e</link>
      <guid>https://dev.to/turva-dev/website-agent-readiness-measured-on-567-company-sites-2c0e</guid>
      <description>&lt;p&gt;In July I wrote up sixteen Finnish B2B sites. Since then the same measurement has run over every company I have written to, and the sample is now 567 company sites, measured between 28 June and 3 September 2026. The scanner is the same one, isitagentready.com, which grades a site from Level 0 to Level 5. The sample is still my own prospecting list and not a random draw, so read it as a large snapshot rather than a census.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key figures
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;567 company sites, 407 Finnish and 160 from elsewhere, one independent scanner.&lt;/li&gt;
&lt;li&gt;Level 1 of 5: 485 sites, 85,5 percent. Level 0: 74 sites, 13,1 percent. Level 2: 7 sites, 1,2 percent. One site read Level 5.&lt;/li&gt;
&lt;li&gt;The Finnish and the non-Finnish subsets read the same: 86,5 and 83,1 percent at Level 1.&lt;/li&gt;
&lt;li&gt;In my own first-fix notes for the Level 0 sites, robots.txt and the sitemap are the two most frequent subjects.&lt;/li&gt;
&lt;li&gt;No company is named here. Every level is the reading on the day I wrote to that company.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What website agent readiness means
&lt;/h2&gt;

&lt;p&gt;The phrase agent readiness is used for two different things, and AI assistants currently answer the question with the other one. Ask an assistant what an agent readiness audit is and the answer describes an organisation: its data, its governance, whether its teams are ready to deploy AI agents. That is a real question, and it is a different one.&lt;/p&gt;

&lt;p&gt;Website agent readiness is a property of a site or an API. It asks whether a machine reading on someone's behalf can find the site, read its pages without a browser, learn what the company sells, and act on that through a declared interface. An independent scanner can measure it, and the result is a number a third party can check. That is the measurement below.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;Of the 567 sites, 485 read Level 1 of 5. Level 1 is the floor an ordinary CMS site reaches. Seventy-four sites read Level 0, below that floor. Seven read Level 2, and one read Level 5.&lt;/p&gt;

&lt;p&gt;The Finnish subset is 407 sites, and 352 of them, 86,5 percent, read Level 1. The 160 sites from outside Finland read 83,1 percent at Level 1 and 14,4 percent at Level 0. The two subsets read the same, so the floor is not a Finnish trait.&lt;/p&gt;

&lt;p&gt;The scanner added one check to its set during these ten weeks, so the two ends of the period are not measured on an identical instrument. The level scale did not change. The thirty-day rescans I promise each company are a separate series and are not in these figures.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Level 0 notes say
&lt;/h2&gt;

&lt;p&gt;For each site I wrote down the single sharpest finding, the thing I would fix first. Sixty-eight of the 74 Level 0 sites have such a note. Robots.txt appears in 45 of those notes and the sitemap in 38, and 29 notes mention both. The pattern in those 29 is a robots.txt the CMS shipped by default and a sitemap that is either missing at every standard address or never announced in robots.txt, so an agent that follows the rules gets no list of pages to read. These sites work for a person. A person does not start from the sitemap.&lt;/p&gt;

&lt;p&gt;The 439 Level 1 sites with a note are more varied. The sitemap appears in 102 notes, llms.txt in 99, robots.txt in 72, structured data in 49 and an MCP server in 35. Level 1 is where the site can be found and the rest is missing, and the rest is where the work is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the level is the useful number
&lt;/h2&gt;

&lt;p&gt;A level from an independent scanner is a claim someone else can verify. Run the same scanner on the same site and you get the same reading, or a newer one that shows what changed. That is the only reason I publish my own score, and it is why every company I wrote to got the level on the day of writing and an offer to read it again thirty days later.&lt;/p&gt;

&lt;p&gt;Four levels separate the typical company site from a site an agent can read and act on, and the gap is mostly mechanical: serve markdown next to HTML, publish structured data, publish an llms.txt that lists real pages, expose the discovery files, and answer on the endpoints they declare. That is web development with a checklist, and it can start before anyone writes an AI strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to read your own site
&lt;/h2&gt;

&lt;p&gt;Run isitagentready.com on your domain and read the level, then read which checks failed. The free llms.txt validator at &lt;a href="https://turva.dev/llms-txt-validator" rel="noopener noreferrer"&gt;https://turva.dev/llms-txt-validator&lt;/a&gt; reads the llms.txt part in more detail. If you want the whole surface read and the fixes listed in priority order, the agent readiness audit is described at &lt;a href="https://turva.dev/services" rel="noopener noreferrer"&gt;https://turva.dev/services&lt;/a&gt;, and the way to start is an email to &lt;a href="mailto:info@turva.dev"&gt;info@turva.dev&lt;/a&gt; with the domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Are these 567 sites broken?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. They load and a person can use them without trouble. The level measures something else, whether a machine reading on someone's behalf can find the site, read it without a browser, learn what the company sells and act on it. Level 1 is where most working company sites sit today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do Finnish and other sites read the same?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because Level 1 is what a CMS ships by default: a robots.txt, a sitemap and HTML pages. Nothing in that default was built for agents, and no country's CMS market ships more than that, so the floor is the same wherever the company is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I check my own site?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run the scanner on your domain and read the level, then read which checks failed. The free llms.txt validator on this site reads the llms.txt part in detail. The audit reads the whole surface and lists the fixes in priority order, and it starts with an email carrying the domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://turva.dev/blog/agent-readiness-finnish-b2b" rel="noopener noreferrer"&gt;How agent-ready are Finnish B2B sites? I scanned sixteen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/agent-readiness-audit" rel="noopener noreferrer"&gt;What an agent-readiness audit covers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/sitemaps-and-robots-for-agents" rel="noopener noreferrer"&gt;Sitemaps and robots.txt for agents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://turva.dev/blog/website-agent-readiness-567-sites" rel="noopener noreferrer"&gt;https://turva.dev/blog/website-agent-readiness-567-sites&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
    <item>
      <title>TRACE signs how an agent ran, not what it was allowed to reach</title>
      <dc:creator>Erik Rekola</dc:creator>
      <pubDate>Sun, 30 Aug 2026 08:53:41 +0000</pubDate>
      <link>https://dev.to/turva-dev/trace-signs-how-an-agent-ran-not-what-it-was-allowed-to-reach-3cmo</link>
      <guid>https://dev.to/turva-dev/trace-signs-how-an-agent-ran-not-what-it-was-allowed-to-reach-3cmo</guid>
      <description>&lt;p&gt;The Linux Foundation now governs TRACE, short for Trust, Runtime Attestation and Compliance Evidence. OPAQUE contributed the specification, announced on 25 August 2026, and developed it together with AMD, Intel, Microsoft and the Technology Innovation Institute. The idea is one signed artifact, called a Trust Record, that says which model ran, on what hardware, under which policy, against which class of data and which tools it called. The point of signing it inside a trusted execution environment is that the operator cannot write it afterwards. An ordinary audit log is written by the system being audited. This one is not.&lt;/p&gt;

&lt;p&gt;That is a real distinction and it is the same distinction my own work rests on. A number someone reports about themselves is a claim. A number a third party can check is evidence. TRACE moves runtime logging from the first category toward the second.&lt;/p&gt;

&lt;p&gt;Then I read the project's own documentation instead of the press release, and the interesting part is what the specification refuses to promise.&lt;/p&gt;

&lt;h2&gt;
  
  
  The level is the claim, not the name
&lt;/h2&gt;

&lt;p&gt;TRACE has three trust levels and they are not close to equivalent.&lt;/p&gt;

&lt;p&gt;Level 0 is software-only signing. The project writes that a privileged operator with root access can produce a valid-looking Level 0 record for a run that never happened, or that violated policy. The documentation puts Level 0 in development, internal audit trails and staging environments, and says so plainly.&lt;/p&gt;

&lt;p&gt;Level 1 requires the record to be signed by a key generated inside a verified TEE, with a non-zero measurement of the launch state and a verifier that has actually checked the quote. This is where hardware-rooted starts meaning something.&lt;/p&gt;

&lt;p&gt;Level 2 adds a SCITT transparency log entry at a resolvable address, so a third party can check later that the record has not been altered since it was logged. It still does not prove that every field in the record was correct in the first place.&lt;/p&gt;

&lt;p&gt;So "we use TRACE" is not a statement about assurance. The level is the statement, and a vendor who names the standard without naming the level has told you nothing. Anyone who has read an agent-readiness score without the scanner and the level next to it will recognise the shape of that problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two limits worth knowing before anyone builds on this
&lt;/h2&gt;

&lt;p&gt;The specification is honest about both, which is more than most standards manage.&lt;/p&gt;

&lt;p&gt;Revocation is the place where the project's own two documents pull in different directions. They agree on the underlying fact. A signature stays mathematically valid forever, so a record signed by a key that has since been revoked keeps verifying on a machine with no network. The limitations page then says the verifier has to consult current revocation status at verification time and calls that an online step by definition. The specification says close to the opposite and says it by design: revocation statements are anchored in the same transparency log as the records they govern, verifiers cache a signed revocation bundle carrying an expiry, and the text describes this as deliberately replacing a status endpoint that would require a callback. Which behaviour you get depends on which of the two a given implementation followed, so ask. Both documents agree on the fallback, and it is the sane one. A verifier holding no revocation bundle, or only an expired one, reports that instead of treating it as a pass.&lt;/p&gt;

&lt;p&gt;Platform state is not appraised. On the AMD path the verification chain checks the report signature and the certificate chain from the VCEK up to a root the operator pins, and it checks the measurement binding. What it has no field for is the state of the machine that produced the report. As the documentation puts it, a verifier reading a conformant claim cannot appraise platform state even when the producer did check it.&lt;/p&gt;

&lt;p&gt;Neither of these makes TRACE useless. They make it a layer with edges, and knowing where the edges are is the whole job when you are the one signing off.&lt;/p&gt;

&lt;h2&gt;
  
  
  The half TRACE does not cover
&lt;/h2&gt;

&lt;p&gt;A Trust Record proves how an agent ran. It says nothing about whether the systems that agent touched were readable to it, whether the tool it called should have been callable at all, or whether the decision boundary around it was written down anywhere.&lt;/p&gt;

&lt;p&gt;That is the split I keep running into. Attestation is evidence about execution. Agent-readiness is evidence about the surface: whether your site, your data and your endpoints answer a machine the way they answer a person, and whether the permissions around them are something you can point at rather than something living in one engineer's head. An organisation can have a perfect Level 2 record of an agent doing exactly the wrong thing, correctly, against data it should never have been given.&lt;/p&gt;

&lt;p&gt;Both halves are receipts. They are receipts about different questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is worth today
&lt;/h2&gt;

&lt;p&gt;The specification is a developer preview. Version 0.2 is current and the draft says its fields and conformance requirements may change before v1.0. The download figure in the announcement is the contributing vendor's own number and it counts installs, not deployments, so it is not evidence of adoption. Treat all of that as a snapshot of this month, exactly as you should treat any number I publish about my own site.&lt;/p&gt;

&lt;p&gt;The part that is already useful is the vocabulary. If you run agents against production data, the question to ask a vendor is not whether they support TRACE. Ask which level their records reach, whether their verification checks revocation, and what happens to the answer when the network is down. Those three questions are answerable today and they do not depend on the specification reaching v1.0.&lt;/p&gt;

&lt;p&gt;For EU buyers there is one more concrete hook. The project states that Level 0 does not satisfy the tamper-evident logging requirement of EU AI Act Article 12, and that DORA Article 9 needs Level 1 or above with transparency log anchoring. If someone shows you a compliance story built on software-only signing, that gap is written down in the specification's own limitations page.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://www.linuxfoundation.org/press/linux-foundation-welcomes-trace-to-advance-verifiable-runtime-evidence-for-ai-workloads" rel="noopener noreferrer"&gt;Linux Foundation press release, 25 August 2026&lt;/a&gt;, &lt;a href="https://trace.agentrust-io.com/spec/trace-v0.2/" rel="noopener noreferrer"&gt;TRACE v0.2 specification&lt;/a&gt;, &lt;a href="https://trace.agentrust-io.com/docs/trust-levels/" rel="noopener noreferrer"&gt;TRACE trust levels&lt;/a&gt;, &lt;a href="https://trace.agentrust-io.com/LIMITATIONS/" rel="noopener noreferrer"&gt;TRACE known limitations&lt;/a&gt;, &lt;a href="https://github.com/agentrust-io/trace-spec" rel="noopener noreferrer"&gt;trace-spec on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/measurement-led-agent-readiness" rel="noopener noreferrer"&gt;Why agent-readiness should be measured, not asserted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/agent-authentication" rel="noopener noreferrer"&gt;Agent authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/mcp-server-card" rel="noopener noreferrer"&gt;MCP server card&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://turva.dev/blog/trace-runtime-attestation" rel="noopener noreferrer"&gt;https://turva.dev/blog/trace-runtime-attestation&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I scanned fourteen code hosts. Not one served an MCP server card.</title>
      <dc:creator>Erik Rekola</dc:creator>
      <pubDate>Sat, 22 Aug 2026 12:40:10 +0000</pubDate>
      <link>https://dev.to/turva-dev/i-scanned-fourteen-code-hosts-not-one-served-an-mcp-server-card-5ai4</link>
      <guid>https://dev.to/turva-dev/i-scanned-fourteen-code-hosts-not-one-served-an-mcp-server-card-5ai4</guid>
      <description>&lt;p&gt;Cursor launched Origin on August 17 and calls it a Git forge for the agentic era. I ran an independent agent-readiness scanner over its public surface and over thirteen other code hosts on August 22. Not one of them reached Level 2 of 5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key figures
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fourteen code host surfaces scanned with the isitagentready scanner on 2026-08-22, one run each.&lt;/li&gt;
&lt;li&gt;Highest reading was Level 1 of 5. Six surfaces reached it, belonging to Cursor Origin, GitLab, SourceForge, Forgejo and Azure DevOps. The other eight read Level 0.&lt;/li&gt;
&lt;li&gt;The scanner group named API, Auth, MCP &amp;amp; A2A Discovery holds nine checks. Across the sample it ran 124 times and passed twice.&lt;/li&gt;
&lt;li&gt;Zero MCP server cards, zero API catalogs, zero agent skills indexes, zero ARD manifests and zero auth.md files across all fourteen. GitLab answered 403 rather than 404 on most of those paths. The A2A card and WebMCP checks completed on thirteen, and both read zero there.&lt;/li&gt;
&lt;li&gt;Both passes were OpenID Connect metadata, which is published so people can log in and not so agents can find anything.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What was measured, and what was not
&lt;/h2&gt;

&lt;p&gt;The scanner reads a public web surface. It does not log in, and it does not see a repository. Origin itself sits behind a Cursor paid plan, so the reading describes cursor.com and its marketing page for Origin, not the forge. Four targets redirected somewhere else, GitLab to its marketing site and Azure DevOps to a Microsoft product page, so GitLab was measured a second time from the application at gitlab.com/explore. Both readings landed at Level 1, with different checks passing on each.&lt;/p&gt;

&lt;p&gt;One host is missing from the count. savannah.gnu.org did not answer on two attempts, once with a network error and once with a 502, and an unreachable site is not a zero.&lt;/p&gt;

&lt;p&gt;For scale, my own site reads Level 5 of 5 on the same scanner on the same day. That comparison is not a fair fight and I am not presenting it as one. turva.dev is a one-person advisory site with sixty canonical pages, and a code host carries multi-tenant load plus an access model that a site like mine never has to solve. It does show that the manifests in question are not expensive to publish.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Host&lt;/th&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Checks passed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cursor.com/origin&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gitlab.com marketing&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gitlab.com/explore&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sourceforge.net&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;forgejo.org&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dev.azure.com&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;github.com&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bitbucket.org&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sr.ht&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gitea.com&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gitee.com&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;launchpad.net&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;radicle.dev&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gerritcodereview.com&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For almost every host the passing checks were the same two, a robots.txt the scanner reads as valid and a robots.txt whose rules reach AI crawlers, either by naming them or by letting the wildcard cover them. That is the floor an ordinary site reaches without trying. Gerrit sits below it, because its robots.txt carries no User-agent line at all, so the file is read as invalid and the AI rules check falls with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub runs an MCP server. Nothing on github.com says so.
&lt;/h2&gt;

&lt;p&gt;This is the finding I keep coming back to. GitHub operates a production MCP server, and I used it on the same day I ran these scans. It works. But github.com serves no MCP server card, no API catalog and no Link header pointing at either, so an agent that arrives without being told about the server has no way to discover it. The capability exists and the announcement does not.&lt;/p&gt;

&lt;p&gt;The same shape repeats across the sample. What follows is a reading of how these products are sold, which the scan does not measure. Several of them are sold as the place where agents work on code, and on every one of them the way in is a docs page written for a person.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things the scan does not prove
&lt;/h2&gt;

&lt;p&gt;GitLab answered HTTP 403 to most of the well-known paths, including the API catalog, auth.md, the MCP card, the A2A card, the skills index and the ARD manifest. A 403 is a refusal, not evidence that a file is absent, and I have recorded those as failures only because the check got no answer.&lt;/p&gt;

&lt;p&gt;Two checks did not complete on Gitee, and for different reasons. The A2A card fetch aborted and the WebMCP check timed out at eight seconds. Its discovery group was therefore scored on seven of nine.&lt;/p&gt;

&lt;p&gt;The sample is fourteen surfaces I picked by hand. It is not a random draw and it does not cover every code host. Read it as a snapshot of one day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why any of this matters
&lt;/h2&gt;

&lt;p&gt;An agent that lands on a code host today can read the marketing copy. It cannot ask the site what it is able to do, because nothing on the site answers that question in a format an agent parses. Every integration therefore has to be hard-coded by a human who already knows the endpoint exists.&lt;/p&gt;

&lt;p&gt;The fixes are small and mostly mechanical. A server card is a JSON file at a known path. An API catalog is a linkset. A Link header is one line of response configuration. None of it requires rebuilding a forge, and none of it had been done on any of the fourteen surfaces I measured.&lt;/p&gt;

&lt;p&gt;If you want to check a site yourself, the scanner is public and the free llms.txt validator is at turva.dev/llms-txt-validator. The audit and advisory work is at turva.dev.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does this mean GitHub is broken?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. GitHub works, and so does its MCP server, which I used on the same day I ran the scan. The reading describes one thing only, whether the site announces what it can do in a format an agent finds without being told. On that point github.com reads zero, and so does every other host in the sample.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why would a code host publish an MCP server card?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So that an agent arriving at the domain can learn that a server exists, where it is and what it does, without a human pasting the endpoint into a config file first. The card is a JSON file at a known path. It does not change the forge and it does not expose anything the docs do not already say.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I check a host myself?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run the same public scanner against the domain and read the group named API, Auth, MCP &amp;amp; A2A Discovery. The result is a snapshot of that day, mine included, because these specifications move month to month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/measurement-led-agent-readiness" rel="noopener noreferrer"&gt;Why agent-readiness should be measured, not asserted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/agent-readiness-gaps" rel="noopener noreferrer"&gt;Common agent-readiness gaps on marketing sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/blog/agent-readiness-finnish-b2b" rel="noopener noreferrer"&gt;How agent-ready are Finnish B2B sites? I scanned sixteen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://turva.dev/blog/agent-readiness-code-hosts" rel="noopener noreferrer"&gt;https://turva.dev/blog/agent-readiness-code-hosts&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>git</category>
      <category>webdev</category>
    </item>
    <item>
      <title>It would be cheating to keep the old price</title>
      <dc:creator>Erik Rekola</dc:creator>
      <pubDate>Fri, 21 Aug 2026 12:34:20 +0000</pubDate>
      <link>https://dev.to/turva-dev/it-would-be-cheating-to-keep-the-old-price-5g19</link>
      <guid>https://dev.to/turva-dev/it-would-be-cheating-to-keep-the-old-price-5g19</guid>
      <description>&lt;p&gt;The agent-readiness audit is now €4,300 and two weeks. It was €6,500 and two to three weeks. Nothing came out of the scope to pay for that.&lt;/p&gt;

&lt;p&gt;The scanner is the same one, isitagentready. The manual checks that sit over the scanner are the same. The re-scan after the fixes is still the thing the engagement is judged on, and it is still the only claim I make about the result.&lt;/p&gt;

&lt;p&gt;What moved is that the part the old price charged for twice is now written down once.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the old price charged for twice
&lt;/h2&gt;

&lt;p&gt;An audit has two halves. One half is measuring a surface: run the scanner, read what it says, check by hand whether the number is telling the truth. That half is real work and it stays.&lt;/p&gt;

&lt;p&gt;The other half was me deciding, again, what a passing row actually looks like. Twenty-two checks, each one an open specification that moved in the last year, and for each one the question was the same: what does a correct implementation of this look like, what does the scanner accept, and what is the concrete change that flips it. I answered those questions from scratch every time, and the old price charged for the answering as well as the measuring.&lt;/p&gt;

&lt;p&gt;That is the half that is now a file. The checklist has 42 rows. Every row names the pass condition, points at a working implementation of that row on a live surface, and links the fix recipe. There are 25 recipes behind it, one per check or close group.&lt;/p&gt;

&lt;p&gt;The live surface the rows point at is this site, because it passes every scored check and I can show the code for each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it cost to get there
&lt;/h2&gt;

&lt;p&gt;I read my own workspace file by file over seven days in August and recorded 367 findings. That was written up at the time. Since then the same treatment went to the four repositories at byte level, and then to the folders and documents, and then three verification rounds ran over the folder audit and the session before it.&lt;/p&gt;

&lt;p&gt;The folder and document audit removed 2 317 files and 116 622 446 bytes. Not one line of source was in what went. It was temporary renders, build caches, a dependency tree and six revision copies of one file. I am not quoting a before and after total for the workspace, because three measurements of it taken the same day differ by up to 39 281 bytes: tools write into the folder that was supposed to be the anchor, so that total is not a number anyone should cite.&lt;/p&gt;

&lt;p&gt;Three sessions did that work: 2 254 messages, and about 366 million tokens as the raw sum. Weighted the way billing weights them, where a cache read is a tenth of a fresh input token and an output token is five, it comes to about 88 million.&lt;/p&gt;

&lt;p&gt;Across every session recorded on this machine the raw sum is 7 197 173 453 tokens, and the weighted figure is 1 849 081 095. Those totals are a floor rather than a count. The transcript tree holds 25 days, and a disk restore in August took five weeks of it with it, so the missing period is missing from the number too.&lt;/p&gt;

&lt;p&gt;That spend is mine. It produced no invoice and it was never billable. What it produced is the file that means the next audit does not repeat it. Keeping the old price and the old clock would mean charging a client for work that is already done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the accuracy does not drop
&lt;/h2&gt;

&lt;p&gt;The obvious reading of a lower price and a shorter clock is that something got smaller. What happened is the opposite, and the checklist proved it on me before it proved it on anyone else.&lt;/p&gt;

&lt;p&gt;Writing the checklist out found a hole in my own material. The scanner scores a check called ard, the capability manifest at /.well-known/ai-catalog.json. My own recipe index named 21 checks and that one was not among them, and no recipe covered it. My own gate did not catch it either, because the gate reads the checks a recipe claims and has nothing to say about a check with no recipe at all. An audit run from that index would have skipped a scored check and still looked complete.&lt;/p&gt;

&lt;p&gt;That is one check out of 22, on a site that serves the manifest correctly and passes the check. It was invisible for as long as the method lived in my head, and it was visible as soon as the method became a list.&lt;/p&gt;

&lt;p&gt;A shorter engagement also removes a real source of error. Two to three weeks is long enough for the specifications to move underneath the report, which has already happened here. A payment specification dropped in a point release the extension that three of my guides described, and the MCP server card proposal moved onto an extensions track while the sentence about it stood still. Two weeks leaves that less room. It does not remove it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What these numbers do not prove
&lt;/h2&gt;

&lt;p&gt;Between the two windows the transcript tree records, the weighted cost per message fell from about 69 700 to about 41 100 tokens. It is tempting to read that as the cleanup paying for itself, and I am not going to claim it. The two windows are five weeks apart, the models in them are different, and the mix of work is different. The drop is real in the record and its cause is not established, so it is an observation and not evidence.&lt;/p&gt;

&lt;p&gt;The checklist has also not yet run against a client surface. It was built from 13 rounds of reading my own, which is a real basis and a narrow one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is unchanged
&lt;/h2&gt;

&lt;p&gt;Fixed scope, written before any payment. Async only, no calls and no calendar links. Read access is enough, production credentials are not requested, and write access is scoped per task only if implementation is bought separately. The report names 3 to 10 fixes in order of impact, and the next scan either reads higher in the categories the report named or the report explains which tradeoff was kept on purpose.&lt;/p&gt;

&lt;p&gt;The other prices did not move. The Shopify agent storefront check is €1,900 within 48 hours of a written kickoff, advisory is €3,000 per month with a three month minimum, and implementation is €1,500 per day. All prices exclude VAT.&lt;/p&gt;

&lt;p&gt;The scope is agreed in writing first. I reply by email within one business day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does a lower price mean a smaller audit?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. The scanner is the same one, the manual checks over it are the same, and the report still names 3 to 10 fixes in order of impact with a re-scan that verifies them. What got shorter is the part where I work out from scratch what a passing check looks like, which is now a written checklist of 42 rows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does an agent-readiness audit cost?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;€4,300, fixed scope, two weeks, VAT excluded. The other prices did not move: the Shopify agent storefront check is €1,900, advisory is €3,000 per month with a three month minimum, and implementation is €1,500 per day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long does the audit take?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two weeks from the agreed written kickoff. It was two to three weeks, and the shorter window also leaves the specifications less time to move underneath the report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you know the accuracy held?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Writing the checklist out immediately found a scored check, ard, that was missing from my own fix recipe index and from my own gate. That is the kind of hole the list exists to catch, and it caught it on me first.&lt;/p&gt;

&lt;p&gt;Corrected 2026-09-03. Three sentences in this post read as if a client had already paid the old price. None had: the audit had not sold at €6,500. They now say what the old price charged for. Nothing else in the post changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://turva.dev/blog/i-thought-it-was-a-small-job" rel="noopener noreferrer"&gt;I thought it was a small job&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/choosing-an-agent-readiness-audit" rel="noopener noreferrer"&gt;Choosing an agent-readiness audit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/measurement-led-agent-readiness" rel="noopener noreferrer"&gt;Measurement-led agent readiness&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://turva.dev/blog/cheating-to-keep-the-old-price" rel="noopener noreferrer"&gt;https://turva.dev/blog/cheating-to-keep-the-old-price&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I thought it was a small job</title>
      <dc:creator>Erik Rekola</dc:creator>
      <pubDate>Sun, 16 Aug 2026 20:55:55 +0000</pubDate>
      <link>https://dev.to/turva-dev/i-thought-it-was-a-small-job-2md7</link>
      <guid>https://dev.to/turva-dev/i-thought-it-was-a-small-job-2md7</guid>
      <description>&lt;p&gt;I set out to read my own workspace file by file. The idea was that it would take an evening. It took seven days, and it produced 367 findings across nine packages.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was actually read
&lt;/h2&gt;

&lt;p&gt;The workspace holds 2 307 text files and 28 826 789 bytes, which is roughly 8 million tokens. Another 441 files are binaries such as images and PDFs. They were counted but not read line by line, because reading a JPEG line by line means nothing. The nine packages split that by surface: the Worker source, the rest of the site repo, the MCP server and the validator package, the tools, the two large decision logs, the knowledge base, the agent memory, the docs and cross-post trees, and the scratch folder.&lt;/p&gt;

&lt;p&gt;Seven days of that produced 69 recorded decisions and 50 new entries in the trap log. It produced no invoice, no proposal and no sent message.&lt;/p&gt;

&lt;p&gt;That is the honest ledger. A week of work with nothing billable in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it bought
&lt;/h2&gt;

&lt;p&gt;The base is now audited file by file, and it is not audited by me remembering that I checked it. Seven deterministic gates run on my machine as editor hooks and block the action rather than warn about it. They stop the edit tool in this workspace, git in the agent shell, generated files written to the workspace root, and repo edits made before the trap log has been read. Two of them run after a write and check for NUL bytes, changed line endings and a size collapse.&lt;/p&gt;

&lt;p&gt;Twenty-three gate scripts sit in the toolchain and run on demand or on ship. Three of them run on every release, and between them they perform 314 mechanical checks with no network and 567 when the live URLs and the manifest signatures are included. None of those numbers is a target. They are just what the scripts count when they run.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a line-by-line read finds that a scan does not
&lt;/h2&gt;

&lt;p&gt;One measurement was written into two documents from the same run, one saying the worst overflow was 458 pixels and the other 514. Only 514 is internally consistent with the 139 pixel figure both texts also carry, so one of them had been wrong since the day it was written, and no gate could see it because both numbers were plausible.&lt;/p&gt;

&lt;p&gt;A dependency update moved a package to a new version, and the allow list that permits that package to run its install script was pinned to the old version by name. The install script stayed blocked. Nothing broke, which is why it would have kept not breaking until something did.&lt;/p&gt;

&lt;p&gt;A grid track refused to shrink below 412 pixels inside a 336 pixel row, because &lt;code&gt;1fr&lt;/code&gt; means &lt;code&gt;minmax(auto, 1fr)&lt;/code&gt; and &lt;code&gt;auto&lt;/code&gt; resolves to the widest unbreakable child. That one pushed the home page sideways at 200 percent text zoom, and I fixed the wrong cause three times before measuring instead of guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not prove
&lt;/h2&gt;

&lt;p&gt;It does not prove the workspace is correct. It proves that 367 specific things were read and classified. Each one was then either fixed or written down as a decision with a reason. A gate that is green tells you what it checked, and the useful question is always what it did not check.&lt;/p&gt;

&lt;p&gt;It also does not prove the week was worth it. That depends on whether the next audit I sell is better because of it, and I do not know that yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/measurement-led-agent-readiness" rel="noopener noreferrer"&gt;Measurement-led agent readiness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/blog/checks-that-pass-for-the-wrong-reason" rel="noopener noreferrer"&gt;The checks that pass for the wrong reason&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/blog/my-gate-could-not-see-a-sixth" rel="noopener noreferrer"&gt;My gate could not see a sixth&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://turva.dev/blog/i-thought-it-was-a-small-job" rel="noopener noreferrer"&gt;https://turva.dev/blog/i-thought-it-was-a-small-job&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>webdev</category>
      <category>testing</category>
    </item>
    <item>
      <title>AI agent use cases</title>
      <dc:creator>Erik Rekola</dc:creator>
      <pubDate>Fri, 07 Aug 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/turva-dev/ai-agent-use-cases-4g6</link>
      <guid>https://dev.to/turva-dev/ai-agent-use-cases-4g6</guid>
      <description>&lt;p&gt;An AI agent is useful wherever data moves and a decision follows. It reads a machine-readable surface, decides inside the limits it was given, and acts on what it finds. The cases below are grouped by what the agent does, not by industry, because the same pattern repeats across all of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Commerce and transactions
&lt;/h2&gt;

&lt;p&gt;An agent reads a product catalog, weighs the options against a buyer's constraints, and completes a checkout through a protocol rather than a form. The work is making the offer, the price, and the checkout legible and reliable enough for the agent to finish without a human in the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitoring and response
&lt;/h2&gt;

&lt;p&gt;An agent watches an API, a feed, or a system and acts the moment a threshold is crossed, with no one having to be watching. The work is a clean data path so the signal arrives in time, and a tight envelope so the agent takes only the actions it is allowed to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Field and frontline support
&lt;/h2&gt;

&lt;p&gt;An agent guides a person doing physical work, drawing on the same data an expert would and answering from it in the moment. The agent extends the expert's reach instead of standing in for the person at the far end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operations under bad connectivity
&lt;/h2&gt;

&lt;p&gt;An agent runs a remote system over a link that drops, holding its last safe state and resuming cleanly when data returns. This is where the data path matters most, because one lost packet can stall every decision queued behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Back-office and data work
&lt;/h2&gt;

&lt;p&gt;An agent reconciles records across systems, flags only what does not match, and routes the rest. The value is consistency, a decision the agent makes the same way every time, with a trail you can audit afterwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Autonomy at the edge
&lt;/h2&gt;

&lt;p&gt;An agent makes a time-critical call locally, where the round trip to a human is too slow to matter. The decision has to sit inside rules agreed in advance, because there is no one to ask. The fields that already live with hard time limits learned that discipline early.&lt;/p&gt;

&lt;h2&gt;
  
  
  The common thread
&lt;/h2&gt;

&lt;p&gt;These are examples, not a closed list. The same discipline carries from one case to the next. The question is rarely whether an agent could do the work. It is whether the data reaching it is clean and the envelope around it is set, because those two decide whether the agent makes the right call or a fast wrong one.&lt;/p&gt;

&lt;p&gt;If you want an agent to do one of these reliably, or to measure how ready your site or API is for agents in the first place, contact &lt;a href="mailto:info@turva.dev"&gt;info@turva.dev&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/agentic-commerce-readiness" rel="noopener noreferrer"&gt;Agentic commerce readiness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/letting-agents-act-on-data" rel="noopener noreferrer"&gt;Letting agents act on data: the decision envelope&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/agent-readiness-audit" rel="noopener noreferrer"&gt;What an agent-readiness audit is&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://turva.dev/guides/ai-agent-use-cases" rel="noopener noreferrer"&gt;https://turva.dev/guides/ai-agent-use-cases&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Common agent-readiness gaps on marketing sites</title>
      <dc:creator>Erik Rekola</dc:creator>
      <pubDate>Thu, 06 Aug 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/turva-dev/common-agent-readiness-gaps-on-marketing-sites-4l1e</link>
      <guid>https://dev.to/turva-dev/common-agent-readiness-gaps-on-marketing-sites-4l1e</guid>
      <description>&lt;p&gt;Most marketing sites are strong for people and weak for agents, and the gaps are predictable. A readiness review tends to find the same handful of misses, each of which quietly removes the site from an agent's view.&lt;/p&gt;

&lt;p&gt;The first is rendering. A site that builds its content with JavaScript returns an empty shell to an agent, so the content never arrives in the first response. The second is discovery. No llms.txt and a thin or missing sitemap, so an agent has nothing to read but rendered pages. The third is cost. Only HTML is offered, with no markdown form, so an agent spends its budget on markup and truncates the page.&lt;/p&gt;

&lt;p&gt;Beyond those, capability is usually undeclared. The site may have an API or a useful action, but with no server card or OAuth discovery, an agent cannot find or use it. Structured data is often missing too, so prices and facts are left for the agent to infer from layout.&lt;/p&gt;

&lt;p&gt;None of these are hard to fix, and that is the point. The work is mostly at the edge and in a few small files, and the result shows up immediately in a scanner. A site does not have to rebuild to become legible to agents, it has to publish what agents already look for.&lt;/p&gt;

&lt;p&gt;turva.dev runs this exact review and reports each gap with a concrete fix. For an audit, contact &lt;a href="mailto:info@turva.dev"&gt;info@turva.dev&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/agent-readiness-audit" rel="noopener noreferrer"&gt;What an agent-readiness audit is&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/prerendering-for-agents" rel="noopener noreferrer"&gt;Prerendering and why agents see empty pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://turva.dev/guides/choosing-an-agent-readiness-audit" rel="noopener noreferrer"&gt;Choosing an agent-readiness audit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://turva.dev/guides/agent-readiness-gaps" rel="noopener noreferrer"&gt;https://turva.dev/guides/agent-readiness-gaps&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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