Launch scope. Use TIER alone, or with people you fully trust. Everyone with a read, upload or administrator credential, or control of the database, must be trusted with all retained developer data and to report usage honestly. Use name-free team/division reports for shared use. Promotion of non-synthetic developer mode awaits controls for who can see named records, a viewing audit log and retention limits (#826). v0.6.1 refuses tierd serve --aggregation developer on real data, including loopback and read-only operation (#1253). Per-developer views and the per-issue report are not available on real data in v0.6.1 (#826). The synthetic demo (tierd demo), which generates its own invented data in a private temporary database and cannot load yours, shows these views read-only with capture and write routes absent. Upload credentials are not yet tied to a contributor's identity: a holder can submit usage as someone else, add fabricated contributors to the team list to meet k (the minimum number of contributors a report needs), or claim another uploader's event key first. That minimum does not authenticate contributors. These trust requirements are not enforced access controls. In v0.6.1, an ingest token permits only event uploads; admin credentials retain broader access. Corrective-work accounting (Event 3) is off by default and requires operator opt-in in v0.6.1. When enabled, only declared Corrects: #N relations count: eligible same-author pairs count provisionally before operator review; cross-author pairs require confirmation. A declared correction can lower the original’s points; undeclared repairs are not detected.
What exactly does the number count?
Points from merged work, divided by list-price AI spend, over a range of dates. Five terms carry the rest of this page:
- A point. Each merged pull request that names an issue earns a weight from 0.5 to 8 for its size (how the weight is set), multiplied by a quality factor that stays at 1.0 unless a revert or a failed CI run cuts it (how). API-posted outcomes can instead start with caller-supplied quality. A clean medium-sized pull request is worth 3 points. A point is a size, not a judgement of difficulty or value, and not a measure of how much of the change an AI wrote. Bot- and agent-produced changes can earn points even when their AI usage is not captured. Account type does not establish whether a change used AI, and missing usage can make the ratio read high. TIER is the points divided by the list-price cost in thousands of dollars. As an illustration, 30 points on $600 of usage is a TIER of 50 (30 ÷ 0.6).
- An issue link. A pull request earns points only if it names an issue. TIER reads only the first issue slot in a branch, such as
feature/42-login, with date/year guards and release, bot and revert exclusions. Tracker keys such asfix/PAY-99-crashcount only when their prefix is configured with--tracker-keys PAY; OP is built in. PR bodies require a closing directive such ascloses #42, a configured tracker key or an explicit relation reference. Bare#Nmentions and unconfigured capitalised tokens such asUTF-8no longer count. TIER does not verify that the referenced tracker record exists. Existing assignments are unchanged. A merged pull request with no issue reference earns nothing. Holding captured spend and all other outcomes fixed, omitting an otherwise eligible PR cannot increase the numeric ratio; it can reduce it. A PR naming several issues still receives one outcome and one primary issue. A branch-derived issue takes precedence over the description. The other issues receive no outcome of their own, so issue-level views show a selected association, not every issue the PR served. Per-developer views and the per-issue report are not available on real data in v0.6.1 (#826). Spend on a branch with no issue still counts as cost. The full rules are in conventions. - A window. Every score covers a range of dates. Spend counts on the day it was spent, merged work on the day it merged. In the synthetic demo’s
developermode, the dashboard opens on the last 30 days; the API and thetierd scorecommand default to the last 90. Team and division reports serve sealed calendar months only, and the dashboard opens on the newest sealed month; until a month is sealed, there are no group scores to show. A short or recent developer window reads low, because work already paid for has not merged yet; a window that starts before TIER began recording spend reads high (how to pick a window). - A row. One line of the report: one invented developer in the synthetic demo’s
developermode, or one team or division in the group modes (the modes), plus the company total. A group's number is its summed points over its summed cost. - Who is who. Spend is recorded under the operating-system username of the machine where the AI ran, unless you pass another name. Merged work is recorded under the pull request author's GitHub login. Where the two differ, an admin maps one to the other with an alias (for example
alice-laptopisalice). Without it, the spend and the work land in separate rows and never pair up. See identity mapping, and Part 2 for loading names and teams from a file.
The evidence floor
A row clears the evidence floor (TIER's code calls it ranked) with at least 3 recorded outcomes, at least $5 of list-price spend, and no zero-token outcome. The count includes every outcome supplied to scoring, including API-posted outcomes and opt-in direct-commit outcomes. The token test uses the developer and issue's shared 14-day window ending at the issue's latest merge in the window. It does not test a separate window before each PR.
These thresholds are screening conventions, not validated sufficiency criteria. Passing them does not establish complete capture, correct issue matching, AI authorship or a reliable comparison. An outcome passes with as few as 1,000 recorded tokens against its issue, however much other work went uncaptured. Below-floor rows stay listed with a tag. Aggregate headlines can be withheld.
When shown, the bounds are the 2.5th and 97.5th percentiles of the stated bootstrap resampling procedure. Their 95% repeated-sampling coverage has not been validated. They exclude uncertainty from uncaptured usage, incorrect attribution and unattributed spend. v0.6.1 withholds intervals below each row’s own 50% attributed-cost share; exactly 50% passes. Shown intervals say “excludes uncertainty from unattributed spend”. Per-developer views and the per-issue report are not available on real data in v0.6.1 (#826). Spend is counted when usage happened and points when the work merged, so work that crosses a period boundary can move the ratio either way. Team scores carry no interval. Month-to-month noise is large. TIER has not established how large a change must be to stand out from ordinary variation. Treat a small difference as no evidence either way, and a large one as a prompt to investigate, not a measured effect.
How should a manager pilot TIER?
Start with a trusted team and check which supported tools it uses. Per-developer views and the per-issue report are not available on real data in v0.6.1 (#826). The synthetic demo (tierd demo), which generates its own invented data in a private temporary database and cannot load yours, shows these views read-only with capture and write routes absent. For real data, start tierd serve --aggregation team behind HTTPS with separate admin, read and send-only ingest tokens. Import the roster and identity aliases before sealing, backfill merged PRs and ship each laptop’s retained usage with the same recent --since date. Deleted session logs cannot be recovered by a longer lookback. A published group and each nonzero measure need k contributors (default 5, minimum 3); small groups pool into “other”, and an insufficient residual withholds the report.
Load and check history before arming the first seal. Read the first full UTC calendar month of cost coverage only after it closes, the default 14-day grace passes, configured sources settle and sealing succeeds. A new pilot can wait longer than a month. Reports stay fixed after sealing; team mode has no per-issue view. Compare the team with its own later sealed months, documenting scope, membership, work mix, capture and rule changes. See Path C and the release-matched manager pilot.
What can I decide with this number?
TIER describes how captured spending and weighted merged work changed between comparable periods; whether a practice caused that change requires further evidence. TIER reports captured spending by model; it does not assign merged outcomes to individual models or determine which model caused a result. Same-task comparisons appear in the separate Model Report, which measures model-and-tool combinations on declared tasks. Its benchmark points are not repository TIER.
- What happened after a practice change? Treat a move to a cheaper model as a hypothesis to investigate. Compare similar work over finished periods, record other changes (task mix, acceptance criteria, pricing and capture), and inspect acceptance and repair evidence beside cost. A before/after change in TIER cannot show that the model change caused the difference, and TIER does not credit merged work to a model, so it cannot say whether the cheaper model did the work as well. Spend is counted when usage happened and points when the work merged, so work that crosses a period boundary can move the ratio either way. Team scores carry no interval, and month-to-month noise is large: TIER has not established how large a change must be to stand out from ordinary variation. Treat a small difference as no evidence either way, and a large one as a prompt to investigate, not a measured effect. Part 2 walks through using the reports.
- Is the trend going the right way? Before interpreting a change, document differences in repository scope, membership, work mix, capture and measurement rules. If those differences are unknown or substantial, report the two observations without calling their difference an improvement or deterioration. Follow one team's number, or its cost per point (list-price dollars per point, which is 1,000 ÷ TIER), across periods that have ended. Check first that each period starts after TIER began recording spend; the dashboard shows a warning when one does not.
- Where is the spend going? These breakdowns appear only in the synthetic demo’s developer mode: the share of spend on premium models, the share of input read from the provider’s cache, and the share of spend linked to an issue. Team and division reports omit them. Per-developer views and the per-issue report are not available on real data in v0.6.1 (#826).
- How far is the bill from list price? Spend Leverage, defined under where a CFO should be careful, compares list-price cost with what finance records as paid.
TIER is built for coaching, not for evaluating developers. Per-person figures are not accurate enough to judge an individual. Points are not dollars: TIER puts no money value on the work. It also does not detect whether AI wrote a given change. It associates captured spend with work by developer, repository and issue, and reports the two side by side.
Is TIER surveillance?
Not of what people write: it stores usage counts, never prompts, replies or source code. On real data, v0.6.1 reports teams or divisions; individual report rows are synthetic-demo-only (#826). For every AI call it captures, TIER stores who made it (an operating-system username, or a GitHub login for merged work), the repository, the model, the token counts, the list-price cost worked out from them, a timestamp, a session id, and the issue the work belongs to. Each capture path reads a fixed list of fields and throws the rest away. For Claude Code the list is the entry type, the timestamp, the git branch, the working directory, the session id, and the message's id, model, role and token counts. The working directory is used only to decide which repository a session belongs to, and is not stored in the usage records. In watch mode (tierd serve --watch-repo), the server also keeps each session file's working-directory path, git branch and session id, so that it can resume reading the file after a restart. The Codex, Opencode and Muse Code readers work the same way. The optional proxy has to pass your prompts on to the provider you chose, because forwarding them is its job; from each reply it keeps only the id, the model and the token counts.
TIER is one program, tierd, over one database file, run on your own laptop or server. It sends nothing to the TIER project. It sends data anywhere only when you turn that on: the proxy forwarding your calls to your provider, the optional usage-report pollers, reading merged pull requests from GitHub, and each laptop's tierd ship sending usage counts to your own server (the full list). Its source is public under the Apache-2.0 license, written in Go with three direct dependencies (a file watcher, a YAML reader and a SQLite driver), so your own engineers can check each of these statements against the code. The privacy document names the source file behind each one.
One optional path does keep personal details. If you connect the GitHub webhook, TIER keeps the raw body of each delivery it processes, so that a score can be re-derived later. Those bodies carry commit authors' names and email addresses, pull request titles and descriptions, and commit messages: metadata GitHub already holds, now also in your TIER database. They are deleted once they are 90 days old, or sooner, oldest first, when more than 50,000 are stored. Both limits are fixed in the code and applied when the server starts and every 24 hours. Erasing a developer does not rewrite them; they age out, or an operator deletes those rows directly. Run without the webhook and none are stored.
On real data, choose team or division reporting. tierd serve requires an explicit aggregation mode and refuses real-data developer mode in v0.6.1 (#1253). Per-developer views and the per-issue report are not available on real data in v0.6.1 (#826). team mode reports teams only. division mode rolls teams up one level, into the divisions named in your team list, and also names nobody. In both, a group with fewer counted people than a minimum is folded into an anonymous "other" row, and if that "other" row is itself under the minimum, TIER withholds the whole report: every team row, "other" and the company total. The minimum is 5 unless you change it, and TIER refuses to start below 3. It counts people, not identifiers: an identifier counts only if it is on your team list, is not a bot, and has spend or merged work that TIER captured itself in the window. Load the aliases, so that one person with two identifiers counts once (the full rule). Team and division mode remove names from reports and from the read-only token, not from the admin token, which can still export any one person's records. Keep the admin token with the server's operator, not with the managers who read the reports. The synthetic demo shows one invented row per developer. The synthetic demo (tierd demo), which generates its own invented data in a private temporary database and cannot load yours, shows these views read-only with capture and write routes absent. Developer reporting awaits the following controls before it can be used on real data:
- Synthetic preview only. The demo shows every invented developer’s row on the dashboard and through the API. Per-developer views and the per-issue report are not available on real data in v0.6.1 (#826). That token is an optional second password the server's operator sets, which can read scores but change nothing; the admin token sees the same. Per-developer rows have no retention limit: they stay until an admin erases that person.
- Ordering. Since v0.5.2, the dashboard has listed developers in identifier order and has never sorted them by TIER. Releases up to and including v0.4.1 sort that list by TIER, highest first. v0.5.0 and v0.5.1 were never released, so v0.5.2 was the first published release after v0.4.1 (changelog).
- Planned, not built. A separate viewing token for each permitted viewer (the developer, their declared manager and, optionally, a skip-level manager), with the shared token limited to pages that name nobody; a log of who viewed a developer's page, which that developer can read; and a retention limit on per-developer rows, 90 days by default and at most 365 days, enough for a full annual coaching cycle, with company history kept in a roll-up that names nobody.
Until #826’s named-viewer, audit and retention controls ship, use team or division mode for real data. v0.6.1 refuses developer-mode startup even on loopback or in read-only operation; the synthetic demo cannot load your data.
TIER is built for coaching, not for evaluating developers. Per-person figures are not accurate enough to judge an individual. TIER cannot enforce how a reader uses developer records. The admin token can export any developer’s records in any mode. See the legal and privacy guide for deployment guidance.
Group reports do not disclose exact cost-attribution or quality-evidence shares. Capture-fidelity and cost-horizon warnings are different signals; they do not establish complete capture or observed quality coverage. 'Not shown' is neither a clean bill of health nor evidence that coverage is low. Ask the operator which diagnostics were run, what they found, and which capture or attribution gaps remain.
Can developers game the score?
Yes, in known ways, and they are written down. TIER's repository ships an adversarial analysis of its own formula: 28 ways the number can be gamed or can mislead, from cherry-picking high-weight issues and splitting one issue into several to doing AI work on a personal account the meter never sees. Each has a severity, a likelihood and a mitigation. Seven are rated critical: AI use the meter never sees, the extra cost of working in legacy code, mentoring, on-call work, a manager inflating weights, work with no recorded AI cost at all, and Goodhart's law (below). A team that knows how a metric fails can watch for it.
What the design already does:
Supported, matched CI and revert signals can cut points. A qualifying CI failure selects 0.7. A supported revert within 60 days selects 0.8 only for strategic keywords without defect keywords, and 0.1 otherwise. Missing or mixed keywords select 0.1; that classification does not establish a defect.
A completed GitHub Actions failure on the default branch can match the exact recorded merge SHA within the 48-hour upper cutoff. v0.6.1 changes quality only for push-triggered runs; scheduled and dispatched runs remain audit-only, and merge-queue runs are dropped because their ref is not the default branch. Legacy CI effects remain labelled “CI trigger unknown” until operator-approved recovery. Workflow scope and pre-merge occurrence timestamps are not filtered, so environmental failures can still impose the CI floor. Other PR-head SHAs are not scored. A repository that gates locally gets no CI evidence from those checks. A strictly later attempt of the same workflow succeeding within 30 minutes can neutralise an already recorded failure; delivery order matters.
The floor values (0.7, 0.8, 0.1) are scoring conventions chosen by the project, not measured fractions of correctness, business value or value lost; no calibration study is published.
TIER does not measure the fraction reversed. A partial reversal that matches its supported revert rule receives the same message-selected floor as a full reversal—0.1 or 0.8. Other partial reversals can remain unobserved. Footer matching identifies recorded merge or squash SHAs, not constituent-commit ancestry. Reverting a revert does not restore the original outcome's credit. A reland is assessed separately; it does not erase the earlier revert signal.
In v0.5.2, a merged revert PR whose branch or body resolves an issue reference could earn a separate size-weighted outcome for the revert PR's author. The parser could treat an eligible number in GitHub's
revert-<PR number>-…branch as an issue number. A separately recognised revert push could reduce the matched original outcome within the supported window; that did not necessarily reduce the team's total and could leave it higher. The reverter was not penalised merely for reverting.v0.6.1. A recognised revert PR earns no positive credit. Reducing the original outcome still depends on a separately recognised revert push that matches that outcome within the supported window. Reverting a revert does not automatically restore credit.
Matched quality evidence does not establish continuous webhook coverage. Coverage remains unknown unless a separately identified reconciliation establishes the supported event inventory for that repository and interval.
Backfill reconstructs merged outcomes, not their historical CI or revert signals. Those outcomes start at multiplier 1.0, which means no degrading signal was recorded. Later qualifying matched evidence can change live values; sealed reports remain unchanged.
- Leaving spend unlinked does not help. TIER divides each row's points by all the AI spend it captured for that row, including spend it could not link to an issue, so working on unlinked branches does not raise a score. Spend TIER never captures is different. AI work in a tool it cannot read, or on a personal account, raises a score, and the flag below catches only the extreme case (which tools it can read).
- A Claude Code call is not counted twice. Each captured call carries a key built from the provider's own message id, so a call seen by both the log reader and the proxy is stored once. Codex and Opencode are the exception: their logs do not carry the id the proxy sees, so routing them through the proxy as well doubles their spend.
tierd servewarns at startup when both are on. - Merged work with almost no recorded AI use is flagged. Such an outcome drops its row below the evidence floor. That catches work done off the meter and broken identity links, and also work genuinely done by hand.
- Size labels are visible on GitHub, but TIER does not verify their calibration. A label sits on the pull request where the team can see it and question it. Outcomes posted through TIER's API are different: a caller admitted by the outcomes API's write/admin authentication gate can supply a weight above 0 up to 8 and quality from 0 to 1; TIER validates the ranges, not the judgments. The gate can be disabled by configuration: it is transparent when
apiTokenis empty.
TIER is built for coaching, not for evaluating developers. Per-person figures are not accurate enough to judge an individual. Tying a metric to rewards can encourage gaming; the adversarial analysis discusses that risk.
TIER does not ingest production incidents, deploy data or service-dependency data, and does not attribute an incident or a downstream failure to an upstream PR. An incident changes points only if it also produces a supported signal such as a qualifying revert. TIER does not observe issue reopening as a quality signal. Hotfix branch names do not change scoring. Corrective declarations do not change scoring with the default policy. An attributed merged hotfix earns ordinary outcome credit; one without a derivable issue earns no ordinary outcome. Corrective-work accounting (Event 3) is off by default and requires operator opt-in in v0.6.1. When enabled, only declared Corrects: #N relations count: eligible same-author pairs count provisionally before operator review; cross-author pairs require confirmation. A declared correction can lower the original’s points; undeclared repairs are not detected. The fuller quality specification is historical design, partially implemented; unimplemented rules are not product commitments.
Does TIER reward writing more lines of code?
Only in coarse steps, and only when nobody labels the pull request. A merged pull request's weight comes first from its size label: size/xs is 0.5 points, size/s 1, size/m 3, size/l 5 and size/xl 8. With no label, TIER estimates the size as lines added plus lines deleted plus ten for each file changed, and puts the result into the same five steps: up to 15 gives 0.5, up to 60 gives 1, up to 200 gives 3, up to 1,000 gives 5, and anything larger gives 8. So a 1,100-line change and a 20,000-line change both earn 8.
The estimate still follows the size of the diff. Generated files, vendored code and lock files count in full. A subtle five-line concurrency fix weighs the same as a five-line typo fix, because the weight is a size, not a judgement of how hard the change was. Explicit labels let reviewers apply the rubric using context the diff heuristic lacks. TIER has not established that labels are more accurate or consistent; comparability depends on shared calibration. An otherwise eligible merged PR can earn points regardless of its file paths, including documentation, handover and agent-memory changes. A point does not establish that the change improved deployed software. With no labels, one 1,000-line PR across 10 files earns 8 points; the same lines as five 200-line PRs earn 25. Points depend on how work is divided into PRs, including across different issues, so compare trends only with a stable splitting practice. Read TIER as its two parts: points per PR and merged PRs per $1,000. Every outcome records where its weight came from, a label or the estimate, so you can see how much of a score rests on the estimate.
Which AI tools does TIER measure?
- Claude Code, with no setup in Claude Code. TIER reads the session files Claude Code already writes on each developer's machine. How those files reach a shared server is below.
- Codex CLI and Opencode, if you turn them on.
--codex-rolloutreads Codex's own session logs.--opencodeopens Opencode's session database read-only and records only providers with a per-token price in TIER's price table. Today that is the Z.ai coding plan, Z.ai's subscription for its GLM models, whose usage TIER prices at Z.ai's published per-token list rates. Other Opencode providers are left out rather than priced by a guess: Ollama's cloud plan, for example, publishes no per-token rate, so a price for it would be invented. TIER names each provider it leaves out and how many rows it skipped. Release v0.4.1 has the Codex reader. The Opencode reader has been available since v0.5.2; v0.4.1 rejects the--opencodeflag. Do not also send either tool's traffic through TIER's proxy: the same calls would be counted twice. - Meta's Muse Code, if you turn it on.
--musereads the session log Muse Code writes for each session. It is off by default and has been available since v0.5.2; v0.4.1 rejects the--museflag. It has three limits to know. A run's calls are recorded only after the run finishes, because Muse writes the run's git branch at the end, so a run's cost appears after it completes, not while it works. Calls made by a subagent count toward the run that started it, but three kinds of subagent are left out, each with a warning in the log, so TIER's Muse figure can be lower than what Muse spent (the cases). And Muse is priced at Meta's published per-token API rates, even if you pay for Muse by subscription; Meta's charge per web search is not a token charge and is not counted. TIER's proxy has no route for Meta; do not also send Muse traffic through TIER's proxy. - Your own apps and scripts, through the optional proxy. An app that calls the Anthropic API or an OpenAI-compatible API can point its base URL at the TIER server, which forwards each call and reads the token counts from the reply; a request header says which developer and issue the spend belongs to. The Anthropic route works, and so does a self-hosted OpenAI-compatible server such as vLLM. The OpenAI route is wired but has not been tested against live OpenAI traffic. xAI's Grok and DeepSeek use the same OpenAI format, so they should work through that route, but nobody has tested them. A Gemini route exists and has never carried live Gemini traffic.
- Organization-wide usage reports. Optional pollers read the Anthropic Admin API and the OpenAI Usage API; neither poller has been tested against live traffic yet. They record the part of the provider's total that per-call capture missed, as rows with no developer or issue attached.
- Not covered: GitHub Copilot, Cursor, and ChatGPT Team or Plus. TIER has no reader for them. Its design notes record that they bill by the seat and do not expose per-developer token counts, so there is no per-call usage to meter. Support is deferred.
How spend reaches a shared server. Session files live on each developer's machine, so a central server has to be sent them. There are three ways, and a team can mix them. tierd serve --watch-repo reads new session files as they are written, on the machine where the server runs. tierd ship, run on each laptop on a schedule (for example every 15 minutes from cron), sends the usage counts, never content, to the server; each run sends the last 90 days still on disk, and the server keeps each call once. Or apps call through the proxy. Use a send-only ingest token for laptop ship uploads; it is accepted only on POST /api/v1/events. Keep admin and read tokens separate. The shared ingest token is not identity-bound, so a trusted holder can still post spend under any developer’s name. The README has the commands.
If most of your team's AI use is Copilot or Cursor, TIER is not useful to you yet. It would see a small share of your spend and report a score built on that share. Its Coverage figure will not warn you. Coverage, shown on the dashboard as Capture Fidelity, is the share of captured spend recorded call by call, rather than as a total from a usage report or a cost entered by hand: it describes how precisely TIER recorded the spend it saw, not how much it missed. The flag for merged work with almost no recorded AI use catches only the extreme case: a developer who works mostly in Copilot and a little in Claude Code simply reads as spending little.
Does it matter what the models are called?
Whatever the models are called, TIER counts the merged work a team gets for its AI usage, priced at published list rates. US federal executive departments and agencies now say “Super Intelligence (SI)” instead of “AI” under Executive Order 14434, 91 Fed. Reg. 63129 (Oct. 2, 2026). The order defines SI as the same technology this page calls AI, applies only to those agencies, and leaves a new legal definition pending. (Checked 10 October 2026.)
Why should a CFO trust the number?
Trust the arithmetic, and check what went into it. Every score can be recomputed from the rows TIER stored, and the project publishes its own mistakes. The arithmetic cannot correct input that is missing or mispriced; the last paragraph of this answer says where that happens.
- No AI model does the scoring. The same stored rows under the same scoring rules give the same score. A change in review or merge policy moves TIER without any change in the work. Every score is stamped with the version of the scoring rules and of the price table it used. In v0.6.1,
tierd verify-reportre-runs a saved report and either reproduces it or names which input changed. - Stored amounts add up exactly. Each call's cost is rounded once, to a whole micro-dollar (a millionth of a dollar), when it is recorded, and every total is a sum of those whole numbers, so totals do not drift with rounding. That makes the sums exact. It says nothing about whether the token counts behind them are complete.
- Prices are versioned. Usage is priced from a price table that ships with the code (version 14 in v0.6.1). Each stored row keeps the price and table version it was recorded under, so a new table does not quietly rewrite last quarter. Re-pricing old rows is a separate command,
tierd reprice, which shows a dry run first and keeps an audit record. - Totals are pooled, never averaged. A team's or a company's TIER is its summed points divided by its summed cost, so a team that spent little cannot count as much as one that spent a lot. Part 2 works an example: how the team scores add up to one company score.
- Thin evidence is flagged. The evidence floor screens some suspicious readings. When shown, bootstrap bounds have unvalidated repeated-sampling coverage and exclude uncertainty from uncaptured usage, incorrect attribution and unattributed spend. Passing the floor does not verify the inputs.
What the project has caught in its own numbers. In May 2026, a scan of TIER's own repository reported $35,251 of AI cost. It had charged every Claude Code session on the machine to whichever repository TIER was pointed at. The fix keeps only sessions run inside the repository being measured, and the same scan then reported $45.97, measured on 19 May 2026, the day the fix landed.
An open question about the input. A third-party write-up (gille.ai, 24 February 2026, labelled preliminary by its author) compared Claude Code's local session files with Claude Code's own status bar and found that the files recorded fewer tokens: output 10 to 17 times low and input 100 to 174 times low, even after duplicate entries were removed. It gives two causes: placeholder counts that are never updated, and thinking tokens missing from the files. TIER's own fix for duplicate entries addresses a different problem. We are measuring whether the gap still holds for current versions of Claude Code. If it does, TIER's costs for Claude Code are a floor, not the full bill, and scores built on them read high.
Historical, size-weighted reading; no quality events were recorded. On TIER's own repository, over the 30 days through 21 July 2026, the maintainer reported 221 outcome points per $1,000 of list-price spend: 723 points from 152 merged pull requests, against $3,268 of one maintainer's spend (723 ÷ 3.268 rounds to 221). 72.1% of that spend could not be linked to an issue, and it stays inside the $3,268. That is a reported historical self-measurement, not a benchmark; original inputs and run settings are not publicly reproducible. The maintainer has exercised TIER's CI and revert rules in manual test runs; the project's automated webhook tests exercise the same rules. The inspected historical 221 figure has no recorded quality-event receipt. Read it as size-weighted history, not demonstrated quality-adjusted output. TIER defines no "good" value.
Where a CFO should be careful
Historical qualification. The historical 221 was computed from backfilled history; no quality events were recorded for it, so it is size-weighted only. Original inputs and run settings are not publicly reproducible. Claude costs came from deduplicated usage logs; completeness against independent provider accounting is unvalidated, including for the subscription routes used here. If the logs undercount, costs are understated and TIER scores read high. If Claude's logs undercount more than Codex's, Claude looks relatively cheaper. This is a maintainer-run historical illustration, not independent validation or a benchmark, and TIER defines no "good" value.
The sums are exact; the inputs have four known limits. TIER prices usage at published list rates, not at what you paid. Its Claude Code costs may be a floor (above). A model missing from the price table is priced by a guess until it is added (below). Spend in tools TIER cannot read is not in the total at all (above). What you actually paid can be recorded beside the list-price cost: finance posts the amount paid for each month through TIER's API, per developer or for the whole organization. List-price cost divided by the amount paid is Spend Leverage. A value of 2.0 means list price was twice what you paid, for example under a discount or a flat-rate subscription. It does not change TIER. Do not rank teams against each other either: model mix, task mix, labelling habits and capture differ between teams. Compare a team with its own history, and like work with like.
Does TIER replace the vendor dashboard?
No. The vendor's billing stays the record of what you paid; TIER sets that spend beside the merged work linked to it. Three differences:
- TIER has an outcome side. A usage console reports spend. TIER sets that spend beside merged work in two ways. For the headline it divides the credited points of recorded, eligible outcomes in the period by all the AI spend it captured in that period. Separately, where a branch names an issue, it links that spend to work by developer, repository and issue, never by pull request. Several pull requests can share an issue, so the link does not give the cost of any one of them.
- TIER is not tied to one vendor. One console sees one provider. TIER prices every provider's usage from one price table into one ledger, in comparable list-price dollars.
- TIER is not run by an AI vendor. ‘Not run by an AI vendor’ describes the project’s declared ownership and incentives, not methodological independence. TIER’s own published measurements, the 221 reading and the Model Reports, are made by its maintainers, who build and benchmark TIER with these vendors’ tools and subscriptions. No independent reproduction receipt is provided alongside these measurements. Measurements made by the maintainer are not independent validation. A vendor reporting the value of its own product has an interest in the answer. TIER runs on your infrastructure, its source is public, and the document listing every way its number can mislead ships with the code.
The vendor's invoice feeds TIER rather than competing with it. Finance records what was paid each month, per developer or for the whole organization, and TIER compares it with the list-price cost to give Spend Leverage. For Anthropic and OpenAI, the optional pollers can read the organization's usage and cost reports directly.
What about work that never becomes a pull request?
It counts as cost and earns no points. This is one of TIER's most important limits. TIER's points come from merged work that names an issue: a merged pull request; a direct push to the default branch, if you turn that on, which earns a fixed 0.5 points per issue per day; or a merge on another forge, such as GitLab, that your CI reports to TIER's API. Design spikes, architecture documents, mentoring, incident calls, security audits and code review all use AI and often merge nothing. Their spend goes into the cost with nothing added to the points. TIER's own analysis rates the mentoring and on-call penalties critical.
One part is built. When such work does end in a pull request, a label can mark it security, incident, research, compliance, tech-debt or bug (a pull request with none of these counts as a feature), and TIER scores each kind separately, so an incident fix is compared with other incident fixes and not with feature work. Credit for work that never merges does not exist.
So read TIER at team level, over periods several times longer than your work usually takes from first AI use to merge, so that this kind of work is a similar share of each period. Then a change in the trend is less likely to be a change in the mix of work. Spend is counted when usage happened and points when the work merged, so work that crosses a period boundary can move the ratio either way. Team scores carry no interval, and month-to-month noise is large: TIER has not established how large a change must be to stand out from ordinary variation. Treat a small difference as no evidence either way, and a large one as a prompt to investigate, not a measured effect. Before interpreting a change, document differences in repository scope, membership, work mix, capture and measurement rules. If those differences are unknown or substantial, report the two observations without calling their difference an improvement or deterioration. For one person, the week they carried the pager will read low. Read a per-developer number against that person's own work mix and history, in context. TIER is built for coaching, not for evaluating developers. Per-person figures are not accurate enough to judge an individual.
Won't TIER discourage people from using AI at all?
It could, if it is read carelessly, and TIER's own analysis lists the risk. Work done without AI adds nothing to the cost, so a developer who avoids AI can look very efficient. The analysis rates this risk high.
The evidence floor catches the extreme case: a row with under $5 of spend, or with a merged outcome that has almost no recorded AI use, stays listed with a tag and its number is marked below the evidence floor. Above that floor, nothing in the formula stops a developer who uses little AI from reading high. The defence is how you read it: next to how much merged work there is. As an illustration, a team that ships 40 points at a TIER of 40 has delivered more than a team that ships 2 points at a TIER of 200. Read TIER beside total merged points and the mix of work, never alone.
Will our legacy codebase score worse than a greenfield team?
Probably, and comparing the two teams' scores directly would be a mistake. TIER's analysis argues that an AI session in a large, old codebase has to read far more context before it can make a safe change than a session in a small new service, so the same merged work costs more. That is a property of the code, not of the engineers. The analysis rates it critical. TIER has not measured the size of the effect, and does not compute the codebase-complexity adjustment the analysis proposes.
So compare each team with its own history, not with other teams. Within a team, compare like work with like: TIER scores bug fixes, features, security work and the other kinds separately.
What happens when a new model launches that isn't in the price table?
TIER prices it with a guess, says so, and keeps the gap visible. A model missing from the table is priced at a flat reference rate of $0.50 per million tokens, input and output combined. A name that carries a parameter count, such as 70b, is priced by size class instead, from $0.10 to $2.00 per million. TIER logs a warning the first time it sees each such model, counts those calls and their cost in its metrics, and checks every ten minutes whether guessed-price spend is more than 5% of the spend it priced in that interval, warning if it is.
Mind the direction of the error. For the frontier models in the table, $0.50 per million is well below list price: Claude Sonnet 5, for example, lists at $2 per million input tokens and $10 per million output tokens in table version 14. So until a new model's entry is added, its usage is under-priced and TIER reads too high for the work that used it. If your teams adopt each new model the week it ships, expect an over-reading after each launch that lasts until the model is priced, and watch for the warning.
The fix is to add the model to the price table: a later TIER release adds it, or you can load your own price file with --prices (the price table reference). Each stored row keeps the price and table version it was recorded under, so rows already priced by the guess stay at the guess. tierd reprice re-prices stored rows on purpose, with a dry run first and an audit record. Table version 10 did this for Claude Sonnet 5, which versions 7 to 9 had over-priced by 50%.
How is TIER different from DORA?
DORA measures how well a team delivers software. TIER measures something DORA has no view on: how much merged work each dollar of AI spend bought. TIER measures none of DORA's four keys (deployment frequency, lead time for changes, change failure rate and time to restore service). Its revert and CI discount adjusts an outcome's points; it is not a failure rate and must not be read as one. Run the two side by side, never fused into one performance number. The same holds for SPACE and DX Core 4, two other frameworks for measuring engineering work, and how TIER relates to each is written up in the repository.
TIER's own analysis is plain about DORA's advantages: DORA measures teams rather than individuals, reads its data from delivery tooling, and is, in the analysis's words, "empirically validated at scale". TIER's formula was first assessed on a six-developer synthetic dataset, and the analysis says its claims should be scoped to that until field data is collected (the comparison). TIER is pre-1.0, and v0.6.1 is its latest release.