Agentic Finance Graph

Home/Research/Data health

Data health · live

We audit our own data before you have to

Assertion checks run against the tables behind every public number, every three hours. Zero failing rows means pass. Here is each one, as of the latest run.

Agentic Finance Graph · Published · Latest run 2026-11-10 17:20 UTC

Right now 56 checks, 1 failing. Health score 0.9939 (degraded), from the run at 2026-11-10 17:20 UTC. 3 informational notes are listed too: they are worth knowing, not defects.

Every number this site publishes is computed from a handful of tables: the payments behind each agent's rank, the agents themselves, the wallets bound to them, and the published snapshots. Before anyone trusts those tables, a set of assertion checks runs against them every three hours. Each check is a database query that returns zero rows when the data is healthy and the offending rows when it is not.

Feed freshness

When each public data feed was last updated, against a lateness budget of about twice its own schedule. A late feed keeps serving its last good document with its own time stamp; nothing is filled in or interpolated. Checked every five minutes; the raw list is at /api/status. Building on our data? See how to use it safely: your own limits, a fallback for when we are late, and checks you run yourself.

Right now Reading the feeds…
Each feed, when it was last updated, its age, the budget it is held to, and its state: ok within budget, late up to twice the budget, stale beyond that.
FeedLast updated (UTC)AgeBudgetState
Loading from /api/status…

What a failure does

  • block: a published number would be wrong while this fails. Our rule is that the number it protects is withheld until the check passes. Since 9 October 2026 the publisher enforces it: publishing is fail-closed, so while a block check fails no new snapshot goes out and the last good one stays up.
  • warn: something is late or drifting. The numbers are still right but may be behind.
  • info: worth knowing, not a defect. It never changes a public number.
  • A check that errors counts as failing. A broken smoke detector is not "no smoke".

By dataset and dimension

The worst state among the checks in each cell. A dash means no check covers that dimension for that dataset.
Datasetcompletenessuniquenessvalidityconsistencyreferentialfreshnessvolume
partner_cursors–––––✓ pass–
series_steps–––✓ pass–––
money_events✓ passi note✓ pass✓ pass✓ pass✓ pass✓ pass
snapshots––✓ passi note–––
registrations––✓ pass✓ pass–––
actors––✓ pass✓ pass–––
bindings–i note✓ pass✓ pass✓ pass––
series✓ pass––––––
acp_jobs––✓ pass✓ pass–––
bankr_launches––✓ pass✓ pass–––
partner_identities–––✓ pass–––
x402_recipients––✓ pass––––
waitlist––✓ pass––––

Every check

Each check, its severity, its state on the latest run and how many rows it found. The raw results, with sample failing keys, are at /api/dq.
Check, and what it guards againstDatasetDimension · severityStateRows
chain_lagAn other-chain registry watcher (Ethereum, Arbitrum, OP Mainnet, Polygon) is more than an hour of blocks behind the chain head, or has blocks it skipped and never scanned. Its mint and owner figures are partial until both are zero. Added 12 Oct 2026, when Arbitrum was about 113,000 blocks behind with a 1.2 million-block gap while health read 1.00.partner_cursorstimeliness · warn✓ pass0
unexplained_stepOne of our own archived series stepped in the last 14 days (a material move concentrated in one day that persisted) and neither a dated change of ours in /api/changepoints nor a checked note explains it. Either we changed something without registering it, or the world moved and the move needs a dated note. Found by afg-steps: PELT (Killick, Fearnhead & Eckley 2012) over each daily series, confirmed by a one-day jump test; the list is at /api/steps. Added 12 Oct 2026.series_stepsconsistency · warn✓ pass0
me_required_fieldsA payment row is missing a field every downstream figure needs.money_eventscompleteness · block✓ pass0
me_duplicate_logThe same on-chain log (transaction + log position) is stored twice, which double-counts it.money_eventsuniqueness · block✓ pass0
me_identical_in_one_txIdentical transfers inside one transaction. Usually a batch payment, not a duplicate: on 2026-09-24 all four counted groups were checked against their on-chain receipts and every one matched. Rows without a log position cannot be told apart from a double insert, which is why me_duplicate_log exists.money_eventsuniqueness · infoi note7,233
me_counted_without_log_indexCounted payments stored before log positions were recorded. me_duplicate_log cannot see them, so a double insert among them would reach the headline. Added 9 Oct 2026 (charter audit); the backfill re-reads their receipts.money_eventsuniqueness · warn✓ pass0
registry_count_vs_dailyThe cited all-chain registration total (agenteconomy.to) did not move while the same source's all-chain daily series reported new mints: one of the two is stale. Seen 30 Sep to 3 Oct 2026; added 9 Oct (charter audit) so a registration rate is never published from a stale total. Until 9 Oct 2026 15:30 UTC this compared the Base-only total with the all-chain daily series and fired falsely.snapshotsconsistency · warn✓ pass0
base_registrations_two_waysBase registrations measured two ways: our dated registrations table counted at the exact end of a UTC day differs from The Graph's Agent0 subgraph total for that day. Added 12 Oct 2026, when 9, 10 and 11 Oct agreed to the registration; a gap means one of the two indexers missed or double-counted a mint.registrationsconsistency · warn✓ pass0
base_registrations_cited_vs_ownThe Base registration total cited from agenteconomy.to and our own count from the Identity Registry contract differ by more than 1%. Informational: the cited figure is labelled as cited and the headline uses our own count (registrations_minted_total). On 9 Oct 2026 the cited total was 100,119 while the chain's newest agent id at 11:00 UTC was 99,013 (99,014 registrations), read both from public RPC and from our live mint feed. Added 9 Oct 2026.snapshotsconsistency · infoi note1
me_missing_log_indexPayments stored before log positions were recorded. They fill in as the payment scan re-reads each wallet; until then me_duplicate_log cannot see them.money_eventscompleteness · info✓ pass0
me_amount_rangeA payment amount is negative or implausibly large for a single agent transfer.money_eventsvalidity · block✓ pass0
me_known_valuesA kind, rail, asset or confidence value appeared that no downstream code knows how to treat. Since 27 Sep 2026: PAY and EARN (income), four stablecoins.money_eventsvalidity · block✓ pass0
me_address_formatA sender or recipient is not a lowercase CAIP-10 address, so joins against it silently miss.money_eventsvalidity · block✓ pass0
me_counted_self_paymentA wallet paying itself is counted as spending. Moving your own money is not paying anybody.money_eventsconsistency · block✓ pass0
me_pre_registration_leakA payment from BEFORE the agent was registered is counted. This exact leak once overstated the headline by 46%.money_eventsconsistency · block✓ pass0
me_orphan_actorA payment points at an actor that does not exist.money_eventsreferential · block✓ pass0
me_sender_never_boundA payment is attributed to an agent whose wallet was never bound to it, so the attribution has no basis.money_eventsreferential · warn✓ pass0
me_pass_through_backlogCounted payments older than the backlog window have not been checked for pass-through routing yet. Pre-registration payments are excluded from every total already, so they never need checking (the first run flagged 3,313 of them by mistake).money_eventsfreshness · warn✓ pass0
me_freshnessThe newest observed payment is older than the scan's own cadence allows: the payment scan may have stalled.money_eventsfreshness · warn✓ pass0
me_volume_swingYesterday's number of newly recorded payments is far from the trailing 7-day median. Needs a week of history.money_eventsvolume · info✓ pass0
actor_liveness_rangeA liveness level outside the L0–L9 ladder.actorsvalidity · block✓ pass0
actor_rank_without_evidenceAn agent is ranked L7 or above with no countable payment behind it. The rank is the product; this is the check that protects it.actorsconsistency · block✓ pass0
actor_evidence_without_rankAn agent has a payment that qualifies for L7 under ladder v2 (counted, not inferred, left its control) but is still ranked below L7: a promotion is pending until the next rank run (afg-payer, every 3 h).actorsconsistency · warn✓ pass0
actor_rank_evidence_withdrawnAn agent ranked L7+ no longer has a payment that left its control (a position, own-address or bridged-back finding arrived after the last rank run). The next rank run (afg-payer, every 3 h) takes it down; a warning, so the gate does not stall publishing for up to three hours.actorsconsistency · warn✓ pass0
actor_unmeasured_l6An agent shows L6 without a probe that measured L6. Ladder v1 parked withdrawn ranks at L6; v2 never does.actorsconsistency · block✓ pass0
actor_l9_counterpartiesAn L9 agent does not have even three distinct counterparties in 30 days, measured as of the last rank computation (afg-payer, every 3 h). Ladder v2 (13 Oct 2026) asks more (three independent ones among payments that left its control), so this is a necessary condition that a correct rank always passes. Until 9 Oct 2026 the window ended now, so a counterparty ageing out between two rank runs failed the check until the next run demoted the agent.actorsconsistency · block✓ pass0
binding_orphan_actorA binding points at an actor that does not exist.bindingsreferential · block✓ pass0
binding_wallet_formatA bound wallet is not a lowercase CAIP-10 address.bindingsvalidity · block✓ pass0
binding_intervalA binding closes before it opens.bindingsconsistency · block✓ pass0
binding_shared_walletOne wallet is currently bound to several identities: an operator wallet, not an agent wallet.bindingsuniqueness · infoi note2,369
snapshot_not_finiteA published value is null, NaN or infinite.snapshotsvalidity · block✓ pass0
snapshot_from_futureA published value claims a timestamp in the future.snapshotsvalidity · block✓ pass0
snapshot_rate_out_of_rangeA published rate or share is below 0 or above 1. A negative share was once published live.snapshotsvalidity · block✓ pass0
series_missing_definitionA metric was written in the last day without a definition id, so /def cannot explain it.seriescompleteness · warn✓ pass0
acp_negative_amountAn ACP job has a negative amount.acp_jobsvalidity · block✓ pass0
acp_paid_exceeds_fundedAn ACP job paid out more than it was funded with (outside rounding).acp_jobsconsistency · warn✓ pass0
bankr_address_formatA Bankr token, deployer or fee recipient is not a lowercase address.bankr_launchesvalidity · block✓ pass0
bankr_fee_splitBankr's platform plus creator fee exceeds the total fee it reported for the same token.bankr_launchesconsistency · warn✓ pass0
bankr_negative_feeA cited Bankr fee is negative.bankr_launchesvalidity · block✓ pass0
partner_shared_flagA wallet declared by several partner identities is not flagged as shared, so it could count as an agent wallet.partner_identitiesconsistency · block✓ pass0
x402_address_formatA named x402 seller is not a lowercase address, so payments to it are never attributed.x402_recipientsvalidity · block✓ pass0
cursor_stalledA worker that pages through a source has not saved a new position for several of its own cycles, so whatever it feeds has quietly stopped updating.partner_cursorsfreshness · warn✓ pass0
catalogue_full_passThe x402 harvest has not completed a full pass of the catalogue within the window. This is the page-one freeze of September 2026, caught by the machine instead of by a reader.partner_cursorsfreshness · warn✓ pass0
registration_from_futureA registration claims to have been minted in the future.registrationsvalidity · block✓ pass0
waitlist_email_formatA waitlist entry does not look like an email address. Only a hash is returned: this table holds personal data.waitlistvalidity · warn✓ pass0

How the health score is computed

A weighted pass rate over the block and warn checks. Each check weighs its dataset's importance (the tables the public rank is built from count 3, published snapshots and paging workers 2, partner and catalogue tables 1) times its severity (block 2, warn 1). Informational checks never move the score. A score of 1 means every check that could make a public number wrong passed on the latest run.

Why this page exists

Every serious correction this project has published was a data-shape error that a person noticed by eye: a share that went negative, routing hops counted as spending, a wallet's history from before its agent existed counted as the agent's spending, and a seller list that stayed frozen at page one for eleven days while every run reported success. Each of those is now a named check on this page, so the next one is found by a machine, not by a reader.

Questions people actually ask

How often are Agentic Finance Graph's data checks run?
Every three hours, on a timer on our own server. Each run stores its results and publishes them at /api/dq, and this page re-reads that document every time it is opened.
What happens when a data check fails?
A block-severity failure means a published number would be wrong, so that number should be withheld until the check passes. A warn failure means data is late or drifting. Info notes never change a public number.
Can I see the rows that failed?
Yes. /api/dq lists every check with up to five sample failing keys. For the one table that holds personal data, the waitlist, it shows only a hash, never an email address.