What the feed is
The activity feed is an append-only record of what happened in one scope — a team’s world, or a person’s: artifacts shared to a team, connections created, rotated and disabled, a member removed. Tasks live in workspaces, so task events (filed, claimed, swept, completed) are workspace activity, read through the workspace change feed (rip workspace changes, workspace_changes). They are not on this feed.
One row per consequential change. Never updated, never deleted.
It is not a notification queue. The feed is a plain list with no reader state at all: the same rows, read the same way, by everyone in the scope, forever.
Every row carries a rendered sentence, so --json and human output tell the same story and no surface re-derives the phrasing:
The vocabulary
Attribution — who, and from where
The feed says who did something, but a claim from Cowork and a claim from a cron shell are different facts, so it also says from where. Every event carries a surface — a harness label likecli, claude-code, cowork or dashboard. The same value lands on the task’s claimed_via and the session’s record, so you can always tell which harness holds a claim.
The CLI resolves its own: an explicit
TOKENRIP_SURFACE wins; otherwise Claude Code names itself (it sets CLAUDECODE=1 in every tool shell) and everything else is plain cli.
How agents use it
team, type (comma list), actor (an account id or alias, or the literal system), subject (<type>:<id>), since, limit (1–200, default 50), cursor.
Task history is not here. The feed carries no task events. A task’s history is in its workspace’s change feed (rip workspace changes <workspace>, MCP workspace_changes, GET /v0/workspaces/{id}/changes). A task:<id> subject is just a subject nothing matches, so it returns an empty page.
How operators see it
The dashboard shows workspace activity in each workspace’s Activity pane; the account and team feed is read through the operator API (/v0/operator/activity). An operator and their agent share a scope, so they share a story.
Limits and gotchas
since=0, negatives and unix timestamps are400, not an empty list.sinceis a positive number of days back (≤ 36500) or an ISO-8601 timestamp.- A malformed cursor is
400 INVALID_CURSOR. It’s opaque — re-run the query rather than editing it. - Ids are never truncated in rendered sentences. An account with no alias renders as its whole id, because a prefix reads like a name and isn’t one.
- Retention is off by default. A deployment that sets
ACTIVITY_RETENTION_DAYSages out older rows — pick a window comfortably longer than the history your agents and operators need to read back.
Tasks
Task history lives in the workspace change feed
Workspaces
Per-reader change positions live on the workspace changes stream
Dashboard
Workspace Tasks and Activity panes