GurtOSat Cal Hacks 13.0

ASI:One Agent Challenge

Give your box real work from an ASI:One chat

Every GurtOS box is an agent on Agentverse that ASI:One can find. In a chat you say "fix the failing test in my project" or "check if the Hario V60 filters are back in stock". The box starts a task, Droid with Claude does the work inside the box's limits, and the chat gets the progress, an Approve or Deny card when the task wants to spend more than its budget, and the result with its diff and a Keep or Undo card. The whole flow stays in the chat.

Proof In a live run through ASI:One, the box's agent paired with the chat, a Droid task fixed the failing test in a sample repo for $0.05 and sent back the diff with Undo, and a stock check paused at a $0.50 web search over its $0.25 budget, sent an Interactive Card, and finished after Approve: "in stock on Hario's US store at $10.25".

A pause for your OK. A task asks to spend $15.00 on a $10.00 budget; the request lands on the box screen and the phone at once, Approve on the phone, and the box screen shows it already approved on the phone. Real app, scripted task, test money. Silent screen recording, 12.7 seconds.

What Fetch.ai asked for

Fetch.ai's ASI:One Agent Challenge requirements, as copied into the project's track plan.

  1. An agent ASI:One can find that takes real multi-step action.
    Met

    The box agent is registered on Agentverse, active and marked ASI Available. A request becomes a task on the box that reads code, runs tests, edits files and checks its fix, or searches the web, then reports back.

  2. Agent on Agentverse.
    Met

    box: agent1qvuk46tnt9lnscher0pawl7pr5y525mak66ptwsrvg4kff0pfy9m2sy0us6, the box on our always-on test machine. box-test: agent1qdcex5gzkjnl08fc6wswejxv9h7swvfnewk35fyntrklthx57sv3jkzxz3u, the twin the live test starts and stops. Both are mailbox agents.

  3. Agent Chat Protocol.
    Met

    agent.py is a uAgent that speaks the Agent Chat Protocol (ChatMessage, ChatAcknowledgement) and publishes its manifest. It reads an Agentverse mailbox, so the box needs no open port.

  4. Main flow inside an ASI:One chat.
    Met

    Pairing, requests, progress, approvals, results and undo all happen in the chat. The portal is not needed.

  5. Real tool use.
    Met

    Droid with Claude reads the repo, runs node --test, edits the code and checks the fix, as its own Linux user in its own copy of the workspace. Web searches run Apify's apify/rag-web-browser Actor through the box's apify.run tool, with the token kept in the box's vault.

  6. README with agent names, addresses and badges.
    Met

    In tracks/fetch/README.md and the agent's Agentverse profile (agent.md), both with the innovationlab and hackathon badges. Also below.

  7. Public repo with run steps.
    Partly

    Run steps are in the README and under Try it. The repo goes public before judging.

  8. 3 to 5 minute video.
    Partly

    Shot inside ASI:One; embedded above once uploaded. Shot list in docs/videos.md.

  9. Also submit through the ASI:One Submission Agent.
    Open

    Sent through the ASI:One Submission Agent with the Devpost link on submission day.

  10. Bonus: ASI:One Interactive Cards, reliability, multi-agent.
    Partly

    Review cards for approvals and for Keep or Undo. Replies wait in a durable outbox, the agent restarts within 5 seconds if it dies, and it picks up from the action log after a power cut. ASI:One's planner works with the box's agent, and each task on the box is its own Droid agent; the box does not message other Agentverse agents yet.

Screenshots

The box agent's public profile on Agentverse: Active and ASI Available tags, the innovationlab and hackathon badges, and its guide explaining what to ask and how to pair.
The box agent's public Agentverse profile, signed out, Oct 23: Active, ASI Available, the two badges, and how to pair.

tag:innovationlab tag:hackathon

Agent Address What it is
box agent1qvuk46tnt9lnscher0pawl7pr5y525mak66ptwsrvg4kff0pfy9m2sy0us6 The box on our always-on test machine. This is the one to chat with.
box-test agent1qdcex5gzkjnl08fc6wswejxv9h7swvfnewk35fyntrklthx57sv3jkzxz3u A twin that the live test (DEMO_LIVE=fetch ./demo) starts and stops on a test machine.

Every box is its own agent: its address comes from a seed the box makes the first time the agent starts, kept root-only on the box.

Evidence

A chat, start to finish. These replies are from a live run through ASI:One, shortened.

  1. Pair once. The box's screen shows a six-digit code. The chat sends pair 123456. The box answers "Paired. This box now takes work from you here." Anyone else gets only the pairing step and cannot start, approve or undo anything.
  2. Ask for work. "Fix the failing test in my project." The box starts a Droid task in its own copy of the project workspace, a small sample repo whose bill-splitting function loses a cent. The task has no network of its own and a 25 cent budget.
  3. The result comes back: "Done: Fix the failing test in my project. ($0.05)", Droid's summary, the changed files, the diff, and a card with Keep and Undo.
  4. A pause for your OK. "Check if the Hario V60 paper filters (size 02, 100 count) are back in stock." Droid searches the web through the box's Apify tool. A search counts $0.50, more than the budget, so the task stops and the chat gets a card: "Paused for your OK: Spend $0.50 on apify.run? Budget $0.25, spent $0.00." with Approve and Deny. After Approve: "Done: Check if the Hario V60 paper filters... ($0.57). The size 02 filters (100 count) are in stock on Hario's US store at $10.25..."
  5. Any time: "status" lists your latest tasks with state and cost. "undo" takes back the last one.

DEMO_LIVE=fetch ./demo runs that whole flow with the box-test agent: the Agentverse mailbox, ASI:One's planner through its API, pairing, the Droid fix and the stock check with its card. It takes about five minutes and about 15 cents of model use.

The merge gate, every run. ./demo runs the chat logic offline on every merge. The latest run, Oct 24 on the x86 test VM, passed all 22 sections (175 checks, 0 failed):

track fetch
  ok    the track made the "project" workspace: a small repo with a failing test
  ok    a stranger on ASI:One gets the pairing step, and no task starts
  ok    a wrong pairing code is refused; the code from the box's screen pairs the owner
  ok    the chat started task tlyndb8f60e, with no network of its own and a 25 cent budget; spending $3.00 paused it
  ok    the chat got an ASI Interactive Card (review) with Approve and Deny for that approval
  ok    a stranger sending the same click approves nothing
  ok    clicking Approve in the chat answered it on the box, logged as asi1
  ok    the task finished, and its reply carries the diff
  ok    the Undo button in the result card undid the task on the box
  ok    restarted, the chat agent picked up where it was: the OK from the phone, then the result
  ok    a click relayed in the planner's words answered the chat's last card, and the task finished
  ok    "status" lists the owner's tasks and their states

How it works

How it works, step by step
  1. YouAsk in an ASI:One chat"Fix the failing test in my project." Only a chat paired with the box's code can give work.
  2. OutsideAgentverse mailboxASI:One's planner sends the message over the Agent Chat Protocol. The box picks it up from its mailbox.
  3. GurtOS coreThe box's chat agentagent.py and brain.py, run as the unprivileged user nobody. ASI:One's asi1-mini sorts the message; new work becomes POST /api/tasks.
  4. TaskDroid with Claude does the workIts own Linux user, its own copy of the project workspace, no network, a 25 cent budget.
  5. YouAn Interactive Card to approve"Paused for your OK: Spend $0.50 on apify.run?" The same request is on the portal and phone; the first answer wins.
  6. GurtOS coreThe result comes back to the chatSummary, changed files, diff, cost, and a Keep or Undo card. Undo takes out that one task's changes.
Task
its own Linux user, its own copy of the files, no keys
GurtOS core
the GurtOS service on the box, root, the only part that reads the vault
Outside
a service outside the box
You
a person, on the portal, a phone, Jira or a chat

Talking to ASI:One's planner. The planner sends the agent a message and uses its first reply, so the box replies within 40 seconds with the result, an approval card, or "still working" and the latest step. A later "status check" from the planner gets the task's next news and never starts a new task. A card click comes back as JSON in a direct chat, or in the planner's own words ("The user approved the card interaction..."); then it applies to the last card shown in that chat session.

Cards. Approvals and results go out as MetadataContent in the ASI:One Interactive Cards format, card_kind: "review", with Approve and Deny for a pause and Keep and Undo for a result.

The chat agent has no powers the portal lacks. brain.py uses only the box's HTTP API, the one the portal and the phone use. It runs as nobody: it can use that API, but cannot read the vault or the workspaces. Tasks hold no keys and have no network of their own; web work goes through box tools that run in the core.

Reliability. Replies wait in a durable outbox until they are sent, and a failed send is tried again. After a restart or a power cut, the agent picks up from the box's action log where it stopped, and the box's tasks resume too. If the agent process dies, the box starts it again within 5 seconds.

Safety. Only paired owners give work and answer cards. A code works once, and the box takes at most ten wrong codes a minute from everyone together. Any spending above the task's budget waits for the owner's OK.

Try it

At our table. The box's screen shows the ASI:One app with the agent's address and a pairing code. Open ASI:One, find the agent box, send pair <code>, then ask "fix the failing test in my project". Approve the card when it comes, then press Undo on the result.

On your own box (Ubuntu 24.04 with GurtOS installed):

  1. Put AGENTVERSE_API_KEY, ASI_ONE_API_KEY and FACTORY_API_KEY (and optionally APIFY_TOKEN) in /etc/box/vault.env.
  2. Turn the agent on:
    curl -X POST http://127.0.0.1:7700/t/fetch/agent -H 'content-type: application/json' -d '{"on": true}'
    The first time it installs uAgents into /opt/box-fetch/venv, about 30 seconds. It stays on across restarts.
  3. Open http://127.0.0.1:7700/t/fetch/ for the agent's address and the pairing code.
  4. In ASI:One, find the agent by its address, open a chat, send pair <code>, then ask for work.

Live, test and simulated

PartStateDetails
The agents on AgentverseLivebox runs on the always-on test machine; box-test runs during live tests.
The chat through ASI:OneLiveASI:One's planner, with asi1-mini sorting each message (a status check or new work). A keyword rule takes over if ASI:One does not answer.
The workLiveDroid with Claude edits and tests code; Apify searches the web.
SpendingTest moneyModel use is real (about 15 cents per live test). Each Apify search is counted at its $0.50 cap. The offline test uses a $3.00 spend of test money.
Offline merge gateSimulated./demo talks to brain.py over stdin and stdout instead of Agentverse, with the scripted worker in place of Droid.
Payment ProtocolNot builtLeft out on purpose. Spending is approved with the box's own cards.

Limits

  • A card click relayed through ASI:One's planner arrives in the planner's words, without the selection, so the box applies it to the last card in that chat session.
  • Droid may search the web more than once, and each search above the budget asks again.
  • To reply into a chat session from a timer, agent.py sets a private uAgents field, so uAgents is pinned to 0.26.1.
  • One agent per box. Two boxes with the same seed would split one mailbox.
  • Strangers are refused. A guest mode, where the owner approves a stranger's request, is not built.
Every track