{
  "$schema": "https://docs.b1m.ai/capabilities.schema.json",
  "schemaVersion": 1,
  "updated": "2026-10-28",
  "about": "Beam's capabilities for AI agents, as data. The prose guide at /docs/agent is authoritative: where this file and the guide differ, the guide wins and this file has a bug. Every capability listed here is live in production; whether an owner can use one depends on the interface, the client version, the deployment and the account's settings.",
  "guide": "/docs/agent",
  "pricing": {
    "creditUsd": 0.5,
    "docs": "/docs/billing#prices",
    "note": "Published prices, which can change. Every charge rounds up to the next 0.01 credit. Provider egress and request charges are separate. Have the owner approve each estimate before anything is spent."
  },
  "rules": [
    "A spending action, such as starting a transfer, creating a Room or funding a sale, needs the owner's approval of its estimate before it runs.",
    "Storage keys belong in Beam Studio. Never ask a person to paste a key into a chat.",
    "An onchain receipt is Beam-reported metadata: never call it verified delivery or proof that content is correct.",
    "A data sale's escrow guarantees the committed bytes, not their accuracy; a false claim is evidence against the seller, not a refund.",
    "Do not quote throughput, capacity, availability or savings without supporting measurements.",
    "Separate what Beam does from the glue the owner runs, and compare every design with the owner's current setup.",
    "When the existing tools already do the job, say so."
  ],
  "interfaces": [
    { "id": "sdk", "name": "Server SDKs: Python, TypeScript, Go, Rust", "docs": "/docs/sdk", "reachFor": "A transfer is one step inside an application. The SDKs have no Room or live-data API." },
    { "id": "cli", "name": "Beam CLI", "docs": "/docs/cli", "reachFor": "Operating Rooms, webhook members, messages, files, streams and media from a terminal; data sales. It does not create bucket transfers." },
    { "id": "http-api", "name": "BeamCore HTTP API", "docs": "/docs/api-reference", "reachFor": "Reading transfer status from any language. It does not create transfers." },
    { "id": "studio", "name": "Beam Studio", "docs": "/docs/studio", "reachFor": "Steps, branches, retries, schedules, webhook triggers and an inspectable run history, with a self-hosted credential store." },
    { "id": "studio-mcp", "name": "Studio MCP server", "docs": "/docs/agent#studio-workflows", "reachFor": "An AI agent operating Studio within an assigned scope: workflows, runs, schedules, Room discovery and bucket membership." },
    { "id": "agent-skill", "name": "Beam agent skill, for OpenClaw and Hermes", "docs": "/docs/agent#3-availability-by-interface", "reachFor": "An AI agent running transfers and fan-out, and operating Rooms through the CLI, for a user." },
    { "id": "hermes-plugin", "name": "Hermes plugin", "docs": "/docs/agent#3-availability-by-interface", "reachFor": "A Hermes agent with native tools for transfers and Rooms." }
  ],
  "operations": [
    { "id": "transfer.create", "name": "Create a transfer or fan-out", "availability": { "sdk": { "status": "yes" }, "cli": { "status": "no" }, "http-api": { "status": "no" }, "studio": { "status": "yes" }, "studio-mcp": { "status": "yes", "note": "as workflows" }, "agent-skill": { "status": "yes" }, "hermes-plugin": { "status": "yes" } } },
    { "id": "transfer.status", "name": "Read transfer status", "availability": { "sdk": { "status": "yes" }, "cli": { "status": "no" }, "http-api": { "status": "yes" }, "studio": { "status": "yes" }, "studio-mcp": { "status": "yes" }, "agent-skill": { "status": "yes" }, "hermes-plugin": { "status": "yes" } } },
    { "id": "room.manage", "name": "Rooms: members, channels, grants, invitations", "availability": { "sdk": { "status": "no" }, "cli": { "status": "yes" }, "http-api": { "status": "no" }, "studio": { "status": "partial", "note": "Rooms with bucket members" }, "studio-mcp": { "status": "partial", "note": "Room discovery, bucket membership" }, "agent-skill": { "status": "yes", "note": "through the CLI" }, "hermes-plugin": { "status": "yes", "note": "through the CLI" } } },
    { "id": "room.messages", "name": "Room messages and media", "availability": { "sdk": { "status": "no" }, "cli": { "status": "yes" }, "http-api": { "status": "no" }, "studio": { "status": "no" }, "studio-mcp": { "status": "no" }, "agent-skill": { "status": "yes", "note": "through the CLI" }, "hermes-plugin": { "status": "yes", "note": "through the CLI" } } },
    { "id": "room.files", "name": "Room files", "availability": { "sdk": { "status": "no" }, "cli": { "status": "yes" }, "http-api": { "status": "no" }, "studio": { "status": "yes", "note": "@beam/room-transfer" }, "studio-mcp": { "status": "no" }, "agent-skill": { "status": "yes", "note": "through the CLI" }, "hermes-plugin": { "status": "no" } } },
    { "id": "room.streams", "name": "Room streams and datagrams", "availability": { "sdk": { "status": "no" }, "cli": { "status": "yes" }, "http-api": { "status": "no" }, "studio": { "status": "no" }, "studio-mcp": { "status": "no" }, "agent-skill": { "status": "yes", "note": "through the CLI" }, "hermes-plugin": { "status": "no" } } },
    { "id": "room.webhooks", "name": "Webhook members", "availability": { "sdk": { "status": "no" }, "cli": { "status": "yes" }, "http-api": { "status": "no" }, "studio": { "status": "no" }, "studio-mcp": { "status": "no" }, "agent-skill": { "status": "yes", "note": "through the CLI" }, "hermes-plugin": { "status": "no" } } },
    { "id": "studio.workflows", "name": "Workflows, triggers and schedules", "availability": { "sdk": { "status": "no" }, "cli": { "status": "no" }, "http-api": { "status": "no" }, "studio": { "status": "yes" }, "studio-mcp": { "status": "yes" }, "agent-skill": { "status": "partial", "note": "through Studio's MCP server" }, "hermes-plugin": { "status": "no" } } },
    { "id": "sale.trade", "name": "Data sales", "availability": { "sdk": { "status": "no" }, "cli": { "status": "yes" }, "http-api": { "status": "no" }, "studio": { "status": "no" }, "studio-mcp": { "status": "no" }, "agent-skill": { "status": "no" }, "hermes-plugin": { "status": "no" } } }
  ],
  "capabilities": [
    {
      "id": "transfer",
      "name": "Transfer",
      "guide": "/docs/agent#transfer",
      "does": "Moves one or more finite objects from source endpoints to destination endpoints, in chunks that several workers carry in parallel.",
      "operations": ["transfer.create", "transfer.status"],
      "inputs": "Sources and destinations on supported connectors, each with a size known before planning: the caller supplies it, or the SDK reads it from the source.",
      "outputs": [
        { "name": "transfer id", "delivery": "read", "how": "Returned at once by the create call." },
        { "name": "terminal state", "delivery": "read", "how": "completed, failed or cancelled, with error_message on failure. Wait in the SDK, or poll GET https://beamcore.b1m.ai/transfers/{id} or GET /transfers?order_by=completed_at&completed_after=<timestamp>. Beam sends no completion webhook." }
      ],
      "connectsTo": ["studio-workflow", "onchain-receipt"],
      "requires": ["Keep the SDK client connected until the transfer reaches a terminal state: it signs the transfer's routes locally."],
      "trust": "Workers can read transferred plaintext unless the client encrypts it first. Storage credentials stay in the SDK process or in Studio; workers receive task-scoped routes.",
      "cost": { "credits": "0.2 per transfer plus 0.02 per GB delivered", "example": "1 GB to one destination: 0.22 credit" },
      "limits": ["A transfer whose estimate exceeds what the key may spend is refused with HTTP 402 insufficient_credits before any data moves.", "Object transfer is not delta synchronization."],
      "docs": ["/docs/transfers", "/docs/sdk"]
    },
    {
      "id": "fan-out",
      "name": "Fan-out",
      "guide": "/docs/agent#fan-out",
      "does": "Delivers the same object to several destinations in one transfer: the transfer API with more than one entry in destinations.",
      "operations": ["transfer.create", "transfer.status"],
      "inputs": "As for a transfer. Studio also has a @beam/fan-out step. A Hugging Face destination takes a single source object.",
      "outputs": [
        { "name": "transfer id and terminal state", "delivery": "read", "how": "As for a transfer. Check every destination." }
      ],
      "connectsTo": ["studio-workflow", "onchain-receipt"],
      "requires": [],
      "trust": "As a transfer, for every destination.",
      "cost": { "credits": "0.2 per transfer plus 0.02 per GB delivered to each destination", "example": "200 GB to three destinations delivers 600 GB: 12.2 credits" },
      "limits": ["Each destination is delivered separately, so the source is read once per destination: a fan-out does not cut source egress."],
      "docs": ["/docs/transfers"]
    },
    {
      "id": "room",
      "name": "Multicast (Room)",
      "guide": "/docs/agent#multicast-room",
      "does": "Runs a permissioned group whose members exchange data on channels, with roles, per-channel grants that deny by default, and bounded invitations. Members are enrolled machines running the Beam agent, object-storage buckets attached through Studio, and webhook members.",
      "operations": ["room.manage", "room.messages", "room.files", "room.streams"],
      "inputs": "The CLI and the local agent API on each member's machine; Studio for Rooms with bucket members and for Room file delivery (@beam/room-transfer).",
      "channelKinds": [
        { "kind": "message", "carries": "Messages, live by default", "receive": "listen streams them to a local process; only listening members receive them unless the channel keeps them locally." },
        { "kind": "object", "carries": "Files", "receive": "Delivered to each recipient's agent inbox; object watch follows a publication. Every selected recipient must finish unless partial delivery is allowed." },
        { "kind": "stream", "carries": "End-to-end encrypted byte streams with no declared size, carried by Beam workers", "receive": "Receivers start listening before the sender publishes." },
        { "kind": "datagram", "carries": "Single payloads of at most 1,008 bytes", "receive": "Live, best effort, no replay." },
        { "kind": "media", "carries": "Live audio and video: WHIP ingest, WHEP playback", "receive": "Viewers need subscribe on the channel, plus discover when it is restricted." }
      ],
      "outputs": [
        { "name": "Room message", "delivery": "pushed", "how": "To members running listen, and to webhook members as a signed POST." },
        { "name": "Room file", "delivery": "read", "how": "The recipient's agent inbox and object watch; pushed to a webhook member with its bytes up to 25 MiB." },
        { "name": "publish outcome", "delivery": "read", "how": "Which members received it, which were not listening, and which refused it, in member_failures." }
      ],
      "connectsTo": ["webhook-member", "studio-workflow", "onchain-receipt", "data-sale"],
      "requires": [
        "Every member runs a current Beam CLI and agent.",
        "A file between an agent member and a bucket member needs Studio v1.0.24 or later at an HTTPS public URL that Beam workers reach; otherwise it fails with room_storage_route_unreachable."
      ],
      "trust": "Content between agents is end-to-end encrypted with the channel's MLS key. A bucket source or recipient lets delivery workers read that publication.",
      "cost": { "credits": "1 each time a Room is started; a file costs 0.2 plus 0.02 per GB, counted for each member that receives all of it; messages and streams are free" },
      "limits": ["A Room publication from a bucket member reads each part of the source once for all recipients.", "Live-channel duration, idle limits, backpressure and reconnects vary by channel.", "Beam does not make a machine's private services reachable from outside."],
      "docs": ["/docs/cli", "/docs/studio"]
    },
    {
      "id": "webhook-member",
      "name": "Webhook member",
      "guide": "/docs/agent#webhook-members",
      "does": "Brings any HTTPS service into a Room with no Beam software on it: a member's always-on agent, its host, delivers the Room's messages and files to the service and publishes its replies.",
      "operations": ["room.webhooks"],
      "inputs": "Messages on the message channels it subscribes to, and files on the object channels it subscribes to. A Room owner or admin adds it; the host's owner accepts it with the service's URL and a signing secret.",
      "outputs": [
        { "name": "delivery", "delivery": "pushed", "how": "One signed HTTPS POST per message or file: HMAC-SHA256 over a timestamp and the body, with an Idempotency-Key. Files up to the webhook's cap (at most 25 MiB) arrive with their bytes; larger ones as a file.notice." },
        { "name": "reply", "delivery": "pushed", "how": "In the response: a 2xx with X-Beam-Reply: v1 within the 10-second attempt. Or later: a 202 with X-Beam-Reply: v1 and a same-origin Location that the host polls, within the reply window (1 hour by default, 1 minute to 24 hours)." }
      ],
      "connectsTo": ["room"],
      "requires": ["Durable delivery needs host CLI 0.1.40 or later.", "The host is an agent member connected to a Beam account that stays online."],
      "trust": "The host decrypts everything sent to the webhook and can publish as it; the service receives plaintext over HTTPS. Beam infrastructure never decrypts webhook traffic.",
      "cost": { "credits": "Free: its traffic is Room messages" },
      "limits": ["Live by default; durable delivery retries what the host accepted for up to 24 hours, never what was published while the host was offline.", "At most 60 deliveries and 30 replies a minute per webhook; 10 webhooks per Room, 20 per host.", "A webhook publishes only replies, never files."],
      "docs": ["/docs/room-webhooks"]
    },
    {
      "id": "studio-workflow",
      "name": "Studio workflows",
      "guide": "/docs/agent#studio-workflows",
      "does": "Runs durable workflows: graphs of steps that move data and call other systems, with conditions, branches, retries and a readable run history, on a self-hosted Studio.",
      "operations": ["studio.workflows", "transfer.create", "room.files"],
      "inputs": "Triggers: on demand, on a schedule, at a date, from a webhook (an HTTPS endpoint, optionally HMAC-signed and deduplicated on Idempotency-Key; its JSON body becomes the run's input, ${workflow.input.<field>}), or when another workflow finishes; or a run started through the Studio MCP server.",
      "steps": ["@beam/transfer", "@beam/fan-out", "@beam/room-transfer", "@beam/webhook", "@beam/slack", "@beam/http-request", "Salesforce", "@beam/zapier", "conditions and data transformations"],
      "outputs": [
        { "name": "run state", "delivery": "read", "how": "A run id, then run and step state, through Studio's interface, its API or the MCP server." },
        { "name": "step results", "delivery": "pushed", "how": "@beam/webhook, @beam/slack and @beam/http-request steps push results to other systems." }
      ],
      "connectsTo": ["transfer", "fan-out", "room"],
      "requires": ["Studio cannot publish Room messages: a reply in a Room comes from an agent member or a webhook member."],
      "trust": "Storage and service credentials stay in Studio; Beam workers receive task-scoped routes.",
      "cost": { "credits": "Workflow runs and their steps are free; the transfers and Room transfers a run starts are charged as transfers" },
      "limits": ["Credential support alone is not a connector: Studio stores credentials for Adobe AEP, Snowflake and Databricks but has no steps for them."],
      "docs": ["/docs/studio", "/docs/studio-first-workflow"]
    },
    {
      "id": "data-sale",
      "name": "Data sales",
      "guide": "/docs/agent#data-sales",
      "does": "Lets two agents that do not trust each other trade a dataset for TAO, through a two-member Room and an escrow on Bittensor EVM that pays the seller only for the bytes it committed to.",
      "operations": ["sale.trade"],
      "inputs": "The CLI: beam sale (wallet, room, join, offer, buy, describe, card, policy, query, verify-claims, status, resume).",
      "stages": [
        "Delivery: the seller's client delivers the encrypted package to the buyer's member in the sale Room; nothing is paid yet.",
        "Checks before payment: the buyer checks the package against the seller's signed commitments and the dataset's fingerprint, reads the card, draws samples and asks questions.",
        "Funding: with the owner's approval, the buyer pays into the escrow; by default a person also confirms any sale above 0.2 TAO at a terminal.",
        "Reveal and leaf check: the seller reveals the key; the buyer decrypts and checks every 4 KiB leaf, and a mismatch is challenged for the full price.",
        "Claim check and use: beam sale verify-claims recomputes the card and every answer from the decrypted dataset."
      ],
      "outputs": [
        { "name": "sale state", "delivery": "read", "how": "beam sale status --json; --json reports carry the sale id, the escrow state and the next step." },
        { "name": "escrow events", "delivery": "onchain", "how": "The escrow's events on Bittensor EVM." }
      ],
      "connectsTo": ["room"],
      "requires": ["Beam does not list datasets or find buyers: the parties find each other first."],
      "trust": "The escrow checks bytes, not meaning. The key becomes public at the reveal, and each sale's addresses, price, size, fingerprint and deadlines are public onchain.",
      "cost": { "credits": "The seller's organization pays 1 for the sale Room and 0.2 plus 0.02 per GB for each delivery; the buyer pays Beam nothing; about 164,000 gas for an honest sale" },
      "limits": ["$10 to 1 TAO per sale, the escrow's own cap.", "Up to 100 GB.", "Raising a limit or moving TAO out of the sale wallet needs a person at a terminal."],
      "docs": ["/docs/data-sales"]
    },
    {
      "id": "onchain-receipt",
      "name": "On-chain transfer receipts",
      "guide": "/docs/agent#on-chain-transfer-receipts",
      "does": "Records receipts of finished Beam transfers and Room deliveries in Beam's receipts contract on Bittensor EVM mainnet, where any smart contract can read them.",
      "operations": [],
      "inputs": "A console switch, Record a receipt for every transfer; or requestReceipt(transferId) and requestRoomReceipt(room, channel, publication) from a contract or wallet Beam approved for the organization. Setup needs a read-only key registered in the console.",
      "outputs": [
        { "name": "receipt", "delivery": "onchain", "how": "Usually recorded within a minute or two of the transfer finishing; contracts read it with getReceipt. Metadata only: status, size, completion time and fingerprints." }
      ],
      "connectsTo": [],
      "requires": ["Beam's relay records receipts only: it never starts a transfer, and a contract cannot start one."],
      "trust": "Beam-reported: it records what Beam's API reported, written by Beam's relay. A Room receipt can also carry target-signed receipts. No receipt proves that the content is correct. Onchain data is public.",
      "cost": { "credits": "1 per recorded receipt; a contract request also costs its requester about 164,000 gas; a request the relay will not answer is closed for 1 credit" },
      "limits": ["A contract acts on a receipt only in a later transaction of its own."],
      "docs": ["/docs/integrations/bittensor-evm"]
    }
  ],
  "connectors": [
    { "id": "s3", "name": "S3, Cloudflare R2 and S3-compatible storage", "source": "yes", "destination": "yes", "through": ["sdk", "studio", "agent-skill", "hermes-plugin"], "notes": "Also buckets as Room members through Studio.", "docs": "/docs/connectors" },
    { "id": "hippius", "name": "Hippius", "source": "yes", "destination": "yes", "through": ["sdk", "studio", "agent-skill", "hermes-plugin"], "notes": "Confirm final-object verification for the adapter before relying on it.", "docs": "/docs/connectors/hippius" },
    { "id": "box", "name": "Box", "source": "yes", "destination": "yes", "through": ["sdk", "studio", "studio-mcp"], "notes": "A file or every file in a folder as a source; a folder as the transfer's only destination. TypeScript and Python SDKs. A file of 20 MiB or more needs its SHA-1.", "docs": "/docs/connectors/box" },
    { "id": "hugging-face", "name": "Hugging Face", "source": "yes", "destination": "yes", "through": ["sdk", "studio", "agent-skill", "hermes-plugin"], "notes": "Files stored with LFS or Xet; buckets as sources only. A destination takes one source object whose SHA-256 is known before any byte moves.", "docs": "/docs/agent#connectors" },
    { "id": "http", "name": "Prepared HTTP endpoints", "source": "yes", "destination": "yes", "through": ["sdk"], "notes": "Authentication, known size, range reads, write semantics and reachability.", "docs": "/docs/connectors/http" },
    { "id": "gcs", "name": "Google Cloud Storage", "source": "yes", "destination": "yes", "through": ["sdk", "studio"], "notes": "Through the S3-compatible configuration: the XML API at https://storage.googleapis.com with an HMAC key for a service account that has the Storage Object User role on the bucket. TypeScript and Python SDKs. Objects carry no SHA-1, so a file of 20 MiB or more sent to Box is read again to compute one.", "docs": "/docs/connectors/gcs" },
    { "id": "azure-blob", "name": "Azure Blob", "source": "no", "destination": "no", "through": [], "notes": "Not supported. Do not propose it.", "docs": "/docs/agent#connectors" }
  ],
  "connections": [
    { "output": "A transfer finished", "delivery": "read", "how": "The SDK's wait; GET /transfers?order_by=completed_at&completed_after=...; a Studio step's outputs", "next": "The next Studio step, a completion trigger, or the owner's poller", "glue": "Outside Studio, the process that created the transfer waits for it, or a poller reads newly finished transfers and starts the next step." },
    { "output": "A Room message", "delivery": "pushed", "how": "listen on a member; a webhook member's signed POST", "next": "The service acts, and can reply in the Room", "glue": "To start a transfer from a message, a webhook service or a listen loop calls an SDK in a process that stays connected." },
    { "output": "A Room file", "delivery": "read", "how": "The recipient's inbox and object watch; a webhook member's file delivery up to 25 MiB", "next": "Processing on the recipient", "glue": "The recipient reads its inbox, or a webhook service receives the file." },
    { "output": "A Studio run's result", "delivery": "read", "how": "Run state through Studio's API or the MCP server; @beam/webhook, @beam/slack or @beam/http-request steps", "next": "Another system, or another workflow through a completion trigger", "glue": "Configuration only: a notifying step or a completion trigger." },
    { "output": "A request from outside", "delivery": "pushed", "how": "A Studio webhook trigger", "next": "A workflow run", "glue": "The external system calls the trigger's URL." },
    { "output": "A data sale's state", "delivery": "read", "how": "beam sale status --json; the escrow's events", "next": "The buyer's processing; the seller's settlement", "glue": "An agent loop reads the status and runs beam sale resume; a person approves what needs a person." },
    { "output": "A recorded receipt", "delivery": "onchain", "how": "getReceipt in Beam's receipts contract", "next": "A contract's own later transaction", "glue": "Something sends that transaction." },
    { "output": "Credit and budget", "delivery": "read", "how": "The Account Management API; HTTP 402 insufficient_credits when a request is refused", "next": "Stop, or ask the owner", "glue": "Read credits and the key's budget before spending." }
  ],
  "patterns": [
    { "id": "A", "name": "Event → workflow → notification", "capabilities": ["studio-workflow", "transfer", "fan-out"], "flow": ["An event in another system calls a Studio webhook trigger", "A @beam/transfer or @beam/fan-out step moves the data", "A @beam/webhook or @beam/slack step reports the result"], "glue": "The system where the event happens calls the trigger's URL with an Idempotency-Key.", "smallestProof": "One real event that delivers one real object to two destinations, and the notification received." },
    { "id": "B", "name": "One source → many recipients", "capabilities": ["fan-out", "room", "studio-workflow"], "flow": ["Fan-out: each destination reads the source", "Room publication from a bucket member: each part of the source is read once for all recipients"], "glue": "Write credentials for each destination, or recipients that are Room members with running agents.", "smallestProof": "One real object to three recipients, with each copy checked." },
    { "id": "C", "name": "Parties across organizations", "capabilities": ["room", "webhook-member"], "flow": ["A Room with message and object channels", "An invitation per partner, limited to its channels", "Optionally a bucket member and a webhook member"], "glue": "Each side's logic, such as a listen loop or a webhook service that acts on messages.", "smallestProof": "A partner joins from an invitation, exchanges one message and one file, and loses access when its grant is removed." },
    { "id": "D", "name": "Request → decision → authorized action", "capabilities": ["room", "webhook-member", "transfer"], "flow": ["A Room message reaches a webhook member", "The AI service decides and asks for approval", "It starts a transfer with an SDK and replies asynchronously in the Room"], "glue": "The service: deduplication, approval, the SDK transfer in a long-running process, and the reply within the reply window.", "smallestProof": "One request, one approval, one transfer and one reply that carries the transfer's terminal state." },
    { "id": "E", "name": "Evaluate → approve → buy → use", "capabilities": ["data-sale", "room"], "flow": ["Encrypted package delivered in the sale Room", "Commitments, card, samples and questions checked", "The owner approves the price; escrow funded", "Key revealed, every 4 KiB leaf checked", "verify-claims, then the owner's processing"], "glue": "An agent loop that reads beam sale status --json and runs beam sale resume, and the person who approves funding.", "smallestProof": "A small sale between the two parties, with the card checked before funding and verify-claims after the key is revealed." },
    { "id": "F", "name": "Delivery → onchain record → contract action", "capabilities": ["transfer", "onchain-receipt"], "flow": ["A transfer from any interface completes", "Its receipt is recorded on Bittensor EVM", "A later transaction to the contract reads getReceipt"], "glue": "Whatever starts the transfer, and whoever sends the contract's next transaction.", "smallestProof": "One transfer whose receipt a test contract reads." },
    { "id": "G", "name": "Dataset → outside compute → results back", "capabilities": ["fan-out", "studio-workflow", "room"], "flow": ["Storage fans out to compute sites", "The owner's jobs run outside Beam", "Results come back as a Room file or a transfer"], "glue": "Starting each job once its data has landed, with a @beam/http-request step or the owner's poller.", "smallestProof": "One dataset to two sites, one job each, and both results back." },
    { "id": "H", "name": "Live feed → several consumers", "capabilities": ["room"], "flow": ["A Room stream between agents, or a media channel with WHIP in and WHEP out"], "glue": "The producer and the consumers.", "smallestProof": "The real source and two consumers, for the required duration." }
  ],
  "notOffered": [
    "General-purpose compute.",
    "Long-term storage.",
    "Reaching a private resource from outside.",
    "A dataset marketplace: Beam does not list datasets or find buyers.",
    "Durable messaging, replay or exactly-once external effects beyond what each channel documents.",
    "CDN edge caching.",
    "Delta synchronization of changed files.",
    "Azure Blob endpoints.",
    "Starting a transfer from a smart contract."
  ]
}
