Cowrie is a payroll agent. It runs a recurring payroll on Celo with no human in the loop and its defining feature is that it can decline. What it does: pays a distributed team in their own local stablecoin out of one balance, in a single transaction. A payer holding dollars pays people in Lagos, Nairobi and Accra the exact amounts promised, 50,000 naira, 6,500 shillings, 900 cedis and nobody touches an exchange. How it decides: each tick it works out which payroll period it owes, checks whether Mento's FX pools are open, prices the batch, then judges it against a cost ceiling, against what the last run cost and against how much of the FX window is left. It emits one of six decisions (idle, quote, wait, submit, defer, abandon) and writes every one to a run log with its reason. It will hold a payroll rather than settle at a bad rate, then retry inside the same window. In the last two hours before the pools close it widens its buffer and settles instead, because deferring on a Friday evening means waiting until Sunday night. Safety: the batch id derives from the schedule and period, so a crash between broadcasting and recording retries with an identical id and the contract's replay guard refuses it rather than paying twice. Catch-up reaches back exactly one period, never further. It signs nothing without an explicit --execute. Why Celo: every currency it pays out in is on the fee-currency allowlist, so recipients can spend what they receive without first holding CELO for gas. Conversion is grouped one per currency, not one per recipient. Pricing: Cowrie takes no fee. The only cost is ~1% per conversion, against the 3-7% a retail remittance corridor charges. Use it via the CLI, the TypeScript SDK, or the Disburser contract directly. Source: github.com/DeborahOlaboye/cowrie
The seven checks, with their evidence
7 recordedRegistered?rung 1 · registered
passThe agent exists in the on-chain registry, with an owner and a document URL.
passed
- block_number
- 79282391
- chain_id
- 42220
- token_id
- 9821
checked at 2026-10-05T07:22:47.097925Z
Reachable?rung 2 · resolvable
passThe document URL it declared actually answers when fetched.
passed
- bytes
- 2873
- data_uri_variant
- base64
- inline
- true
- scheme
- data
- uri
data:application/json;base64,ewogICJ0eXBlIjogImh0dHBzOi8vZWlwcy5ldGhlcmV1bS5vcmcvRUlQUy9laXAtODAwNCNyZWdpc3RyYXRpb24tdjE… (3,861 chars — expand)
data:application/json;base64,ewogICJ0eXBlIjogImh0dHBzOi8vZWlwcy5ldGhlcmV1bS5vcmcvRUlQUy9laXAtODAwNCNyZWdpc3RyYXRpb24tdjEiLAogICJuYW1lIjogIkNvd3JpZSIsCiAgImRlc2NyaXB0aW9uIjogIkNvd3JpZSBpcyBhIHBheXJvbGwgYWdlbnQuIEl0IHJ1bnMgYSByZWN1cnJpbmcgcGF5cm9sbCBvbiBDZWxvIHdpdGggbm8gaHVtYW4gaW4gdGhlIGxvb3AgYW5kIGl0cyBkZWZpbmluZyBmZWF0dXJlIGlzIHRoYXQgaXQgY2FuIGRlY2xpbmUuXG5cbldoYXQgaXQgZG9lczogcGF5cyBhIGRpc3RyaWJ1dGVkIHRlYW0gaW4gdGhlaXIgb3duIGxvY2FsIHN0YWJsZWNvaW4gb3V0IG9mIG9uZSBiYWxhbmNlLCBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbi4gQSBwYXllciBob2xkaW5nIGRvbGxhcnMgcGF5cyBwZW9wbGUgaW4gTGFnb3MsIE5haXJvYmkgYW5kIEFjY3JhIHRoZSBleGFjdCBhbW91bnRzIHByb21pc2VkLCA1MCwwMDAgbmFpcmEsIDYsNTAwIHNoaWxsaW5ncywgOTAwIGNlZGlzIGFuZCBub2JvZHkgdG91Y2hlcyBhbiBleGNoYW5nZS5cblxuSG93IGl0IGRlY2lkZXM6IGVhY2ggdGljayBpdCB3b3JrcyBvdXQgd2hpY2ggcGF5cm9sbCBwZXJpb2QgaXQgb3dlcywgY2hlY2tzIHdoZXRoZXIgTWVudG8ncyBGWCBwb29scyBhcmUgb3BlbiwgcHJpY2VzIHRoZSBiYXRjaCwgdGhlbiBqdWRnZXMgaXQgYWdhaW5zdCBhIGNvc3QgY2VpbGluZywgYWdhaW5zdCB3aGF0IHRoZSBsYXN0IHJ1biBjb3N0IGFuZCBhZ2FpbnN0IGhvdyBtdWNoIG9mIHRoZSBGWCB3aW5kb3cgaXMgbGVmdC4gSXQgZW1pdHMgb25lIG9mIHNpeCBkZWNpc2lvbnMgKGlkbGUsIHF1b3RlLCB3YWl0LCBzdWJtaXQsIGRlZmVyLCBhYmFuZG9uKSBhbmQgd3JpdGVzIGV2ZXJ5IG9uZSB0byBhIHJ1biBsb2cgd2l0aCBpdHMgcmVhc29uLiBJdCB3aWxsIGhvbGQgYSBwYXlyb2xsIHJhdGhlciB0aGFuIHNldHRsZSBhdCBhIGJhZCByYXRlLCB0aGVuIHJldHJ5IGluc2lkZSB0aGUgc2FtZSB3aW5kb3cuIEluIHRoZSBsYXN0IHR3byBob3VycyBiZWZvcmUgdGhlIHBvb2xzIGNsb3NlIGl0IHdpZGVucyBpdHMgYnVmZmVyIGFuZCBzZXR0bGVzIGluc3RlYWQsIGJlY2F1c2UgZGVmZXJyaW5nIG9uIGEgRnJpZGF5IGV2ZW5pbmcgbWVhbnMgd2FpdGluZyB1bnRpbCBTdW5kYXkgbmlnaHQuXG5cblNhZmV0eTogdGhlIGJhdGNoIGlkIGRlcml2ZXMgZnJvbSB0aGUgc2NoZWR1bGUgYW5kIHBlcmlvZCwgc28gYSBjcmFzaCBiZXR3ZWVuIGJyb2FkY2FzdGluZyBhbmQgcmVjb3JkaW5nIHJldHJpZXMgd2l0aCBhbiBpZGVudGljYWwgaWQgYW5kIHRoZSBjb250cmFjdCdzIHJlcGxheSBndWFyZCByZWZ1c2VzIGl0IHJhdGhlciB0aGFuIHBheWluZyB0d2ljZS4gQ2F0Y2gtdXAgcmVhY2hlcyBiYWNrIGV4YWN0bHkgb25lIHBlcmlvZCwgbmV2ZXIgZnVydGhlci4gSXQgc2lnbnMgbm90aGluZyB3aXRob3V0IGFuIGV4cGxpY2l0IC0tZXhlY3V0ZS5cblxuV2h5IENlbG86IGV2ZXJ5IGN1cnJlbmN5IGl0IHBheXMgb3V0IGluIGlzIG9uIHRoZSBmZWUtY3VycmVuY3kgYWxsb3dsaXN0LCBzbyByZWNpcGllbnRzIGNhbiBzcGVuZCB3aGF0IHRoZXkgcmVjZWl2ZSB3aXRob3V0IGZpcnN0IGhvbGRpbmcgQ0VMTyBmb3IgZ2FzLiBDb252ZXJzaW9uIGlzIGdyb3VwZWQgb25lIHBlciBjdXJyZW5jeSwgbm90IG9uZSBwZXIgcmVjaXBpZW50LlxuXG5QcmljaW5nOiBDb3dyaWUgdGFrZXMgbm8gZmVlLiBUaGUgb25seSBjb3N0IGlzIH4xJSBwZXIgY29udmVyc2lvbiwgYWdhaW5zdCB0aGUgMy03JSBhIHJldGFpbCByZW1pdHRhbmNlIGNvcnJpZG9yIGNoYXJnZXMuXG5cblVzZSBpdCB2aWEgdGhlIENMSSwgdGhlIFR5cGVTY3JpcHQgU0RLLCBvciB0aGUgRGlzYnVyc2VyIGNvbnRyYWN0IGRpcmVjdGx5LiBTb3VyY2U6IGdpdGh1Yi5jb20vRGVib3JhaE9sYWJveWUvY293cmllIiwKICAiaW1hZ2UiOiAiaHR0cHM6Ly9ibG9iLjgwMDRzY2FuLmFwcC9zYW5pdGl6ZWQtaW1hZ2VzL3YxL2Y1ZDE4NDliMmJhMDE5MzEzZDExYmI4YzZiODY2ZDE5YmIzNThiOWFhZTA0ZWRkNDk1MjExMmJhYTIwOGVkMTUud2VicCIsCiAgInNlcnZpY2VzIjogWwogICAgewogICAgICAibmFtZSI6ICJPQVNGIiwKICAgICAgImVuZHBvaW50IjogImh0dHBzOi8vZ2l0aHViLmNvbS9hZ250Y3kvb2FzZi8iLAogICAgICAic2tpbGxzIjogWwogICAgICAgICJnb3Zlcm5hbmNlX2NvbXBsaWFuY2UvYXVkaXRfdHJhaWxfc3VtbWFyaXphdGlvbiIsCiAgICAgICAgImdvdmVybmFuY2VfY29tcGxpYW5jZS9yaXNrX2NsYXNzaWZpY2F0aW9uIiwKICAgICAgICAiZ292ZXJuYW5jZV9jb21wbGlhbmNlL3BvbGljeV9tYXBwaW5nIiwKICAgICAgICAiYWR2YW5jZWRfcmVhc29uaW5nX3BsYW5uaW5nL2xvbmdfaG9yaXpvbl9yZWFzb25pbmciLAogICAgICAgICJ0b29sX2ludGVyYWN0aW9uL3dvcmtmbG93X2F1dG9tYXRpb24iLAogICAgICAgICJldmFsdWF0aW9uX21vbml0b3JpbmcvYW5vbWFseV9kZXRlY3Rpb24iCiAgICAgIF0sCiAgICAgICJkb21haW5zIjogWwogICAgICAgICJmaW5hbmNlX2FuZF9idXNpbmVzcy9maW5hbmNlIiwKICAgICAgICAiZmluYW5jZV9hbmRfYnVzaW5lc3MvYmFua2luZyIsCiAgICAgICAgImh1bWFuX3Jlc291cmNlcy9jb21wZW5zYXRpb25fYW5kX2JlbmVmaXRzIgogICAgICBdCiAgICB9LAogICAgewogICAgICAibmFtZSI6ICJNQ1AiLAogICAgICAiZW5kcG9pbnQiOiAiaHR0cHM6Ly9jb3dyaWUtbWNwLm9ucmVuZGVyLmNvbS9tY3AiCiAgICB9CiAgXSwKICAicmVnaXN0cmF0aW9ucyI6IFtdLAogICJzdXBwb3J0ZWRUcnVzdHMiOiBbCiAgICAicmVwdXRhdGlvbiIKICBdLAogICJhY3RpdmUiOiB0cnVlLAogICJ4NDAyc3VwcG9ydCI6IGZhbHNlCn0=
checked at 2026-10-05T07:22:47.097925Z
Readable?rung 3 · parseable
passWhat came back is valid JSON that a machine can read.
passed
- body_bytes
- 2873
- body_sha256
- 5a1db210bf563bb332a0c53cf0a94cdcb57fa06448e5c843faa28378c31916f7
- content_type
- —
checked at 2026-10-05T07:22:47.097925Z
Follows the spec?rung 4 · conformant
passThe document meets what ERC-8004 requires of it.
passed
- both_fields_present
- false
- legacy_endpoints_field
- false
- may_gaps
- x402Support, supportedTrust
- must_violations
- (empty)
- registrations_checked
- 0
- services_field_source
- services
- services_status
- present
- should_gaps
- services[].version, registrations
- spec_commit
- 68fc6765761a10fb26f0692df21c8a6f9d12b1be
checked at 2026-10-05T07:22:47.097925Z
Claims its identity?rung 5 · bound
unclaimedThe document names the on-chain agent it belongs to, rather than leaving it unsaid.
unclaimed — the document made no claim to check
- declared_agent_id
- —
- declared_chain
- —
- declared_registry
- —
- match
- —
- reason
- unclaimed
- registrations_seen
- 0
checked at 2026-10-05T07:22:47.097925Z
Answers?rung 6 · live
passA declared endpoint responds to a probe. Not implemented yet, so nobody passes or fails it.
passed
- endpoints
{"declared":"https://github.com/agntcy/oasf/","elapsed_ms":2288,"final_url":"https://github.com/agntcy/oasf/","http_stat… (465 chars — expand)
{"declared":"https://github.com/agntcy/oasf/","elapsed_ms":2288,"final_url":"https://github.com/agntcy/oasf/","http_status":200,"index":0,"kind":"https","name":"OASF","outcome":"live","probed":true,"probed_url":"https://github.com/agntcy/oasf/"}, {"declared":"https://cowrie-mcp.onrender.com/mcp","elapsed_ms":245,"error":"robots_disallowed","index":1,"kind":"https","name":"MCP","outcome":"refused","probed":true,"probed_url":"https://cowrie-mcp.onrender.com/mcp"}- endpoints_answered_not_live
- 0
- endpoints_declared
- 2
- endpoints_live
- 1
- endpoints_our_error
- 0
- endpoints_payment_gated
- 0
- endpoints_probeable
- 2
- endpoints_probed
- 2
- endpoints_refused
- 1
checked at 2026-10-05T07:31:54.600744Z
Has feedback?rung 7 · attested
failAt least one on-chain feedback entry names this agent.
did not pass
- distinct_authors
- 0
- feedback_count
- 0
- reason
- no_feedback
checked at 2026-10-05T07:22:47.097925Z
Check it again, now
outside the censusOn-chain snapshot
celo- token id
- 9821
- owner
- 0x9cb49e92d3e6edfc4f8dca3e5a20c5b142fc4237
- block
- 79,282,391
- observed
- 2026-10-05T07:22:47.101504Z
What the fetch saw
data- scheme
- data
- request url
- —
- final url
- —
- http status
- —
- content type
- —
- size
- 2,873 bytes
- sha256
- 5a1db210bf563bb332a0c53cf0a94cdcb57fa06448e5c843faa28378c31916f7
- elapsed
- 0 ms
This run
reproducible- run
- 51518bd2-6305-4b27-a769-cf957aba00f4
- chain
- celo
- pinned block
- 79,282,391
- agents
- 9,878
- started
- 2026-10-05T06:52:29.184815Z
- finished
- 2026-10-05T07:30:46.088420Z
- checker
- 0.7.0 · 10238dd9af44dfa032e6578390569a413a6bb393
- spec commit
- 68fc6765761a10fb26f0692df21c8a6f9d12b1be
cargo run -p sweeper -- celo # at block 79282391