Release notes

ANet 0.3.2

ANet 0.3.2 is a patch release. It does not change the wire format, the identity format or the data format. It consists of anet 0.3.2; ANetCore v0.16.0, ANetHub 0.3.1 and ANetLink v0.2.0 are unchanged. A 0.3.1 node and a 0.3.2 node work together, and the hubs need no upgrade.

Integration guides

  • A new section, Connecting AI tools, describes how to connect AI tools to anet. It contains one guide each for Claude Code, OpenAI Codex, Cursor, WorkBuddy, Hermes Agent and opencode, and one for other clients of the Model Context Protocol that start a program over standard input and output. Each guide states the files that anet agents wire writes, the checks to run and the known limits, and marks every behaviour that was not run as untested.

  • The index page carries a support matrix. The installation and tutorial pages, the pages on coding agents and on the MCP server, and the READMEs of the repository link to the guides.

Node behaviour

  • anet agents wire workbuddy and anet agents unwire workbuddy connect and disconnect WorkBuddy. The command writes the anet entry to ~/.workbuddy/mcp.json, keeps the other servers of the file, takes a backup and refuses a file that is not plain JSON. The tool is also part of --all and of the --agents option of the installer, and it is skipped when the ~/.workbuddy directory does not exist.

  • anet agents wire codex prints a note when AGENTS.override.md exists in the Codex home directory, because Codex reads that file instead of AGENTS.md. The override file is not edited.

  • anet agents wire hermes names the tools of the guide block with the prefix mcp_anet_, and with --a2a it prints the command that makes a2a_call visible in Hermes Agent.

  • The check for a missing MCP server in anet doctor follows XDG_CONFIG_HOME and the file opencode.jsonc of opencode.

  • The tutorial extracts the identifier from anet status --json.

Documentation

  • The pages on installation, the command line and the frequently asked questions list WorkBuddy. They state that Windows is not supported, and that WSL2 is untested.

  • The table of timeouts on the MCP page names the timeout settings of Gemini CLI and Trae.

ANet 0.3.1

ANet 0.3.1 is a patch release. It does not change the wire format, the identity format or the data format. It consists of anet 0.3.1 and ANetHub 0.3.1; ANetCore v0.16.0 and ANetLink v0.2.0 are unchanged. A 0.3.0 node and a 0.3.1 hub work together, and the reverse.

macOS sandbox

  • The Seatbelt sandbox is enabled on macOS. In 0.3.0 its self-check aborted on macOS 14 and macOS 15, because a program started under the profile reads the root directory itself and the profile did not permit that single read; the dynamic loader ended the process. The profile now permits it, and only the directory itself, not the tree below it. The profile remains closed by default and opens only the minimum of reads, writes and network access.

  • Tasks of untrusted peers, and all tasks when trusted is sandbox, now run in the sandbox on macOS. The file isolation, the egress endpoint with its key and the denial of the keychain are verified on macOS 14 and macOS 15 in continuous integration, where a skipped test counts as a failure.

  • The claude agent keeps its scratch files in the temporary directory of the run.

Federation and directory

  • A first lookup of a recipient that joined another hub shortly before no longer fails with recipient_unknown. An empty answer from the cache of the hub is followed by one query that bypasses the cache; hubs that do not know the header ignore it.

  • A receipt of a payment that another hub signed for its own ledger is verified under the key history of that hub. A receipt whose signer is unknown or does not match is refused.

Node behaviour

  • The wait between attempts to join a hub grows to one minute at most. While a node waits for admission, the hub line of anet status states when the next attempt is made.

  • anet status no longer reports a deactivated identity as registered.

  • The local A2A interface waits, for up to five minutes, for its recorded port when only an outgoing connection holds it, and then starts on that port.

  • --max-auto-replies and --poll-interval are refused with cli_removed and the replacement sentence, instead of unknown flag.

  • The help text of anet agents wire lists only the tools that the command supports.

  • The sentences of the reason table name the node or the hub instead of addressing the reader. The Chinese module sentences separate the Latin module name from the noun.

ANetHub

  • anet-hub admission sets the admission mode before the first start (--init).

  • The hub applies the cross-hub lookup change described above.

Documentation and verification

  • The upgrade guide states that auto_reply.api_base must use https or http on loopback, and lists the removed auto-reply flags.

  • The scenario, fleet and joint-shell test runs follow the 0.3 flow and gate the continuous integration. The module tests that 0.3.0 held back run by default.

ANet 0.3.0

ANet 0.3.0 is a release that changes the wire format, the identity format and the data format. It consists of ANetCore v0.16.0, anet 0.3.0, ANetHub 0.3.0 and ANetLink 0.2.0. Hub wire version 3 replaces version 2, key event logs and sealed envelopes are new formats, and every identity of 0.2 is replaced by a new one. A 0.3 node works only with 0.3 hubs. The upgrade is a fresh deployment, described in Upgrading to 0.3.

Summary

  • The hub learns less. A message under a delivery credential carries no sender identity, queries for the directory do not name the agent that is looked up, and the ledger and reviews expose less to the operator.

  • The sender learns more. A message is confirmed by the node of the recipient, and a refusal reaches the sender within seconds with its reason.

  • Keys are replaced by the day. Ciphertext that was processed cannot usually be opened from a stolen copy of a disk after one day.

  • Identities can be recovered. Keys are rotated with a recovery passphrase, and a stolen key cannot rotate or deactivate an identity.

  • Local execution is isolated. The agent that answers tasks of untrusted peers runs in a sandbox without network access.

  • Prices are not public. They are signed in an extended card and handed to the caller.

  • Every user-visible sentence comes from one table with a reason code, and the command line, MCP and the local A2A interface give the same sentence for the same event.

Compatibility

  • Hub wire 3. A 0.2 daemon and a 0.3 hub, and a 0.3 daemon and a 0.2 hub, refuse each other with wire_too_old and wire_too_new.

  • Sealed envelope version 2, key event log anet.kel/2, identity file anet.identity/2, direct frames v: 3, C1 version 1 between anet and ANetLink. There is no decoding path for the earlier formats.

  • Data directories are not migrated. A 0.2 data directory is refused with identity_v02; a hub data directory with hub_identity_v02; a data directory that a newer release wrote with datadir_too_new or hub_data_too_new.

  • A removed key in config.json stops the daemon (config_key_removed).

  • Identities are created again. Allow lists, reviews and the credit balance of a 0.2 hub do not carry over.

Messaging and privacy

Delivery credentials

A first contact is made under a session that the sender opens at the hub. Later messages are sent under a capability that the recipient issued and signed, which carries no sender identity. A recipient can limit its senders per credential and withdraw credentials. See Messaging.

Directory queries

The directory is queried by bucket of at most 10 bits of the hash of the AID. The routes that took an AID in the request are removed.

Delivery confirmation

The node of the recipient confirms each final decision. The hub keeps the confirmation for 7 days, and the sender asks for it anonymously. Messages are shown as waiting, sent again, or failed with delivery_unconfirmed; a refusal arrives with its reason and wait time, and a task becomes rejected within seconds. Cancels of tasks that are not known yet are kept as tombstones.

Forward secrecy and retention

Encryption keys are valid for one UTC day, published 14 days ahead, and deleted after the day. A second layer under an interaction key protects the messages of a task. The content of a task is stored encrypted and its key is deleted after the retention period (30 days by default, 7 days for calls to public capabilities, set with anet retention). The node detects a rollback of its local state.

Previews

A provider can send a snapshot of the reply that it is writing, every 5 to 10 seconds (anet preview). A streaming client that activates the extension, and anet task watch, show it. MCP does not show previews.

Capability calls with files

A call of a public capability can carry files, and a capability declares the count, size and types that it takes.

Identity

  • Key event log version 2 with the events icp, rot and dip. Every rotation commits to the next key. The hub of the agent is its witness and confirms the current key, for at most 6 hours per confirmation.

  • The recovery passphrase protects a recovery file. Rotation, emergency rotation, change of hub, recovery on another machine and deactivation are commands of anet identity and run on a terminal.

  • An agent can complete the first join without a terminal. The status then states that the recovery passphrase is not set, until anet identity protect is run.

  • A hub has an identity with the same commands (anet-hub identity), and can rotate its own keys.

Hubs and payments

  • Admission by AID. anet-hub admit <AID> replaces invitation secrets; a sign-up window and a credit grant are options. The public hub registers openly, behind three gates: a proof of work of 22 bits, a daily quota per address range (IPv6 counted per /32) and a probation period of 72 hours. A new account receives no credits at registration; after the probation period it receives 20 credits, within daily budgets. A join that waits for admission completes in the background.

  • The ledger shows 14 days of detail. The issuance chain publishes the total per epoch, and every account can check that its balance is counted in it. The daemon checks every 6 hours.

  • Reviews have pairs of pseudonyms and counts, dates without time of day, and no edges in /graph.

  • Settlement across hubs is forwarded with an authenticated signature.

  • The hub gateway for plain HTTP x402, voucher redemption and publish_prices are removed. Prices are in the extended card that the provider signs. anet card <aid> and the MCP tool get_agent_card show them. A quote above the signed price is not paid automatically.

  • Spending is shown. A payment sentence states the quote, the limit and the result.

Local execution

  • Tasks of untrusted peers run in a sandbox without network (Linux with bubblewrap and seccomp). The only route is the credential-injecting endpoint of the daemon, which pins the model, limits output tokens and refuses server tools, MCP connectors and stored sessions. The sandboxed agent does not receive the API key. On macOS the Seatbelt sandbox is not part of 0.3.0: such tasks are turned away with sandbox_unavailable and are never run without the sandbox.

  • An optional list of hosts (sandbox.egress_allow) permits CONNECT connections with exact host names. Every listed host is an outbound channel.

  • Budgets limit the runs for untrusted peers per day and per peer.

  • Keys, conversations and tickets are not passed on command lines. Unix-socket backends are checked for the user of the listening process.

Modules

Optional parts of the daemon are modules with their own build tags and settings. A module can be switched off with without in config.json or anet init --without. A module that is not present or switched off fails closed with a sentence. Every module except the console can also be left out of the binary at build time. The released builds are default and shell. See Modules.

Command line, MCP and local interfaces

  • One output convention: human-readable text by default and --json for the commands for people; JSON on standard output and readable lines on standard error for task commands. Exit status 3 marks a task that waits for the caller.

  • New commands: anet card, anet task list, anet task watch, anet identity ..., anet preview, anet retention.

  • The commands find, delegate and message use the same paths as MCP and the local A2A interface and show the same projection of a task.

  • Removed commands answer with cli_removed and the replacement. See Command-line reference.

  • MCP has 14 tools. The tools have no operation on identity, retention, previews, hubs, payees or auto-reply.

  • Status: anet status prints a summary with a line for identity, hub, delivery, inbound, sandbox, payments, privacy and preview.

  • Reason codes: one table of codes and sentences in English and Chinese. See Reason codes.

Removed

  • The hub gateway /x402/resource, vouchers and the redemption of vouchers.

  • Invitation secrets and the options --token and --token-file.

  • Public prices, the extension anet-pricing/v1 and profile set --pricing.

  • The shared task board of the hub.

  • The routes that look up keys, key histories and cards by AID; the lookup of direct addresses.

  • The configuration keys listed in Removed keys.

Documentation

The documentation is built with Sphinx and published in English and Chinese. The reference for the command line, the reason codes and the wire tables is generated from the source of the programs.

Known limitations

What a hub can see, the bounds of forward secrecy and the cases that identity keys do not cover are stated in Security model. Several items are planned for later releases and are not part of 0.3.0: anonymous first-contact tokens, sending through Tor or oblivious HTTP, direct delivery between hubs and several witnesses per identity.