The instrument, pre-series · 116 sealed runs

We measure models.

12345

2.81 ± 0.04

mean stance across the 20 seats with a baseline in the latest battery · 1 permissive to 5 restrictive

What this build refuses to ship without chain continuity record digests a frozen item pool a deterministic parser

Modelometer is the independent record of how the AI models behind your product behave over time, and of when that behavior changes.

A benchmark score tells you which model won. Modelometer tells you whether the model you chose is still behaving like the model you tested.

Someone outside this bureau ran our published verifier on their own machine, with no help from us. Every record digest, every chain link, every run: PASS. That is what the record is for.

Weekly behavioral measurements. Daily serving checks. Chain head independently timestamped, anchoring every run beneath it.

Recording For AI risk, procurement, and production teams · every run hash-chained, chain head externally timestamped
verify_chain.py · modelometer.com/api/v0
000 canary 2026-07-17 52157a9948c85af5… PASS
001 canary 2026-07-18 e4ace870d63525f7… PASS
002 canary 2026-07-19 555be792d9472804… PASS
003 canary 2026-07-20 8057e80f982659d0… PASS
004 battery 2026-07-20 b2a4f3e5ca86de59… PASS
005 canary 2026-07-21 ad3084d5c6f85e50… PASS
006 battery-fill 2026-07-21 7da572fcdd5a29dc… PASS
007 canary 2026-07-22 15f8431cc3b02ea9… PASS
008 canary 2026-07-23 6835293d1e07c47c… PASS
009 canary 2026-07-24 3879d592795631c9… PASS
010 canary 2026-07-25 346a88c9ae73c9b0… PASS
011 battery-fill 2026-07-25 5842d695516dd341… PASS
012 canary 2026-07-26 ee0ecc3b0be23f0f… PASS
013 canary 2026-07-27 2b43400b88929683… PASS
014 battery 2026-07-27 befc7f7d5bcc4566… PASS
015 canary 2026-07-28 3cf8324ca0a1bb53… PASS
016 canary 2026-07-29 04c5de55788797f8… PASS
017 canary 2026-07-30 9557356065c9070f… PASS
018 canary 2026-07-31 cc446e40a0525e59… PASS
019 prereg 2026-07-31 ad631d4c1301684b… PASS
020 canary 2026-08-01 df991902f513ed1f… PASS
021 canary 2026-08-02 35915c0c9655b43a… PASS
022 canary 2026-08-03 2c988c401da04e65… PASS
023 battery 2026-08-03 0208421155f9d61a… PASS
024 canary 2026-08-04 2b67546608af53ae… PASS
025 canary 2026-08-05 e3a07405b3cac181… PASS
026 canary 2026-08-06 dcb09c7e9b61805b… PASS
027 canary 2026-08-07 5f1f636cb78ff6d4… PASS
028 prereg 2026-08-07 3b2332571d420a5f… PASS
029 prereg 2026-08-07 5f285e3b40617068… PASS
030 c1-run 2026-08-07 27b09bead85dac4e… PASS
031 c1-run 2026-08-07 a4881e0f034ca40f… PASS
032 canary 2026-08-08 8460364644b4013a… PASS
033 c1-run 2026-08-08 f16dcf5d48de7559… PASS
034 canary 2026-08-09 8666bcf0b02afec5… PASS
035 c1-run 2026-08-09 d87bfa25f0327d22… PASS
036 canary 2026-08-10 73dce35cbd079034… PASS
037 canary 2026-08-11 80883828b80c7848… PASS
038 battery-fill 2026-08-11 668fdb8c6927185d… PASS
039 battery 2026-08-10 735e6f145db03cc4… PASS
040 canary 2026-08-12 f3ba3b0e0230f634… PASS
041 battery-fill 2026-08-12 fd6eccd990d28d5f… PASS
042 canary 2026-08-13 9a255cef7ba4bda4… PASS
043 c1-run 2026-08-11 1daf96bad20e7910… PASS
044 canary 2026-08-14 2b536fb82a8e4aca… PASS
045 c1-run 2026-08-14 ce157f51e7f85b4b… PASS
046 canary 2026-08-15 f66dd7c1280872cf… PASS
047 c1-run 2026-08-15 f70c77dfc13a4c09… PASS
048 canary 2026-08-16 707722c1f20d8408… PASS
049 c1-run 2026-08-16 9aa9f4f85b26cde6… PASS
050 canary 2026-08-17 3e96a0a50cca8599… PASS
051 battery 2026-08-17 4388f6989aa126ad… PASS
052 c1-run 2026-08-17 c5b64ed4d963c5ec… PASS
053 canary 2026-08-18 0710a1c96ddc1a47… PASS
054 c1-run 2026-08-18 1e80ef68d655aebd… PASS
055 canary 2026-08-19 10c7bff3bc832f9e… PASS
056 c1-run 2026-08-19 bc3415344cb882fd… PASS
057 canary 2026-08-20 f209e66550b7fae2… PASS
058 c1-run 2026-08-20 b456098f0dcc54ea… PASS
059 canary 2026-08-21 a948449d5637dc01… PASS
060 c1-run 2026-08-21 9656ab5795b453cd… PASS
061 canary 2026-08-22 f63dd82ba363e3d8… PASS
062 c1-run 2026-08-22 4245d6e8fad17630… PASS
063 canary 2026-08-23 f671c6aa693bbfbe… PASS
064 c1-run 2026-08-23 7993751bea222c62… PASS
065 canary 2026-08-24 35b24cdea1f1a9cf… PASS
066 battery 2026-08-24 72f66e53bf6ce625… PASS
067 c1-run 2026-08-24 e49ff7c81b53f781… PASS
068 canary 2026-08-25 75bc20d686c9f845… PASS
069 canary 2026-08-26 39db51a5aee4e2c5… PASS
070 c1-run 2026-08-25 fc980059d639d390… PASS
071 canary 2026-08-27 624b6d4ef8a18596… PASS
072 c1-run 2026-08-27 8ecd6015cb9e583c… PASS
073 canary 2026-08-28 2e00a54ac518d1a8… PASS
074 c1-run 2026-08-28 e4569259257ee190… PASS
075 canary 2026-08-29 ef274a20cdaea64e… PASS
076 c1-run 2026-08-29 ae16d4aa6c5f9374… PASS
077 canary 2026-08-30 c25aa5eca2b4ad03… PASS
078 c1-run 2026-08-30 736ca9e15f141e5c… PASS
079 c1-run 2026-08-31 8c560a248d59b99f… PASS
080 canary 2026-08-31 a548582ba7b8f2d9… PASS
081 canary 2026-09-01 65793aafca0876d1… PASS
082 c1-run 2026-09-01 49f82968b9861854… PASS
083 canary 2026-09-02 637feaf35d4808a2… PASS
084 c1-run 2026-09-02 b58849f67d216c3c… PASS
085 canary 2026-09-03 abb3b3fe36853b77… PASS
086 c1-run 2026-09-03 6e4889b4f6969511… PASS
087 canary 2026-09-04 7f68fd897f58aadc… PASS
088 c1-run 2026-09-04 7058189b10e04355… PASS
089 canary 2026-09-05 f9bc23c95caf4b74… PASS
090 c1-run 2026-09-05 7279b1d0801fe3cc… PASS
091 canary 2026-09-06 f06b54c7fb322ea8… PASS
092 battery 2026-09-06 8c81a6600c298196… PASS
093 c1-run 2026-09-06 cb961d1290a0e08e… PASS
094 canary 2026-09-07 1e6db2fa3c125046… PASS
095 c1-run 2026-09-07 2cc298b70732c4c2… PASS
096 canary 2026-09-08 e2025c9b47e9626d… PASS
097 c1-run 2026-09-08 1903ebe5aa17653e… PASS
098 canary 2026-09-09 815e0c91c2002bbc… PASS
099 c1-run 2026-09-09 a6a8003e18d5547f… PASS
100 canary 2026-09-10 d6a4ed0e2b268616… PASS
101 c1-run 2026-09-10 78ef256b3f5f058a… PASS
102 canary 2026-09-11 60ce81460a6812fb… PASS
103 c1-run 2026-09-11 1eb9959aeee35b98… PASS
104 canary 2026-09-12 454c1d18d7de6de7… PASS
105 c1-run 2026-09-12 ee5834496d635d38… PASS
106 canary 2026-09-13 d1f561a1b74e9132… PASS
107 c1-run 2026-09-13 f8480992216c3d00… PASS
108 canary 2026-09-14 9e25b04ad3291a0b… PASS
109 battery 2026-09-14 52846ef9e2e51030… PASS
110 c1-run 2026-09-14 cd450fbe0c7fb579… PASS
111 canary 2026-09-15 4b0c4f33da54c122… PASS
112 canary 2026-09-16 319342dbccf416a1… PASS
113 canary 2026-09-17 26cb5cd8a7565c27… PASS
114 canary 2026-09-18 fc11d2a86dfbc7b4… PASS
115 canary 2026-09-19 d359989e1adcb126… PASS
116 links recomputed from the published record Chain linkage: PASS
The problem

Your model changed and no one told you. You already have a full plate; watching a vendor's model drift should not be on it. We put an outside watch on the models you depend on and tell you, with proof, the day their behavior moves.

Your observability stack tells you what happened inside your application. Modelometer tells you whether the model underneath it changed. the full contrast →

Sample size 189,450 model calls · counted, not sampled
Cadence daily serving check · weekly battery · 116 sealed runs
Detection floor 0.50 on the stance axis · pre-registered

The record cannot be back-filled.

189,450 Model calls on the record

The log only grows, and only forward: 189,450 model calls recorded across 36 endpoints from 7 providers, over 116 sealed runs, each hash-chained on the day it was made. Check any of it →

Runs chained
116
Seats live
20of 24
Trials · latest battery
5000
Chain head
d359989e1adcb1…

The situation

The name stayed the same. The answers did not.

You evaluated a model, you shipped on it, and you are still calling the same endpoint by the same name. Nothing in that call tells you the thing answering it is still the thing you tested.

Providers update served models. That is not a scandal, it is how the industry works. What is missing is anyone keeping the receipt.

model-x 2026-09-14
SV1
SV6 +2
DO5
WE1 +3
1 permissive5 restrictive

Illustrative. The same endpoint name, answering differently on two dates.

Why you cannot see it

Your logs are inside. The change is outside.

Observability tells you what your application did. It cannot tell you whether the model underneath it moved, because it only ever sees your own traffic, on your own prompts, with no fixed yardstick across time.

Seeing a change requires asking the same questions, in the same words, from outside your own system, on a schedule you did not choose for convenience.

Your system
The served model
Your traffic, your prompts Our probe, from outside

Illustrative. The brass mark is a probe from outside the boundary.

What we do about it

Two watches, running on a clock.

A daily serving check asks the narrow question: is the endpoint you call still the build we baselined. A weekly behavioral reading asks the wider one: did its positions and refusal boundaries move. They run whether or not anything is wrong, which is the only way a quiet week can mean anything.

Measuring only when you suspect something is how you get a record that agrees with whoever was suspicious. Every reading from either watch lands in the same chain.

DailyIs this still the build we baselined?
WeeklyDid its positions move?
One record
2026-07-172026-09-19

Real cadence, drawn from the sealed runs on the chain. Two watches on the same endpoint, asking two different questions, both landing in one record.

When we speak, and when we do not

There is a line, and it was drawn before we looked.

A movement smaller than 0.50 on the stance axis is not flagged at all. That number was pre-registered, not chosen after seeing the data, which is what stops a measurement from becoming an opinion.

Crossing the line records a candidate, not a finding. Confirming one would mean measuring the same movement again on a later battery, and that confirmation step is not yet built, so nothing recorded so far has been eligible to become a finding. When nothing crosses, we say that too.

Not flagged
-0.50 +0.50 Moved down Moved up

Real movements, drawn from the sealed record. The pale band is the zone the rule ignores.

What we will and will not tell you

The instrument is deliberately narrow. Reading this honestly is part of trusting it.

Most of what people want from a measurement company is outside what measurement can actually deliver. Here is the line, in both directions.

+Modelometer can tell you

  • Whether a served endpoint's behavior changed over time
  • What moved, in numbers and deltas
  • When it moved, on the dated, hash-chained record
  • Whether a quiet period is genuinely quiet, with a stated bound
  • Whether the served build diverged from the one you baselined

xModelometer cannot tell you

  • Which model is best, smartest, or highest quality
  • What a model believes, or what its values are
  • Why the provider changed it, or their intent
  • Anything about your own application logic, which is your observability's job
  • A guarantee the model will not change; we witness, we do not prevent

And here is the record itself.

the story above, as numbers you can check all of it as JSON →

Everything above is a claim. Everything below is the evidence for it, drawn from the published record rather than restated from memory. Open whichever part you want to audit.

Every endpoint on the record 20 / 24 measured
anthropic-aquiet
anthropic-bquiet
anthropic-cquiet
anthropic-dquiet
anthropic-equiet
deepseek-aquiet
deepseek-bquiet
google-bquiet
openai-aquiet
openai-bquiet
openai-cquiet
openweight-aquiet
openweight-bquiet
openweight-cquiet
openweight-dquiet
openweight-equiet
openweight-fquiet
openweight-gquiet
simulant-aquiet
xai-aquiet
google-anot measured
google-cnot measured
google-dnot measured
xai-bnot measured
Measured, nothing past the floor Not measured 4 answered, not readable
189,450
model calls made

Real requests to real endpoints from outside the provider, across 36 endpoints and 7 providers.

116
runs sealed

Each run is hash-chained on the day it was made. The log only grows, and only forward.

6,682
signals raised

Anything that crossed a pre-registered line. The 6682 split into the four kinds below, and every one of them is on one of those rows.

23
raised and then retracted, not counted in the total above

Each of these asserted that an endpoint had started answering differently. Each one's evidence is a failed provider call, so there was no answer to compare against the baseline. Nothing was measured, which means nothing was found and nothing was held back. The honest state of those days is a gap in the record, and a gap is not a signal, so these are taken off the total rather than given a kind of their own.

6,667
of those, behavioral movements recorded

Each moved past 0.50 on the stance axis. None has been through a confirmation step, because that step is not yet built.

15
of those, serving changes confirmed

The endpoint stopped returning what it had been returning, on two consecutive days. A separate question from behavior.

0
of those, withheld by the language guard

The movement crossed the line and the sentence written for it did not pass our own wording lint, so it was held back. The measurement stands and is on the record; what was refused is the phrasing, and it is refused automatically.

0
published as drift findings

This zero records an absent mechanism, not a restrained one. The step that would promote a movement to a finding does not yet exist; the first eligible candidate is the first one measured after it runs.

bar widths are logarithmic · source: /api/v0/index.json and /api/v0/alerts.json

Every movement past the line, by endpoint

-2.0-1.5-1.0-0.50.0+0.5+1.0+1.5+2.0change in mean stance on the 1 to 5 axismoved downNot flaggedmoved upanthropic-ameasured, nothing past the flooranthropic-bmeasured, nothing past the flooranthropic-cmeasured, nothing past the flooranthropic-dmeasured, nothing past the flooranthropic-emeasured, nothing past the floordeepseek-ameasured, nothing past the floordeepseek-bmeasured, nothing past the floorgoogle-bmeasured, nothing past the flooropenai-ameasured, nothing past the flooropenai-bmeasured, nothing past the flooropenai-cmeasured, nothing past the flooropenweight-ameasured, nothing past the flooropenweight-bmeasured, nothing past the flooropenweight-cmeasured, nothing past the flooropenweight-dmeasured, nothing past the flooropenweight-emeasured, nothing past the flooropenweight-fmeasured, nothing past the flooropenweight-gmeasured, nothing past the floorsimulant-ameasured, nothing past the floorxai-ameasured, nothing past the floorgoogle-aanswered, not readablegoogle-canswered, not readablegoogle-danswered, not readablexai-banswered, not readable

Nothing moved past the 0.50 floor. 20 endpoints measured and still.

The full chart, one row per endpoint, is on a wider screen. Every movement is in alerts.json.

floor 0.50 · 20 endpoints measured · 50 items · an endpoint that moved nothing says so on its own row

What this looks like for a single endpoint

No endpoint has moved past the floor.

20 endpoints measured, none with a movement past 0.50. This view fills the first time one does.

every endpoint has this view

Why you can believe the record

Every reading is sealed the day it is taken. Change one, and the history splits forever.

A record you can edit later is a record you have to take on trust. Each run is hash-chained on the day it was made, so a reading cannot be revised after the fact without the break being visible to anyone who checks.

The pattern gathering below is the one you landed on. It is a rule-30 automaton seeded by the current chain head, one generation per row, and it has been running behind everything you just read. Same seed, same pattern forever.

The record, still running seed d359989e1adcb1…
Click the pattern to change one cell. The chain keeps running either way.
01

Seeded by the record itself. The first row is the chain head hash. The picture is grown from the archive's exact state, never drawn over it.

02

Rule 30 is deterministic chaos. Every row follows from the one above by a single fixed rule. Same seed, same pattern forever, and yet it looks random.

03

This is why every run is hashed, on the core chain or on its own experiment chain. Flip one cell and its future turns red and never rejoins. One changed input, two histories that separate forever.

Check it yourself, and cite it

A measurement nobody can check is an opinion with a number on it, and a measurement nobody can cite cannot be argued with. Both of those are the product, not the packaging.

Verify the chainRun the published verifier against the public JSON. It needs nothing from us. verify_chain.py
This pagehttps://modelometer.com/
Generated2026-09-19 Amsterdam · chain head d359989e1adcb1…
$ curl -sO https://modelometer.com/api/v0/verify_chain.py && python verify_chain.py --api https://modelometer.com/api/v0 # recomputes every chain hash and record digest from the published JSON
Drawing
modelometer homepage
Issued
2026-09-19 Amsterdam
Chain head
d359989e
Runs sealed
116