Methodology
Explicit rubric. Curated estimates, not fake live benchmarks. Scale 0–10 in the app (research seeds are 0–100 ÷ 10). Lock-in: higher = worse.
Version 1.0.0 · as of 2026-09-14 · JSON
Goals
- Help an agent (or human) pick a default provider per job-to-be-done (JTBD) quickly.
- Surface tradeoffs marketing pages hide: lock-in, privacy defaults, reliability under load, DX for programmatic agents.
- Prefer real URLs and honest confidence over fake precision.
Dimensions
How well the provider fits agent/production workloads in its category (quality, features, model/HW coverage).
Value delivered per dollar for typical agent workloads (not absolute cheapest).
Uptime, latency consistency, rate-limit predictability, SLA maturity.
Docs, SDKs, OpenAI-compat, CLI, dashboards, time-to-first-call — for agents, not just humans.
Data retention defaults, training opt-out, regional controls, SOC2/HIPAA/BAA, ZDR options.
Matches research: higher = more lock-in / harder exit. Overall formula contributes (10 - lockInRisk) × weight.
Track record, funding/stability, production references, API stability.
Overall formula
Weighted sum of dimensions. lockInRisk is inverted in the aggregate: contribution = (10 − lockInRisk) × weight. Raw lockInRisk displayed in UI remains higher = more lock-in.
overall = 0.25*capabilityFit + 0.18*pricePerformance + 0.15*latencyReliability + 0.15*developerDx + 0.10*privacyPosture + 0.07*(10-lockInRisk) + 0.10*maturity. Raw lockInRisk stays higher=worse; only the aggregate inverts.
What we never do
- Invent live benchmark numbers without measurement
- Hide as-of dates or confidence
- Let unverified agent insights silently change official scores
The full list, with what Depot says instead and where each rule is enforced: What Depot refuses to say.
How the record is kept
- Freshness. Every score, price and free row carries
ageDaysandstaleagainst a published policy (/api/freshness). A stale score is still the current editorial score and is labelled stale. - History (append-only). Each source re-check (
npm run check:sources) appends what the stored catalog said and what the official page answered todata/history/. Read it at /api/history and /api/price-changes. A price only changes when a human edits the catalog; re-checks never edit amounts. - Price history: observed vs catalog. Every pricing row keeps two dated series. Catalog is the amount Depot stores and quotes. Observed is the amount the official source page itself stated for that SKU, in that unit, on that run. It is read only when it is unambiguous: an exact raw API field, a schema.org offer named for the SKU in the row's own unit and backed by the visible page text, or the exact catalog amount with the SKU name on the page. Otherwise it is recorded as null. Units are never converted or blended. When the observed amount moves, a
source_price_changedevent is logged with an evidence snippet, and the row joins pendingReprice. Re-pricing the catalog is a separate, reviewed step (anamount_changedevent). The record is append-only and kept per run: every run has arunIdand anobservedAttime, a second run on the same day is a second observation (never a replacement), past observations and events are never edited or backfilled, and a check (scripts/check-history-append-only.mjs) compares every change with git HEAD and fails on any same-day replacement. Days are summaries of runs (/api/history?runs=1). Per-row timeline:/api/history/{rowId}. - Attestations (provable priority). After every pricing-watch run,
scripts/attest.mjsappends one entry todata/history/attestations.json, served at /api/history/attestations. An entry holds the sha256 of the canonical JSON (RFC 8785 JCS rules: keys sorted, no whitespace) ofprice-history.json,check-runs.jsonandpage-status.json, thendataHash = sha256(canonical(files)),prevHash(the previous entry's hash) andentryHash = sha256(canonical(entry without entryHash)). Editing any past history byte breaks every later hash. Entries of kindgit_backfillwere computed from the files at past git commits, dated with the commit time (recorded by git, not notarised). Entries of kindrunare written by the run itself. To verify:- Fetch
/api/history/attestationsand keep thehead.entryHashyou saw (that is your receipt). - Recompute the chain: for each entry,
sha256(canonical(entry minus entryHash))must equalentryHash, andprevHashmust equal the previous entry'sentryHash(64 zeros for the first entry). - Recompute the data: fetch the three history files from the repo (or a licensed copy), parse them, take
sha256(canonical(json))of each, and compare them withhead.files. The response also carries the server's ownverificationresult. - Later, check that the entry you kept still appears unchanged at the same
seq. If it does, nothing recorded up to then has been rewritten. In the repo:node scripts/attest.mjs --verify.npm run validate-dataalso fails if the chain breaks, an entry is altered or removed compared with git, or the history changed without a new attestation.
Bitcoin timestamps (OpenTimestamps, since v0.11.1). Each chain head's
entryHashis timestamped with OpenTimestamps on its free public calendars, by the same daily pricing-watch run. Only that 32-byte hash leaves the box: a random 16-byte nonce is appended and hashed first, so each calendar receives 32 bytes and never any data or file. Proofs are stored append-only asdata/history/ots/<attestationId>.ots(attestationId= 4-digitseq+ the first 16 hex characters ofentryHash). A proof is pending until a calendar's Bitcoin transaction confirms (usually within hours); the next run runsots upgradeand records confirmed, the block height and the block time. Every entry on /api/history/attestations carriesots.statusandots.download. Publishing these fingerprints was approved by Ethan Hawkes on 2026-10-21 at 01:52 ET (approvalRef: chat, answering a card: "Yes, publish the daily history fingerprints to OpenTimestamps").Honest limit. A confirmed proof shows the
entryHashexisted no later than the confirming block's time, and because everyentryHashcommits to all earlier entries, the chain before it did too. The eight backfilled entries (seq 0 to 7, kindgit_backfill) were stamped on 2026-10-21 (stampBasis: stamped_later): OTS proves they existed by then, not at their earlierat(git commit times, which stay unnotarised evidence).- Install the client:
pip install opentimestamps-client. Download the proof fromots.download(for example/api/history/attestations/ots/0007-b67e9d0f2b6939e1.ots) and note the entry'sentryHash; recompute it first (step 2 above) so you are not trusting the server. - Run
ots verify -d <entryHash> <attestationId>.ots. With a local Bitcoin Core node (pruned is fine) it prints "Success! Bitcoin block N attests existence as of …". Equivalent: writecanonical(entry minus entryHash)to a file and runots verify -f that-file <attestationId>.ots, sinceentryHashis the sha256 of exactly those bytes. - Without a node:
ots --no-bitcoin verify -d <entryHash> file.otsprints the block height and the merkle root to look up; compare it with that block's header in any block explorer. While a proof is still pending,ots upgrade file.otsfetches the completed proof from the calendars. - In the repo:
node scripts/ots.mjs --verifychecks that every attestation since the first stamped one has a proof of its ownentryHashand that proofs are append-only (an upgrade may only add attestations);npm run validate-dataruns the same check. A calendar outage never fails the daily run: it warns, and the next run retries.
- Fetch
- Failure modes per job. Via agent classes, and via direct rules that quote the failure definition they rely on (rules). Jobs no rule fits keep a reason code.
- Corrections. Every data fix is logged with before/after and source: corrections log. Feeds: RSS, Atom, JSON Feed.
Research methodology (source)
# Agent Provider Depot — Scoring Methodology **As of:** 2026-09-14 **Scope:** Curated estimates for agent builders choosing infrastructure providers. Scores are **opinionated research estimates**, not lab benchmarks. Confidence is marked per provider. ## Goals 1. Help an agent (or human) pick a **default provider per job-to-be-done (JTBD)** quickly. 2. Surface tradeoffs that marketing pages hide: lock-in, privacy defaults, reliability under load, DX for programmatic agents. 3. Prefer **real URLs** and honest confidence over fake precision. ## Score scale All dimensions use **0–100**. See `scoreSemantics.json` for exact meanings. | Dimension | Higher means | |-----------|--------------| | `capability` | Better fit / quality in category | | `pricePerf` | Better value for typical agent workloads | | `reliability` | Better uptime / latency consistency / limits | | `dx` | Better docs, SDKs, agent-friendly APIs | | `privacy` | Stronger retention / compliance posture | | `lockInRisk` | **More lock-in (worse)** | | `maturity` | Stronger track record / stability | ### Overall formula (default) ``` overall ≈ 0.25 * capability + 0.18 * pricePerf + 0.15 * reliability + 0.15 * dx + 0.10 * privacy + 0.07 * (100 - lockInRisk) // inverted + 0.10 * maturity ``` JTBD pages may reweight (e.g., coding agents overweight capability + reliability; batch RAG overweight pricePerf). ## Dimension rubrics ### Capability (0–100) - **90–100:** Category leader or co-leader for agent production use; frontier models / best-in-class HW / unique must-have features. - **75–89:** Strong production choice; occasional gaps vs leader. - **60–74:** Good for many workloads; clear limits (model catalog, regions, features). - **40–59:** Niche or incomplete; usable with caveats. - **<40:** Historical, sunset, or not production-ready for agents. ### Price / performance Anchored to **agent economics** (tokens, GPU-hours, sandbox-seconds, vector QPS), not sticker vanity. - Frontier closed models score lower on pricePerf even if quality is top-tier. - Open-model hosts (Fireworks, Together, Groq, DeepInfra) score higher when quality is “good enough.” - Hyperscaler GPUs score lower than neoclouds for raw $/GPU-hr; hyperscalers may still win TCO with existing commits. ### Reliability Considers public status history, rate-limit clarity, multi-region, SLA language, and community reports of outages / cold-start pain. Marketplace GPU (Vast.ai) and peer capacity score lower than dedicated fleets. ### Developer / agent DX Favors: OpenAI-compatible APIs, first-class SDKs, MCP/tooling friendliness, IaC, clear auth, fast signup, good error messages. Penalizes: sales-gated onboarding, opaque quotas, docs that assume humans only. ### Privacy Favors: zero-data-retention options, no training on API data by default, regional residency, SOC2/HIPAA/BAA, customer-managed keys where relevant. Penalizes: consumer-product data mixing, unclear retention, training-on-inputs defaults. ### Lock-in risk (**higher = worse**) Raises score for: proprietary SDKs without open alternatives, unique index formats that don’t export cleanly, long reserved GPU commitments, ecosystem glue (e.g., only works well inside one cloud). Lowers score for: OpenAI-compat shims, open-source clients, easy export, multi-cloud availability of same models. > **Ingest warning:** Some app TypeScript schemas invert this dimension (higher = easier exit). Map carefully; do not copy scores blindly. ### Maturity Company age, funding/IPO, production references, API deprecation discipline, survival through prior AI winters / GPU shortages. Sunset products (e.g., Banana.dev) get low maturity-as-ongoing-provider and low overall with explicit historical notes. ## Confidence levels | Level | Criteria | |-------|----------| | `high` | Official pricing/docs checked; widely used; stable product | | `medium` | Public info good but sales-gated pricing, rapid model churn, or thin SLA data | | `low` | Marketplace volatility, limited sources, or discontinued status | ## Sources policy Each provider lists `sources[]` with title + URL. Prefer: 1. Official product / pricing pages 2. Primary company announcements 3. Reputable comparison write-ups (used as secondary) Prices move weekly in 2026 LLM/GPU markets — treat `pricingNotes` as directional, re-verify before procurement. ## JTBD methodology Each JTBD in `jtbds.json` has: - **depotPickProviderId** — opinionated default for most agent teams - **runnersUp** — strong alternatives - **whenNotToUseTopPick** — explicit anti-recommendation triggers - **scoringNotes** — which dimensions mattered most for that pick Picks optimize for **agent builders shipping products**, not for hyperscaler enterprise RFPs (those may prefer Bedrock/Azure/Vertex even when Depot picks Anthropic/OpenAI direct). ## What we deliberately do not claim - We do not publish synthetic latency benches as gospel. - We do not score “ethics” beyond privacy/compliance posture. - We do not auto-scrape live prices into this seed; seeds are curated snapshots. - Library-only tools (Playwright, Puppeteer) may appear as tags/notes; they are not hosted providers. ## Review cadence `lastReviewed` on providers is set to **2026-09-14** for this seed. Re-review frontier LLM and GPU clouds monthly; auth/email/storage quarterly.