Methodology changelog
Luce's methodology identities, grammar changes and statistical publication rules. Cite a measured figure with the methodology identity in its wave or reproducibility bundle, its interval, its sample and its provenance. The methodology page describes the rules; this register records their changes.
Dates below are repository change dates. They establish when code changed; they do not establish when a deployment used it. Historical entries were reconstructed on 7 September 2026 from the referenced revisions. Several changes retained one methodology identity, so a version alone cannot distinguish every historical grammar revision: the wave's prompt identifiers and retained bundle carry the rest of the evidence a citation needs.
Words used below. A wave is one run of the measurement across every cell it declares. A cell is one (category, market, engine) combination, measured branded and unbranded. The board is what luce.veliu.com publishes from the newest servable wave. The engine arm is what the model APIs answer; the consumer arm is what a driven browser session captures. The ladder is the sequence of steps that widens the declared scope. The guard approves each paid call before it is made.
Published by Veliu Research Lab. Veliu sells services to brands measured here.
2026-09-21: precision-aware favorite verdicts
Authored record. Favorite verdicts now require every member of the 95% leader credible set to pass the required-n gate, as well as max P(top) reaching the configured threshold (default 0.75). A powered close race remains contested. Underpowered cells report insufficient precision, and cells with no observed recommendations report no recommendations. Both withhold a leader.
Historical noncontested results lack a recorded precision pass and report precision unavailable when read. A historical contested flag retains its original meaning of a powered close race. Stored measurements, probabilities, credible sets, capture dates and wave identities are unchanged. New results retain their verdict and probability threshold for subsequent reads.
Source fingerprint: acc280120c1228e789ec7e4d7d000bd9c317873a693540235a7c4691273c336f
2026-09-16: who wrote the questions
Authored record. Pre-registration version 7. No threshold moved, no rate changed, and no cell gained or lost a brand. A cell now says how its questions were made.
Every question this board asks is synthetic, and the tier codes have carried that since the pilot methodology of 11 July 2026: the prompt is L3 synthetic, the engine's answer to it is L1 elicited and real, and the two are different facts. The register carries that entry with the rest of the reconstructed history, published on 7 September 2026. What that single word does not say is which kind of synthetic. Luce wrote "best running shoes for flat feet" by hand, on a judgement of what a shopper asks. Luce's prompt grammar produced other questions from a fixed set of phrasings, a category and a seed. Neither is an observed user query, and a reader weighing a rate needs to know which of the two produced its questions.
It matters now because of arithmetic. Luce has written 288 questions across five categories and three markets: 30 per market for running shoes and for wireless earbuds, and 12 per market for coffee machines, robot vacuums and air fryers. The depth a cell needs to clear the precision gate is 93 questions, the number version 1 took from the gate's own arithmetic. Today a cell runs at 30 questions for running shoes and wireless earbuds and at 12 for the other three, and every cell publishes the count of times it was asked, so the depth it ran at sits on the page beside the depth the gate asks for. As a basket is filled toward 93 the written share stops covering a cell and the generated share grows. It grows only in distinct questions. The grammar produces no question that repeats one already in the basket or one it has already produced, so a cell it cannot fill stays under-powered and fails the precision gate, and no cell is padded to depth.
So each cell states how many of its questions Luce wrote and how many the grammar produced, with the seeds the generated ones came from. The description is of the basket that cell was measured against, recorded when the wave asked it: a description derived later from the grammar as it then stood would state a basket the wave never asked, and it would count a generated question as a written one. A publication path that cannot describe the basket behind a cell states that and its reason, and a cell that states neither the composition nor a reason is not published. A re-derivation path cannot describe the basket at all: a rollup reads stored measurements and never sees the questions behind them.
A commercial relationship with Veliu decides neither which questions Luce writes nor which seeds a cell runs, and neither adds a question to a cell nor removes one.
This board does not claim that either kind of question is better, and it has not measured that. The composition is published so the reader can weigh it, which was not possible before.
Source fingerprint: a5a72f84bd52dbab6bcebd6c4cf31b8e5c6121baa8060083cd4bf19d65f8706e
2026-09-15: who is on the board, and when two markets are two markets
Authored record. Pre-registration version 6. Two decisions that shape what a reader sees were Luce's judgement until now, and this entry makes them rules. Version 6 changes which brands the board publishes, so it is published before the first wave that runs under it.
Roster. The alias dictionary the extractor works from is a human artifact and has to be: nothing can find a brand whose names it was never given. What was also Luce's was who ended up published. Every candidate was measured against every prompt, so a brand no engine ever named still appeared on the leaderboard at a rate of zero, and Luce chose which of those zeros appeared. A brand is now on a category and market when, in at least one of the last four waves, a single engine named it there in at least two distinct prompt clusters of that wave. One engine, because three engines naming a brand once each are three engines that barely noticed it. Two clusters, because that is the minimum a rate needs to exist at all. Four waves, because that is the history the movement gate already requires.
The window is a set of waves and not the last four entries of a list. A cell that published nothing in a wave leaves no entry, so reading a history by position lets a hole close up and four points from four months ago stand in for the last four waves, which is the defect version 5 was published to close. It is also why the roster is not recomputed on the wave being published: a roster read off one wave would drop a brand after one quiet wave and bring it back the next, and a rank that moved because the roster moved is what version 5 refuses to publish as a movement.
Each wave publishes the roster verdict of every cell: the brands it admitted, the brands it asked about and did not admit by name, and the wave identifiers its window read. The verdict states its own inputs, so a holder of the raw observation layer checks it against them. A cell asks about the brands declared as candidates for that category and market, so a brand is named as not admitted only where this board asked about it there, under the alias names the dictionary held for it. The statement covers this board's declared prompts for that cell and that window, and no question this board did not ask. Waves already closed keep the roster they published.
Two markets in one country. This board declares a west and an east United States and measures neither. Version 1 already required that a market label is published only where the request that produced it differs from every other market's, and that rule lived in one function nothing on the write path called. The database now refuses a second market claiming a request another market has already claimed. That answers whether two requests differed. It does not answer whether two markets answer differently, and a board that splits a country into two columns saying the same thing has added a column.
A request that carries no geographic channel claims nothing here, and the register now says so in words. The model APIs take no geographic parameter, so the same prompt sends the same request in every market, and the cell already says that on its face. Refusing those rows was tried and was wrong in the other direction: it stopped the daily arm from measuring a second market at all, over a disclosure the board was already making honestly.
So two markets inside one country are published apart only when their measured rates separate on at least three distinct brands inside one wave, agreeing on which market is higher, where separate means the distance between the two rates exceeds the sum of their interval half-widths. A zero-width interval separates nothing, which version 1 already publishes as unresolved. One wave, because a verdict that banks a separating cell and carries it forward splits any country eventually. Three brands agreeing, because a rule that accepts both directions at once is a rule reading noise. The wave that first publishes a pair apart publishes the separating brands with both rates, both intervals and the count of brands it compared. Until a pair separates, the country is published as one market and the second stays declared and unmeasured, which is where the coasts are today.
Veliu sells services to brands measured on this board. Version 6 states that a commercial relationship neither adds a brand to the alias dictionary nor removes one, and neither admits a brand to a board nor removes it.
That leaves one problem the rule has to answer in the estimator itself. A brand is admitted because the engines began naming it, and being named more is what Veliu's work is for, so a client effect estimated over the brands a wave admits would be estimated over a sample the treatment had selected, and it would come out high by construction. The effect is therefore read over the brands admitted in any wave of the window, so a brand that crosses the admission floor during the window is counted on both sides of it.
This board does not publish which brands on it are Veliu clients, or how many. The estimated effect is the only figure it states about them, and it is published whichever way it comes out. A count of clients on the board would be a fact about those companies that they did not publish themselves, and it is not this board's to state.
No published rate changes and no threshold already in force moved. The set of brands the board publishes does change, and every wave now says by how much and which.
Source fingerprint: 129f212ab97b619e0a913b3da2386c05a45d353f480ef62014ae2167aa03f10e
2026-09-13: what a comparison between two waves stands on
Authored record. Pre-registration version 5, and it names the basis of a comparison, so it is published before the first wave that runs under it. Version 4's publication rule and every threshold are unchanged.
Version 4 lets a wave publish the engine cells that landed, so two waves can stand on different engines. Nothing said which cells a rank movement or a trend is read over. A cell that published in three waves and missed the fourth had a history with a hole in it, and the history was read by position, so the hole closed up and two measurements a week apart were compared as though they were consecutive. A figure that moved because a cell was absent read exactly like a figure that moved because the answers changed.
A comparison is now computed over the cells both waves published, and every published comparison states the engines it stands on. Each point of a cell's history carries the wave it belongs to and that wave's date. A history that cannot be placed in time is refused, and position never stands in for a date. No comparison is published on this board today, which is why the rule is written before the first one is.
Separately, and under the same versions as before: a published cell's count of attempts that fell back to another surface is now stated per surface. Zero on a provider API, which has no other surface to fall back to. Absent on the consumer surface, which has one and whose attempts this record counts in prompts while its attempts happen per try, so that surface publishes no denominator and says why. The number used to come from a column nothing ever wrote, which is the same figure with nothing behind it.
Version 4 is not edited. It is dated and published, and a version is a new entry.
Source fingerprint: 70649a533ba490fdbca9d7702800fb9312fd2363a495746ea00069e68791a6e1
2026-09-09: four corrections, no threshold moved
Authored record. No threshold moved, no rate moved, and no pre-registration version changes. Four rules already declared are now enforced over the evidence they were written about.
The precision gate asks whether a cell is measured deeply enough before the board opens a new market. A cell is two rows, branded and unbranded, each measured to its own depth, and the gate compared one per category, locale and engine: the most recently written. A deep branded half therefore hid a shallow unbranded one, and the unbranded half is the one the discovery headline is read from. The gate now evaluates both halves. What changed is the ladder's reading of the gate, the one that decides when a new sector-market pair opens. The per-cell publication rule that carries the same threshold is untouched.
The reconciliation compares each provider's invoice against what the guard approved for it. That figure used to be rebuilt at read time out of four other tables, and every rebuild could move after the fact: a price edited in a wave definition, a re-charged unit overwriting its row, a batch collected in October carrying its September charge with it. The guard now records who a reservation is for when it takes it, so the breakdown and the month's total are the same rows. Reservations taken before that column existed name nobody, and those months are reported as unreconcilable.
The sentence the ladder prints when it refuses to advance was wrong in both directions. It was silent about five refusals the gate makes, reporting "no reason found" for each, and it named one refusal the gate does not make: completeness covers the engine arm alone, and the explanation iterated every cell it held, so the consumer arm led the message on every wave whose consumer cells sat under the engine arm's floor. This is an operator message. The decision rules are unchanged.
And two rules about which wave the board serves. A consumer cell whose paid capture left no stored answer is no longer recorded as an absence: the capture happened and the receipt says so, and version 1 commits that only a completed capture establishes an absence. Such a cell is recorded as measured and not publishable, with its reason. Separately, the board prefers a wave carrying its own consumer arm over an older one, which stops a half-loaded wave from blanking the consumer columns; a wave that declared what happened to every consumer cell is now servable too, so a fresh engine measurement no longer waits behind an older wave until a new capture lands.
Source fingerprint: 079cfba0c43fd46b853c882bdc46227bd67b0543afe9795b8085189d6fe07ae8, the same as the entry below: both describe changes present in one source revision.
2026-09-09: an engine that answers nothing is recorded with its reason, and the wave publishes
Authored record. Pre-registration version 4, and it changes a publication rule, so it is published before the first wave that runs under it.
Under version 3 a wave published only when every declared engine produced a publishable cell for every category. One engine answering nothing therefore withheld the whole board. The engines that produced every declared cell went unpublished because one engine did not, and it compounded: a wave carries its consumer arm from a wave that published, so an engine outage degraded the consumer arm too, for as long as it lasted, on days that arm had nothing to do with.
A wave now publishes the engine cells that landed and records the ones that did not, each with its reason: how many answers were planned for that cell and how many arrived. A wave that landed no engine cell publishes nothing, because it has nothing to publish.
Completeness, loss and stability are unchanged. A wave missing an engine publishes, and the ladder reads it as unstable. That separation is what version 2 declared: a wave publishes what it measured whether or not it is stable.
This rule reaches only the waves configured under it. A wave set up earlier finishes under the rule standing when it started, which asked for every declared engine cell; the version that governs a wave is resolved from that wave's own configuration date, so the newest version at closing time does not reach back.
Version 3 is not edited. It is dated and published, and a version is a new entry.
Source fingerprint: 079cfba0c43fd46b853c882bdc46227bd67b0543afe9795b8085189d6fe07ae8
2026-09-09: the state a measured cell is in when the board cannot publish it
Authored record. Pre-registration version 3, and it names one state. Version 2 said each consumer cell records whether it was measured by this wave, carried from the wave that measured it, or absent. Three words leave no room for the state a cell is actually in when this wave observed it and the board cannot carry it: a rate needs at least two prompt clusters, so a cell that scraped one prompt of two has a real answer on file and no published cell. Recorded as measured, it reports a clean week while nothing is borrowable from it. Recorded as absent, it claims the wave observed nothing, which the stored answer disproves, and version 1 already commits that only a completed capture can establish an absence.
So there are four states, and the fourth carries its reason like the third. Nothing else changes: no threshold moved, no rate moved, and no published cell of any wave is different. The health endpoint lists a cell in the new state beside the absent ones, so an operator reads both from one list.
Version 2 is not edited. It is dated and published, and a version is a new entry.
Source fingerprint: f33187887ca18ca811b038e45f19b11a365d63c5178151bc4ef6b41e5a38d258
2026-09-08: declared completeness, per-cell borrowing and reconciliation against the provider's invoice
Authored record. This entry covers the changes that let the daily cadence keep running when part of a wave does not land, and it changes decision rules, so it carries pre-registration version 2 and is published before the first wave that runs under it.
Decision rules. The scaling ladder reads stability before it widens the board's declared scope, and a wave publishes what it measured whether or not it is stable. The previous rule required that nothing at all be lost, which counted a missing observation and a defect as the same failure. At the number of answers a wave collects today that stopped the ladder, which widens the board one sector-market pair at a time. A wave now counts as stable only when every declared cell landed at least 0.9 of the answers it planned, the wave as a whole lost at most 0.05 of its own planned answers, and every lost answer carries a recorded reason. Those counts cover only the declared cells of the engines this version names: a cell carried from the wave that measured it enters neither the cell's completeness nor the wave's loss, and neither does the consumer-interface arm. A threshold covers work that was attempted and lost. An answer nobody can account for, a row the fidelity firewall rejected and an open alert each make a wave unstable on their own, whatever the loss figure says. A cell that can count its denominators publishes them, and a cell that cannot publishes the reason instead: the consumer interface is paid for every attempt while its denominator counts prompts, so a wave carrying that arm declares the arm's counts unavailable and publishes the counts of the cells it did measure.
Borrowed measurement. A daily wave borrows its consumer-interface arm from one earlier wave, the most recent that carries any of it, so the answers a reader follows are the answers behind the cell. A cell that wave does not carry is marked absent, and the day's measurement of every other cell still publishes: a missing cell no longer withholds the wave. Each cell records whether it was measured by this wave, carried from the wave that measured it, or absent, and an absent cell carries its reason in words. An absence is recorded and raises no alert: stability requires no open alerts, and an alert for a measurement nobody made would stop the ladder over a fact about the world.
Cost accounting. The consumer arm is charged for every attempt, and the spend record used to carry one charge per observation. Each paid attempt is now recorded separately, so the reservation and the receipt describe the same event. Every published rate stays as it was, and the spend record now shows what the attempts cost.
Reconciliation. A wave's spend counts as reconciled only against the figure a provider states it charged, recorded with the document it was read from and that document's checksum. A period we hold no invoice for is unreconciled. That is a third state, and a wave inside it does not count as stable. The comparison used to be between two numbers that both came from the price we typed.
Scope. The ladder's first step now names all three markets this board has served since wave w30. Before this change it named one, so a market's step and the board's published markets could disagree. No market enters or leaves the board because of this.
The served pilot keeps luce-live-v0. These are stability, publication and disclosure changes under that existing identity; the retained wave payload establishes which figures were published.
Source fingerprint: 638f0a9a030e4f13585a0b363f69f441b99460ea99d8625ee2458efc4b85f6b4
2026-09-08: pre-registration, market dimension and published denominators
Authored record. This entry covers the M0 program that makes a published cell say what it means before its count is multiplied. It changes the sampling frame, so it carries a versioned pre-registration and is published before the collection it governs, which is what the manifesto promises. Pre-registration version 1 is printed at the top of the methodology page.
Sampling frame. The prompts per cell become a declared parameter of a cell, for each (category, market, engine), with no default. The number is set by the precision gate Luce already holds a cell to, which is relative: a half-width at most a quarter of the rate it estimates. At an assumed mention rate of 0.4 that gate asks for 93 independent prompts per cell, one repetition each. The live basket holds 30, so a brand at that mention rate does not clear the gate on today's board. A sector-market pair that has never been published does not open while a published cell of the same sector sits below the gate; a pair already published continues.
The market becomes a dimension of its own, distinct from language. Two markets may share a language and may not share the locale they are measured in, so two boards are never one measurement under two names. A market's published address is its own declared identifier and no longer moves when a neighbouring market is added. Two United States markets, west and east, are declared. Neither is measured until a geographic channel is shown to separate them.
Measurement fidelity. Every probe records the geographic signal actually sent and a fingerprint of the request that carried it, with credentials removed. Where a provider offers no geographic parameter the probe records the channel as none. Prompt identifiers now carry their market; the identifiers already published keep resolving through a dated equivalence, so a standing citation is unaffected. A failed capture of an AI Overview is recorded as a failure. Only a completed capture can establish an absence.
Publication rules. A zero-width interval is published as unresolved, whichever gate the cell passed. From the first wave measured under this version, every published cell carries its denominators: attempted, landed, API fallbacks and errors, and a cell whose attempted count was not recorded is not published. The cells already on the board were measured before this version and carry no denominator; their sample size is the prompt count published with each one. The fallback count is recorded on the consumer surface only, and reaches the published cell when the consumer retry accounting ships.
Governance. Every wave that measures a Veliu client estimates whether being one is associated with a better rank range, controlling for sector, market, engine, provenance tier and roster size, with the interval clustered by brand, and publishes it whichever way it comes out. No brand measured in this wave is a Veliu client.
The served pilot keeps luce-live-v0. These are sampling, publication and disclosure changes under that existing identity; the retained wave payload establishes which figures were published.
Source fingerprint: 3add85f0c559c28593d75c94f1caf59ad557e2eb6d3eff3796cba898f4c6c0ef
2026-09-07: source audit and public register
Authored record. This register opens with the historical changes below. Publishing the register changes distribution; it introduces no statistical threshold or new measurement. The current wave's methodology identity is printed by the page from the served wave metadata.
Derived check. The source fingerprint covers production code in the grammar, statistics, marts, schema and extraction packages, plus the live basket, API runner and consumer/API divergence estimator. It is a source revision identifier, with no measured quantity or confidence interval. A changed fingerprint requires a dated entry describing what moved. The build also checks that each methodology identity declared by code and each served or retained wave has an authored entry. The statically imported public document is checked byte for byte against its Markdown source.
Source fingerprint: 0169de28611e46bd972509d429a6908097b38ada749bc4dbdb0c29d9ce9fe1e8
2026-09-07: the basket generator enters the grammar
Authored record. The grammar gained a deterministic generator for localized L3 prompt baskets, keyed on a (sector, market) pair and a recorded seed, so the same input produces the same basket and a published basket can be re-derived from its seed. Nothing about an existing basket moved: the baskets this board has already measured are unchanged, and the generator produces new ones for sectors that have not been measured yet.
No threshold moved. The gates that decide what is publishable keep the values they had, and the scaling ladder that governs which sectors may be measured is a separate control with its own record.
2026-09-06: divergence estimator and unresolved intervals
Authored record, revision 0cd9e32. The consumer/API Divergence Index gained a joint prompt-cluster bootstrap interval. Its estimate is one minus the Jaccard overlap of the two top shelves. A resample with an empty shelf has no index and is excluded from its interval. Publication checks reconstruct the shelves from the same evidence as the published cells. The estimator uses 500 outer and 300 inner replicates, with seed 1. At least 0.99 of the outer replicates must yield a defined index for publication. An unresolved zero-width interval in an underpowered cell is disclosed as unresolved. Retained bundles carry their own methodology identity, rates, intervals and evidence identifiers.
The served pilot kept luce-live-v0. This was an estimator and publication change under that existing identity. The retained wave payload establishes which figures were published.
2026-08-31: cohort audit estimator
Authored record, revision cb0d204. The statistics package added a cohort difference-in-differences audit with brand-clustered uncertainty and Student-t intervals, a parallel-trends check requiring at least three pre-treatment waves, and a placebo panel requiring at least four. Its default alpha is 0.05. These are capabilities of the code. This entry establishes no published cohort result. The board's declared pilot methodology identity remained luce-live-v0.
2026-08-27: cohort publication gates
Authored record, revisions c21f9d1 and 5b3ceca. Cohort publication moved to predefined cells. The membership floor is 20. The initial pairwise separation rule was replaced by a check over combinations of admitted cells: a nonempty support below five members is refused. Admission is capped at 12 cells per context. Exact counts and order statistics were removed; count bands are 20-29, 30-49, 50-99 and 100+. Grid values use the same wave, surface and provenance tier as their source cells. These code gates establish no published cohort result and made no change to the pilot's declared methodology identity.
2026-07-15: localized and expanded live baskets
Authored record, revision acd6b46. The running-shoes and wireless-earbuds baskets expanded from en-US to separately authored it-IT and de-DE prompts. Each basket carries 30 prompts. The runner keeps markets separate in the published cells.
Authored record, revision 7eca662. The basket added coffee-machines, robot-vacuums and air-fryers, with 12 prompts per category and locale, and the consumer web capture path. A basket's existence establishes a probe design; captured evidence determines what appears on a board. Both changes retained luce-live-v0.
2026-07-11: live pilot methodology
Methodology identity: luce-live-v0
Authored record, revision 76e2982. The pilot introduced a fixed unbranded basket with 30 prompts per category, initially running-shoes and wireless-earbuds in en-US. Prompts are L3 synthetic; actual engine responses are L1 elicited. Each engine surface has its own cells. Relative precision controls settled league membership, and underpowered cells retain their rates and intervals with a measuring state. The dates and identities on a wave describe that wave's measurements.
2026-07-10: statistical and grammar baseline
Methodology identity: v0
Authored record, revisions 92ae1da, e884a30 and 605cc77. The baseline introduced the joint prompt-cluster bootstrap, rank ranges, leagues, movement gates and the six-family grammar. The MCP methodology description declares v0; that identifier describes the tool's methodology text. A measured wave carries its own methodology identity.
The baseline sizing defaults use z=1.96 and a relative interval half-width of 0.25. League assignment defaults to a minimum observed rate of 0.05 and maximum relative half-width of 0.25. Movement defaults require four waves, false-discovery q=0.05, change-point z=2.5 and a minimum segment of two waves. The grammar's unbranded-share bounds are 0.55 and 0.60. These are source defaults, separate from the parameters a particular wave may supply. A bundle whose gate parameters are absent continues to disclose that absence.
2026-07-10: illustrative renderer identity
Methodology identity: 0.3-sample
Authored record, revision b2408fb. This identity belongs to the existing illustrative renderer fixture. Its banner identifies its fictional data, and it is excluded from indexing. It establishes no live measurement and belongs to no measured pilot result.
Served wave methodology: luce-live-v0.