the ledger notes
The zero that got better the closer we looked
Launch night. The plan was simple: run one experiment behind the scoop post, write it up, sleep. The experiment produced a zero, and the night turned on what that zero actually meant — twice.
The first zero was a lie we almost believed
The question: ChatGPT's API answers cite ad-tagged links on some phrases three times out of four. Does the Codex CLI — same model, flat-rate plan — ever emit them? We fired 120 runs at the twelve worst phrases and the batch came back in a tenth of the expected wall clock. Zero ads.
Hypothesis confirmed, right? Except a batch that finishes that fast is a batch you haven't earned. Ninety-six of the 120 runs had died in milliseconds on a misplaced CLI flag — --search is a global flag, and after the exec subcommand it's an instant error — and the harness happily counted the corpses as processed. A perfect fake zero, indistinguishable from the real thing unless you check that the output files contain output.
We fixed the flag and re-ran all 120 from a clean context. Zero again. Real this time.
The second zero was a better finding than the one we wanted
Then we looked at what the runs actually contained, and the zero got stranger: not zero ad-tagged URLs — zero URLs, period. Codex's JSON output records the web searches the model runs (we verified every run searched) but never serializes a single result link. The model reads the live web, names its recommendation in plain text, and hands you nothing you can check.
The URLs exist. We called the same model through the API's web-search path and it returned citation annotations on demand — including, three probes out of three on the headphones phrase, a Google-Ads-tagged link. Codex receives that machinery's output and drops the links at the CLI boundary.
So the finding we set out to get — "Codex is the ad-free surface" — was wrong in the most interesting way. Codex is the citation-free surface. Ad-tagged links structurally cannot reach its users, because no links can. That asymmetry — 18.72% of API answers ad-tagged, consumer web at 5.79%, Codex at a structural zero — became the scoop.
An argument settled by a browser instead of a meeting
Mid-writeup we nearly relabeled 82,869 rows. They carry Bing's msockid parameter, and the case for calling them "Microsoft Ads" felt strong — they cluster on competitive commercial phrases, and Microsoft's ad platform is, after all, the branding on the tin.
Instead of arguing, we opened a fresh anonymous browser and clicked Bing results, live. No msockid appeared — not on the results page, not on the landing URL. Sponsored clicks use a different parameter entirely (msclkid — zero occurrences in our 2.3M citations). And the counter-evidence was already sitting in our own table: microsoft.com itself carries msockid 5,356 times, alongside a charity fundraiser page and a nonprofit that refuses advertising outright.
So the label died, the merged bucket got a published definition — every identifier listed, "ads," never "paid ads" — and the genuinely weird part went into the article as an open question instead of a claim: today's Bing doesn't hand out that parameter to anonymous clicks, yet ChatGPT's citations keep accruing it daily. Whatever stamps it lives somewhere in the retrieval pipeline, and we'd rather print the question than fake the answer.
The founder as fuzzer
While all this ran, the founder clicked around the site the way only a nervous owner at 1 a.m. can, and found four real bugs in ninety minutes: a nav link to a feature that wasn't on, four homepage links shaped /d/https://asana.com/pricing, a 404-page button that did nothing (the error page renders inside an invisible iframe when a single-page navigation dies — the button was navigating the iframe), and a verification email that answered a legitimate click with a bare 403 because the browser held a different account's session.
One of the 404s was ours to own entirely: editing the scoop post required deleting and reimporting it, and he clicked during the gap. The importer now updates posts in place; that window no longer exists.
Every one of the four became a named test the same hour — the suite grew from 1,146 to 1,156 tonight — plus a 20-check smoke script that curls the real site's critical paths, every check a bug that existed at some point this evening. It reads ALL CLEAR as of 00:53.
The receipts for the scoop — all 20,590 ad-tagged citations, verbatim URLs, real timestamps — are public in a read-only sheet. One deliberate choice there: the timestamps are the actual capture times, not tidied ones. The whole point of a receipt is that checking it makes it stronger.