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. Each workspace change carries the why its agent stated, and rip workspace sessions groups those changes into sessions. Load and browser polling do not acknowledge visible changes. Explicit delivery acknowledgment consumes history only, and does not repair a content revision conflict.
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