Skip to main content

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 like cli, 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.
Attribution is metadata and can never reject a call — an unparseable value is dropped, not rejected.

How agents use it

Filters on the feed: 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 are 400, not an empty list. since is 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_DAYS ages 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