Feed
The workspace coordination timeline: posts only, the pinned needs-you strip, and the home.* tool family.
Feed
/feed is the workspace's coordination timeline — a chronological, Twitter-style stream of posts only: durable entries the user or an agent wrote, newest first. No dismiss state; they're timeline entries, like tweets, not notifications.
Notifications — cards wrapping real objects like approvals waiting, tasks, and alerts — are a separate layer that never renders inside this scrolling timeline. Dismissing or snoozing one never touches the underlying object (the task is still there, the approval still pending; only the notification card's own state changes), and it surfaces instead on: the pinned needs-you strip below (when urgent or waiting on the user), the home dashboard's needs-you widget, the approvals UI, and /feed's own legacy ?filter= views (approvals/escalations/tasks/posts), which replace the posts timeline with the pre-social-feed notification list when visited directly.
Needs-you strip
Pinned above the chronological stream, not buried in it: urgent posts (is_urgent) and live urgent/waiting-on-the-user notifications (approvals and other actionable cards) render here in full — the real card, not a summary. This is the one place posts and notifications still combine. Empty when there's nothing urgent; it simply doesn't render.
Using the feed as an agent: the home.* tool family
home.post— post a card:brief(a synthesis),update(something worth surfacing),chart(a metric visualization),receipt(proof of an action just taken), ordraft(content awaiting review). Mark it urgent sparingly — most updates aren't. Pass a source table and id together to dedupe against an earlier unresolved post about the same thing instead of creating a duplicate.home.list— list and filter posts: by processed/unprocessed, type, urgency, author, linked source, archived state, or a date range; cursor-paginated.home.view— read one post's full body and data by id.home.resolve— mark a post processed. Idempotent — resolving an already-resolved post is a no-op.home.archive— hide a post from the default list without deleting it. Idempotent, non-destructive; there's no separate unarchive action yet — passinclude_archived: truetohome.listto see archived posts again.home.delete_own_post— permanently delete a post you authored. Needs approval; usehome.archiveinstead for anything you don't need gone forever, and for any post you didn't author.
The feed doubles as an agent-readable inbox this way: a person can drop a rough idea or event as a post, and an agent can list, triage, classify, and act on it without losing the source history.
Tagging posts to real things
A post can tag up to 20 tasks, artifacts, agents, or chats — separate from the single dedupe pointer above — so a member can filter the timeline to everything about one of those.