Ownership and review
The development portfolio owns the recommendation cards and compares opportunities across its declared campaign children. Campaign interventions keep that same card home and name the campaign as execution owner. A campaign ledger exposes its actualparent_portfolio references for this handoff; it cannot create a second hidden
recommendation under the campaign.
An operator suggestion may start as portfolio research. Before preparation, curation can bind that same card to the appropriate declared campaign child while retaining completed root research. Active research must settle first; preparation freezes the binding. A campaign-bound card cannot switch to another campaign.
Each execution owner retains its own scope and finite automation allowance.
Recommendations do not create a workstream, scheduler or second assignment engine.
The existing reconciliation pass consumes the recommendations and review cursor
in its ledger. Broad opportunity discovery is due weekly, or earlier when material
evidence changes. Existing requests and returned work continue on each pass. A
completed review can produce zero new ideas. At most three opportunities without
linked work can await a start; saving a research request does not evade that cap.
Sources are retained, scoped Knowledge packets or pages. Live datasets supply
research inputs; query findings are retained in the packet. The server pins source
content and rereads that basis before private test preparation. Draft research can
justify investigation; test readiness needs an approved factual source or the exact
accepted research result. A method is not factual evidence or a performance forecast.
Research, preparation and approval are different facts
Suggest saves an input. Research and Prepare save durable intent and wake the declaring coordinator; they do not prove that a worker started. The coordinator uses the existing assignment engine and reviews actual returned handles. Completed work is not automatically accepted. Research and preparation keep separate assignment links. Dispatch uses the exact server-issuedresearch_dispatch_key or preparation_dispatch_key. Native dispatch
atomically attaches the assignment and increments the card revision; reread it
after dispatch. A legacy explicit link specifies
assignment_phase: "research" or "prepare". Repeating a current request
reuses work. An explicit retry after terminal failure or rejection creates a new
phase generation while retaining earlier links in history.
Preparation produces a concrete private proposal, including scope, treatment,
measurement, duration, limits and stopping conditions. Accepted preparation can
request the existing native approval workflow, but the root coordinator cannot file
a child provider approval under the root’s approval context. request_approval
creates the server’s execution_generation and execution_dispatch_key; it is
durable intent, not execution. The root dispatches the third native execute
assignment to the exact ExecutionWorkstreamID with that key, the native
expected_result_kind: "action_request", the unchanged accepted preparation
packet and the child’s finite allowance. Native dispatch atomically attaches the
actual execution assignment; a legacy explicit link uses
assignment_phase: "execute" with the fresh revision. The detached worker uses the exact child scope and
existing approval gates, which pause and resume it; the root never repeats the
provider tool. No child recurring heartbeat or second assignment engine is needed.
approval_id names an actual approval request from this recommendation’s scoped
execution run, not a decision identifier. An unrelated approval from the same
campaign cannot establish this recommendation’s progress.
The canonical projection discovers all approvals for the exact execute attempts,
organization and execution workstream using the native exact-run association.
A partial failed batch may recover only when every recorded member has a known terminal outcome; failure can otherwise hide an in-flight or unknown write. Earlier successful receipts are retained and must not be replayed.
Every discovered approval must have a succeeded receipt and the execute assignment
must be completed and accepted before execution is succeeded. Zero approvals or an
approved-only state never proves execution. Retries remain bounded and a failed
partial provider write is never auto-replayed as a duplicate execution. Existing
executor tools, approval runner, and native assignment review/result receipts own
the workflow. Approval, confirmed execution, and experiment measurement remain
separate; a saved setting or research allowance grants no media spend or provider
write authority.
The returned stage is derived from real linked assignments, all discovered approval
and execution receipts, and experiment records. A successful execution also needs
post-execution primary-metric evidence for an elapsed window ending before the
experiment decision, from an actually readable, scoped retained Knowledge packet,
with the observed outcome. A fabricated source identifier or a future window cannot
establish measurement. Missing measurements remain unknown or
inconclusive; a completed run or approved request is not a measured win.
Recovering failed execution
An in-flight or queued worker recovers through the native assignment. Terminal failed, cancelled or rejected execution needs an explicit recovery reason and finite allowance before another generation can be requested. Pending approvals and active tests must first be resolved. Earlier assignments and actual approvals remain available inprevious_executions.
Read actual provider state and earlier receipts before retrying; successful writes
must not be repeated. A materially different treatment needs changed-evidence
reconsideration and fresh preparation. Recovery intent never grants spending or
provider authority; the worker still reaches the native gates.
Decision memory
Pass retains its actor, optional reason and pinned source basis. It cannot cancel active work implicitly. Rewording a title, changing source order or checking again does not reopen it. Reconsideration requires the current revision, changed pinned evidence and an explicit explanation; it returns to research.API, MCP and CLI
Readrecommendations and recommendation_review from
GET /v1/workstreams/:workstreamSlug/ledger. The ledger also exposes outstanding
assignment reservations separately from spent allowance.
Write through POST /v1/workstreams/:workstreamSlug/recommendations. Actions are
suggest, curate, research, prepare, request_approval, pass, reconsider,
link and complete_review. Existing-record mutations require expected_revision.
Organization, actor and source readiness are derived by the server.
The MCP tool is erdo_manage_workstream_recommendations with
{workstream_slug, input}. The CLI reads the same ledger and sends an exact JSON
mutation file:
measurement_evidence on the recommendation. The source is hydrated and
pinned, and must have been created after the observed window. This joins existing
readings without manufacturing another observation; a changed source needs
reassessment. Explicitly inconclusive experiment decisions remain inconclusive.
