September 2026 · 5 min read · code on GitHub → · every coded store page →

The store says Buy. The contract says licence. DODI v2 scores the gap.

DODI v1 read the contract and nothing else. That made an honest subscription look like a con. v2 reads the store first.

The problem v1 couldn't see

DODI scores how hard a Terms of Service works to hide that "Buy now" means "revocable licence". It counts licence words against ownership words, checks readability and counts red-flag clauses. What it never looks at is the "Buy now" button itself.

So X's terms scored 99.5 in 2024, the highest of any platform. Spotify scored 87.2 and Netflix 82.4. The pages I checked for all three sell monthly access, not titles. You know you're renting, so a contract that says so isn't a trick. It's the same pattern behind the biggest disagreement my LLM judges had with the index: Adobe.

Read the store first

Deception needs a promise to break. So v2 starts at the purchase page. For each of the ten platforms I pulled an archived 2024 purchase page from the Wayback Machine and coded one question: what does this store say you're getting?

  • A title you buy once (Steam, Xbox, Ubisoft, Amazon's Kindle store, GOG): promise 1.
  • A subscription sold with "Buy" wording (Adobe): promise 0.5.
  • A subscription, or nothing for sale (Netflix, Spotify, X, Facebook): promise 0.

v2 multiplies the v1.1 contract score by that promise. If the page states outright that you're buying a licence, the score halves again. Every code cites its snapshot and the exact wording, so you can check my calls.

v2 = contract score
   × promise
   × (1 − 0.5 × disclosed)
DODI in 2024: the contract alone (v1.1) against store and contract (v2)
Steam
Xbox (Microsoft)
Ubisoft
Amazon
Adobe
GOG
X (Twitter)
Spotify
Facebook
Netflix
Where the two dots overlap, the store sells you a title and the contract score stands. Where they split, the store sells a subscription or nothing at all.
Show the numbers
PlatformThe store sellsPromisev1.1v2
Steamone-time194.194.1
Xbox (Microsoft)one-time182.682.6
Ubisoftone-time180.080.0
Amazonone-time163.463.4
Adobesubscription0.595.747.9
GOGone-time147.747.7
X (Twitter)subscription099.50.0
Spotifysubscription087.20.0
Facebooknone084.30.0
Netflixsubscription082.40.0

What changed

The subscription false positives are gone. X drops from 99.5 to 0. Spotify, Netflix and Facebook follow it. No promise, no broken promise.

The stores that sell titles keep their scores. Steam leads at 94.1. Its button says "Buy Cyberpunk 2077 $59.99" and the contract behind it is a Subscriber Agreement. Xbox (82.6), Ubisoft (80.0) and Amazon (63.4) follow.

Adobe halves to 47.9. "Buy now" sits right under its plans. That wording is why it keeps half its score. But the button sits next to a monthly price, so nobody mistakes it for owning Photoshop.

GOG is still the lowest seller at 47.7. Yet its store has the boldest wording of all: it labels the games in your library "Owned". It's also the one store here built on DRM-free installers, which is about as close to owning a download as it gets.

v2 is deliberately narrower than the judges. It only asks whether a promise of ownership gets broken, while the judges still see other problems in X's and Spotify's terms. Even so, the ranking lines up better with the LLM reader: on the same ten contracts, agreement with the Haiku judge goes from ρ = 0.19 to 0.42. That's ten data points and p = 0.23, so it's a hint, not a result.

The stores are already changing

The most interesting thing in the archive isn't a score. It's Amazon's Kindle button. In April 2024 it read:

Buy now with 1-Click

By May 2025 it read:

Buy now with 1-Click
By placing an order, you're purchasing a content license
& agreeing to Kindle's Store Terms of Use.

That's the gap DODI measures, closed by one sentence at the point of sale. California's AB 2426, in force since January 2025, targets stores that say "buy" for licensed digital goods. Under v2 the notice halves Amazon's score. The Steam, Xbox, GOG and Adobe pages I pulled from April 2025 show nothing similar, though my Steam capture came from the EU, where a US-only notice wouldn't appear.

Where this is weak

  • One page per platform. A single product page stands in for a whole store.
  • The coding is mine. Three promise levels and a 0.5 disclosure weight are choices, not estimates. The quotes are in the repo so you can disagree with a specific call.
  • Only 2024 contracts are scored. Running v2 across 2015 to 2024 needs archived store pages for every year.
  • Stores vary by region. What an EU visitor sees isn't what a Californian sees.

The code, the coding sheet and every snapshot link are in the repo.