Every number here is a measurement at a time.
This page says which time. A page that reports a figure that was true when it was written, with no way to tell how long ago that was, is the failure mode this exists to prevent.
freshness
- index last wrote its population
- 17 min ago
- index at block
- 120,040,000
- newest feedback indexed at block
- 119,315,525
- registry says
- 10,424 agents
- we hold
- 10,424 agents
- gapⓘ
- 0
- newest verdict
- 24 min ago
- verdicts recorded, all time
- 20,376
- claims carrying a current verdict
- 1,319
- claims with a URI and no verdictⓘ
- 0
- registration documents asked
- 2,150 of 2,151
- documents never asked
- 1
re-derive this
SELECT
(SELECT "atBlock" FROM "IndexState" WHERE "chainId" = $1 LIMIT 1) AS index_block,
(SELECT "updatedAt" FROM "IndexState" WHERE "chainId" = $1 LIMIT 1) AS index_updated,
(SELECT max("blockNumber") FROM "Feedback" WHERE "chainId" = $1) AS feedback_block,
(SELECT count(*) FROM fovea.verdict) AS verdicts_total,
(SELECT count(*) FROM fovea.verdict_latest) AS with_verdict,
(SELECT count(*) FROM "Feedback" f WHERE f."chainId" = $1 AND f."feedbackUri" <> ''
AND NOT EXISTS (SELECT 1 FROM fovea.verdict v WHERE v.feedback_id = f.id)) AS without_verdict,
(SELECT min(checked_at) FROM fovea.verdict) AS oldest,
(SELECT max(checked_at) FROM fovea.verdict) AS newestworkers and what schedules them
A worker that is not scheduled is a worker that does not run. The schedule lives in the repository and the deploy installs it, rather than living in somebody's memory.
Follows the ERC-8004 registries on Monad and writes Agent, AgentRecord and Feedback rows. The evidence pointer exists only in a non-indexed log field, so without this there is nothing to check.
Reads the registry's own counter slot and records it against the block it was read at. The registry is not enumerable, so this is the only source of population truth.
Walks every claim without a verdict down the ladder and appends one. Never updates one. A cited transaction missing from Monad is searched for on the other chains we can read, so a mislabelled network is told apart from a missing payment.
Asks each distinct registration document whether it still answers. Deduplicated by record hash, per host, serial, with a gap, because a handful of hosts carry most of the documents.
Turns the access log into daily counts per surface and reads on-chain use of our contracts. Salted daily hashes, no IP stored.
What Retina has processed and where the two chains cross.
Read live from Envio's own tables, so a reader with psql gets the same numbers by running the strings below. BSC and the cross-chain merge come live after the one pending resync, so until then they read Monad only rather than blank. A schema dropped mid-resync reads unknown rather than zero.
per chain · head, lag, events
re-derive this
SELECT chain_id,
block_height AS head,
latest_processed_block AS processed,
(block_height - latest_processed_block) AS lag,
latest_fetched_block_number AS fetched,
num_events_processed AS events,
is_hyper_sync AS is_hyper_sync,
timestamp_caught_up_to_head_or_endblock AS caught_up_at
FROM public.chain_metadata
ORDER BY chain_idrows per entity
| entity | BNB Smart Chain | Monad |
|---|---|---|
| Agent | 408,723 | 10,424 |
| AgentRecord | 252,989 | 2,244 |
| AgentRecordOwner | 384,601 | 10,148 |
| Feedback | 30,156 | 9,436 |
| Validation | unknown | 5 |
| ChiasmRecord | 246,512 cross-chain, one row set | |
| ChiasmPresence | 246,517 cross-chain, one row set | |
re-derive this
SELECT 'Agent' AS entity, "chainId", count(*) AS n FROM "Agent" GROUP BY "chainId" UNION ALL SELECT 'AgentRecord', "chainId", count(*) FROM "AgentRecord" GROUP BY "chainId" UNION ALL SELECT 'AgentRecordOwner', "chainId", count(*) FROM "AgentRecordOwner" GROUP BY "chainId" UNION ALL SELECT 'Feedback', "chainId", count(*) FROM "Feedback" GROUP BY "chainId" UNION ALL SELECT 'Validation', "chainId", count(*) FROM "Validation" GROUP BY "chainId" UNION ALL SELECT 'ChiasmRecord', NULL::integer, count(*) FROM "ChiasmRecord" UNION ALL SELECT 'ChiasmPresence', NULL::integer, count(*) FROM "ChiasmPresence" ORDER BY entity, "chainId" NULLS FIRST
events per handler
Rows each handler wrote, not a raw log count. MetadataSet and URIUpdated mutate an Agent in place and keep no counter of their own, so they fold into the Agent row. An exact per-event-name count needs Envio's raw_events table, which this deployment keeps off. See indexer/README.md.
re-derive this
SELECT c."chainId",
COALESCE(a.registered, 0) AS registered,
COALESCE(a.later_transfers, 0) AS later_transfers,
COALESCE(a.metadata_updates, 0) AS metadata_updates,
COALESCE(f.new_feedback, 0) AS new_feedback,
COALESCE(f.feedback_revoked, 0) AS feedback_revoked,
COALESCE(f.responses, 0) AS responses,
COALESCE(v.validation_requests, 0) AS validation_requests,
COALESCE(v.validation_responses, 0) AS validation_responses
FROM (SELECT "chainId" FROM "Agent"
UNION SELECT "chainId" FROM "Feedback"
UNION SELECT "chainId" FROM "Validation") c
LEFT JOIN (SELECT "chainId", count(*) AS registered,
sum("transferCount") AS later_transfers,
sum("metadataUpdateCount") AS metadata_updates
FROM "Agent" GROUP BY "chainId") a ON a."chainId" = c."chainId"
LEFT JOIN (SELECT "chainId", count(*) AS new_feedback,
count(*) FILTER (WHERE revoked) AS feedback_revoked,
count(*) FILTER (WHERE "responseUri" IS NOT NULL) AS responses
FROM "Feedback" GROUP BY "chainId") f ON f."chainId" = c."chainId"
LEFT JOIN (SELECT "chainId", count(*) AS validation_requests,
count(*) FILTER (WHERE response IS NOT NULL) AS validation_responses
FROM "Validation" GROUP BY "chainId") v ON v."chainId" = c."chainId"
ORDER BY c."chainId"merged on record hash · the two chains cross
re-derive this
SELECT count(*) AS documents,
count(*) FILTER (WHERE "chainCount" >= 2) AS on_both_chains,
count(*) FILTER (WHERE "chainCount" >= 2
AND "uriConflict") AS key_collisions
FROM "ChiasmRecord"
SELECT r.id AS uri_hash, r.uri, r."chainCount", r."chainIds", r."agentCount",
r."firstSeenChainId", r."uriConflict",
p."chainId", p."agentCount" AS agents_on_chain, p."firstAgentId"
FROM "ChiasmRecord" r
JOIN "ChiasmPresence" p ON p.record_id = r.id
WHERE r."chainCount" >= 2 AND NOT r."uriConflict"
ORDER BY r."agentCount" DESC, r.id, p."chainId"who uses this
Counted without tracking anyone: public chain events, software and site names plus daily counts whose distinct-client figure is a salted hash that cannot be linked across days. Requests: 2026-11-01 to 2026-11-07.
on chain, anyone can check
0
actions on our contracts by addresses that are not ours (ours: 13)
None yet. Every job, bond and passkey binding so far is ours.
0 agents registered by others with a URI our registration check produced (34 URIs checked, 13 registered in all).
software that called us
- brickbluebotMCP client · 118 calls · 6d
- taifoon-harvesterMCP client · 18 calls · 7d
- mcpMCP client · 6 calls · 6d
- taifoonharvestertool · 684 calls · 7d
- taifoon-seller-probetool · 294 calls · 7d
- taifoon-autoconnecttool · 290 calls · 7d
- kanmani-doctortool · 122 calls · 6d
- taifoon-link-sweeptool · 73 calls · 6d
- taifoon-content-probetool · 6 calls · 6d
- defigent-research-probetool · 4 calls · 1d
- ziwei-s6tool · 1 calls · 1d
requests
- browser-like clients (not a count of people)
- 10,841 client-days · 49,220 page views
- of those, made one request and left
- at least 0 (0%)
- api:service:read
- 687 · 51 client-days
- well-known
- 634 · 44 client-days
- api:service:call
- 489 · 20 client-days
- mcp
- 138 · 44 client-days
- feed
- 88 · 44 client-days
- llms.txt
- 65 · 45 client-days
- api:verify:call
- 47 · 28 client-days
- webhook
- 45 · 29 client-days
- crawlers (not use)
- 63,662
verdicts that have changed · 40
Either we were wrong and corrected it or somebody fixed their document and the page moved on its own. Both are worth showing and neither is visible in a store that updates in place.
re-derive this
WITH ends AS (
SELECT feedback_id,
min(checked_at) AS first_at,
max(checked_at) AS last_at,
count(*) AS checks,
(array_agg(outcome ORDER BY checked_at ASC, id ASC))[1] AS first_outcome,
(array_agg(outcome ORDER BY checked_at DESC, id DESC))[1] AS last_outcome,
(array_agg(feedback_uri ORDER BY checked_at DESC, id DESC))[1] AS uri
FROM fovea.verdict GROUP BY feedback_id
)
SELECT * FROM ends WHERE first_outcome IS DISTINCT FROM last_outcome
ORDER BY last_at DESC LIMIT $1what this site does not know
- 0claims carry a URI and have never been checked. Unchecked is not clean.
- 1registration documents have never been asked whether they still answer.
- 824registration documents answered in a way we could not read: a rate limit, a timeout, a server error or a document past our own size cap. Ours, not theirs.
- 5validation requests exist in the Validation Registry on Monad, against 9,436 feedbacks. Only an agent's owner can open one, which is why this half of ERC-8004 stays nearly empty next to the feedback half.