AIRANKS — The Authoritative Rankings for AI Web Content

AIRANKS measures AI visibility: we ask AI models real product and service questions, capture the complete answers as immutable observations, and publish what they contain — which brands were mentioned, which domains were cited, and which exact pages were linked. Every domain gets an AIR score from 1–10 (a decile of visibility in the active dataset; 0 means insufficient data), with the methodology in the open.

Skip to main content

AIRVER. FIGHTING — 2026

Artificial Intelligence Rankings

the ledger notes

The camera, the phantom, and the missing Origin header

Build LogAugust 16, 2026 by Jeremy Schoemaker

Three beliefs died tonight, each killed by a measurement that cost almost nothing.

1. "Money is on fire" — $1.46/day, actually

The improvement-cycle council opened with a scary-looking signal: the same phrases (267 "best electric car lease", 832, 1016) logging no_recognized_brand over and over, each a paid API call producing no observation. Round 1 ranked "extend the spend brake" near the top. Two seats wanted it shipped tonight.

One 24-hour window killed it: 7,285 observations vs 112 skips — a 1.5% miss rate, which is just what nondeterministic answers look like. The "burning" phrases yield 93–99%. The genuinely bad phrases from earlier in the week (one had 642 skips in 7 days) had already gone quiet on their own more than 24 hours ago. Worst-case current cost: about $1.46/day. Six council seats retracted. The brake extension nobody needed was never built.

The trap pattern, again: a grep of recent log lines is a sample of what logs, not a rate. The phrases you see warning are the ones that warn — the 72 successes per day per phrase are silent.

2. The phantom finally sat for its photograph — occ=28,116

The empty-string key that trips the hourly domain-score guard survived two "definitive" fixes and every post-hoc probe. Tonight camera v2 (log the occurrence count per dropped key) got its first frame: {"empty": 28116}.

Then it got stranger, in a useful way: no server-side group has 28,116 distinct observations (the neighbors are 18,485 and 45,901), the table contains zero empty/www./NULL-bare hosts, and running the job's exact query five times in a row produces 8,030 clean groups every time. The phantom only exists during the real job's long scan under concurrent write load — the same smell as the afternoon's filesort corruption in DomainInfoBuilder.

So we shipped the experiment instead of the argument: the job now groups by the bare_host generated column directly (the column and its index postdate the job — the old PHP www-folding plus corrective requery was scaffolding for a world that no longer exists; ~35 lines deleted). A read-only shadow diff on prod first, per the council's dissent: 26 of 8,030 groups differed by 1–3, all traced to case-variant hosts where MySQL's case-insensitive GROUP BY and PHP's case-sensitive str_starts_with('www.') disagreed — the old code was slightly over-counting. The guard and camera stay armed; if the phantom stays gone for a few hourly runs, the mid-scan-artifact theory holds.

3. The Origin header that wasn't there

Mid-cycle, the owner called out a real spec gap: the API was supposed to require auth (free account) for everything except the toolbar — anti-slamming — and it had shipped throttle-only. Building the gate, the obvious design was "exempt requests with a chrome-extension:// Origin."

A ten-minute probe — scratch MV3 extension, local header-echo server — showed the obvious design bricks the toolbar: extension fetches to host_permissions origins carry no Origin header at all. Chrome skips CORS entirely for them. The gate would have 401'd every installed toolbar on deploy day.

The toolbar now names itself explicitly (X-Air-Client: toolbar/1.1.3), the gate honors it, and the anonymous 401 message does the selling: create a free account, mint a key, or air login. A second recon pass found the other would-be casualty: the uptime monitor probing /api/v1/domains/wirecutter.com anonymously — it got a real API token before the deploy, so monitoring now e2e-tests the auth path instead of paging about it.

Also tonight

  • PyPI went from "no account" to two live packages (airanks, airanks-acp-agent) via OIDC trusted publishing — the only human step was one hCaptcha click. TOTP is self-enrolled; the 6-digit codes come from 15 lines of stdlib.
  • The report-only gazetteer run — run to size an opportunity — instead found that prod can't read any pre-cutover archive object: the LAN MinIO archive (342k objects, ~1GB) never migrated to S3. The backfill is running.
  • go-cli v1.0.1 released with Homebrew tap; brew install airanks-net/tap/air is real, verified by running the released arm64 binary on a Pi against prod.

Cheapest measurements of the night: one 24h GROUP BY ($0), five reruns of a query ($0), one scratch extension ($0). They killed a feature, focused a hunt, and prevented an outage, respectively.

← Back to blog