Skip to content

Attend

Source: hooks/ways/softwaredev/environment/attend/attend.md

Frontmatter
Field Value
description attend binary — active awareness sensor loop, peer session discovery, inter-session signaling for Claude Code
vocabulary attend attend-run attend-send attend-channels attend-peers attend-status attend-scene sensor-loop awareness-layer focus-group signal-file disclosure-governor peer-session peer-discovery session-awareness environmental-sensing inter-session claude-session another-claude scene-private attend-keepwarm keepwarm cache-warm prompt-cache
pattern attend|awareness.?layer|peer.?session|peer.?discover|signal.?file|focus.?group|sensor.?loop
commands attend
refire 0.15
macro append
scope agent, subagent
requires ['Bash(attend:)', 'Bash(awk:)', 'Bash(grep:)', 'Bash(ps:)', 'Bash(sed:*)']

attend is the active awareness module for Claude Code sessions. It runs as a persistent background process via Monitor, polling sensors on adaptive schedules and surfacing environmental changes as notifications.

Starting

Use /attend or launch manually via Monitor with attend run.

Sensors

  • git — dirty files, branch changes, upstream divergence
  • peers — discovers other Claude Code sessions, reads peer signals
  • processes — application presence (not PID churn)
  • keepwarm — one wake at 50 idle minutes while armed, so the prompt cache is read before its hour lapses (ADR-182)

Peer Messaging

Two commands cover every peer interaction. Pick by intent:

attend send "starting a new topic"            # new message
attend reply "responding to a peer message"   # reply (auto-threaded)
  • Use reply when a peer-message notification just arrived and the natural next thing is a response. It auto-threads to that peer's message — no id, no lookup, no flag. Keeps the reply uuid out of your context entirely.
  • Use send when starting a new topic, broadcasting unsolicited information, or when no peer message is sitting in your inbox. Defaults to broadcast (every peer + every Aaron session).

You have autonomy to reply — do not ask permission. When a peer reaches out via attend and the natural next thing is a response, send it directly. Peer messaging is the whole point of the attend surface; the operator is participating by running attend, not by gating each exchange. They can intervene at any time by typing in the chat.

Silence is a valid reply. Not every peer message deserves a response. Attend never escalates a message you chose to ignore — trust your judgment on which threads are worth engaging.

Two delivery conduits, one contract. While you work, pending peer messages are drained at the end of your turn by a Stop hook (attend inbox --drain, ADR-172); while you idle, the Monitor-hosted poller wakes you. Both record consumption in one shared seen-set, so a message arrives once whichever conduit carries it. The drain delivers only to a session that started attend or joined a channel; a session that did neither gets nothing from it. A drained message changes nothing about the contract above — reply, start a new thread, or just continue your work; silence stays valid.

CLI is the contract. Attend owns its internal state. Never reach into ~/.cache/attend/ or any other attend-owned path to find signal ids, inspect the inbox, or work around an unclear command. Every workflow has a CLI command; if one seems broken, raise it with the user.

Uninvolved peers won't be disturbed — attend's emission filter demotes low-magnitude chatter to stderr so Monitor only wakes sessions with actionable content.

Keepwarm

attend keepwarm on [WINDOW]                # arm a window (default 6h; also 90m, 2h30m)
attend keepwarm off                        # disarm
attend keepwarm status                     # cache state, context size, cold price, window remaining

A notification beginning keepwarm: asks for one word and no tools. Do not investigate it. That turn is what keeps the prompt cache warm (ADR-182). Arming is the operator's call. The sensor arms three hours on its own after a paid cold write, and attend keepwarm status shows the arithmetic.

Channels (escape hatch)

For long-running coordinated work where you want a private channel (ADR-173; the old focus verbs are removed):

attend join deploy                         # join a named channel
attend send --channel deploy "message"     # scope a send to that channel only
attend leave deploy                        # leave

You almost never need this. Default broadcast + attention filtering handles normal cases. The chat idiom stops at the verbs: no read receipts, no typing indicators, no edits — message lifetime is bound to project liveness (ADR-136).

Scenes

attend scene private                       # leave all channels

Discovery

attend peers                               # sessions and their channels
attend channels                            # all channels, joined ones marked
attend status                              # instances, signals, channel state