Skip to content
Agent Orchestration
Agent

HANDOFF

Everything here is durable; nothing depends on tmux or model context.

BOOST
From plugin
aweb
12629 skills29 agents1 MCP
Install
$ npx -y skills add awebai/aweb --agent claude-code

How it fires

How this agent gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.

Context preview

The summary Claude sees to decide when to auto-load this agent.

Everything here is durable; nothing depends on tmux or model context.

Agent definition

HANDOFF.md

oats-coord state — 2026-08-04

Everything here is durable; nothing depends on tmux or model context.

**Resolve who exists from `aw workspace status` and the active team instructions, never from this file.** Rosters, presence and current pairings change independently of any document, so a copy here becomes a durable contradiction.

**An alias in a task, a handoff or a mail is not evidence that anyone is behind it.** Verify a recipient is reachable before routing work, and re-verify before believing a reply will come. This is not hypothetical caution: work was routed to this epic's agents after they were gone, and to an alias whose current occupant was a different agent doing unrelated work — who correctly refused to answer for work that was not theirs. Both failures looked exactly like a message in flight.

**Staff through `aw team admin add … --start`, not `oats spawn`.** That is the proven path on this machine and it provisions identity through the Library, sidestepping the hosted-minting gap in `.66`.

Resume

From `oats/agents/oats-coord/instances/alice` (never `cd` elsewhere before `aw`):

aw workspace status          # confirm Team=aweb-oats:aweb.ai Name=alice
aw task show aweb-oats-aaaa   # the epic
aw task list --status open | grep aaaa

Read `oats/docs/oats-aweb-seam.md` first — it is the design of record, and its newest section ("Cleanup authority belongs to the spawner, never to the worker") is today's main decision.

Repository state

  • **aweb**: work on `oats-coord/alice`, never on `main`. Keep local `main` as a

pure mirror of `origin/main` so a stray push cannot land coordinator work on the shared branch. Forward before starting: fetch, reset the branch onto `origin/main`, then work. **`main` is shared with teams that cut releases from it.** A release gate can be materializing this repository's pinned inputs at any moment, so an unannounced push to `main` is not just a merge risk, it can change what a live ship is building. Ask before pushing to `main` when any release may be in flight, and never push a revert of something a gate is currently consuming.

  • **Never let anyone branch off your local main without checking it against

origin first** — `git rev-list --left-right --count origin/main...main`. A developer once branched off unpushed local work here, so their branch silently carried unreviewed commits underneath a reviewed one, and the review scope had to be recomputed twice. The rule is durable; the divergence it guards against is transient and must be measured, never read from this file.

  • **upstream OATS clone**: `~/prj/awebai/oas`. Branch `working` is HISTORY, not

current — it was 8 commits on a pre-v0.20 base and its rebuild is abandoned. Current is `aweb/v020-integration`: released v0.20 upstream main plus the three seams open upstream as PRs 37, 48 and 69.

  • **The local `oas` binary is OURS, not upstream.** `@oas-framework/oas`

**0.20.0-aweb.1**, built from `aweb/v020-integration`. Released upstream 0.20.0 does NOT carry the three seams, which is why the version is not a bare 0.20.0. Rollback: `npm i -g /private/tmp/oas-rollback-0.18.0/pkg`.

  • **The test pin resolves the same commit the binary runs**, through an

aweb-controlled mirror `github.com/awebai/oats` rather than upstream. Upstream branch retention is not ours to promise: the previous pin's ancestor lived on an upstream branch that was DELETED, which invalidated the pin and forced a full rebuild.

  • **Push to the upstream clone is deliberately blocked**:

`remote.origin.pushurl = BLOCKED-open-a-PR-for-Pepe-instead-see-aweb-oats-aaaa`. Leave it blocked. The `mirror` remote is ours and is where our branches go.

Upstream PRs (three OPEN, awaiting Pepe — who has NOT been told what they are for)

  • **PR 37** `fix/delimit-task-prompt-after-variadic-flags` — rebased onto current

main and **reduced to the pi half only**; Pepe's `5a79622` already delimits claude. Fixes a defect *we introduced*: adding `--` made every pi spawn die with `Unknown option: --`. pi has no end-of-options marker. Fix = task positional ahead of contributed options.

  • **PR 48** `upstream/launch-environment-contract` — 6 commits, rebased, one

conflict resolved (Pepe added error handling around the lock write; our disclosure now precedes it) plus a fixture fix for his new `lib/packages.mjs`.

What works

`.60` shipped the customer path **for a BYOT team**, and that qualifier is load-bearing: every one of its tests drives a fake `aw` that answers `import-request`, which is the BYOT flow. Our own deployment team `aweb-oats:aweb.ai` is HOSTED, and the capability only mints under a local BYOT controller, so the shipped path has never run against the only kind of team we have. The claim is true about the object it tested and false about the object we run. See `.66`.

Also merged: `.57` (adapter signals broken bindings as subprocess failure), `.56` (OATS_TEST_ROOT coupling fails legibly), `.28` (ordinary worker journey, bounded, residuals stated), `.30`'s harness (preserved on main even though the proof is incomplete — it is what found the pi defect).

Blockers, in priority order

1. **`.63` — IMPLEMENTED AND ACKed, NOT LANDED.** Branch `e2ee-dev`, reviewed tip `64833dac`, task commit `2a25f085`. The root cause was NOT the resolver I traced: `aw mail show` was refused outright by the `.11` default-deny allowlist, which is why it diverged from `inbox`. **Read its current prerequisites off the board, not from here** — they have already changed more than once, and any count written down goes stale the next time a review round adds a commit. **Residual: no resident Pi/channel journey was rerun — cross-runtime local channel decryption is UNPROVED and must not be reported as proved.** 2. **`.47`** — ours to build, unblocked, blocks `.44`. AC already exposes the endpoints (`POST /{team_id}/agents/remove-member` and `add-member` in `aweb_clou

Read more
Ships withaweb

Communication for AI agents. aweb gives independently running agents stable identities, durable mail and chat, and wake-up events across sessions, runtimes, and machines. Agents can use it through the aw CLI, HTTP API, MCP tools, or event stream.

Get the whole plugin

Other agents on aweb.