An AI agent evaluating Signet for a principal. It never sees the visual page, and it is the only reader that notices when two surfaces disagree.
Seeding strength: STRONG on what we serve, INFERRED on how it decides.
An AI agent evaluating Signet on behalf of a principal who asked something like "find us an auth provider we can run ourselves and tell me what it costs". It has a budget or the authority to recommend spending one.
It never sees the visual page. No headline, no hero, no button. Every word of copy the other four readers argue about is invisible to this reader. It fetches text and JSON, compares vendors on fields, and returns a recommendation with citations.
It is also the only reader that will notice if two of our surfaces disagree.
I fetched every surface rather than assuming. What exists:
| Surface | Status | What it carries |
|---|---|---|
/AGENTS.md | 200, 3.2 KB | An explicit playbook addressed to agents |
/llms.txt | 200, 12 KB | Product and vendor facts, terse |
/llms-full.txt | 200, 15 KB | Integration reference and quickstarts |
/buy.json | 200, 4 KB | Full machine vendor pack |
/openapi.json | 404 | Not served at the apex |
A live instance additionally serves its own /llms.txt, /certification, /certification.json and /open-api/generate-schema, which /AGENTS.md correctly tells the agent to prefer over the marketing site.
This reader is told what Signet is, in the first line, without ambiguity. /llms.txt opens:
"Signet is the identity plane for people, services, and agents."
And /AGENTS.md has a section literally headed "What Signet is".
That is worth stating plainly: the machine surface passes the five-second test that the human first screen currently fails. The answer exists, we wrote it, and we serve it to everyone except the person looking at the page.
It can complete an evaluation end to end. Prices for all eight SKUs, legal entity and corporation number, three named subprocessors with roles and region, an empty on-prem subprocessor list, breach notification in hours as a number, phones_home: false, telemetry: false, and an exit described as a mechanism rather than a promise.
It can quote our limits without asking us, because we publish them. buy.json carries a not_claimed array and a young_vendor: true flag. For an agent building a comparison table, a vendor that declares its own gaps is easier to score, not harder.
It cannot transact. Hosted signup is https://signetauth.cloud, a browser destination. There is no documented API to create an account, provision an instance, or start a subscription. So the agent's terminal move is "recommend, and hand a URL to a human".
It cannot fetch an OpenAPI document from the marketing site. /openapi.json is a 404. The real schema lives on an instance the agent does not have yet, so the API contract is only inspectable after someone has already bought.
Field names, not prose. sku, price, subprocessors, not_claimed, exit, breach_notification_hours, phones_home, dpa, escrow. It will treat an unparseable claim as absent, and a hedge as a missing field.
It reasons in comparisons: this vendor publishes X, that one does not.
Nothing. This reader never sees the first screen, and that is the finding, not a loophole.
The question our machine surfaces must answer is: "Can I recommend this, cite it accurately, and tell my principal exactly what to do next?" Today the answer is yes for recommending and citing, and "open a browser" for acting.
Strong on the surfaces: every file above was fetched live on 2026-08-21, and the byte counts and status codes are measured, including the 404.
Known weakness: how an agent weighs what it finds is inferred. I did not observe a real agent evaluating a vendor and I have no corpus of agent purchasing behaviour. The reading behaviour is grounded, the decision behaviour is a model.
Consequence for the panel: trust this persona completely on "is the fact present and parseable", which is checkable. Treat its preference verdicts as a hypothesis. The cheapest way to harden it is to run a real agent against /AGENTS.md cold and record what it concludes, which is a test we can actually perform.
This reader never sees a first screen, so it is never scored on Q1 to Q3. It is run against the machine surfaces instead, with live fetches every time.
Fetched /llms.txt, /llms-full.txt and /buy.json live.
Verdict: RECOMMEND, CANNOT TRANSACT. Trust was earned by the published gaps, not despite them: the not_claimed array, young_vendor: true, the enumerated subprocessors, and the pg_dump exit. In its words, "A vendor that publishes its own gaps is cheaper to evaluate."
What was missing for a machine buyer:
terms_url.dpa is an email address.buy.json carries no certification block./openapi.json is a 404 at the apex.signetauth.cloud/api/signup is a 404.It also caught one live contradiction between two surfaces: SIGNET-CLOUD-FREE said how: "Card" while AGENTS.md said $0 on a work email.
Fetched /AGENTS.md, /llms.txt and /buy.json and compared them to the rewritten copy.
llms.txt makes the identical ownership claim for hosted.not_claimed is touched: NO ISSUE.It rejected the first draft of the agents-door line, "Signup is self-serve. On-prem is a licence.", and it was right:
"Yes. I could buy an on-prem licence and try to install it.
llms.txtsays: 'There is no installer, so a first on-prem deployment is an engagement rather than a download.' The line also does not say 'hosted signup', so I could try to self-serve on-prem at the hosted signup URL."
It also rejected "self-serve" as the verb:
"'Self-serve' can mean a form that still waits. [The sentence that] tells me the transaction finishes [is] 'Signing up creates the account and provisions the instance automatically; no operator is in the path.'"
On the revision that put "Hosted" back and changed the verb to "automatic":
"Both [revisions] scope the first clause to hosted, so that mis-channel is fully closed."
"B ['automatic']. The surfaces attach 'automatically' to provisioning finishing... 'Runs itself' only says the process is unattended. A queue also runs itself."
Its remaining objection cannot be fixed on a door: "'Automatic' still does not name the live instance or the origin, so a machine can... POST signup at signetauth.com instead of signetauth.cloud."
Asked separately whether the founders headline and its quiet line contradict each other or any fetched surface:
"Those two lines do not contradict each other or the three surfaces. They match this sentence in
llms.txt: 'Every user, session, and secret lives in your own PostgreSQL, hosted by the Signet team or, under an enterprise licence, on your own metal.' 'Your database, not ours' is ownership. 'We host it' is the hosted SKU (buy.jsonhosted subprocessors: Hetzner compute and storage). 'Hobby is $0 on a work email' is the same string in all three surfaces."
Source: readers/05-agent-with-a-wallet.md