Open project · real data, checked automatically

Is it the business, or the pipeline?

When a payments metric suddenly moves, the first question is whether customers changed or the data did. A late file or a duplicated load can look exactly like a real drop. twinfault finds every unusual day in every USDT, USDC and PYUSD transfer on Ethereum since January 2024, checks the pipeline first, and decides with evidence which it was.

733M

stablecoin transfers, reconciled day by day

7.18M

Ethereum blocks, none missing or duplicated

1,004

days, Jan 2024 to Sep 2026

21

dbt tests passed by every month

€0

a month to run: GitHub Actions, Hugging Face and GitHub Pages

Stablecoin transfers per month on Ethereum

The look-alike pairs

Every metric move has two possible explanations that look the same on a dashboard: a pipeline fault, or a real change in behaviour. The metric alone cannot separate them; the rows can. The table lists the pairs and the evidence that separates them. Most of these checks run automatically on every unusual day.

Pipeline fault Business twin Same headline effect Evidence that separates them
A day’s partition not loaded Real network slowdown Volume drops Gaps in block numbers vs continuous blocks with fewer transfers
Same data loaded twice Genuine surge Volume jumps Repeated transaction hashes vs unique ones
Late-arriving data Real slowdown that day Yesterday looks low Load time lags block time, then backfills
Decimals bug, values off by a power of 10 Real surge in large transfers Average value jumps Exact 10× factor vs a shifted distribution
Classification rule changed Real mix shift Segment shares move Rule version changed while raw data did not
Timezone bug Real change in hourly pattern Hourly profile shifts Constant whole-hour offset
Filter drops failed transactions Real fall in failures Failure rate falls Raw and modelled counts disagree

Blockchain data suits this unusually well: block numbers are sequential and transaction hashes are unique, so completeness and duplicates can be checked from the data itself.

A real twin, found in this data. On 15 October 2025, PYUSD value moved was $600T, about 5.99M times its median day. On a dashboard that looks exactly like a decimals bug. It wasn’t one. Paxos minted 300 trillion PYUSD by mistake and burned it within about 30 minutes (source). The data was right, and the investigation shows it from the data itself. Telling cases like this apart, before anyone explains them, is what twinfault tests.

Live now

How it is built

Source
AWS Public Blockchain Data
Ethereum as Parquet on S3
Extract
DuckDB on GitHub Actions
a month per job, seven checks
Store
Hugging Face dataset
one folder per day, free and public
Model
dbt on DuckDB
daily marts, 21 tests a month
Publish
Quarto on GitHub Pages
this site, rebuilt from the marts
  • Extract: DuckDB reads the AWS public Parquet files straight from S3 on free GitHub runners, a month per job and four months at a time. Each month must pass seven checks before upload.
  • Model: dbt on DuckDB builds staging tables and three daily marts for each month. A month is published only if every test passes, including a reconciliation that the daily cube adds up to the raw transfers.
  • Publish: Quarto rebuilds this site from the marts and GitHub Pages hosts it. Every number on it is computed from the published data at build time. There is no server and no subscription.

Status

  • Done Extract and check 33 months of transfers, transactions and blocks
  • Done dbt models, daily marts, tests and freshness checks
  • Done This website and the dbt documentation
  • Done Four real anomalies investigated: pipeline or business, with evidence
  • Done Every unusual day found and checked automatically, and scored against the hand investigations
  • Next Run the checks automatically after each new month is loaded
  • Next Keep a snapshot of every load, so a rewritten day can be compared with what was first published