ATLAS · METHOD
Every figure here comes from a file under scripts/analysis/out/drift/, named beside it, so each can be traced (R27). The measures: (d) the first brand an answer names and not a brand it advises against; (b) the set of brands it names, scored as the overlap of two sets (1.00 the same set, 0 nothing in common); (c) the set of sites it cites, scored the same way; (f) whether the app showed product cards. A pair is two answers to the same question, and a cell is the mean over its pairs, with the pairs counted beside it. The ten questions are questions.json: four English, three Hinglish, three Hindi, about earbuds and smartwatches. The ledger entries are D759 to D763 in web/LATER.md.
HOW TO READ THE FIGURES
compare-summary.txt, is the file the figures beside it come from, under scripts/analysis/out/drift in the Atlas repository. A build step reads each figure back from that file; a figure it cannot find there stops the build.compare-summary.txtSixty app runs captured logged out (ten questions, ChatGPT and Gemini, three fresh chats each, 4 and 5 Oct 2026) against sixty API draws with Atlas's production settings (gpt-4.1-mini and gemini-3.6-flash, temperature 0.2, grounded), plus a third arm for ChatGPT alone with an India location on its search tool.
check-runs.txt: no links on 30 of 30 Gemini pages, every one signed out), so an empty set matches an empty set and the API row measures only whether the API also cited nothing.What it leaves untested: one account state (logged out) on one day; the app's agreement with itself comes from three chats minutes apart, never an hour apart; the API's location arm exists for ChatGPT only, since Gemini's search tool takes no location; and on Gemini the cited-sites measure says nothing, the app having cited nothing.
config/compare.txt, config/cost.txtSix API arms, each drawn three times per question in two rounds an hour apart (the actual gaps, from the records: Gemini 60 minutes on every arm, ChatGPT 78 to 85 minutes after three credit stops), measured two ways: against the app runs of section 1 (the surface, 18 pairs a question) and against themselves an hour later (the clock, 9 pairs a question). The arms: ChatGPT P (production gpt-4.1-mini, temperature 0.2, no location), M (the app's own model as the API lists it, chat-latest, default temperature, an India location), S (M plus a short system prompt stating the date, India and a shopping purpose); Gemini P (production gemini-3.6-flash, grounded), U (the app's then model, gemini-3.5-flash-lite, grounding off), G (the same, grounded). The whole test cost $15.40 at list rates.
What it leaves untested: the app side is the same 60 logged-out runs, so the app's own hour-apart stability is not measured; chat-latest is the API's name for ChatGPT's model and may not be what the app's "Auto" picks; the location and the system prompt are guesses at what the app sends; Gemini's "app model" arms used 3.5 Flash-Lite, the label the logged-out pages carried, while the signed-in app later reported 3.8 Flash (section 3); and the ChatGPT rounds were 78 to 85 minutes apart, not 60.
signed-in/compare.txt, signed-in/arm-3.8-cost.txtThirty Gemini app runs captured signed in on 5 Oct 2026 (Apps Activity off, Personal Intelligence off, the app's picker reading 3.8 Flash), each capture firing one draw of the production arm (gemini-3.6-flash, grounded) within 0.6 to 1.6 seconds (gap_seconds in each signed-in-runs/<q>/api-<run>.json), so every app run has a draw made at the same moment. Later the same morning, one draw per app run of gemini-3.8-flash, the model the app named, 12 to 47 minutes after the captures (arm-3.8-cost.txt), for $1.01.
signed-in-runs/ parse-log.txt: 0 links and 0 cards on 30 of 30, the page check finding no sources list, control, external link or redirect), exactly as the 30 logged-out pages had (check-runs.txt). The cited-sites measure is therefore not computable on Gemini in either state, and the card measure is 0.00 of 30 on both.signed-in/compare.txt counts the draws that searched; the questions skipped were brand-comparison and trust questions).What it leaves untested: one account, one sixteen-minute session, with personalisation switched off, so what a personalised signed-in Gemini answers is unknown; the simultaneous draw is paired with the capture, not with the moment the app composed its answer, which the capture does not record; the cited-sites measure says nothing on Gemini in either state; the 3.8 arm was drawn later, not at capture, so its gap is 12 to 47 minutes; the app's "3.8 Flash" is the picker label as the owner read it; ChatGPT has no signed-in test; and the raw pages were deleted at capture, so the no-sources reading rests on the parser's page check, with one page read by hand before deletion agreeing with it.
strength-sets/strength-sets.txtOn 82 distinct questions from the calibration sets of three reports (boAt, Mivi and Freshdesk (US)) and a D2C set of neckbands, headphones and power banks (Mivi's report repeats 14 of boAt's word for word, each counted once; ChatGPT and Gemini, two runs each, captured 7 to 13 Oct 2026), each app run was set against the production API draw fired at its capture (API with app, 192 pairs on each app) and the app against itself, run 1 against run 2 (app with app, 96 pairs on each app). The measures: the first brand named, the brands named and, on ChatGPT, the cited sites. First brand leaves out a pair in which a side names no brand, and cited sites one in which a side cites no site, so each of those cells counts its own pairs; brands named scores every pair, as the brands both name over the brands either names (a side naming no brand against one naming some agrees on none).
A cell is the mean agreement over its pairs, then its 95% interval and, in parentheses, its pair count. The intervals come from 10,000 bootstrap resamples of whole questions, drawn from all four sets at once (a question in two reports is one unit); a question with no scored pair on a measure, on either side, is not drawn for that measure. The difference is API with app minus app with app, with its 90% interval; the two are within ±0.10 when two one-sided tests each give p below 0.05 (the larger p is shown).
Across 82 questions, the API named the same first brand as the app 65% (ChatGPT) and 70% (Gemini) of the time; each app agreed with itself 70% and 74%. The gap is 4 to 5 points; at 90% confidence it is no larger than 11 to 12 points, close to but not yet inside our 10-point bar.
| MEASURE | API WITH APP [95%] | APP WITH APP [95%] | DIFFERENCE [90%] | WITHIN ±0.10 |
|---|---|---|---|---|
| ChatGPT, first brand | 0.65 [0.57, 0.73] (191) | 0.70 [0.61, 0.79] (96) | -0.05 [-0.12, 0.02] | no, p 0.112 |
| ChatGPT, brands named | 0.57 [0.54, 0.61] (192) | 0.65 [0.62, 0.69] (96) | -0.08 [-0.12, -0.05] | no, p 0.205 |
| ChatGPT, cited sites | 0.19 [0.15, 0.23] (140) | 0.42 [0.34, 0.51] (62) | -0.24 [-0.30, -0.17] | no, p 1.000 |
| Gemini, first brand | 0.70 [0.62, 0.77] (192) | 0.74 [0.65, 0.82] (96) | -0.04 [-0.11, 0.03] | no, p 0.076 |
| Gemini, brands named | 0.66 [0.62, 0.69] (192) | 0.77 [0.73, 0.81] (96) | -0.11 [-0.15, -0.08] | no, p 0.729 |
open-data/MANIFEST.jsonEvery app run and every API draw the tests above score is in one archive: atlas-app-vs-api-runs-2026-10-18.zip (2129819 bytes, sha256 695e51d95be48bff6169baf874cd5054922ed7dfab682f330bd687b4fe0fa0a2), with its README, which describes each file and field, the tests, the measures and the licence. Inside: 474 app runs (the ten drift questions, logged out and signed in; the four calibration sets, boAt, Mivi, Freshdesk from the US and the D2C set, 96 runs each) and 1374 API draws paired with them, each answer as the app showed it or the API returned it, with its links, cards, timestamps and settings. Nothing identifies the person who ran the apps: the build refuses to write if an answer, link, card or citation carries their name or email, a sign-in line, a chat or share link or an account link, and the same check was run again on the published file; cited URLs are as the models returned them, with their tracking and affiliate parameters removed, so the archive carries no one's click tracking. Licensed CC BY 4.0: share and adapt it for any purpose, crediting Supernamed and naming the archive and its build date.
SOURCE: scripts/analysis/drift/finding.md IN THE ATLAS REPOSITORY, WITH THE FILES IT NAMES UNDER scripts/analysis/out/drift. THE LEDGER ENTRIES D759 TO D764 RECORD EACH RUN.