# The `+freeq.at/*` Tag Registry

Everything freeq adds to IRC rides [IRCv3 message
tags](https://ircv3.net/specs/extensions/message-tags). This page is the
canonical registry of the vendored `+freeq.at/*` namespace, plus the
standard/draft tags freeq implements. A tag-unaware client ignores all of
them and still sees readable text — that is the design contract.

Tags prefixed `+` are client-only tags (relayed verbatim by the server);
values are strings per the IRCv3 escaping rules.

## Identity & integrity

| Tag | On | Meaning |
|---|---|---|
| `+freeq.at/sig` | PRIVMSG, TAGMSG | Per-session ed25519 signature: `ed25519:<kid>:<base64url sig>`. For act messages it covers the JCS-canonicalized `act-*` tags; for plain messages, the message body. Public keys: `/api/v1/signing-keys/<did>`. |
| `+freeq.at/account` | PRIVMSG (server → client) | The sender's authenticated DID, attached by the server. |
| `+freeq.at/origin` | relayed messages | Origin server name for messages arriving via federation. Clients show "via {origin}" and suppress local verification badges. |
| `+freeq.at/echo-nonce` | PRIVMSG (client → server) | Client-chosen nonce echoed back with the server-assigned `msgid`, so senders can match their own `echo-message`. |

## Messaging features

| Tag | On | Meaning |
|---|---|---|
| `+draft/edit=<msgid>` | PRIVMSG | This message replaces `<msgid>`. Server verifies authorship. |
| `+draft/delete=<msgid>` | TAGMSG | Soft-delete `<msgid>` (author or ops). |
| `+draft/reply=<msgid>` / `+reply` | PRIVMSG, TAGMSG | Threading / reply-to reference. |
| `+draft/react` / `+react` + `+reply=<msgid>` | TAGMSG | Add a reaction; `+freeq.at/unreact` removes one. |
| `+typing=active\|done` | TAGMSG | Typing indicator. |
| `+freeq.at/reactions` | CHATHISTORY replay | Server-persisted reaction tallies, so reactions survive reconnects. |
| `+freeq.at/pin` / `+freeq.at/unpin` | TAGMSG | Pin/unpin a message in a channel. |
| `+freeq.at/streaming` | PRIVMSG | Marks an in-progress streamed message (agents editing as they generate). |
| `+freeq.at/multiline` | PRIVMSG | Legacy multi-line encoding; new senders use standard `draft/multiline` BATCHes. |

## Agent coordination

| Tag | On | Meaning |
|---|---|---|
| `+freeq.at/event` | PRIVMSG | Freeform typed event, any kind the sender chooses (`objective`, `status_update`, `delegation_notice`, …). Not a task: a task with a lifecycle is `+freeq.at/act` below. |
| `+freeq.at/task-id` | PRIVMSG | Second wire spelling of `+freeq.at/ref` — both are the same `ref` field in the signed canonical, and `ref` is read first. New senders use `ref`. |
| `+freeq.at/payload` | PRIVMSG | JSON payload for the event (machine-readable half of the message). |
| `+freeq.at/parent`, `+freeq.at/ref` | PRIVMSG | Event lineage / cross-references (delegation, evidence links). |
| `+freeq.at/evidence-type` | PRIVMSG | Kind of evidence attached to a task event. |
| `+freeq.at/actor-class` | messages | Declares the sender class (e.g. agent vs human) for client rendering. |

## Signed action cards (`act`)

The handoff/action system — signed, structured "cards" (see the act RFC in
the repo). The signature in `+freeq.at/sig` covers **every** `act-*` tag plus
three mandatory envelope fields — the signer (`+freeq.at/from`), the event id
(`+freeq.at/eventid`), and the venue — JCS-canonicalized; byte-compatible
across the Rust and TypeScript SDKs with shared test vectors
(`spec/act-signing-vectors.json`).

| Tag | Meaning |
|---|---|
| `+freeq.at/act` | The task kind (`handoff`, …). |
| `+freeq.at/act-id` | The action a follow-up belongs to — the opener's own event id. Openers carry none. |
| `+freeq.at/act-verb` | What is being asked/done. |
| `+freeq.at/act-title` | Human-readable title. |
| `+freeq.at/act-to` | The recipient an offer is directed at, by DID. Absent means open: anyone may claim it. |
| `+freeq.at/act-caps` | A self-declared hint about what the work needs. Stored and filterable, never a gate — nothing checks it. |
| `+freeq.at/act-note` | A sentence for the record on any step. Prose, covered by the signature like every other act tag. |
| `+freeq.at/act-ctx` | Where the action's materials are. |
| `+freeq.at/act-ctx-h` | A hash of what `act-ctx` points at, so what is fetched later is checkable against what was signed. |
| `+freeq.at/act-replaces` | The finished action this one revives — a failed handoff re-offered, a forfeited bounty re-listed. Openers only. |
| `+freeq.at/act-subject` | The event a receipt confirms. Written by the action's home server, never by a participant. |
| `+freeq.at/from` | The signer/actor (envelope tag; the document key is `from`). |
| `+freeq.at/eventid` | The event id the signer minted; the server adopts it (shared with chat). |
| `+freeq.at/act-accepts` | The bid an award takes — that bid's own event id. The assignee is its author. |
| `+freeq.at/act-deadline` | How long the offer stands, unix seconds. Compared by the referee. |
| `+freeq.at/act-bid-deadline` | How long a bounty takes bids, unix seconds. Compared by the referee. |
| `+freeq.at/act-price` | What a bounty offers to pay. Opaque: stored, relayed, signed, never read. |
| `+freeq.at/act-bid` | What a bidder asks for. Opaque. |
| `+freeq.at/act-pay-to` | Where a bidder wants paying. Opaque. |
| `+freeq.at/act-tx` | A payment reference on the acceptance. Opaque — a claim on the record, never a confirmation. |
| `+freeq.at/act-scope` | What an `approval` action covers. A kind's own field: the signature covers every `act-` tag, so a kind adds one without any canonical changing. |

## Governance & budgets

| Tag | Meaning |
|---|---|
| `+freeq.at/governance` | Governance verb events (pause / resume / revoke / approve). |
| `+freeq.at/reason` | Human-readable reason attached to a governance action. |
| `+freeq.at/issued-by` | Who issued a capability/credential. |
| `+freeq.at/limit`, `+freeq.at/spent`, `+freeq.at/unit` | Budgeted capabilities: spending caps for economic controls. |

## Voice / video (AV sessions)

Control plane for calls — see the [AV protocol](/docs/av-protocol/) for the
full lifecycle. Media itself rides MoQ over QUIC, never IRC.

| Tag | Direction | Meaning |
|---|---|---|
| `+freeq.at/av-start` | client → server | Open a call in this channel. |
| `+freeq.at/av-join` / `+freeq.at/av-leave` | client → server | Join / leave the call in `av-id`. |
| `+freeq.at/av-end` | client → server | End the call (originator/ops). |
| `+freeq.at/av-id` | both | Call identifier. |
| `+freeq.at/av-instance` | both | Per-device instance id (multi-device: your phone and laptop are distinct participants). |
| `+freeq.at/av-state` | server → channel | Broadcast call state (`started`, `ended`, participant changes). |
| `+freeq.at/av-participants` | server → channel | Current participant list. |
| `+freeq.at/av-actor` | server → channel | Who performed the state change. |
| `+freeq.at/av-title` | both | Optional call title. |
| `+freeq.at/av-token` | server → client | Media-plane auth token for the SFU. |

## Standard IRCv3 capabilities implemented

`sasl` (incl. `ATPROTO-CHALLENGE`) · `message-tags` · `server-time` ·
`echo-message` · `batch` · `draft/chathistory` · `account-tag` ·
`account-notify` · `extended-join` · `away-notify` · `multi-prefix` ·
`draft/read-marker` · `draft/multiline` — plus a `iroh=<endpoint>` cap
advertising the server's P2P endpoint.

*This registry documents the wire as implemented in `freeq-server` and the
SDKs; when in doubt, the source is authoritative. Corrections welcome —
[file an issue](https://github.com/freeq-irc/freeq/issues).*
