Integration status

ONE × Fetch.ai

What is actually wired between the ONE substrate, ASI:One and Agentverse. Every row carries the file or the HTTP response it was measured from. Where something does not work, it says so — an unrun check is never reported as a passing one.

Measured 2026-10-04

6/6 Inbound — ONE calls Agentverse
6/8 Outbound — ONE publishes to Agentverse
5/6 FET / ASI payment rail
115/116 Agents clean on the lifecycle walk

Inbound — ONE calls agents on Agentverse

This direction works today and needs no hosting plan. It is the half that gives ONE access to the whole Agentverse agent population.

Wired

ASI:One as a first-class model provider

An `asi1/…` model id routes to api.asi1.ai through the channels provider ladder. A missing key throws rather than silently answering from a different provider.

channels/src/middleware.ts — deployed, prod version 90ccd8e1
Wired

Live Agentverse agent invocation via planner_mode

POST /v1/chat/completions with model `asi1`, body planner_mode:true, and an x-session-id header. It discovered and called real Agentverse agents — returned a live EUR/USD rate and named the agent it used, reporting that two others were rate-limited.

Verbatim response: “I used the FX Intelligence Monitor agent”
Wired

Marketplace discovery

POST /v1/search/agents returns the live Agentverse directory, so ONE can find an agent by capability before calling it. Works on an expired hosting plan.

750 matches for “payment” — HTTP 200
Wired

Tool calling and streaming

asi1-mini returns OpenAI-shaped tool_calls (finish_reason: tool_calls) and textbook SSE deltas (object: chat.completion.chunk), so agent tools and streamed chat both work with no shim.

10 unit tests + 2 mutation tests that go red when the guard is removed
Wired

Direct agent-to-agent messaging

agentverse:send carries a signed uAgents chat message from a ONE agent straight to an Agentverse agent's address, and the reply is correlated back by session. ONE's ceo asked the Fetch.ai Weather Agent and got "cloudy, 20.3°C, humidity 44%, wind 7.2 km/h" back in 13.0s. The brain was not invoked: the message went agent to agent.

prod 800fb08c2 · ceo → agent1qfvydlgcxrvga2kqjxhj3hpngegtysm2c7uk48ywdue0kgvtc2f5cwhyffv · reply in 13.0s · packages/sdk/src/receivers.ts:1372
Wired

agentverse:search

A receiver over the Agentverse index that returns each agent's address (what agentverse:send takes), name, protocols and whether it speaks the chat protocol. A search for “weather” returned 10 of 196 matches, and the answer says it is short rather than passing a page off as the whole index.

10 of 196 for “weather”, flagged short · packages/sdk/src/receivers.ts:1335

Outbound — ONE publishes agents to Agentverse

ONE agents are live on Agentverse in endpoint mode: registered on the almanac, answering at one.ie/api/uagents, and reachable from ASI:One. Hosted deployment and name search are blocked by an expired account plan, not by code.

Wired

agent.md → uAgents Python compiler

The SDK compiles an agent definition to a deployable uAgents module: Agent(...) constructor, on_event/on_interval/on_rest handlers, and one Protocol + on_message per resolved skill.

packages/sdk/src/compile.ts — compileUAgents
Wired

Publish path — create · upload · secrets · start · poll

oneie agent publish --target agentverse --hosted drives the five-step Agentverse hosting sequence (since CLI 5.5.0 the default is endpoint mode — one agentverse:enroll call, no hosting plan). The create step reaches the API and returns a well-formed response, so request shape and auth are correct.

packages/cli/src/agent.ts
Blocked

Hosted deployment

Creating a hosted agent is refused because the Agentverse plan lapsed. This is an account state, not a code defect — reads still succeed on the same credential. Deleting agents does not clear it: the block persisted at 0 agents, and storage/computation counters are cumulative for the billing period rather than live usage.

POST /hosting/agents → 403 {"detail":"User plan has expired"} · expiry 2026-04-03
Wired

Endpoint mode

Every ONE agent answers at one.ie/api/uagents itself: a Cloudflare Worker endpoint that speaks uAgents envelopes, signed in and signed out, with ONE as the brain. No hosting plan, no mailbox, no Python. Registration is the free almanac path, and the almanac lists ONE's ceo agent as active at that endpoint.

prod d6c77acb4 · almanac agent1qv2zyczjsqjc3run53csgwvtmpdk4895936kgnpzj6ke0fdtryv7g7pny7p → status active, endpoint https://one.ie/api/uagents · HEAD /api/uagents → x-uagents-status: ready
Wired

ASI:One talks to a ONE agent

ASI:One relayed a question to ONE's ceo agent and relayed its answer back. The ONE turn took 6.5s and the whole round trip 18.2s; a second run took 21.1s end to end, 12.3s of it in ONE. Both are inside ASI:One's 45s reply window.

run 1: ONE 6.5s, end to end 18.2s · run 2: ONE 12.3s, end to end 21.1s · window 45s
Wired

Signing verified against the Python reference

The envelopes ONE signs are byte-identical to the test vectors produced by uagents-core, the Python reference implementation: for the same input, ONE puts the same bytes on the wire that a Python uAgent would.

one.ie/web/tests/unit/uagents/vectors.test.ts — fixtures from uagents-core 0.4.11
Wired

Re-registration

Almanac records expire about seven days after registration, so a daily job re-registers every enrolled agent before its record lapses. The ceo record read on the measured date expires 2026-10-11, a week out.

billing-cron 03:00 daily — one.ie/web/wrangler.toml:112 · src/workers/billing-cron.ts:128
Blocked

Name search / profile

Giving an agent a searchable name and profile on Agentverse is refused by the same lapsed plan. Agents are reachable by their @address now; they are not yet findable by name.

POST /v2/identity → 406 "User plan has expired"

The FET / ASI payment rail

Wired

FET / ASI accepted as payment

The EVM verifier whitelists the Fetch.ai ERC-20 alongside USDC, so a payment in FET can be verified and claimed on the quote/claim rail.

pay/backend/src/chains/evm.ts — verifyAsiPayment, TOKEN_WHITELIST
Wired

Contract identity verified on-chain

Read directly from Ethereum mainnet rather than taken from a doc: symbol() returns FET and decimals() returns 18, matching the constants the verifier uses.

0xaea46A60368A7bD060eec7DF8CBa43b7EF41Ad85 — symbol()=FET, decimals()=18
Wired

FET balance in the workspace wallet

The wallet page reads a real ERC-20 balanceOf for FET, sharing the derived ETH address. When the contract is absent on the resolved network it renders nothing rather than a fabricated zero.

one.ie/web/src/lib/chain-balances.ts — getErc20Balance
Wired

Native ASI address in every ONE wallet

Every ONE wallet derives a fetch1… address at m/44'/118'/0'/0/0, matching the ASI Alliance Wallet. The address is derived independently in the tests rather than read back from the code under test. The /key page shows it as one of five chain keys.

packages/sdk/src/wallet.ts:231 — asi: m/44'/118'/0'/0/0 · npm oneie 5.4.0+, @oneie/sdk 0.17.0
Wired

Native FET verification

Native FET on the Fetch mainnet (fetchhub-4) is verified by the pay gateway, and a priced ONE agent sells through the uAgents payment protocol: RequestPayment, the buyer pays and sends CommitPayment, ONE verifies the transaction on fetchhub-4, then CompletePayment. A transaction hash binds to exactly one request, so one payment cannot be claimed twice. The publicnode REST endpoint is proven reachable from Cloudflare; fetchhub.fetch.ai returns 503 from Cloudflare.

pay/backend/src/chains/fetch.ts:233 — verifyFetchTransaction · pay/backend/src/config.ts:79 · migration 0280 tx_hash UNIQUE
Open

First paid ASI:One message

Not yet exercised. No payout address is set for workspace one, and no live FET payment has been made to a ONE agent. The seller flow above is built and tested; until a real payment settles on chain, it is not a measured rail.

no payout address on workspace one · 0 live FET payments

The deterministic lifecycle walk

One script walks an agent along the ASI lifecycle with no model in the loop, and reports numbers rather than a verdict. Read-only by default at every level: the local half needs no credentials, --remote only reads, and --publish is the single flag that changes anything on a third party. It drives the real CLI publish path rather than a reimplementation, so it breaks when production breaks.

bash .claude/scripts/asi-walk.sh <agent.md> --skills <dir>

Local stations — no credentials

  • parsesagent.md exists and its frontmatter parses
  • namefrontmatter declares a name
  • compilescompileAgent(target=uagents) emits Python
  • import-rootModel imported from the uagents ROOT, not uagents.models
  • agent-ctoremitted Python constructs Agent(...)
  • protocolsdeclared skills resolve to Protocol/on_message handlers
  • stampGenerated by ONE attribution present
  • model-creda model credential exists for the deployed agent
  • substrate-creda ONE key exists to inject

Remote stations — gated on a key

  • av-keyAGENTVERSE_API_KEY present
  • av-reachAPI reachable AND the key is accepted
  • av-publishoneie agent publish --target agentverse --hosted (needs --publish)
  • av-pollthe deployed agent reports compiled

Three exit states

  • 0every station that ran, passed
  • 1a station RAN and FAILED
  • 3a station COULD NOT RUN — no key, no network

A station that could not run is not a station that passed. An unrun remote station never aggregates into green.

115/116 agents clean 10/10 identical runs on one input 4/4 self-test guards proved falsifiable

What the walk found

In the code under test

  • Declared skills were silently dropped when written as a bare scalar (skills: writer) or a comma string (skills: a, b) — both forms ship. With no skill resolved the compiler emits ZERO message handlers, so two agents would have published to Agentverse unable to receive anything. Fixed; guarded by 8 tests with a mutation check.
  • The emitted Python imported Model from uagents.models, a module that does not exist upstream (404) — an ImportError at agent startup that no local typecheck can see. Fixed to import from the package root.

In the walk itself

  • pipefail + grep -q reported a successful MATCH as a failure: grep exits first, the producer takes SIGPIPE and returns 141. Only fires on large output, so the walk was intermittently wrong — roughly one run in three.
  • A symlinked skills directory resolved to zero skills, because the reader branched on dirent type and a symlink reports isSymbolicLink() rather than isDirectory().
  • The protocols station failed any agent with no on_message, without reading whether the agent had declared skills at all — blaming 28 healthy agents for a property they never claimed.
  • The publish station ran bunx oneie, which resolves the PUBLISHED npm package rather than this tree, so it exercised a different CLI than the one under development.

More defects were found in the instrument than in the fleet it inspects. That is recorded deliberately: the headline count moved several times before the walk was trustworthy, and every intermediate figure was a harness fault rather than a finding. A near-uniform failure across a whole population is evidence about the instrument.

Open — what is not done

  • No agent has been published through the HOSTED path. The plan expiry blocks the create step, so upload, secrets, start and compile remain unproven there. Endpoint mode does not depend on it.
  • No paid ASI:One message has run. The FET seller flow is built, but workspace one has no payout address and no live FET payment has been made.
  • The emitted agent calls Anthropic() with no key. Until a model credential is injected, a published agent deploys and then fails on its first handled message. The walk reports this as UNRUN, never as a pass.
  • Whether the Agentverse sandbox permits importing the model SDK at all is unverified — it decides whether the emitted code can run there under any configuration.
  • The Fetch-scoped agent-launch-toolkit does not wire back to ONE: no @oneie reference in any of its packages. Agents it launches are Fetch-native, not ONE substrate actors.
  • 182 secrets remain on the Agentverse account attached to agents that no longer exist, including wallet keys and a bot token. Deleting an agent does not delete its secrets.

Check it yourself

Links that resolve for anyone. The repository is private, so commit links are deliberately absent rather than offered and broken — and because no FET payment exists yet, no transaction link is offered either. An unresolvable proof link is worse than none.

  • Almanac record for ONE's ceo agent The public Agentverse almanac entry: status active, endpoint https://one.ie/api/uagents, and the date the record expires before the daily re-registration renews it.
  • one.ie/api/uagents The endpoint every ONE agent answers at. A GET returns “OK - Agent is running”, and the response carries x-uagents-status: ready.
  • FET token on Etherscan Verify symbol() = FET and decimals() = 18 yourself — the same values the payment verifier is built on.
  • pay.one.ie/quote?chain=ASI&amount=100 A live FET quote from the deployed gateway: currency ASI, a real rate, and the EVM treasury to pay. Reachable right now, no key needed.
  • channels.one.ie/health The deployed agent runtime carrying the ASI:One provider. Returns 200 with the running service and version.
  • pay.one.ie/status The deployed payment gateway with its contract addresses and chain list.

Reproduce it yourself

The inbound direction does not need our word for it. With your own keys these run anywhere — the first one is the exact call that reached a live Agentverse agent.

Call live Agentverse agents through ASI:One

Needs your own ASI:One key. planner_mode works on asi1 and asi1-mini; asi1-fast and asi1-extended return 400. The x-session-id header is required — without it the request is refused.

curl https://api.asi1.ai/v1/chat/completions \
  -H "Authorization: Bearer $ASI1_API_KEY" \
  -H "Content-Type: application/json" \
  -H "x-session-id: $(uuidgen)" \
  -d '{"model":"asi1","planner_mode":true,
       "messages":[{"role":"user","content":
         "Find an agent on Agentverse that converts currency and convert 100 EUR to USD."}]}'

Check that ONE's agent is live on Agentverse

No key needed. The almanac answers with the agent's status and endpoint; the endpoint itself answers with a ready header.

curl https://agentverse.ai/v1/almanac/agents/agent1qv2zyczjsqjc3run53csgwvtmpdk4895936kgnpzj6ke0fdtryv7g7pny7p
curl -sI https://one.ie/api/uagents | grep -i x-uagents-status

Get a live FET price quote

No key needed. FET is now quoted as a median across three exchanges, so losing any one of them does not fall back to a hardcoded constant.

curl "https://pay.one.ie/quote?chain=ASI&amount=100"

Query the Agentverse directory

Needs your own Agentverse key. Works on an expired hosting plan — discovery is not gated by it.

curl -X POST https://agentverse.ai/v1/search/agents \
  -H "Authorization: Bearer $AGENTVERSE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"search_text":"payment","sort":"relevancy",
       "direction":"asc","offset":0,"limit":5}'

Run the lifecycle walk on an agent

No credentials needed for the local half. Exit 0 = every station that ran passed; exit 1 = a station failed; exit 3 = something could not be checked.

bash .claude/scripts/asi-walk.sh one.ie/ai/agents/gbp-drafter.md \
  --skills .claude/skills --json

Source of truth for this page is the repository, not the page. Every row was measured on 2026-10-04 from the file or endpoint named beside it. Where a check could not be run, it is listed as open rather than assumed to pass.