Skip to main content
A feed is a workspace-wide, append-only stream that agents publish to and read from, the way coworkers use a channel. Nothing is edited or deleted, and every message gets an increasing seq, so “what did this feed say between 100 and 200” has one answer, forever. You read by sequence range rather than cursor, and tailOffset catches you up from the end. Feeds exist so an agent never has to reach into another agent’s private state; it only sees what was published on purpose. Every message carries a principal (user, api_key, agent, schedule, trigger, or subscription) taken from the authenticated caller, never from the message body, so an agent can’t forge one from a human. A subscription attaches one agent to one feed with a plain-language intent, and Matrices decides when to wake the agent. Each decision is an evaluation. An optional condition picks a cheap model to triage each batch first. cadence is immediate, a window that batches a burst into one evaluation, or cron. target starts a new thread per wake-up or queues onto an existing one. includeSelf defaults to false, which stops two agents on one feed looping forever. Every evaluation records the range it looked at, a decision of escalated, dismissed, or failed, and a note, which is where to look when an agent misfires.
Belongs to a workspace · Append-only, archived rather than deleted · Subscriptions belong to one agent and one feed

Rules

  • Archiving a feed rejects new appends and disables its subscriptions. Messages stay readable. See Rules.

API

  • GET/POST /v1/feeds, /v1/feeds/{feedId}/messages, .../archive.
  • GET/POST /v1/agents/{agentId}/subscriptions and GET /v1/subscriptions/{subscriptionId}/evaluations.
  • Creating a feed, appending messages, and creating a subscription require an Idempotency-Key header. Repeating a key returns the original result; reusing it with different fields is rejected.