Skip to main content

Strategies

A Strategy is an operating role played by an existing Workstream. It is not a separate Erdo resource. Use a long-lived root workstream for the business outcome and attach each campaign workstream directly beneath it with the existing workstream resource type and child relationship. Experiments remain hosted by the workstream doing the work. A campaign experiment therefore lives on its campaign workstream, while the root workstream supervises the portfolio.

Attach campaign workstreams

The same operation is available through erdo_attach_workstream_resource and POST /v1/workstreams/:slug/resources.

Read the portfolio

erdo workstream ledger <strategy-slug>, erdo_read_workstream_ledger, and GET /v1/workstreams/:slug/ledger return a one-level child_portfolio. Each entry contains the child workstream, experiment counts, and open-attention count. The read is deliberately one level deep and includes only direct children in the same organization and project. Deeper execution detail remains on each child workstream’s own ledger.
The project filter compares each child against the root’s project, and attaching across projects is not an error. A child created in a different project attaches successfully, returns 200, and is then absent from child_portfolio — so the portfolio reads as empty while the resource link plainly exists. Create campaign workstreams in the same project as their root, or read them through their own ledgers.

Declare which provider campaigns a workstream governs

A workstream that manages paid media must be able to say which provider campaigns it manages. That belongs in a typed field, not in an agent’s instructions — an allowlist written in prose has to be edited by hand for every new campaign, in every record that repeats it, and nothing fails when two copies disagree.
Every field is an opaque provider string. Erdo stores what you resolved and hands it back; it does not parse the ids, check them against the provider, or infer scope of its own. You hold the evidence that produced the mapping. The write is a replace. Resolve the complete set each time: a campaign left out of the request leaves scope, which is how a campaign is unmanaged and how an explicit [] turns management off without deleting the workstream. There is no merge form, because under one a stale reference could never be removed. Reading needs no extra call. external_refs is on every workstream response and on every entry of a root ledger’s child_portfolio, so a portfolio loop reads the whole account’s scope from the ledger read it already makes. It is always present — [] when nothing is declared.
The write is REST-only and has no MCP tool, so an agent can read the campaigns it may act on and cannot widen that set. Scope is declared by the system that owns the mapping.
Declaring scope also decides where the resulting approvals live. A campaign lifecycle call — pausing a campaign, changing its daily budget — names the campaign and nothing else, so the approval it files is placed on the workstream that declared that campaign as its scope. It then appears under erdo approvals list --workstream <slug>, and --scope always_this_workstream on that approval grants standing authority for that action within that workstream only. A campaign no workstream declares still files its approval as normal; it simply belongs to no workstream. So does a campaign two workstreams both declare — where the answer is ambiguous, Erdo leaves the approval unplaced rather than guessing between them.

Scope work and authority

The shared Work feed and approval list accept an exact workstream slug:
MCP and REST use workstream_slug on erdo_list_activity_feed, erdo_list_approvals, GET /v1/activity/feed, and GET /v1/approvals. Exact scope is applied before pagination, so unrelated urgent or organization-level items cannot displace matching work. always_this_workstream creates a standing approval policy for that action and its parameter constraints on this workstream only. It does not grant authority to another workstream, and all provider writes continue through the existing approval system.