AllocatorRecommendation is the allocator's whole read-only output for a
· object
workstream: a per-bet action + posterior, plus the budget envelope it fit the recommendation inside. Deterministic — same ledger in, same recommendation out.
AssignmentSummary is one bounded responsibility as a coordinator reads it:
· object[]
the latest worker did about each piece of it. It rides in the ledger read for the same reason the standing decisions do: a pass that had to remember to go and look would eventually not, and the states that need a coordinator specifically — a submission nobody has reviewed, work whose worker died — are invisible in every other part of this read. list_assignments remains the drill-in; this is the overview a pass gets without asking.
JudgeCalibrationStats is one judge's track record: how often its predictions
· object[]
trust dial the loop uses to weight kills and screening. Empty until judges have made forecasts reality later measured. Each entry also carries its residual stream (misordered_examples) — the seed the loop hands to judge generation when a persistent disagreement pattern emerges.
DecisionSummary is the compact projection of one decision that both a
· object[]
unexpired standing commitments no later decision has superseded, plus the one_shot authorizations whose work is still in flight. They are loaded here, with the ledger, rather than left to a search the model may not run — an agent that has to remember to look up what the organization already decided is an agent that will eventually recommend the opposite of it.
LapsedDecisions contains expired, unsuperseded commitments awaiting review. RecentDecisions is the surrounding history, current and lapsed rows excluded: what was proposed, refused, replaced, failed, or authorized and since carried out. Context for the agent's reasoning, never a commitment it should continue.
ExperimentDefect is one human "this variant is broken" verdict from the ledger
· object[]
ledger — the seeded complement to the misordered_examples each judge carries. A defect costs no conversion, so the residual stream can never surface it; the loop reads these alongside misordered_examples so judge generation can propose a lens for a failure only a human eye caught. Bounded per read.
AttentionItem is one thing the engine wants a human to see or answer,
· object[]
this workstream declared in its external refs, filed by anything other than this workstream — in practice the organization's monitors. A monitor files against the organization because it cannot know a workstream exists, so without this the pass never reads a finding about a campaign it manages. Open items plus the recent window, newest first, no digests.
DecisionSummary is the compact projection of one decision that both a
· object[]
last four weeks that no workstream filed, such as a campaign setting changed from a chat. The workstream-scoped lists above never include them, and a pass reads them before it explains a movement in its numbers.
this project: how many measured bets skipped judge screening vs. were screened. The loop watches the split to keep the random arm alive (roughly one in ten) so it can price what the judges cost.
AttentionItem is one thing the engine wants a human to see or answer,
· object[]
that a human (or the expiry safe-default) resolved within the recent window. The loop reads these to act on ANSWERS to the escalations/choices it asked — a self-reconciling pass must be able to read back the human's reply, not just re-ask. Carries the answer + applied safe_default; newest first.
Workstream represents a piece of business work in motion.
· object
Operational state machine for multi-step work (campaign launches, reports, monitors).
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Erdo Docs","colors":{"primary":"#008b1d","light":"#84bf88","dark":"#007c10"},"logo":{"light":"https://mintcdn.com/erdoai/a0Yf-u_wE-IxMDL6/logo/light.png?fit=max\u0026auto=format\u0026n=a0Yf-u_wE-IxMDL6\u0026q=85\u0026s=87480ed4521e74bd7996b5c35e23c346","dark":"https://mintcdn.com/erdoai/a0Yf-u_wE-IxMDL6/logo/dark.png?fit=max\u0026auto=format\u0026n=a0Yf-u_wE-IxMDL6\u0026q=85\u0026s=0db855b87e16887e9aeb3059fbf75f99"},"favicon":"https://mintcdn.com/erdoai/O_YT_Nxge5MHHZ8y/favicon.png?fit=max\u0026auto=format\u0026n=O_YT_Nxge5MHHZ8y\u0026q=85\u0026s=88f0d650ce929194af21b33be4594ecd","navbar":{"links":[{"href":"https://erdo.ai","label":"Platform"}],"primary":{"type":"button","label":"Get Started","href":"https://erdo.ai/signup"}},"footer":{"socials":{"github":"https://github.com/erdoai","linkedin":"https://linkedin.com/company/erdo-ai"}},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"erdoai","hasAudioNarration":false,"actualSubdomain":"erdoai","customDomains":["docs.erdo.ai"],"gitSource":{"type":"github","owner":"erdoai","repo":"erdo","deployBranch":"main","contentDirectory":"docs-public","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adc9a4a2892a8a2da11d4f2","collectionId":"54104034-bb98-4786-a14d-ccc9afdf69ee","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adc9a4a2892a8a2da11d4f2"},"entitlements":{},"buildId":"6adc9a4a2892a8a2da11d4f2","clientVersion":"0.0.3964","searchFilterCounts":[{"language":"default","tag":"API Reference","count":548},{"language":"default","tag":"Developers","count":320},{"language":"default","tag":"Product","count":55},{"language":"default","tag":"Features","count":43},{"language":"default","tag":"Platform API","count":39},{"language":"default","tag":"Get started","count":7},{"language":"default","tag":"Connect Erdo","count":5},{"language":"default","tag":"TypeScript SDK","count":5},{"language":"default","tag":"Build apps","count":1},{"language":"default","tag":"Python SDK","count":1}]},"assistantConfig":{},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators","slug":"/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators","pageMetadata":{"title":"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator's\n","description":"single ledger read (budget, experiments + observations, calibration, steering notes, attention items, allocator recommendation).\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/workstreams/{workstreamSlug}/ledger","href":"/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"single ledger read (budget, experiments + observations, calibration, steering notes, attention items, allocator recommendation).\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator's\n","description":"single ledger read (budget, experiments + observations, calibration, steering notes, attention items, allocator recommendation).\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/workstreams/{workstreamSlug}/ledger","href":"/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"single ledger read (budget, experiments + observations, calibration, steering notes, attention items, allocator recommendation).\n","operationId":"GET:mcp.ReadWorkstreamLedgerAPI","parameters":["4ac1c128-d5c7-40b1-8935-46a8126991f7","69cd6946-6b29-4a56-82f4-aca0b2021251"],"responses":{"200":"4929a24c-40a7-4bf9-8a42-64a7ff232d74","default":"88199270-ddbb-4409-be6a-054e72ac5418"},"summary":"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator's\n","method":"get","type":"path","servers":["25229d51-4af5-48c1-9f4c-aa490e05e71b"],"security":["87ded638-1a4c-4e27-bc39-d45352300008"],"path":"/v1/workstreams/{workstreamSlug}/ledger","baseUrlOptions":["https://api.erdo.ai"],"title":"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator's\n","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"4ac1c128-d5c7-40b1-8935-46a8126991f7":{"allowEmptyValue":true,"explode":false,"in":"path","name":"workstreamSlug","required":true,"schema":{"type":"string","isRequired":true,"uniqueKey":"","typeLabel":"string"},"style":"simple"},"69cd6946-6b29-4a56-82f4-aca0b2021251":{"allowEmptyValue":true,"explode":true,"in":"query","name":"observations_per_experiment","required":false,"schema":{"format":"int32","maximum":2147483647,"minimum":-2147483648,"type":"integer","isRequired":false,"uniqueKey":"","typeLabel":"integer\u003cint32>"},"style":"form"}},"responses":{"4929a24c-40a7-4bf9-8a42-64a7ff232d74":{"content":{"application/json":{"schema":{"properties":{"allocator_recommendation":{"description":"workstream: a per-bet action + posterior, plus the budget envelope it fit the recommendation inside. Deterministic — same ledger in, same recommendation out.\n","properties":{"bets":{"items":{"description":"active experiment. Action is fund | hold | kill\\_candidate | lottery\\_slot | champion\\_trial; Rationale is one machine-written sentence naming the discipline that produced it. The posterior fields make the value estimate inspectable: which source produced it (reality vs a judge prior), its mean/stddev, the attributable cost, and the resulting value-per-cost — so a human (or the agent) can see WHY the action was recommended, not just what.\n","properties":{"action":{"type":"string","uniqueKey":"allocator_recommendation.bets.items.[INDEX].action","typeLabel":"string"},"champion_judge":{"type":"string","uniqueKey":"allocator_recommendation.bets.items.[INDEX].champion_judge","typeLabel":"string"},"cost_attributed":{"title":"false = nominal fallback cost, not itemized spend\n","type":"boolean","uniqueKey":"allocator_recommendation.bets.items.[INDEX].cost_attributed","typeLabel":"boolean"},"cost_millicents":{"title":"Cost + value-per-cost (value / attributable spend, floored so it's finite).\n","type":"number","uniqueKey":"allocator_recommendation.bets.items.[INDEX].cost_millicents","typeLabel":"number"},"experiment_slug":{"type":"string","uniqueKey":"allocator_recommendation.bets.items.[INDEX].experiment_slug","typeLabel":"string"},"has_reality":{"title":"reality measured the primary metric for this bet\n","type":"boolean","uniqueKey":"allocator_recommendation.bets.items.[INDEX].has_reality","typeLabel":"boolean"},"judge_standing":{"description":"floor test's input (reality rank when measured, else calibrated-judge-weighted win fraction). ChampionJudge names the calibrated dissenting judge when the action is champion\\_trial.\n","title":"JudgeStanding is the bet's position in its experiment's field in [0,1] — the\n","type":"number","uniqueKey":"allocator_recommendation.bets.items.[INDEX].judge_standing","typeLabel":"number"},"posterior_source":{"title":"reality | judge_prior | uninformed\n","type":"string","uniqueKey":"allocator_recommendation.bets.items.[INDEX].posterior_source","typeLabel":"string"},"rationale":{"type":"string","uniqueKey":"allocator_recommendation.bets.items.[INDEX].rationale","typeLabel":"string"},"value_mean":{"title":"Value posterior over the experiment's primary metric.\n","type":"number","uniqueKey":"allocator_recommendation.bets.items.[INDEX].value_mean","typeLabel":"number"},"value_per_cost_mean":{"type":"number","uniqueKey":"allocator_recommendation.bets.items.[INDEX].value_per_cost_mean","typeLabel":"number"},"value_per_cost_stddev":{"type":"number","uniqueKey":"allocator_recommendation.bets.items.[INDEX].value_per_cost_stddev","typeLabel":"number"},"value_stddev":{"type":"number","uniqueKey":"allocator_recommendation.bets.items.[INDEX].value_stddev","typeLabel":"number"},"variant_key":{"type":"string","uniqueKey":"allocator_recommendation.bets.items.[INDEX].variant_key","typeLabel":"string"}},"title":"BetAllocation is the allocator's recommendation for one bet — one variant of one\n","type":"object","uniqueKey":"allocator_recommendation.bets.items.[INDEX]","typeLabel":"BetAllocation is the allocator's recommendation for one bet — one variant of one\n · object"},"type":"array","uniqueKey":"allocator_recommendation.bets","typeLabel":"BetAllocation is the allocator's recommendation for one bet — one variant of one\n · object[]"},"budget_exhausted":{"type":"boolean","uniqueKey":"allocator_recommendation.budget_exhausted","typeLabel":"boolean"},"notes":{"description":"weigh alongside the per-bet actions.\n","items":{"type":"string","uniqueKey":"allocator_recommendation.notes.items.[INDEX]","typeLabel":"string"},"title":"Notes carries workstream-level remarks (e.g. budget exhausted) the agent should\n","type":"array","uniqueKey":"allocator_recommendation.notes","typeLabel":"string[]"},"remaining_millicents":{"description":"against (nil = unlimited budget, no budget gate). BudgetExhausted is true when a bounded envelope is already spent, so nothing new can be funded this pass.\n","format":"int64","title":"RemainingMillicents is the envelope headroom the recommendation reserved\n","type":"integer","uniqueKey":"allocator_recommendation.remaining_millicents","typeLabel":"integer\u003cint64>"}},"title":"AllocatorRecommendation is the allocator's whole read-only output for a\n","type":"object","uniqueKey":"allocator_recommendation","typeLabel":"AllocatorRecommendation is the allocator's whole read-only output for a\n · object"},"assignments":{"description":"the latest worker did about each piece of it. It rides in the ledger read for the same reason the standing decisions do: a pass that had to remember to go and look would eventually not, and the states that need a coordinator specifically — a submission nobody has reviewed, work whose worker died — are invisible in every other part of this read. list\\_assignments remains the drill-in; this is the overview a pass gets without asking.\n","items":{"description":"what it is for, where the supervisor thinks it stands, where its RESULT stands, and what the latest worker did about it. The two state axes ride together because they answer different questions — a completed assignment carrying a rejected result is a true row, and one field could not say so.\n","properties":{"acceptance_criteria":{"type":"string","uniqueKey":"assignments.items.[INDEX].acceptance_criteria","typeLabel":"string"},"adoption_state":{"type":"string","uniqueKey":"assignments.items.[INDEX].adoption_state","typeLabel":"string"},"assigned_agent_key":{"type":"string","uniqueKey":"assignments.items.[INDEX].assigned_agent_key","typeLabel":"string"},"created_at":{"format":"date-time","type":"string","uniqueKey":"assignments.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"expected_result_kind":{"type":"string","uniqueKey":"assignments.items.[INDEX].expected_result_kind","typeLabel":"string"},"id":{"format":"uuid","type":"string","uniqueKey":"assignments.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"latest_attempt":{"type":"object","title":"LatestAttempt is the most recent worker's go at it, absent on work nothing\n","description":"has attempted yet.\n","properties":{"affected_output":{"type":"string","uniqueKey":"assignments.items.[INDEX].latest_attempt.affected_output","typeLabel":"string"},"agent_run_id":{"format":"uuid","type":"string","uniqueKey":"assignments.items.[INDEX].latest_attempt.agent_run_id","typeLabel":"string\u003cuuid>"},"attempt_number":{"format":"int64","type":"integer","uniqueKey":"assignments.items.[INDEX].latest_attempt.attempt_number","typeLabel":"integer\u003cint64>"},"ended_at":{"format":"date-time","type":"string","uniqueKey":"assignments.items.[INDEX].latest_attempt.ended_at","typeLabel":"string\u003cdate-time>"},"handles":{"description":"the revision the worker produced. This is what a reviewer validates and what an acceptance attaches; the summary is only how the worker described it.\n","items":{"description":"service owns, as a dispatching producer declares it. It mirrors the handle the funnel stores, and it is what replaces \"the worker can read the parent's transcript\": an assignment attempted a week after its coordinator exited has no transcript to inherit, so every input it works from is named here. RevisionRef pins content that can change, so the worker and the coordinator who judges its result are looking at the same thing.\n","properties":{"resource_id":{"type":"string","uniqueKey":"assignments.items.[INDEX].latest_attempt.handles.items.[INDEX].resource_id","typeLabel":"string"},"resource_type":{"type":"string","uniqueKey":"assignments.items.[INDEX].latest_attempt.handles.items.[INDEX].resource_type","typeLabel":"string"},"revision_ref":{"type":"string","uniqueKey":"assignments.items.[INDEX].latest_attempt.handles.items.[INDEX].revision_ref","typeLabel":"string"}},"title":"AssignmentResourceHandleInput is one typed pointer at something a domain\n","type":"object","uniqueKey":"assignments.items.[INDEX].latest_attempt.handles.items.[INDEX]","typeLabel":"AssignmentResourceHandleInput is one typed pointer at something a domain\n · object"},"title":"Handles are the domain objects the submission consists of, each pinned to\n","type":"array","uniqueKey":"assignments.items.[INDEX].latest_attempt.handles","typeLabel":"AssignmentResourceHandleInput is one typed pointer at something a domain\n · object[]"},"result_kind":{"description":"unaltered beside the assignment's expected\\_result\\_kind rather than reconciled with it, so a reviewer can see that the two disagree — which is a fact about the submission and often the reason to reject it.\n","title":"ResultKind is what the worker BELIEVES it produced, as declared. Carried\n","type":"string","uniqueKey":"assignments.items.[INDEX].latest_attempt.result_kind","typeLabel":"string"},"state":{"type":"string","uniqueKey":"assignments.items.[INDEX].latest_attempt.state","typeLabel":"string"},"summary":{"description":"attempt submitted. It is never the result itself: a summary that could stand in for the work would let an unverified sentence become current state.\n","title":"Summary is the submitted result's bounded description, present once the\n","type":"string","uniqueKey":"assignments.items.[INDEX].latest_attempt.summary","typeLabel":"string"},"terminal_cause":{"type":"string","uniqueKey":"assignments.items.[INDEX].latest_attempt.terminal_cause","typeLabel":"string"},"terminal_reason":{"type":"string","uniqueKey":"assignments.items.[INDEX].latest_attempt.terminal_reason","typeLabel":"string"}},"uniqueKey":"assignments.items.[INDEX].latest_attempt","typeLabel":"LatestAttempt is the most recent worker's go at it, absent on work nothing\n · object"},"objective":{"type":"string","uniqueKey":"assignments.items.[INDEX].objective","typeLabel":"string"},"reason":{"type":"string","uniqueKey":"assignments.items.[INDEX].reason","typeLabel":"string"},"slug":{"type":"string","uniqueKey":"assignments.items.[INDEX].slug","typeLabel":"string"},"work_state":{"type":"string","uniqueKey":"assignments.items.[INDEX].work_state","typeLabel":"string"},"work_state_reason":{"type":"string","uniqueKey":"assignments.items.[INDEX].work_state_reason","typeLabel":"string"}},"title":"AssignmentSummary is one bounded responsibility as a coordinator reads it:\n","type":"object","uniqueKey":"assignments.items.[INDEX]","typeLabel":"AssignmentSummary is one bounded responsibility as a coordinator reads it:\n · object"},"title":"Assignments is the durable work this workstream has outstanding, and what\n","type":"array","uniqueKey":"assignments","typeLabel":"AssignmentSummary is one bounded responsibility as a coordinator reads it:\n · object[]"},"calibration":{"description":"trust dial the loop uses to weight kills and screening. Empty until judges have made forecasts reality later measured. Each entry also carries its residual stream (misordered\\_examples) — the seed the loop hands to judge generation when a persistent disagreement pattern emerges.\n","items":{"description":"were later measured, and how often it ordered variants the way reality did. Pairwise agreement is the trust signal — it covers both prediction rows (two forecasts imply an ordering) and comparison rows (an explicit ordering) uniformly, against reality's ordering from the measured metric\\_reads.\n","properties":{"agreed_pairs":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].agreed_pairs","typeLabel":"integer\u003cint64>"},"by_artifact_kind":{"additionalProperties":{"description":"the \"trust region\" the input-dependent gate reads (Kennedy–O'Hagan): a judge is trusted to block a build only within an artifact kind its forecasts have been validated on. The Effective\\* fields mirror the top-level hierarchical estimate but scoped to this ONE kind: kind-local pairs shrunk toward this kind's platform prior. A kind with no local or platform evidence has zero effective pairs, so the gate treats the judge as advisory there — exactly like an uncalibrated judge.\n","properties":{"agreed_pairs":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].by_artifact_kind.additionalProperties.agreed_pairs","typeLabel":"integer\u003cint64>"},"comparable_pairs":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].by_artifact_kind.additionalProperties.comparable_pairs","typeLabel":"integer\u003cint64>"},"effective_agreement":{"type":"number","uniqueKey":"calibration.items.[INDEX].by_artifact_kind.additionalProperties.effective_agreement","typeLabel":"number"},"effective_pairs":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].by_artifact_kind.additionalProperties.effective_pairs","typeLabel":"integer\u003cint64>"},"paired_predictions":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].by_artifact_kind.additionalProperties.paired_predictions","typeLabel":"integer\u003cint64>"},"pairwise_agreement_rate":{"type":"number","uniqueKey":"calibration.items.[INDEX].by_artifact_kind.additionalProperties.pairwise_agreement_rate","typeLabel":"number"},"platform_agreement":{"description":"(app-level default judges only; zero for org-authored judges, which never pool). EffectiveAgreement / EffectivePairs are the kind-scoped hierarchical estimate — the (rate, sample) the gate scores via TrustAgreementForKind.\n","title":"PlatformAgreement / PlatformPairs are this kind's pooled prior across every org\n","type":"number","uniqueKey":"calibration.items.[INDEX].by_artifact_kind.additionalProperties.platform_agreement","typeLabel":"number"},"platform_pairs":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].by_artifact_kind.additionalProperties.platform_pairs","typeLabel":"integer\u003cint64>"},"total_predictions":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].by_artifact_kind.additionalProperties.total_predictions","typeLabel":"integer\u003cint64>"}},"title":"JudgeCalibrationKindStats is the per-artifact-kind slice of a judge's record —\n","type":"object","uniqueKey":"calibration.items.[INDEX].by_artifact_kind.additionalProperties","typeLabel":"JudgeCalibrationKindStats is the per-artifact-kind slice of a judge's record —\n · object"},"description":"details\\_json->>'artifact\\_kind' tag, when judges set it (e.g. landing\\_page vs dashboard). Empty when no prediction carried a kind.\n","title":"ByArtifactKind breaks the prediction-derived stats out by the\n","type":"object","uniqueKey":"calibration.items.[INDEX].by_artifact_kind","typeLabel":"ByArtifactKind breaks the prediction-derived stats out by the\n · object"},"by_grounding_source":{"additionalProperties":{"description":"the \"trust region\" the input-dependent gate reads (Kennedy–O'Hagan): a judge is trusted to block a build only within an artifact kind its forecasts have been validated on. The Effective\\* fields mirror the top-level hierarchical estimate but scoped to this ONE kind: kind-local pairs shrunk toward this kind's platform prior. A kind with no local or platform evidence has zero effective pairs, so the gate treats the judge as advisory there — exactly like an uncalibrated judge.\n","properties":{"agreed_pairs":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].by_grounding_source.additionalProperties.agreed_pairs","typeLabel":"integer\u003cint64>"},"comparable_pairs":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].by_grounding_source.additionalProperties.comparable_pairs","typeLabel":"integer\u003cint64>"},"effective_agreement":{"type":"number","uniqueKey":"calibration.items.[INDEX].by_grounding_source.additionalProperties.effective_agreement","typeLabel":"number"},"effective_pairs":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].by_grounding_source.additionalProperties.effective_pairs","typeLabel":"integer\u003cint64>"},"paired_predictions":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].by_grounding_source.additionalProperties.paired_predictions","typeLabel":"integer\u003cint64>"},"pairwise_agreement_rate":{"type":"number","uniqueKey":"calibration.items.[INDEX].by_grounding_source.additionalProperties.pairwise_agreement_rate","typeLabel":"number"},"platform_agreement":{"description":"(app-level default judges only; zero for org-authored judges, which never pool). EffectiveAgreement / EffectivePairs are the kind-scoped hierarchical estimate — the (rate, sample) the gate scores via TrustAgreementForKind.\n","title":"PlatformAgreement / PlatformPairs are this kind's pooled prior across every org\n","type":"number","uniqueKey":"calibration.items.[INDEX].by_grounding_source.additionalProperties.platform_agreement","typeLabel":"number"},"platform_pairs":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].by_grounding_source.additionalProperties.platform_pairs","typeLabel":"integer\u003cint64>"},"total_predictions":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].by_grounding_source.additionalProperties.total_predictions","typeLabel":"integer\u003cint64>"}},"title":"JudgeCalibrationKindStats is the per-artifact-kind slice of a judge's record —\n","type":"object","uniqueKey":"calibration.items.[INDEX].by_grounding_source.additionalProperties","typeLabel":"JudgeCalibrationKindStats is the per-artifact-kind slice of a judge's record —\n · object"},"description":"prediction was made by an AUTHORED persona (brand-brief cohort) or a MEASURED one (grounded from real sessions) — keyed \"authored\"/\"measured\". This is the acceptance test for persona grounding v1: grounded personas must out-agree authored ones. Populated only for persona judges when the caller supplied the measured-hash set; empty otherwise.\n","title":"ByGroundingSource splits this judge's pairwise agreement by whether the\n","type":"object","uniqueKey":"calibration.items.[INDEX].by_grounding_source","typeLabel":"ByGroundingSource splits this judge's pairwise agreement by whether the\n · object"},"comparable_pairs":{"description":"where BOTH the judge and reality expressed an ordering; AgreedPairs is how many the judge got right. PairwiseAgreementRate = AgreedPairs/ComparablePairs (0 when there are no comparable pairs yet).\n","format":"int64","title":"ComparablePairs is the number of variant pairs (within one experiment)\n","type":"integer","uniqueKey":"calibration.items.[INDEX].comparable_pairs","typeLabel":"integer\u003cint64>"},"direct_pairs":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].direct_pairs","typeLabel":"integer\u003cint64>"},"effective_agreement":{"description":"platform prior adjusted by this org's local pairs as they accumulate. With zero local pairs it equals the platform rate; with many it converges to the org-local rate (a divergent org overrides the prior once it has the evidence). EffectivePairs is the combined sample size behind it (capped platform prior + local pairs) — the sample count the trust gate reads. See HierarchicalAgreement.\n","title":"EffectiveAgreement is the hierarchical (Beta-binomial shrinkage) estimate: the\n","type":"number","uniqueKey":"calibration.items.[INDEX].effective_agreement","typeLabel":"number"},"effective_pairs":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].effective_pairs","typeLabel":"integer\u003cint64>"},"judge_slug":{"type":"string","uniqueKey":"calibration.items.[INDEX].judge_slug","typeLabel":"string"},"misordered_examples":{"description":"of variant pairs where reality's measured ordering disagreed with the judge's (the surprises). These are the seed for judge GENERATION: a new judge is proposed to catch the failure these examples name. Capped per judge (judge generation wants the head of the stream, not its full history).\n","items":{"description":"preferred JudgeWinner over RealityWinner, but reality's measured Metric ranked RealityWinner higher. It is grounded — every field is a recomputable fact about what was measured, never a guess — so a judge proposed from it anchors to checkable reality, the anti-Goodhart property the meta loop depends on.\n","properties":{"experiment_run_id":{"type":"string","uniqueKey":"calibration.items.[INDEX].misordered_examples.items.[INDEX].experiment_run_id","typeLabel":"string"},"judge_winner":{"type":"string","uniqueKey":"calibration.items.[INDEX].misordered_examples.items.[INDEX].judge_winner","typeLabel":"string"},"judge_winner_value":{"type":"number","uniqueKey":"calibration.items.[INDEX].misordered_examples.items.[INDEX].judge_winner_value","typeLabel":"number"},"metric":{"type":"string","uniqueKey":"calibration.items.[INDEX].misordered_examples.items.[INDEX].metric","typeLabel":"string"},"reality_winner":{"type":"string","uniqueKey":"calibration.items.[INDEX].misordered_examples.items.[INDEX].reality_winner","typeLabel":"string"},"reality_winner_value":{"type":"number","uniqueKey":"calibration.items.[INDEX].misordered_examples.items.[INDEX].reality_winner_value","typeLabel":"number"}},"title":"JudgeMisorderedPair is one residual: within one decided experiment the judge\n","type":"object","uniqueKey":"calibration.items.[INDEX].misordered_examples.items.[INDEX]","typeLabel":"JudgeMisorderedPair is one residual: within one decided experiment the judge\n · object"},"title":"MisorderedExamples is the residual stream for this judge — a bounded sample\n","type":"array","uniqueKey":"calibration.items.[INDEX].misordered_examples","typeLabel":"JudgeMisorderedPair is one residual: within one decided experiment the judge\n · object[]"},"paired_predictions":{"description":"metric\\_read on the same (experiment\\_run, variant\\_key) — i.e. reality eventually spoke on that forecast. DirectPairs is the further subset where the measured metric\\_name matched the forecast's (a value-vs-value pair, not only a ranking pair).\n","format":"int64","title":"PairedPredictions is the subset of predictions that have a later\n","type":"integer","uniqueKey":"calibration.items.[INDEX].paired_predictions","typeLabel":"integer\u003cint64>"},"pairwise_agreement_rate":{"type":"number","uniqueKey":"calibration.items.[INDEX].pairwise_agreement_rate","typeLabel":"number"},"platform_agreement":{"description":"These three fields are populated ONLY for app-level default judges (the NULL-org seeded lenses Erdo ships). An org-authored judge's record stays org-private and never pools, so they are zero for it.\n\nPlatformAgreement / PlatformPairs are the judge's agreement rate and paired count POOLED across every org — statistics only, never verdict content and never an org identifier (see the platform-calibration privacy contract). They let a default judge's trust cold-start from the whole platform's record while a new org has zero local pairs.\n","title":"--- hierarchical (platform-pooled) calibration ---\n","type":"number","uniqueKey":"calibration.items.[INDEX].platform_agreement","typeLabel":"number"},"platform_pairs":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].platform_pairs","typeLabel":"integer\u003cint64>"},"random_arm_pairs":{"description":"against a variant that reached reality via the random arm (a bet flagged random\\_arm=true, i.e. one that skipped judge screening and went to reality anyway — see the meta loop). The permanent random arm is how the engine measures what the judges cost: a judge's agreement over bets it did NOT gate is its track record on the counterfactual the screened path can never show.\n","format":"int64","title":"RandomArmPairs is how many of this judge's ComparablePairs were scored\n","type":"integer","uniqueKey":"calibration.items.[INDEX].random_arm_pairs","typeLabel":"integer\u003cint64>"},"total_comparisons":{"format":"int64","type":"integer","uniqueKey":"calibration.items.[INDEX].total_comparisons","typeLabel":"integer\u003cint64>"},"total_predictions":{"description":"judge across the scanned ledger.\n","format":"int64","title":"TotalPredictions / TotalComparisons are raw row counts attributed to this\n","type":"integer","uniqueKey":"calibration.items.[INDEX].total_predictions","typeLabel":"integer\u003cint64>"}},"title":"JudgeCalibrationStats is one judge's track record: how often its predictions\n","type":"object","uniqueKey":"calibration.items.[INDEX]","typeLabel":"JudgeCalibrationStats is one judge's track record: how often its predictions\n · object"},"title":"Calibration is the per-judge track record over this project's ledger — the\n","type":"array","uniqueKey":"calibration","typeLabel":"JudgeCalibrationStats is one judge's track record: how often its predictions\n · object[]"},"child_portfolio":{"description":"It is deliberately one level deep: portfolio supervision does not require an unbounded graph traversal.\n","items":{"description":"uses to supervise its direct child workstreams without recursively walking the resource graph.\n","properties":{"experiment_count":{"format":"int64","type":"integer","uniqueKey":"child_portfolio.items.[INDEX].experiment_count","typeLabel":"integer\u003cint64>"},"open_attention_count":{"format":"int64","type":"integer","uniqueKey":"child_portfolio.items.[INDEX].open_attention_count","typeLabel":"integer\u003cint64>"},"resources":{"items":{"properties":{"created_at":{"format":"date-time","type":"string","uniqueKey":"child_portfolio.items.[INDEX].resources.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"id":{"format":"uuid","type":"string","uniqueKey":"child_portfolio.items.[INDEX].resources.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"phase_id":{"format":"uuid","type":"string","uniqueKey":"child_portfolio.items.[INDEX].resources.items.[INDEX].phase_id","typeLabel":"string\u003cuuid>"},"relationship_type":{"type":"string","uniqueKey":"child_portfolio.items.[INDEX].resources.items.[INDEX].relationship_type","typeLabel":"string"},"resource_id":{"format":"uuid","type":"string","uniqueKey":"child_portfolio.items.[INDEX].resources.items.[INDEX].resource_id","typeLabel":"string\u003cuuid>"},"resource_type":{"type":"string","uniqueKey":"child_portfolio.items.[INDEX].resources.items.[INDEX].resource_type","typeLabel":"string"},"title":{"type":"string","uniqueKey":"child_portfolio.items.[INDEX].resources.items.[INDEX].title","typeLabel":"string"},"workstream_id":{"format":"uuid","type":"string","uniqueKey":"child_portfolio.items.[INDEX].resources.items.[INDEX].workstream_id","typeLabel":"string\u003cuuid>"}},"title":"WorkstreamResource is a typed link from a workstream to another domain object.\n","type":"object","uniqueKey":"child_portfolio.items.[INDEX].resources.items.[INDEX]","typeLabel":"WorkstreamResource is a typed link from a workstream to another domain object.\n · object"},"type":"array","uniqueKey":"child_portfolio.items.[INDEX].resources","typeLabel":"WorkstreamResource is a typed link from a workstream to another domain object.\n · object[]"},"running_experiment_count":{"format":"int64","type":"integer","uniqueKey":"child_portfolio.items.[INDEX].running_experiment_count","typeLabel":"integer\u003cint64>"},"workstream":{"description":"Operational state machine for multi-step work (campaign launches, reports, monitors).\n","properties":{"autonomy_mode":{"description":"(autopilot|propose|strict); nil inherits the org-level setting. The engine gate resolves effective mode = workstream ?? org ?? propose.\n","title":"AutonomyMode is this workstream's autonomy override\n","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.autonomy_mode","typeLabel":"string"},"completed_at":{"format":"date-time","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.completed_at","typeLabel":"string\u003cdate-time>"},"created_at":{"format":"date-time","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.created_at","typeLabel":"string\u003cdate-time>"},"description":{"type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.description","typeLabel":"string"},"escalation_budget_per_day":{"format":"int32","maximum":2147483647,"minimum":-2147483648,"type":"integer","uniqueKey":"child_portfolio.items.[INDEX].workstream.escalation_budget_per_day","typeLabel":"integer\u003cint32>"},"external_refs":{"description":"machine-readable answer to \"which campaigns is this managing?\". Always present (empty when nothing is declared) so a reader never has to tell \"governs nothing\" from \"field absent\". It rides along on every workstream read, including each entry of a root's ChildPortfolio, so a portfolio loop gets the whole account's scope from the ledger read it already makes.\n","items":{"description":"workstream governs.\n\nIt exists because \\`workstream\\_resource\\` cannot express this: that table keys on a uuid, and providers do not issue uuids — a Google Ads campaign is \\`24033607833\\`. With nowhere typed to put it, the only place scope could live was prose in a knowledge record, hand-mirrored from a mapping the job reading it could not see.\n\nEvery field is an opaque provider string. Erdo does not parse them, validate them against the provider, or dereference them; it stores what the owning consumer resolved and hands it back. That is deliberate — the consumer holds the evidence that produced the mapping, and a platform that second-guessed it would have to reimplement that evidence.\n","properties":{"account_id":{"description":"hold the same campaign id in different accounts, so a ref without it is not unique.\n","title":"AccountID is the provider's account/customer identifier. Two customers can\n","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.external_refs.items.[INDEX].account_id","typeLabel":"string"},"external_id":{"title":"ExternalID is the provider's own identifier for the object.\n","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.external_refs.items.[INDEX].external_id","typeLabel":"string"},"kind":{"description":"\"ad\\_group\". Free-form: providers keep inventing object types, and an allowlist here would need a platform release to track each one.\n","title":"Kind is what the id names within that provider, e.g. \"campaign\",\n","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.external_refs.items.[INDEX].kind","typeLabel":"string"},"label":{"description":"approval card can say \"Northline Residences - Wellness Led\" rather than a number. Never used for matching. The development is fictional on purpose: this comment is published verbatim into docs-public/api/openapi.json, so a real customer's campaign name here names that customer on docs.erdo.ai.\n","title":"Label is an optional human-readable name, carried so a log line or\n","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.external_refs.items.[INDEX].label","typeLabel":"string"},"provider":{"title":"Provider is the integration this ref belongs to, e.g. \"google_ads\".\n","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.external_refs.items.[INDEX].provider","typeLabel":"string"}},"title":"ExternalRef names one object in an external provider's account that a\n","type":"object","uniqueKey":"child_portfolio.items.[INDEX].workstream.external_refs.items.[INDEX]","typeLabel":"ExternalRef names one object in an external provider's account that a\n · object"},"title":"ExternalRefs are the provider-owned objects this workstream governs — the\n","type":"array","uniqueKey":"child_portfolio.items.[INDEX].workstream.external_refs","typeLabel":"ExternalRef names one object in an external provider's account that a\n · object[]"},"id":{"format":"uuid","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.id","typeLabel":"string\u003cuuid>"},"organization_id":{"format":"uuid","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.organization_id","typeLabel":"string\u003cuuid>"},"primary_thread_id":{"format":"uuid","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.primary_thread_id","typeLabel":"string\u003cuuid>"},"project_id":{"format":"uuid","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.project_id","typeLabel":"string\u003cuuid>"},"revision":{"description":"title, description, budgets, autonomy, external refs and phases that say what it IS. Spend accrual and the reconciliation pass counters write the same row and deliberately do not move it, so a coordinator's read is not invalidated by a worker's cost landing mid-pass.\n\nIt rides on every read because it is what a writer writes against: a coordinator reads the position, spends minutes deciding, and passes this number back on the write. If a human steered or a worker's result landed in between, the write is refused and the pass re-reads rather than committing a decision about a world that has moved.\n","format":"int64","title":"Revision counts the authoritative mutations of this workstream — the state,\n","type":"integer","uniqueKey":"child_portfolio.items.[INDEX].workstream.revision","typeLabel":"integer\u003cint64>"},"slug":{"type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.slug","typeLabel":"string"},"source_template_id":{"format":"uuid","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.source_template_id","typeLabel":"string\u003cuuid>"},"spent_millicents":{"format":"int64","type":"integer","uniqueKey":"child_portfolio.items.[INDEX].workstream.spent_millicents","typeLabel":"integer\u003cint64>"},"started_at":{"format":"date-time","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.started_at","typeLabel":"string\u003cdate-time>"},"status":{"type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.status","typeLabel":"string"},"title":{"type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.title","typeLabel":"string"},"token_budget_millicents":{"description":"ceiling (nil = unlimited); SpentMillicents is the running total accrued from completed engine work; EscalationBudgetPerDay caps urgent items per rolling 24h (nil = org default). Millicents are thousandths of a cent: money.MillicentsPerDollar (100,000) per dollar, which is the unit provider.CostBreakdown.Millicents() writes spend in.\n","format":"int64","title":"Budget envelope (work-engine D6). TokenBudgetMillicents is the spend\n","type":"integer","uniqueKey":"child_portfolio.items.[INDEX].workstream.token_budget_millicents","typeLabel":"integer\u003cint64>"},"updated_at":{"format":"date-time","type":"string","uniqueKey":"child_portfolio.items.[INDEX].workstream.updated_at","typeLabel":"string\u003cdate-time>"}},"title":"Workstream represents a piece of business work in motion.\n","type":"object","uniqueKey":"child_portfolio.items.[INDEX].workstream","typeLabel":"Workstream represents a piece of business work in motion.\n · object"}},"title":"ChildPortfolioSummary is the bounded one-level projection a root workstream\n","type":"object","uniqueKey":"child_portfolio.items.[INDEX]","typeLabel":"ChildPortfolioSummary is the bounded one-level projection a root workstream\n · object"},"title":"ChildPortfolio contains direct same-org/project workstream children only.\n","type":"array","uniqueKey":"child_portfolio","typeLabel":"ChildPortfolioSummary is the bounded one-level projection a root workstream\n · object[]"},"current_decisions":{"description":"unexpired standing commitments no later decision has superseded, plus the one\\_shot authorizations whose work is still in flight. They are loaded here, with the ledger, rather than left to a search the model may not run — an agent that has to remember to look up what the organization already decided is an agent that will eventually recommend the opposite of it.\n\nLapsedDecisions contains expired, unsuperseded commitments awaiting review. RecentDecisions is the surrounding history, current and lapsed rows excluded: what was proposed, refused, replaced, failed, or authorized and since carried out. Context for the agent's reasoning, never a commitment it should continue.\n","items":{"description":"continuing agent and a returning operator read.\n\nIt is the same shape for both audiences on purpose. The agent's copy of what the organization has committed to cannot be the only one, or a human coming back to the workstream has no way to check what it is acting on — so the projection carries decision, rationale, authority, execution and supersession, and both surfaces render those five facts rather than each deriving their own.\n\nIt is deliberately not the whole record: the envelope's declared effects, its per-action inputs and its measurement contract are a drill-in, and putting them here would push the ledger read past what a model can usefully hold.\n","properties":{"age_seconds":{"format":"int64","type":"integer","uniqueKey":"current_decisions.items.[INDEX].age_seconds","typeLabel":"integer\u003cint64>"},"agent_run_id":{"format":"uuid","type":"string","uniqueKey":"current_decisions.items.[INDEX].agent_run_id","typeLabel":"string\u003cuuid>"},"alternatives_considered":{"description":"before proposing this — the WHY's companion, so a reader can tell a choice from the only idea anyone had. Empty is ordinary: most calls had no real alternative, and the record says so rather than inventing one.\n","title":"AlternativesConsidered is the producer's account of what else it weighed\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].alternatives_considered","typeLabel":"string"},"applicability":{"description":"that outlives the work it authorized, or an authorization for exactly the actions it named. It travels with the summary because the two are read differently — a standing decision applies until its review deadline or explicit retirement, while a one\\_shot in the current list is work still in flight to see through, not a strategy to keep running.\n","title":"Applicability is standing or one_shot: whether this decision is a course\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].applicability","typeLabel":"string"},"approval_id":{"description":"approval producer family. It travels on the row so the join runs in both directions from one read: a caller holding an approval filters the list by it, and a caller reading a page of decisions can index them by the approvals they answer without a call per row.\n","format":"uuid","title":"ApprovalID is the ask this decision was made on, present only for the\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].approval_id","typeLabel":"string\u003cuuid>"},"authorized_at":{"format":"date-time","type":"string","uniqueKey":"current_decisions.items.[INDEX].authorized_at","typeLabel":"string\u003cdate-time>"},"decided_by_name":{"description":"name, else email), so a surface can say \"X did Y\" without carrying a user lookup of its own. Empty when no human decided (an agent or a policy did), or when the id could not be resolved in the caller's organization — a manager acting into a client org is the case that does not resolve, and the raw id stays on DecidedByUserID for that. It is display-only and never a filter.\n","title":"DecidedByName is the human decider resolved to a name (display name, else\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].decided_by_name","typeLabel":"string"},"decided_by_user_id":{"format":"uuid","type":"string","uniqueKey":"current_decisions.items.[INDEX].decided_by_user_id","typeLabel":"string\u003cuuid>"},"decider_kind":{"description":"deterministic\\_policy, safe\\_default or system.\n","title":"DeciderKind is who exercised the judgement: human, llm_agent,\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].decider_kind","typeLabel":"string"},"decider_rationale":{"description":"they supplied any. Usually empty — approving a card records no sentence.\n","title":"DeciderRationale is the deciding human's own words about the answer, when\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].decider_rationale","typeLabel":"string"},"decision_class":{"description":"(\\`paid\\_media.ad\\_group.pause\\`), provider-agnostic and stable across the tools that implement it. Source is the producer family that recorded it.\n","title":"DecisionClass is what KIND of decision this is\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].decision_class","typeLabel":"string"},"evidence_kind":{"description":"specified state exists), experimental (a controlled comparison), or observational (a before/after movement with no control). Empty when the settled effects disagree — a decision with one experimental and one deterministic result has no single kind, and picking one would attach the stronger claim to both.\n","title":"EvidenceKind is what KIND of evidence settled it: deterministic (the\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].evidence_kind","typeLabel":"string"},"execution_status":{"description":"change the decision authorized actually reached the outside world. pending | started | succeeded | failed | unknown, and empty when the decision authorized no action at all.\n","title":"ExecutionStatus rolls the child actions up into one word: whether the\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].execution_status","typeLabel":"string"},"exit_condition":{"type":"string","uniqueKey":"current_decisions.items.[INDEX].exit_condition","typeLabel":"string"},"has_pending_effects":{"description":"outcome. An effective decision can legitimately be in this state between its action landing and the settlement sweep starting measurement, so clients must not infer that an empty outcome means the decision is finished.\n","title":"HasPendingEffects says whether at least one measurable effect still owes an\n","type":"boolean","uniqueKey":"current_decisions.items.[INDEX].has_pending_effects","typeLabel":"boolean"},"lapsed":{"type":"boolean","uniqueKey":"current_decisions.items.[INDEX].lapsed","typeLabel":"boolean"},"outcome_label":{"description":"says the same thing about the same row rather than each deriving its own vocabulary from the pair above. Only an experiment may say a change \"worked\"; deterministic evidence says \"confirmed\" and observational says \"moved as expected\".\n\nEmpty whenever the pair cannot support one phrase — mixed outcomes, mixed evidence kinds — because there is no honest single sentence for those and the per-effect labels in the detail read are the answer.\n","title":"OutcomeLabel is the server's own words for this outcome, so every surface\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].outcome_label","typeLabel":"string"},"outcome_status":{"description":"not\\_met, inconclusive, or \\`mixed\\` when they disagree. Empty while nothing has settled, which is a different fact from inconclusive — one says the answer is not in yet, the other says the evidence could not produce one.\n\nEffects that are unmeasurable, censored, or parked in measurement\\_unavailable contribute nothing here. They are coverage, they are visible as such in the detail read and the scorecard, and folding them in would let a decision nobody could measure read as one that did not work.\n","title":"OutcomeStatus rolls this decision's SETTLED effects into one word: met,\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].outcome_status","typeLabel":"string"},"proposed_at":{"format":"date-time","type":"string","uniqueKey":"current_decisions.items.[INDEX].proposed_at","typeLabel":"string\u003cdate-time>"},"rejected_at":{"description":"whose status is \\`rejected\\`.\n\nIt is nullable when the source has no trustworthy answer fact, and is never inferred from a write clock.\n","format":"date-time","title":"RejectedAt is when the proposal was refused, and it is present only on a\ndecision\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].rejected_at","typeLabel":"string\u003cdate-time>"},"review_by":{"description":"never a lifecycle status or a destructive rewrite of the original record.\n","format":"date-time","title":"ReviewBy includes the legacy creation-time fallback. Lapsed is derived,\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].review_by","typeLabel":"string\u003cdate-time>"},"slug":{"type":"string","uniqueKey":"current_decisions.items.[INDEX].slug","typeLabel":"string"},"source":{"type":"string","uniqueKey":"current_decisions.items.[INDEX].source","typeLabel":"string"},"status":{"type":"string","uniqueKey":"current_decisions.items.[INDEX].status","typeLabel":"string"},"subject_kind":{"description":"names it — a campaign, a page, a lead form.\n","title":"SubjectKind / SubjectLabel name what the decision is about, as the operator\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].subject_kind","typeLabel":"string"},"subject_label":{"type":"string","uniqueKey":"current_decisions.items.[INDEX].subject_label","typeLabel":"string"},"superseded_by_decision_slug":{"description":"decision that later replaced this one. It carries the same past-authorization rule the currentness read applies — a reversal somebody PROPOSED and a human then refused has not replaced anything, and showing it here would report a course as retired exactly when the human voted to keep it.\n","title":"SupersededByDecisionSlug is the other direction of the same link: the\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].superseded_by_decision_slug","typeLabel":"string"},"supersedes_decision_slug":{"description":"the producer declared the link explicitly — a reversal states what it reverses, and nothing infers it from two decisions sharing a subject.\n","title":"SupersedesDecisionSlug names the decision this one replaced. Set only when\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].supersedes_decision_slug","typeLabel":"string"},"what":{"description":"PRODUCER's rationale — the argument the proposal was made on. When a human gave their own reason for the answer it is in DeciderRationale, never merged into this one: reading a proposal's argument as the approver's reason for accepting it is how a record starts attributing motives.\n","title":"What is the decision in one line of business English; Why is the\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].what","typeLabel":"string"},"why":{"type":"string","uniqueKey":"current_decisions.items.[INDEX].why","typeLabel":"string"},"workstream_id":{"description":"filed under and the run that proposed it. They travel on the summary so a surface rendering one row can link the workstream without a second read — the same reason ApprovalID travels. Both are optional in fact as well as shape: an org-level decision belongs to no workstream, and a deterministic producer may have no run.\n","format":"uuid","title":"WorkstreamID / AgentRunID are provenance: the workstream the decision was\n","type":"string","uniqueKey":"current_decisions.items.[INDEX].workstream_id","typeLabel":"string\u003cuuid>"}},"title":"DecisionSummary is the compact projection of one decision that both a\n","type":"object","uniqueKey":"current_decisions.items.[INDEX]","typeLabel":"DecisionSummary is the compact projection of one decision that both a\n · object"},"title":"CurrentDecisions is what this workstream is operating under right now:\n","type":"array","uniqueKey":"current_decisions","typeLabel":"DecisionSummary is the compact projection of one decision that both a\n · object[]"},"defects":{"description":"ledger — the seeded complement to the misordered\\_examples each judge carries. A defect costs no conversion, so the residual stream can never surface it; the loop reads these alongside misordered\\_examples so judge generation can propose a lens for a failure only a human eye caught. Bounded per read.\n","items":{"description":"— a 'defect' observation written when a human flagged a choice's variant. It is the seeded complement to the misordered-pair residual stream: a defect costs no conversion (a clipped hero, off-brand type, scaffolding text on a stat card), so it can never surface as a variant that \"converted worse than predicted\", yet it is exactly the kind of failure judge generation should learn to catch. JudgeSlug is \"human:\\\u003cuser\\_id>\"; Reason is the human's free text naming the problem.\n","properties":{"experiment_run_id":{"type":"string","uniqueKey":"defects.items.[INDEX].experiment_run_id","typeLabel":"string"},"judge_slug":{"type":"string","uniqueKey":"defects.items.[INDEX].judge_slug","typeLabel":"string"},"observed_at":{"format":"date-time","type":"string","uniqueKey":"defects.items.[INDEX].observed_at","typeLabel":"string\u003cdate-time>"},"reason":{"type":"string","uniqueKey":"defects.items.[INDEX].reason","typeLabel":"string"},"variant_key":{"type":"string","uniqueKey":"defects.items.[INDEX].variant_key","typeLabel":"string"}},"title":"ExperimentDefect is one human \"this variant is broken\" verdict from the ledger\n","type":"object","uniqueKey":"defects.items.[INDEX]","typeLabel":"ExperimentDefect is one human \"this variant is broken\" verdict from the ledger\n · object"},"title":"Defects are the human \"this variant is broken\" verdicts on this project's\n","type":"array","uniqueKey":"defects","typeLabel":"ExperimentDefect is one human \"this variant is broken\" verdict from the ledger\n · object[]"},"experiments":{"items":{"description":"of its observation ledger, so the loop can weigh a bet without a second read.\n","properties":{"experiment":{"description":"Sibling to Workstream, can be hosted by a workstream or standalone.\n","properties":{"created_at":{"format":"date-time","type":"string","uniqueKey":"experiments.items.[INDEX].experiment.created_at","typeLabel":"string\u003cdate-time>"},"decided_at":{"format":"date-time","type":"string","uniqueKey":"experiments.items.[INDEX].experiment.decided_at","typeLabel":"string\u003cdate-time>"},"decision":{"type":"string","uniqueKey":"experiments.items.[INDEX].experiment.decision","typeLabel":"string"},"decision_rule_markdown":{"type":"string","uniqueKey":"experiments.items.[INDEX].experiment.decision_rule_markdown","typeLabel":"string"},"guardrail_metrics":{"items":{"type":"string","uniqueKey":"experiments.items.[INDEX].experiment.guardrail_metrics.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"experiments.items.[INDEX].experiment.guardrail_metrics","typeLabel":"string[]"},"hypothesis_markdown":{"type":"string","uniqueKey":"experiments.items.[INDEX].experiment.hypothesis_markdown","typeLabel":"string"},"id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].experiment.id","typeLabel":"string\u003cuuid>"},"organization_id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].experiment.organization_id","typeLabel":"string\u003cuuid>"},"outcome_markdown":{"type":"string","uniqueKey":"experiments.items.[INDEX].experiment.outcome_markdown","typeLabel":"string"},"primary_metric":{"type":"string","uniqueKey":"experiments.items.[INDEX].experiment.primary_metric","typeLabel":"string"},"primary_thread_id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].experiment.primary_thread_id","typeLabel":"string\u003cuuid>"},"project_id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].experiment.project_id","typeLabel":"string\u003cuuid>"},"scope":{"type":"string","uniqueKey":"experiments.items.[INDEX].experiment.scope","typeLabel":"string"},"slug":{"type":"string","uniqueKey":"experiments.items.[INDEX].experiment.slug","typeLabel":"string"},"started_at":{"format":"date-time","type":"string","uniqueKey":"experiments.items.[INDEX].experiment.started_at","typeLabel":"string\u003cdate-time>"},"status":{"type":"string","uniqueKey":"experiments.items.[INDEX].experiment.status","typeLabel":"string"},"title":{"type":"string","uniqueKey":"experiments.items.[INDEX].experiment.title","typeLabel":"string"},"updated_at":{"format":"date-time","type":"string","uniqueKey":"experiments.items.[INDEX].experiment.updated_at","typeLabel":"string\u003cdate-time>"},"workstream_id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].experiment.workstream_id","typeLabel":"string\u003cuuid>"}},"title":"ExperimentRun is a structured test with hypothesis, variants, decision.\n","type":"object","uniqueKey":"experiments.items.[INDEX].experiment","typeLabel":"ExperimentRun is a structured test with hypothesis, variants, decision.\n · object"},"recent_observations":{"items":{"description":"read, a decision check, or an action the optimizer took. See migrations/002\\_create\\_experiment\\_observation.up.sql for the full rationale — short version: experiment\\_run carries state, this table carries the history needed to recover learning later from SQL rather than prose.\n","properties":{"action_taken":{"type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].action_taken","typeLabel":"string"},"agent_run_id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].agent_run_id","typeLabel":"string\u003cuuid>"},"created_at":{"format":"date-time","type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"details":{"type":"object","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].details","typeLabel":"object"},"evidence_dataset_slug":{"type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].evidence_dataset_slug","typeLabel":"string"},"evidence_resource_id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].evidence_resource_id","typeLabel":"string\u003cuuid>"},"experiment_run_id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].experiment_run_id","typeLabel":"string\u003cuuid>"},"id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"job_execution_id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].job_execution_id","typeLabel":"string\u003cuuid>"},"metric_name":{"type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].metric_name","typeLabel":"string"},"metric_value":{"type":"number","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].metric_value","typeLabel":"number"},"observation_type":{"type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].observation_type","typeLabel":"string"},"observed_at":{"format":"date-time","type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].observed_at","typeLabel":"string\u003cdate-time>"},"organization_id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].organization_id","typeLabel":"string\u003cuuid>"},"project_id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].project_id","typeLabel":"string\u003cuuid>"},"reason_code":{"type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].reason_code","typeLabel":"string"},"variant_key":{"type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].variant_key","typeLabel":"string"},"window_end":{"format":"date-time","type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].window_end","typeLabel":"string\u003cdate-time>"},"window_start":{"format":"date-time","type":"string","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX].window_start","typeLabel":"string\u003cdate-time>"}},"title":"ExperimentObservation is one append-only structured record of a metric\n","type":"object","uniqueKey":"experiments.items.[INDEX].recent_observations.items.[INDEX]","typeLabel":"ExperimentObservation is one append-only structured record of a metric\n · object"},"type":"array","uniqueKey":"experiments.items.[INDEX].recent_observations","typeLabel":"ExperimentObservation is one append-only structured record of a metric\n · object[]"},"variants":{"items":{"properties":{"allocation_percent":{"format":"int32","maximum":2147483647,"minimum":-2147483648,"type":"integer","uniqueKey":"experiments.items.[INDEX].variants.items.[INDEX].allocation_percent","typeLabel":"integer\u003cint32>"},"created_at":{"format":"date-time","type":"string","uniqueKey":"experiments.items.[INDEX].variants.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"experiment_run_id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].variants.items.[INDEX].experiment_run_id","typeLabel":"string\u003cuuid>"},"id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].variants.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"is_control":{"type":"boolean","uniqueKey":"experiments.items.[INDEX].variants.items.[INDEX].is_control","typeLabel":"boolean"},"key":{"type":"string","uniqueKey":"experiments.items.[INDEX].variants.items.[INDEX].key","typeLabel":"string"},"label":{"type":"string","uniqueKey":"experiments.items.[INDEX].variants.items.[INDEX].label","typeLabel":"string"},"treatment_class":{"description":"(TreatmentClassTaxonomy) — DECLARED by the producing agent, never derived from content. It is the privacy boundary the cross-customer prior distiller aggregates on. Nil for the control and for treatments that carry no class.\n","title":"TreatmentClass is the variant's structural class from the fixed taxonomy\n","type":"string","uniqueKey":"experiments.items.[INDEX].variants.items.[INDEX].treatment_class","typeLabel":"string"},"treatment_resource_id":{"format":"uuid","type":"string","uniqueKey":"experiments.items.[INDEX].variants.items.[INDEX].treatment_resource_id","typeLabel":"string\u003cuuid>"},"treatment_resource_type":{"type":"string","uniqueKey":"experiments.items.[INDEX].variants.items.[INDEX].treatment_resource_type","typeLabel":"string"},"treatment_url":{"description":"page resource — the wind-tunnel persona panel can visit either. Set for variants whose page is not an Erdo artifact (an agency's client landing page); mutually exclusive with TreatmentResourceType/ID. Public http(s) URLs only, never a signed-in Erdo workspace URL.\n","title":"TreatmentURL is an external page URL this variant tests INSTEAD OF an Erdo\n","type":"string","uniqueKey":"experiments.items.[INDEX].variants.items.[INDEX].treatment_url","typeLabel":"string"}},"title":"ExperimentVariant is one variant in an experiment.\n","type":"object","uniqueKey":"experiments.items.[INDEX].variants.items.[INDEX]","typeLabel":"ExperimentVariant is one variant in an experiment.\n · object"},"type":"array","uniqueKey":"experiments.items.[INDEX].variants","typeLabel":"ExperimentVariant is one variant in an experiment.\n · object[]"}},"title":"ExperimentWithObservations pairs an experiment with its variants and the head\n","type":"object","uniqueKey":"experiments.items.[INDEX]","typeLabel":"ExperimentWithObservations pairs an experiment with its variants and the head\n · object"},"type":"array","uniqueKey":"experiments","typeLabel":"ExperimentWithObservations pairs an experiment with its variants and the head\n · object[]"},"judged_bets":{"format":"int64","type":"integer","uniqueKey":"judged_bets","typeLabel":"integer\u003cint64>"},"lapsed_decisions":{"items":{"description":"continuing agent and a returning operator read.\n\nIt is the same shape for both audiences on purpose. The agent's copy of what the organization has committed to cannot be the only one, or a human coming back to the workstream has no way to check what it is acting on — so the projection carries decision, rationale, authority, execution and supersession, and both surfaces render those five facts rather than each deriving their own.\n\nIt is deliberately not the whole record: the envelope's declared effects, its per-action inputs and its measurement contract are a drill-in, and putting them here would push the ledger read past what a model can usefully hold.\n","properties":{"age_seconds":{"format":"int64","type":"integer","uniqueKey":"lapsed_decisions.items.[INDEX].age_seconds","typeLabel":"integer\u003cint64>"},"agent_run_id":{"format":"uuid","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].agent_run_id","typeLabel":"string\u003cuuid>"},"alternatives_considered":{"description":"before proposing this — the WHY's companion, so a reader can tell a choice from the only idea anyone had. Empty is ordinary: most calls had no real alternative, and the record says so rather than inventing one.\n","title":"AlternativesConsidered is the producer's account of what else it weighed\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].alternatives_considered","typeLabel":"string"},"applicability":{"description":"that outlives the work it authorized, or an authorization for exactly the actions it named. It travels with the summary because the two are read differently — a standing decision applies until its review deadline or explicit retirement, while a one\\_shot in the current list is work still in flight to see through, not a strategy to keep running.\n","title":"Applicability is standing or one_shot: whether this decision is a course\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].applicability","typeLabel":"string"},"approval_id":{"description":"approval producer family. It travels on the row so the join runs in both directions from one read: a caller holding an approval filters the list by it, and a caller reading a page of decisions can index them by the approvals they answer without a call per row.\n","format":"uuid","title":"ApprovalID is the ask this decision was made on, present only for the\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].approval_id","typeLabel":"string\u003cuuid>"},"authorized_at":{"format":"date-time","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].authorized_at","typeLabel":"string\u003cdate-time>"},"decided_by_name":{"description":"name, else email), so a surface can say \"X did Y\" without carrying a user lookup of its own. Empty when no human decided (an agent or a policy did), or when the id could not be resolved in the caller's organization — a manager acting into a client org is the case that does not resolve, and the raw id stays on DecidedByUserID for that. It is display-only and never a filter.\n","title":"DecidedByName is the human decider resolved to a name (display name, else\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].decided_by_name","typeLabel":"string"},"decided_by_user_id":{"format":"uuid","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].decided_by_user_id","typeLabel":"string\u003cuuid>"},"decider_kind":{"description":"deterministic\\_policy, safe\\_default or system.\n","title":"DeciderKind is who exercised the judgement: human, llm_agent,\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].decider_kind","typeLabel":"string"},"decider_rationale":{"description":"they supplied any. Usually empty — approving a card records no sentence.\n","title":"DeciderRationale is the deciding human's own words about the answer, when\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].decider_rationale","typeLabel":"string"},"decision_class":{"description":"(\\`paid\\_media.ad\\_group.pause\\`), provider-agnostic and stable across the tools that implement it. Source is the producer family that recorded it.\n","title":"DecisionClass is what KIND of decision this is\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].decision_class","typeLabel":"string"},"evidence_kind":{"description":"specified state exists), experimental (a controlled comparison), or observational (a before/after movement with no control). Empty when the settled effects disagree — a decision with one experimental and one deterministic result has no single kind, and picking one would attach the stronger claim to both.\n","title":"EvidenceKind is what KIND of evidence settled it: deterministic (the\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].evidence_kind","typeLabel":"string"},"execution_status":{"description":"change the decision authorized actually reached the outside world. pending | started | succeeded | failed | unknown, and empty when the decision authorized no action at all.\n","title":"ExecutionStatus rolls the child actions up into one word: whether the\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].execution_status","typeLabel":"string"},"exit_condition":{"type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].exit_condition","typeLabel":"string"},"has_pending_effects":{"description":"outcome. An effective decision can legitimately be in this state between its action landing and the settlement sweep starting measurement, so clients must not infer that an empty outcome means the decision is finished.\n","title":"HasPendingEffects says whether at least one measurable effect still owes an\n","type":"boolean","uniqueKey":"lapsed_decisions.items.[INDEX].has_pending_effects","typeLabel":"boolean"},"lapsed":{"type":"boolean","uniqueKey":"lapsed_decisions.items.[INDEX].lapsed","typeLabel":"boolean"},"outcome_label":{"description":"says the same thing about the same row rather than each deriving its own vocabulary from the pair above. Only an experiment may say a change \"worked\"; deterministic evidence says \"confirmed\" and observational says \"moved as expected\".\n\nEmpty whenever the pair cannot support one phrase — mixed outcomes, mixed evidence kinds — because there is no honest single sentence for those and the per-effect labels in the detail read are the answer.\n","title":"OutcomeLabel is the server's own words for this outcome, so every surface\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].outcome_label","typeLabel":"string"},"outcome_status":{"description":"not\\_met, inconclusive, or \\`mixed\\` when they disagree. Empty while nothing has settled, which is a different fact from inconclusive — one says the answer is not in yet, the other says the evidence could not produce one.\n\nEffects that are unmeasurable, censored, or parked in measurement\\_unavailable contribute nothing here. They are coverage, they are visible as such in the detail read and the scorecard, and folding them in would let a decision nobody could measure read as one that did not work.\n","title":"OutcomeStatus rolls this decision's SETTLED effects into one word: met,\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].outcome_status","typeLabel":"string"},"proposed_at":{"format":"date-time","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].proposed_at","typeLabel":"string\u003cdate-time>"},"rejected_at":{"description":"whose status is \\`rejected\\`.\n\nIt is nullable when the source has no trustworthy answer fact, and is never inferred from a write clock.\n","format":"date-time","title":"RejectedAt is when the proposal was refused, and it is present only on a\ndecision\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].rejected_at","typeLabel":"string\u003cdate-time>"},"review_by":{"description":"never a lifecycle status or a destructive rewrite of the original record.\n","format":"date-time","title":"ReviewBy includes the legacy creation-time fallback. Lapsed is derived,\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].review_by","typeLabel":"string\u003cdate-time>"},"slug":{"type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].slug","typeLabel":"string"},"source":{"type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].source","typeLabel":"string"},"status":{"type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].status","typeLabel":"string"},"subject_kind":{"description":"names it — a campaign, a page, a lead form.\n","title":"SubjectKind / SubjectLabel name what the decision is about, as the operator\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].subject_kind","typeLabel":"string"},"subject_label":{"type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].subject_label","typeLabel":"string"},"superseded_by_decision_slug":{"description":"decision that later replaced this one. It carries the same past-authorization rule the currentness read applies — a reversal somebody PROPOSED and a human then refused has not replaced anything, and showing it here would report a course as retired exactly when the human voted to keep it.\n","title":"SupersededByDecisionSlug is the other direction of the same link: the\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].superseded_by_decision_slug","typeLabel":"string"},"supersedes_decision_slug":{"description":"the producer declared the link explicitly — a reversal states what it reverses, and nothing infers it from two decisions sharing a subject.\n","title":"SupersedesDecisionSlug names the decision this one replaced. Set only when\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].supersedes_decision_slug","typeLabel":"string"},"what":{"description":"PRODUCER's rationale — the argument the proposal was made on. When a human gave their own reason for the answer it is in DeciderRationale, never merged into this one: reading a proposal's argument as the approver's reason for accepting it is how a record starts attributing motives.\n","title":"What is the decision in one line of business English; Why is the\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].what","typeLabel":"string"},"why":{"type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].why","typeLabel":"string"},"workstream_id":{"description":"filed under and the run that proposed it. They travel on the summary so a surface rendering one row can link the workstream without a second read — the same reason ApprovalID travels. Both are optional in fact as well as shape: an org-level decision belongs to no workstream, and a deterministic producer may have no run.\n","format":"uuid","title":"WorkstreamID / AgentRunID are provenance: the workstream the decision was\n","type":"string","uniqueKey":"lapsed_decisions.items.[INDEX].workstream_id","typeLabel":"string\u003cuuid>"}},"title":"DecisionSummary is the compact projection of one decision that both a\n","type":"object","uniqueKey":"lapsed_decisions.items.[INDEX]","typeLabel":"DecisionSummary is the compact projection of one decision that both a\n · object"},"type":"array","uniqueKey":"lapsed_decisions","typeLabel":"DecisionSummary is the compact projection of one decision that both a\n · object[]"},"monitor_findings":{"description":"this workstream declared in its external refs, filed by anything other than this workstream — in practice the organization's monitors. A monitor files against the organization because it cannot know a workstream exists, so without this the pass never reads a finding about a campaign it manages. Open items plus the recent window, newest first, no digests.\n","items":{"description":"surfaced in the Activity feed. See migrations/008\\_create\\_attention\\_item.\n","properties":{"answer":{"type":"object","uniqueKey":"monitor_findings.items.[INDEX].answer","typeLabel":"object"},"answered_at":{"format":"date-time","type":"string","uniqueKey":"monitor_findings.items.[INDEX].answered_at","typeLabel":"string\u003cdate-time>"},"answered_by_user_id":{"format":"uuid","type":"string","uniqueKey":"monitor_findings.items.[INDEX].answered_by_user_id","typeLabel":"string\u003cuuid>"},"ask":{"description":"act | read (see AttentionAsk). Derived by the service from kind, severity and payload, so every surface files the item under the same heading — an escalation a person has to go and resolve by hand is \\`act\\`, never a report.\n","title":"Ask is what the item wants from the person reading it: approve | choose |\n","type":"string","uniqueKey":"monitor_findings.items.[INDEX].ask","typeLabel":"string"},"body_markdown":{"type":"string","uniqueKey":"monitor_findings.items.[INDEX].body_markdown","typeLabel":"string"},"created_at":{"format":"date-time","type":"string","uniqueKey":"monitor_findings.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"cycle_started_at":{"description":"reopen, while CreatedAt stays at the slug's original filing. Anything that reads the ask's age — feed recency, \"unread for\", eligibility windows — belongs to the occurrence, not the row.\n","format":"date-time","title":"CycleStartedAt is when the CURRENT occurrence began: it resets on every\n","type":"string","uniqueKey":"monitor_findings.items.[INDEX].cycle_started_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"format":"date-time","type":"string","uniqueKey":"monitor_findings.items.[INDEX].expires_at","typeLabel":"string\u003cdate-time>"},"id":{"format":"uuid","type":"string","uniqueKey":"monitor_findings.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"kind":{"title":"digest | choice | escalation | judge_rescreen\n","type":"string","uniqueKey":"monitor_findings.items.[INDEX].kind","typeLabel":"string"},"last_confirmed_at":{"description":"confirmation. It is optional for rows created before confirmation was introduced.\n","format":"date-time","title":"LastConfirmedAt is the database-clock timestamp of the latest producer\n","type":"string","uniqueKey":"monitor_findings.items.[INDEX].last_confirmed_at","typeLabel":"string\u003cdate-time>"},"organization_id":{"format":"uuid","type":"string","uniqueKey":"monitor_findings.items.[INDEX].organization_id","typeLabel":"string\u003cuuid>"},"payload":{"description":"{title, questions\\[]} plus optional experiment mapping; for escalation {proposed\\_answer, safe\\_default}.\n","title":"Payload carries the kind-specific shape: for choice the ask_user\n","uniqueKey":"monitor_findings.items.[INDEX].payload","typeLabel":"any"},"read_at":{"format":"date-time","type":"string","uniqueKey":"monitor_findings.items.[INDEX].read_at","typeLabel":"string\u003cdate-time>"},"resolution_note":{"description":"read when it found the condition gone. Empty unless Status is \\`cleared\\` and the clear carried a note. The same text is appended to BodyMarkdown under a \"Cleared:\" heading; this field lets a surface show it on its own.\n","title":"ResolutionNote is the evidence a system clear recorded — what the monitor\n","type":"string","uniqueKey":"monitor_findings.items.[INDEX].resolution_note","typeLabel":"string"},"resolved_at":{"description":"dismissal, the system clearing it, or its deadline.\n","format":"date-time","title":"ResolvedAt is when the item left `open`, by any route: a person's answer or\n","type":"string","uniqueKey":"monitor_findings.items.[INDEX].resolved_at","typeLabel":"string\u003cdate-time>"},"severity":{"title":"info | attention | urgent\n","type":"string","uniqueKey":"monitor_findings.items.[INDEX].severity","typeLabel":"string"},"slug":{"type":"string","uniqueKey":"monitor_findings.items.[INDEX].slug","typeLabel":"string"},"status":{"description":"expired. \\`cleared\\` is the system's own close — the monitor that filed the item found the condition gone (see AttentionStatusCleared); \\`dismissed\\` is a person's. The two were one status until October 2026, and every feed showed a monitor's close as something a person had done.\n","title":"Status is the item's lifecycle: open | answered | dismissed | cleared |\n","type":"string","uniqueKey":"monitor_findings.items.[INDEX].status","typeLabel":"string"},"subjects":{"description":"it. Always present (possibly empty) so a consumer never has to distinguish \"no subjects\" from \"this item predates the field\".\n","items":{"description":"The title has always carried the subject in prose — \"Campaign 23926631489: conversion rate dropped 72.5%\" — which reads well and joins to nothing: the only way back to the id is to parse an LLM-written sentence, and control flow over free text is not something this codebase does. So the emitter states it instead, at the one moment anything knows it.\n\nKind is a freeform string from a small documented vocabulary rather than an enum, because it grows with the providers the engine watches and a closed set would make every new subject kind a migration. The vocabulary today: google\\_ads\\_campaign, meta\\_ads\\_campaign, google\\_ads\\_ad\\_group, google\\_ads\\_ad (the provider's numeric ids), page (the artifact UUID), dataset (dataset slug), workstream (workstream slug).\n\nID is the subject's canonical identifier, so a caller already holding the resource can ask about it directly. Label is the human name as it read at emit time, carried so a feed row renders without a provider round trip and deliberately never matched on — names change, ids do not.\n","properties":{"id":{"type":"string","uniqueKey":"monitor_findings.items.[INDEX].subjects.items.[INDEX].id","typeLabel":"string"},"kind":{"type":"string","uniqueKey":"monitor_findings.items.[INDEX].subjects.items.[INDEX].kind","typeLabel":"string"},"label":{"type":"string","uniqueKey":"monitor_findings.items.[INDEX].subjects.items.[INDEX].label","typeLabel":"string"}},"title":"AttentionSubject names one thing an attention item is about.\n","type":"object","uniqueKey":"monitor_findings.items.[INDEX].subjects.items.[INDEX]","typeLabel":"AttentionSubject names one thing an attention item is about.\n · object"},"title":"Subjects is what the item is ABOUT, stated structurally by whoever emitted\n","type":"array","uniqueKey":"monitor_findings.items.[INDEX].subjects","typeLabel":"AttentionSubject names one thing an attention item is about.\n · object[]"},"title":{"type":"string","uniqueKey":"monitor_findings.items.[INDEX].title","typeLabel":"string"},"workstream_id":{"format":"uuid","type":"string","uniqueKey":"monitor_findings.items.[INDEX].workstream_id","typeLabel":"string\u003cuuid>"},"workstream_slug":{"description":"WorkstreamID by every read that returns an item. Empty for a standalone item, and empty if the id no longer resolves (a deleted workstream sets the item's workstream\\_id to NULL, but a foreign one would resolve to nothing rather than name another tenant's work). It travels beside the id because a uuid is not something a page, a tool or a link can act on.\n","title":"WorkstreamSlug is the owning workstream's handle, resolved from\n","type":"string","uniqueKey":"monitor_findings.items.[INDEX].workstream_slug","typeLabel":"string"}},"title":"AttentionItem is one thing the engine wants a human to see or answer,\n","type":"object","uniqueKey":"monitor_findings.items.[INDEX]","typeLabel":"AttentionItem is one thing the engine wants a human to see or answer,\n · object"},"title":"MonitorFindings are the organization's attention items about the objects\n","type":"array","uniqueKey":"monitor_findings","typeLabel":"AttentionItem is one thing the engine wants a human to see or answer,\n · object[]"},"open_attention_items":{"items":{"description":"surfaced in the Activity feed. See migrations/008\\_create\\_attention\\_item.\n","properties":{"answer":{"type":"object","uniqueKey":"open_attention_items.items.[INDEX].answer","typeLabel":"object"},"answered_at":{"format":"date-time","type":"string","uniqueKey":"open_attention_items.items.[INDEX].answered_at","typeLabel":"string\u003cdate-time>"},"answered_by_user_id":{"format":"uuid","type":"string","uniqueKey":"open_attention_items.items.[INDEX].answered_by_user_id","typeLabel":"string\u003cuuid>"},"ask":{"description":"act | read (see AttentionAsk). Derived by the service from kind, severity and payload, so every surface files the item under the same heading — an escalation a person has to go and resolve by hand is \\`act\\`, never a report.\n","title":"Ask is what the item wants from the person reading it: approve | choose |\n","type":"string","uniqueKey":"open_attention_items.items.[INDEX].ask","typeLabel":"string"},"body_markdown":{"type":"string","uniqueKey":"open_attention_items.items.[INDEX].body_markdown","typeLabel":"string"},"created_at":{"format":"date-time","type":"string","uniqueKey":"open_attention_items.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"cycle_started_at":{"description":"reopen, while CreatedAt stays at the slug's original filing. Anything that reads the ask's age — feed recency, \"unread for\", eligibility windows — belongs to the occurrence, not the row.\n","format":"date-time","title":"CycleStartedAt is when the CURRENT occurrence began: it resets on every\n","type":"string","uniqueKey":"open_attention_items.items.[INDEX].cycle_started_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"format":"date-time","type":"string","uniqueKey":"open_attention_items.items.[INDEX].expires_at","typeLabel":"string\u003cdate-time>"},"id":{"format":"uuid","type":"string","uniqueKey":"open_attention_items.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"kind":{"title":"digest | choice | escalation | judge_rescreen\n","type":"string","uniqueKey":"open_attention_items.items.[INDEX].kind","typeLabel":"string"},"last_confirmed_at":{"description":"confirmation. It is optional for rows created before confirmation was introduced.\n","format":"date-time","title":"LastConfirmedAt is the database-clock timestamp of the latest producer\n","type":"string","uniqueKey":"open_attention_items.items.[INDEX].last_confirmed_at","typeLabel":"string\u003cdate-time>"},"organization_id":{"format":"uuid","type":"string","uniqueKey":"open_attention_items.items.[INDEX].organization_id","typeLabel":"string\u003cuuid>"},"payload":{"description":"{title, questions\\[]} plus optional experiment mapping; for escalation {proposed\\_answer, safe\\_default}.\n","title":"Payload carries the kind-specific shape: for choice the ask_user\n","uniqueKey":"open_attention_items.items.[INDEX].payload","typeLabel":"any"},"read_at":{"format":"date-time","type":"string","uniqueKey":"open_attention_items.items.[INDEX].read_at","typeLabel":"string\u003cdate-time>"},"resolution_note":{"description":"read when it found the condition gone. Empty unless Status is \\`cleared\\` and the clear carried a note. The same text is appended to BodyMarkdown under a \"Cleared:\" heading; this field lets a surface show it on its own.\n","title":"ResolutionNote is the evidence a system clear recorded — what the monitor\n","type":"string","uniqueKey":"open_attention_items.items.[INDEX].resolution_note","typeLabel":"string"},"resolved_at":{"description":"dismissal, the system clearing it, or its deadline.\n","format":"date-time","title":"ResolvedAt is when the item left `open`, by any route: a person's answer or\n","type":"string","uniqueKey":"open_attention_items.items.[INDEX].resolved_at","typeLabel":"string\u003cdate-time>"},"severity":{"title":"info | attention | urgent\n","type":"string","uniqueKey":"open_attention_items.items.[INDEX].severity","typeLabel":"string"},"slug":{"type":"string","uniqueKey":"open_attention_items.items.[INDEX].slug","typeLabel":"string"},"status":{"description":"expired. \\`cleared\\` is the system's own close — the monitor that filed the item found the condition gone (see AttentionStatusCleared); \\`dismissed\\` is a person's. The two were one status until October 2026, and every feed showed a monitor's close as something a person had done.\n","title":"Status is the item's lifecycle: open | answered | dismissed | cleared |\n","type":"string","uniqueKey":"open_attention_items.items.[INDEX].status","typeLabel":"string"},"subjects":{"description":"it. Always present (possibly empty) so a consumer never has to distinguish \"no subjects\" from \"this item predates the field\".\n","items":{"description":"The title has always carried the subject in prose — \"Campaign 23926631489: conversion rate dropped 72.5%\" — which reads well and joins to nothing: the only way back to the id is to parse an LLM-written sentence, and control flow over free text is not something this codebase does. So the emitter states it instead, at the one moment anything knows it.\n\nKind is a freeform string from a small documented vocabulary rather than an enum, because it grows with the providers the engine watches and a closed set would make every new subject kind a migration. The vocabulary today: google\\_ads\\_campaign, meta\\_ads\\_campaign, google\\_ads\\_ad\\_group, google\\_ads\\_ad (the provider's numeric ids), page (the artifact UUID), dataset (dataset slug), workstream (workstream slug).\n\nID is the subject's canonical identifier, so a caller already holding the resource can ask about it directly. Label is the human name as it read at emit time, carried so a feed row renders without a provider round trip and deliberately never matched on — names change, ids do not.\n","properties":{"id":{"type":"string","uniqueKey":"open_attention_items.items.[INDEX].subjects.items.[INDEX].id","typeLabel":"string"},"kind":{"type":"string","uniqueKey":"open_attention_items.items.[INDEX].subjects.items.[INDEX].kind","typeLabel":"string"},"label":{"type":"string","uniqueKey":"open_attention_items.items.[INDEX].subjects.items.[INDEX].label","typeLabel":"string"}},"title":"AttentionSubject names one thing an attention item is about.\n","type":"object","uniqueKey":"open_attention_items.items.[INDEX].subjects.items.[INDEX]","typeLabel":"AttentionSubject names one thing an attention item is about.\n · object"},"title":"Subjects is what the item is ABOUT, stated structurally by whoever emitted\n","type":"array","uniqueKey":"open_attention_items.items.[INDEX].subjects","typeLabel":"AttentionSubject names one thing an attention item is about.\n · object[]"},"title":{"type":"string","uniqueKey":"open_attention_items.items.[INDEX].title","typeLabel":"string"},"workstream_id":{"format":"uuid","type":"string","uniqueKey":"open_attention_items.items.[INDEX].workstream_id","typeLabel":"string\u003cuuid>"},"workstream_slug":{"description":"WorkstreamID by every read that returns an item. Empty for a standalone item, and empty if the id no longer resolves (a deleted workstream sets the item's workstream\\_id to NULL, but a foreign one would resolve to nothing rather than name another tenant's work). It travels beside the id because a uuid is not something a page, a tool or a link can act on.\n","title":"WorkstreamSlug is the owning workstream's handle, resolved from\n","type":"string","uniqueKey":"open_attention_items.items.[INDEX].workstream_slug","typeLabel":"string"}},"title":"AttentionItem is one thing the engine wants a human to see or answer,\n","type":"object","uniqueKey":"open_attention_items.items.[INDEX]","typeLabel":"AttentionItem is one thing the engine wants a human to see or answer,\n · object"},"type":"array","uniqueKey":"open_attention_items","typeLabel":"AttentionItem is one thing the engine wants a human to see or answer,\n · object[]"},"organization_changes":{"description":"last four weeks that no workstream filed, such as a campaign setting changed from a chat. The workstream-scoped lists above never include them, and a pass reads them before it explains a movement in its numbers.\n","items":{"description":"continuing agent and a returning operator read.\n\nIt is the same shape for both audiences on purpose. The agent's copy of what the organization has committed to cannot be the only one, or a human coming back to the workstream has no way to check what it is acting on — so the projection carries decision, rationale, authority, execution and supersession, and both surfaces render those five facts rather than each deriving their own.\n\nIt is deliberately not the whole record: the envelope's declared effects, its per-action inputs and its measurement contract are a drill-in, and putting them here would push the ledger read past what a model can usefully hold.\n","properties":{"age_seconds":{"format":"int64","type":"integer","uniqueKey":"organization_changes.items.[INDEX].age_seconds","typeLabel":"integer\u003cint64>"},"agent_run_id":{"format":"uuid","type":"string","uniqueKey":"organization_changes.items.[INDEX].agent_run_id","typeLabel":"string\u003cuuid>"},"alternatives_considered":{"description":"before proposing this — the WHY's companion, so a reader can tell a choice from the only idea anyone had. Empty is ordinary: most calls had no real alternative, and the record says so rather than inventing one.\n","title":"AlternativesConsidered is the producer's account of what else it weighed\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].alternatives_considered","typeLabel":"string"},"applicability":{"description":"that outlives the work it authorized, or an authorization for exactly the actions it named. It travels with the summary because the two are read differently — a standing decision applies until its review deadline or explicit retirement, while a one\\_shot in the current list is work still in flight to see through, not a strategy to keep running.\n","title":"Applicability is standing or one_shot: whether this decision is a course\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].applicability","typeLabel":"string"},"approval_id":{"description":"approval producer family. It travels on the row so the join runs in both directions from one read: a caller holding an approval filters the list by it, and a caller reading a page of decisions can index them by the approvals they answer without a call per row.\n","format":"uuid","title":"ApprovalID is the ask this decision was made on, present only for the\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].approval_id","typeLabel":"string\u003cuuid>"},"authorized_at":{"format":"date-time","type":"string","uniqueKey":"organization_changes.items.[INDEX].authorized_at","typeLabel":"string\u003cdate-time>"},"decided_by_name":{"description":"name, else email), so a surface can say \"X did Y\" without carrying a user lookup of its own. Empty when no human decided (an agent or a policy did), or when the id could not be resolved in the caller's organization — a manager acting into a client org is the case that does not resolve, and the raw id stays on DecidedByUserID for that. It is display-only and never a filter.\n","title":"DecidedByName is the human decider resolved to a name (display name, else\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].decided_by_name","typeLabel":"string"},"decided_by_user_id":{"format":"uuid","type":"string","uniqueKey":"organization_changes.items.[INDEX].decided_by_user_id","typeLabel":"string\u003cuuid>"},"decider_kind":{"description":"deterministic\\_policy, safe\\_default or system.\n","title":"DeciderKind is who exercised the judgement: human, llm_agent,\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].decider_kind","typeLabel":"string"},"decider_rationale":{"description":"they supplied any. Usually empty — approving a card records no sentence.\n","title":"DeciderRationale is the deciding human's own words about the answer, when\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].decider_rationale","typeLabel":"string"},"decision_class":{"description":"(\\`paid\\_media.ad\\_group.pause\\`), provider-agnostic and stable across the tools that implement it. Source is the producer family that recorded it.\n","title":"DecisionClass is what KIND of decision this is\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].decision_class","typeLabel":"string"},"evidence_kind":{"description":"specified state exists), experimental (a controlled comparison), or observational (a before/after movement with no control). Empty when the settled effects disagree — a decision with one experimental and one deterministic result has no single kind, and picking one would attach the stronger claim to both.\n","title":"EvidenceKind is what KIND of evidence settled it: deterministic (the\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].evidence_kind","typeLabel":"string"},"execution_status":{"description":"change the decision authorized actually reached the outside world. pending | started | succeeded | failed | unknown, and empty when the decision authorized no action at all.\n","title":"ExecutionStatus rolls the child actions up into one word: whether the\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].execution_status","typeLabel":"string"},"exit_condition":{"type":"string","uniqueKey":"organization_changes.items.[INDEX].exit_condition","typeLabel":"string"},"has_pending_effects":{"description":"outcome. An effective decision can legitimately be in this state between its action landing and the settlement sweep starting measurement, so clients must not infer that an empty outcome means the decision is finished.\n","title":"HasPendingEffects says whether at least one measurable effect still owes an\n","type":"boolean","uniqueKey":"organization_changes.items.[INDEX].has_pending_effects","typeLabel":"boolean"},"lapsed":{"type":"boolean","uniqueKey":"organization_changes.items.[INDEX].lapsed","typeLabel":"boolean"},"outcome_label":{"description":"says the same thing about the same row rather than each deriving its own vocabulary from the pair above. Only an experiment may say a change \"worked\"; deterministic evidence says \"confirmed\" and observational says \"moved as expected\".\n\nEmpty whenever the pair cannot support one phrase — mixed outcomes, mixed evidence kinds — because there is no honest single sentence for those and the per-effect labels in the detail read are the answer.\n","title":"OutcomeLabel is the server's own words for this outcome, so every surface\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].outcome_label","typeLabel":"string"},"outcome_status":{"description":"not\\_met, inconclusive, or \\`mixed\\` when they disagree. Empty while nothing has settled, which is a different fact from inconclusive — one says the answer is not in yet, the other says the evidence could not produce one.\n\nEffects that are unmeasurable, censored, or parked in measurement\\_unavailable contribute nothing here. They are coverage, they are visible as such in the detail read and the scorecard, and folding them in would let a decision nobody could measure read as one that did not work.\n","title":"OutcomeStatus rolls this decision's SETTLED effects into one word: met,\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].outcome_status","typeLabel":"string"},"proposed_at":{"format":"date-time","type":"string","uniqueKey":"organization_changes.items.[INDEX].proposed_at","typeLabel":"string\u003cdate-time>"},"rejected_at":{"description":"whose status is \\`rejected\\`.\n\nIt is nullable when the source has no trustworthy answer fact, and is never inferred from a write clock.\n","format":"date-time","title":"RejectedAt is when the proposal was refused, and it is present only on a\ndecision\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].rejected_at","typeLabel":"string\u003cdate-time>"},"review_by":{"description":"never a lifecycle status or a destructive rewrite of the original record.\n","format":"date-time","title":"ReviewBy includes the legacy creation-time fallback. Lapsed is derived,\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].review_by","typeLabel":"string\u003cdate-time>"},"slug":{"type":"string","uniqueKey":"organization_changes.items.[INDEX].slug","typeLabel":"string"},"source":{"type":"string","uniqueKey":"organization_changes.items.[INDEX].source","typeLabel":"string"},"status":{"type":"string","uniqueKey":"organization_changes.items.[INDEX].status","typeLabel":"string"},"subject_kind":{"description":"names it — a campaign, a page, a lead form.\n","title":"SubjectKind / SubjectLabel name what the decision is about, as the operator\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].subject_kind","typeLabel":"string"},"subject_label":{"type":"string","uniqueKey":"organization_changes.items.[INDEX].subject_label","typeLabel":"string"},"superseded_by_decision_slug":{"description":"decision that later replaced this one. It carries the same past-authorization rule the currentness read applies — a reversal somebody PROPOSED and a human then refused has not replaced anything, and showing it here would report a course as retired exactly when the human voted to keep it.\n","title":"SupersededByDecisionSlug is the other direction of the same link: the\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].superseded_by_decision_slug","typeLabel":"string"},"supersedes_decision_slug":{"description":"the producer declared the link explicitly — a reversal states what it reverses, and nothing infers it from two decisions sharing a subject.\n","title":"SupersedesDecisionSlug names the decision this one replaced. Set only when\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].supersedes_decision_slug","typeLabel":"string"},"what":{"description":"PRODUCER's rationale — the argument the proposal was made on. When a human gave their own reason for the answer it is in DeciderRationale, never merged into this one: reading a proposal's argument as the approver's reason for accepting it is how a record starts attributing motives.\n","title":"What is the decision in one line of business English; Why is the\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].what","typeLabel":"string"},"why":{"type":"string","uniqueKey":"organization_changes.items.[INDEX].why","typeLabel":"string"},"workstream_id":{"description":"filed under and the run that proposed it. They travel on the summary so a surface rendering one row can link the workstream without a second read — the same reason ApprovalID travels. Both are optional in fact as well as shape: an org-level decision belongs to no workstream, and a deterministic producer may have no run.\n","format":"uuid","title":"WorkstreamID / AgentRunID are provenance: the workstream the decision was\n","type":"string","uniqueKey":"organization_changes.items.[INDEX].workstream_id","typeLabel":"string\u003cuuid>"}},"title":"DecisionSummary is the compact projection of one decision that both a\n","type":"object","uniqueKey":"organization_changes.items.[INDEX]","typeLabel":"DecisionSummary is the compact projection of one decision that both a\n · object"},"title":"OrganizationChanges are the decisions this organization authorized in the\n","type":"array","uniqueKey":"organization_changes","typeLabel":"DecisionSummary is the compact projection of one decision that both a\n · object[]"},"organization_changes_truncated":{"description":"than the list carries, so the list holds the newest of them and older ones were cut. The full window is readable through list\\_decisions.\n","title":"OrganizationChangesTruncated is true when more changes matched the window\n","type":"boolean","uniqueKey":"organization_changes_truncated","typeLabel":"boolean"},"phases":{"items":{"properties":{"completed_at":{"format":"date-time","type":"string","uniqueKey":"phases.items.[INDEX].completed_at","typeLabel":"string\u003cdate-time>"},"created_at":{"format":"date-time","type":"string","uniqueKey":"phases.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"id":{"format":"uuid","type":"string","uniqueKey":"phases.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"skill_slug":{"type":"string","uniqueKey":"phases.items.[INDEX].skill_slug","typeLabel":"string"},"slug":{"type":"string","uniqueKey":"phases.items.[INDEX].slug","typeLabel":"string"},"sort_order":{"format":"int32","maximum":2147483647,"minimum":-2147483648,"type":"integer","uniqueKey":"phases.items.[INDEX].sort_order","typeLabel":"integer\u003cint32>"},"started_at":{"format":"date-time","type":"string","uniqueKey":"phases.items.[INDEX].started_at","typeLabel":"string\u003cdate-time>"},"status":{"type":"string","uniqueKey":"phases.items.[INDEX].status","typeLabel":"string"},"thread_id":{"format":"uuid","type":"string","uniqueKey":"phases.items.[INDEX].thread_id","typeLabel":"string\u003cuuid>"},"title":{"type":"string","uniqueKey":"phases.items.[INDEX].title","typeLabel":"string"},"updated_at":{"format":"date-time","type":"string","uniqueKey":"phases.items.[INDEX].updated_at","typeLabel":"string\u003cdate-time>"},"workstream_id":{"format":"uuid","type":"string","uniqueKey":"phases.items.[INDEX].workstream_id","typeLabel":"string\u003cuuid>"}},"title":"WorkstreamPhase is an ordered step within a workstream.\n","type":"object","uniqueKey":"phases.items.[INDEX]","typeLabel":"WorkstreamPhase is an ordered step within a workstream.\n · object"},"type":"array","uniqueKey":"phases","typeLabel":"WorkstreamPhase is an ordered step within a workstream.\n · object[]"},"random_arm_bets":{"description":"this project: how many measured bets skipped judge screening vs. were screened. The loop watches the split to keep the random arm alive (roughly one in ten) so it can price what the judges cost.\n","format":"int64","title":"RandomArmBets / JudgedBets are the meta loop's screening-cost accounting for\n","type":"integer","uniqueKey":"random_arm_bets","typeLabel":"integer\u003cint64>"},"recent_decisions":{"items":{"description":"continuing agent and a returning operator read.\n\nIt is the same shape for both audiences on purpose. The agent's copy of what the organization has committed to cannot be the only one, or a human coming back to the workstream has no way to check what it is acting on — so the projection carries decision, rationale, authority, execution and supersession, and both surfaces render those five facts rather than each deriving their own.\n\nIt is deliberately not the whole record: the envelope's declared effects, its per-action inputs and its measurement contract are a drill-in, and putting them here would push the ledger read past what a model can usefully hold.\n","properties":{"age_seconds":{"format":"int64","type":"integer","uniqueKey":"recent_decisions.items.[INDEX].age_seconds","typeLabel":"integer\u003cint64>"},"agent_run_id":{"format":"uuid","type":"string","uniqueKey":"recent_decisions.items.[INDEX].agent_run_id","typeLabel":"string\u003cuuid>"},"alternatives_considered":{"description":"before proposing this — the WHY's companion, so a reader can tell a choice from the only idea anyone had. Empty is ordinary: most calls had no real alternative, and the record says so rather than inventing one.\n","title":"AlternativesConsidered is the producer's account of what else it weighed\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].alternatives_considered","typeLabel":"string"},"applicability":{"description":"that outlives the work it authorized, or an authorization for exactly the actions it named. It travels with the summary because the two are read differently — a standing decision applies until its review deadline or explicit retirement, while a one\\_shot in the current list is work still in flight to see through, not a strategy to keep running.\n","title":"Applicability is standing or one_shot: whether this decision is a course\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].applicability","typeLabel":"string"},"approval_id":{"description":"approval producer family. It travels on the row so the join runs in both directions from one read: a caller holding an approval filters the list by it, and a caller reading a page of decisions can index them by the approvals they answer without a call per row.\n","format":"uuid","title":"ApprovalID is the ask this decision was made on, present only for the\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].approval_id","typeLabel":"string\u003cuuid>"},"authorized_at":{"format":"date-time","type":"string","uniqueKey":"recent_decisions.items.[INDEX].authorized_at","typeLabel":"string\u003cdate-time>"},"decided_by_name":{"description":"name, else email), so a surface can say \"X did Y\" without carrying a user lookup of its own. Empty when no human decided (an agent or a policy did), or when the id could not be resolved in the caller's organization — a manager acting into a client org is the case that does not resolve, and the raw id stays on DecidedByUserID for that. It is display-only and never a filter.\n","title":"DecidedByName is the human decider resolved to a name (display name, else\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].decided_by_name","typeLabel":"string"},"decided_by_user_id":{"format":"uuid","type":"string","uniqueKey":"recent_decisions.items.[INDEX].decided_by_user_id","typeLabel":"string\u003cuuid>"},"decider_kind":{"description":"deterministic\\_policy, safe\\_default or system.\n","title":"DeciderKind is who exercised the judgement: human, llm_agent,\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].decider_kind","typeLabel":"string"},"decider_rationale":{"description":"they supplied any. Usually empty — approving a card records no sentence.\n","title":"DeciderRationale is the deciding human's own words about the answer, when\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].decider_rationale","typeLabel":"string"},"decision_class":{"description":"(\\`paid\\_media.ad\\_group.pause\\`), provider-agnostic and stable across the tools that implement it. Source is the producer family that recorded it.\n","title":"DecisionClass is what KIND of decision this is\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].decision_class","typeLabel":"string"},"evidence_kind":{"description":"specified state exists), experimental (a controlled comparison), or observational (a before/after movement with no control). Empty when the settled effects disagree — a decision with one experimental and one deterministic result has no single kind, and picking one would attach the stronger claim to both.\n","title":"EvidenceKind is what KIND of evidence settled it: deterministic (the\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].evidence_kind","typeLabel":"string"},"execution_status":{"description":"change the decision authorized actually reached the outside world. pending | started | succeeded | failed | unknown, and empty when the decision authorized no action at all.\n","title":"ExecutionStatus rolls the child actions up into one word: whether the\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].execution_status","typeLabel":"string"},"exit_condition":{"type":"string","uniqueKey":"recent_decisions.items.[INDEX].exit_condition","typeLabel":"string"},"has_pending_effects":{"description":"outcome. An effective decision can legitimately be in this state between its action landing and the settlement sweep starting measurement, so clients must not infer that an empty outcome means the decision is finished.\n","title":"HasPendingEffects says whether at least one measurable effect still owes an\n","type":"boolean","uniqueKey":"recent_decisions.items.[INDEX].has_pending_effects","typeLabel":"boolean"},"lapsed":{"type":"boolean","uniqueKey":"recent_decisions.items.[INDEX].lapsed","typeLabel":"boolean"},"outcome_label":{"description":"says the same thing about the same row rather than each deriving its own vocabulary from the pair above. Only an experiment may say a change \"worked\"; deterministic evidence says \"confirmed\" and observational says \"moved as expected\".\n\nEmpty whenever the pair cannot support one phrase — mixed outcomes, mixed evidence kinds — because there is no honest single sentence for those and the per-effect labels in the detail read are the answer.\n","title":"OutcomeLabel is the server's own words for this outcome, so every surface\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].outcome_label","typeLabel":"string"},"outcome_status":{"description":"not\\_met, inconclusive, or \\`mixed\\` when they disagree. Empty while nothing has settled, which is a different fact from inconclusive — one says the answer is not in yet, the other says the evidence could not produce one.\n\nEffects that are unmeasurable, censored, or parked in measurement\\_unavailable contribute nothing here. They are coverage, they are visible as such in the detail read and the scorecard, and folding them in would let a decision nobody could measure read as one that did not work.\n","title":"OutcomeStatus rolls this decision's SETTLED effects into one word: met,\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].outcome_status","typeLabel":"string"},"proposed_at":{"format":"date-time","type":"string","uniqueKey":"recent_decisions.items.[INDEX].proposed_at","typeLabel":"string\u003cdate-time>"},"rejected_at":{"description":"whose status is \\`rejected\\`.\n\nIt is nullable when the source has no trustworthy answer fact, and is never inferred from a write clock.\n","format":"date-time","title":"RejectedAt is when the proposal was refused, and it is present only on a\ndecision\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].rejected_at","typeLabel":"string\u003cdate-time>"},"review_by":{"description":"never a lifecycle status or a destructive rewrite of the original record.\n","format":"date-time","title":"ReviewBy includes the legacy creation-time fallback. Lapsed is derived,\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].review_by","typeLabel":"string\u003cdate-time>"},"slug":{"type":"string","uniqueKey":"recent_decisions.items.[INDEX].slug","typeLabel":"string"},"source":{"type":"string","uniqueKey":"recent_decisions.items.[INDEX].source","typeLabel":"string"},"status":{"type":"string","uniqueKey":"recent_decisions.items.[INDEX].status","typeLabel":"string"},"subject_kind":{"description":"names it — a campaign, a page, a lead form.\n","title":"SubjectKind / SubjectLabel name what the decision is about, as the operator\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].subject_kind","typeLabel":"string"},"subject_label":{"type":"string","uniqueKey":"recent_decisions.items.[INDEX].subject_label","typeLabel":"string"},"superseded_by_decision_slug":{"description":"decision that later replaced this one. It carries the same past-authorization rule the currentness read applies — a reversal somebody PROPOSED and a human then refused has not replaced anything, and showing it here would report a course as retired exactly when the human voted to keep it.\n","title":"SupersededByDecisionSlug is the other direction of the same link: the\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].superseded_by_decision_slug","typeLabel":"string"},"supersedes_decision_slug":{"description":"the producer declared the link explicitly — a reversal states what it reverses, and nothing infers it from two decisions sharing a subject.\n","title":"SupersedesDecisionSlug names the decision this one replaced. Set only when\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].supersedes_decision_slug","typeLabel":"string"},"what":{"description":"PRODUCER's rationale — the argument the proposal was made on. When a human gave their own reason for the answer it is in DeciderRationale, never merged into this one: reading a proposal's argument as the approver's reason for accepting it is how a record starts attributing motives.\n","title":"What is the decision in one line of business English; Why is the\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].what","typeLabel":"string"},"why":{"type":"string","uniqueKey":"recent_decisions.items.[INDEX].why","typeLabel":"string"},"workstream_id":{"description":"filed under and the run that proposed it. They travel on the summary so a surface rendering one row can link the workstream without a second read — the same reason ApprovalID travels. Both are optional in fact as well as shape: an org-level decision belongs to no workstream, and a deterministic producer may have no run.\n","format":"uuid","title":"WorkstreamID / AgentRunID are provenance: the workstream the decision was\n","type":"string","uniqueKey":"recent_decisions.items.[INDEX].workstream_id","typeLabel":"string\u003cuuid>"}},"title":"DecisionSummary is the compact projection of one decision that both a\n","type":"object","uniqueKey":"recent_decisions.items.[INDEX]","typeLabel":"DecisionSummary is the compact projection of one decision that both a\n · object"},"type":"array","uniqueKey":"recent_decisions","typeLabel":"DecisionSummary is the compact projection of one decision that both a\n · object[]"},"recent_events":{"items":{"description":"— a git-log-style record of what happened and what's next. Body is free-form; actor\\_type/actor\\_id is attribution (identity, not routing).\n","properties":{"actor_id":{"format":"uuid","type":"string","uniqueKey":"recent_events.items.[INDEX].actor_id","typeLabel":"string\u003cuuid>"},"actor_type":{"type":"string","uniqueKey":"recent_events.items.[INDEX].actor_type","typeLabel":"string"},"body":{"type":"string","uniqueKey":"recent_events.items.[INDEX].body","typeLabel":"string"},"created_at":{"format":"date-time","type":"string","uniqueKey":"recent_events.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"id":{"format":"uuid","type":"string","uniqueKey":"recent_events.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"organization_id":{"format":"uuid","type":"string","uniqueKey":"recent_events.items.[INDEX].organization_id","typeLabel":"string\u003cuuid>"},"workstream_id":{"format":"uuid","type":"string","uniqueKey":"recent_events.items.[INDEX].workstream_id","typeLabel":"string\u003cuuid>"}},"title":"WorkstreamEvent is one entry in a workstream's append-only, chronological log\n","type":"object","uniqueKey":"recent_events.items.[INDEX]","typeLabel":"WorkstreamEvent is one entry in a workstream's append-only, chronological log\n · object"},"type":"array","uniqueKey":"recent_events","typeLabel":"WorkstreamEvent is one entry in a workstream's append-only, chronological log\n · object[]"},"recently_resolved_attention_items":{"description":"that a human (or the expiry safe-default) resolved within the recent window. The loop reads these to act on ANSWERS to the escalations/choices it asked — a self-reconciling pass must be able to read back the human's reply, not just re-ask. Carries the answer + applied safe\\_default; newest first.\n","items":{"description":"surfaced in the Activity feed. See migrations/008\\_create\\_attention\\_item.\n","properties":{"answer":{"type":"object","uniqueKey":"recently_resolved_attention_items.items.[INDEX].answer","typeLabel":"object"},"answered_at":{"format":"date-time","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].answered_at","typeLabel":"string\u003cdate-time>"},"answered_by_user_id":{"format":"uuid","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].answered_by_user_id","typeLabel":"string\u003cuuid>"},"ask":{"description":"act | read (see AttentionAsk). Derived by the service from kind, severity and payload, so every surface files the item under the same heading — an escalation a person has to go and resolve by hand is \\`act\\`, never a report.\n","title":"Ask is what the item wants from the person reading it: approve | choose |\n","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].ask","typeLabel":"string"},"body_markdown":{"type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].body_markdown","typeLabel":"string"},"created_at":{"format":"date-time","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"cycle_started_at":{"description":"reopen, while CreatedAt stays at the slug's original filing. Anything that reads the ask's age — feed recency, \"unread for\", eligibility windows — belongs to the occurrence, not the row.\n","format":"date-time","title":"CycleStartedAt is when the CURRENT occurrence began: it resets on every\n","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].cycle_started_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"format":"date-time","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].expires_at","typeLabel":"string\u003cdate-time>"},"id":{"format":"uuid","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"kind":{"title":"digest | choice | escalation | judge_rescreen\n","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].kind","typeLabel":"string"},"last_confirmed_at":{"description":"confirmation. It is optional for rows created before confirmation was introduced.\n","format":"date-time","title":"LastConfirmedAt is the database-clock timestamp of the latest producer\n","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].last_confirmed_at","typeLabel":"string\u003cdate-time>"},"organization_id":{"format":"uuid","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].organization_id","typeLabel":"string\u003cuuid>"},"payload":{"description":"{title, questions\\[]} plus optional experiment mapping; for escalation {proposed\\_answer, safe\\_default}.\n","title":"Payload carries the kind-specific shape: for choice the ask_user\n","uniqueKey":"recently_resolved_attention_items.items.[INDEX].payload","typeLabel":"any"},"read_at":{"format":"date-time","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].read_at","typeLabel":"string\u003cdate-time>"},"resolution_note":{"description":"read when it found the condition gone. Empty unless Status is \\`cleared\\` and the clear carried a note. The same text is appended to BodyMarkdown under a \"Cleared:\" heading; this field lets a surface show it on its own.\n","title":"ResolutionNote is the evidence a system clear recorded — what the monitor\n","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].resolution_note","typeLabel":"string"},"resolved_at":{"description":"dismissal, the system clearing it, or its deadline.\n","format":"date-time","title":"ResolvedAt is when the item left `open`, by any route: a person's answer or\n","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].resolved_at","typeLabel":"string\u003cdate-time>"},"severity":{"title":"info | attention | urgent\n","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].severity","typeLabel":"string"},"slug":{"type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].slug","typeLabel":"string"},"status":{"description":"expired. \\`cleared\\` is the system's own close — the monitor that filed the item found the condition gone (see AttentionStatusCleared); \\`dismissed\\` is a person's. The two were one status until October 2026, and every feed showed a monitor's close as something a person had done.\n","title":"Status is the item's lifecycle: open | answered | dismissed | cleared |\n","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].status","typeLabel":"string"},"subjects":{"description":"it. Always present (possibly empty) so a consumer never has to distinguish \"no subjects\" from \"this item predates the field\".\n","items":{"description":"The title has always carried the subject in prose — \"Campaign 23926631489: conversion rate dropped 72.5%\" — which reads well and joins to nothing: the only way back to the id is to parse an LLM-written sentence, and control flow over free text is not something this codebase does. So the emitter states it instead, at the one moment anything knows it.\n\nKind is a freeform string from a small documented vocabulary rather than an enum, because it grows with the providers the engine watches and a closed set would make every new subject kind a migration. The vocabulary today: google\\_ads\\_campaign, meta\\_ads\\_campaign, google\\_ads\\_ad\\_group, google\\_ads\\_ad (the provider's numeric ids), page (the artifact UUID), dataset (dataset slug), workstream (workstream slug).\n\nID is the subject's canonical identifier, so a caller already holding the resource can ask about it directly. Label is the human name as it read at emit time, carried so a feed row renders without a provider round trip and deliberately never matched on — names change, ids do not.\n","properties":{"id":{"type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].subjects.items.[INDEX].id","typeLabel":"string"},"kind":{"type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].subjects.items.[INDEX].kind","typeLabel":"string"},"label":{"type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].subjects.items.[INDEX].label","typeLabel":"string"}},"title":"AttentionSubject names one thing an attention item is about.\n","type":"object","uniqueKey":"recently_resolved_attention_items.items.[INDEX].subjects.items.[INDEX]","typeLabel":"AttentionSubject names one thing an attention item is about.\n · object"},"title":"Subjects is what the item is ABOUT, stated structurally by whoever emitted\n","type":"array","uniqueKey":"recently_resolved_attention_items.items.[INDEX].subjects","typeLabel":"AttentionSubject names one thing an attention item is about.\n · object[]"},"title":{"type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].title","typeLabel":"string"},"workstream_id":{"format":"uuid","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].workstream_id","typeLabel":"string\u003cuuid>"},"workstream_slug":{"description":"WorkstreamID by every read that returns an item. Empty for a standalone item, and empty if the id no longer resolves (a deleted workstream sets the item's workstream\\_id to NULL, but a foreign one would resolve to nothing rather than name another tenant's work). It travels beside the id because a uuid is not something a page, a tool or a link can act on.\n","title":"WorkstreamSlug is the owning workstream's handle, resolved from\n","type":"string","uniqueKey":"recently_resolved_attention_items.items.[INDEX].workstream_slug","typeLabel":"string"}},"title":"AttentionItem is one thing the engine wants a human to see or answer,\n","type":"object","uniqueKey":"recently_resolved_attention_items.items.[INDEX]","typeLabel":"AttentionItem is one thing the engine wants a human to see or answer,\n · object"},"title":"RecentlyResolvedAttentionItems are items the loop raised on this workstream\n","type":"array","uniqueKey":"recently_resolved_attention_items","typeLabel":"AttentionItem is one thing the engine wants a human to see or answer,\n · object[]"},"resources":{"items":{"properties":{"created_at":{"format":"date-time","type":"string","uniqueKey":"resources.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"id":{"format":"uuid","type":"string","uniqueKey":"resources.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"phase_id":{"format":"uuid","type":"string","uniqueKey":"resources.items.[INDEX].phase_id","typeLabel":"string\u003cuuid>"},"relationship_type":{"type":"string","uniqueKey":"resources.items.[INDEX].relationship_type","typeLabel":"string"},"resource_id":{"format":"uuid","type":"string","uniqueKey":"resources.items.[INDEX].resource_id","typeLabel":"string\u003cuuid>"},"resource_type":{"type":"string","uniqueKey":"resources.items.[INDEX].resource_type","typeLabel":"string"},"title":{"type":"string","uniqueKey":"resources.items.[INDEX].title","typeLabel":"string"},"workstream_id":{"format":"uuid","type":"string","uniqueKey":"resources.items.[INDEX].workstream_id","typeLabel":"string\u003cuuid>"}},"title":"WorkstreamResource is a typed link from a workstream to another domain object.\n","type":"object","uniqueKey":"resources.items.[INDEX]","typeLabel":"WorkstreamResource is a typed link from a workstream to another domain object.\n · object"},"type":"array","uniqueKey":"resources","typeLabel":"WorkstreamResource is a typed link from a workstream to another domain object.\n · object[]"},"workstream":{"description":"Operational state machine for multi-step work (campaign launches, reports, monitors).\n","properties":{"autonomy_mode":{"description":"(autopilot|propose|strict); nil inherits the org-level setting. The engine gate resolves effective mode = workstream ?? org ?? propose.\n","title":"AutonomyMode is this workstream's autonomy override\n","type":"string","uniqueKey":"workstream.autonomy_mode","typeLabel":"string"},"completed_at":{"format":"date-time","type":"string","uniqueKey":"workstream.completed_at","typeLabel":"string\u003cdate-time>"},"created_at":{"format":"date-time","type":"string","uniqueKey":"workstream.created_at","typeLabel":"string\u003cdate-time>"},"description":{"type":"string","uniqueKey":"workstream.description","typeLabel":"string"},"escalation_budget_per_day":{"format":"int32","maximum":2147483647,"minimum":-2147483648,"type":"integer","uniqueKey":"workstream.escalation_budget_per_day","typeLabel":"integer\u003cint32>"},"external_refs":{"description":"machine-readable answer to \"which campaigns is this managing?\". Always present (empty when nothing is declared) so a reader never has to tell \"governs nothing\" from \"field absent\". It rides along on every workstream read, including each entry of a root's ChildPortfolio, so a portfolio loop gets the whole account's scope from the ledger read it already makes.\n","items":{"description":"workstream governs.\n\nIt exists because \\`workstream\\_resource\\` cannot express this: that table keys on a uuid, and providers do not issue uuids — a Google Ads campaign is \\`24033607833\\`. With nowhere typed to put it, the only place scope could live was prose in a knowledge record, hand-mirrored from a mapping the job reading it could not see.\n\nEvery field is an opaque provider string. Erdo does not parse them, validate them against the provider, or dereference them; it stores what the owning consumer resolved and hands it back. That is deliberate — the consumer holds the evidence that produced the mapping, and a platform that second-guessed it would have to reimplement that evidence.\n","properties":{"account_id":{"description":"hold the same campaign id in different accounts, so a ref without it is not unique.\n","title":"AccountID is the provider's account/customer identifier. Two customers can\n","type":"string","uniqueKey":"workstream.external_refs.items.[INDEX].account_id","typeLabel":"string"},"external_id":{"title":"ExternalID is the provider's own identifier for the object.\n","type":"string","uniqueKey":"workstream.external_refs.items.[INDEX].external_id","typeLabel":"string"},"kind":{"description":"\"ad\\_group\". Free-form: providers keep inventing object types, and an allowlist here would need a platform release to track each one.\n","title":"Kind is what the id names within that provider, e.g. \"campaign\",\n","type":"string","uniqueKey":"workstream.external_refs.items.[INDEX].kind","typeLabel":"string"},"label":{"description":"approval card can say \"Northline Residences - Wellness Led\" rather than a number. Never used for matching. The development is fictional on purpose: this comment is published verbatim into docs-public/api/openapi.json, so a real customer's campaign name here names that customer on docs.erdo.ai.\n","title":"Label is an optional human-readable name, carried so a log line or\n","type":"string","uniqueKey":"workstream.external_refs.items.[INDEX].label","typeLabel":"string"},"provider":{"title":"Provider is the integration this ref belongs to, e.g. \"google_ads\".\n","type":"string","uniqueKey":"workstream.external_refs.items.[INDEX].provider","typeLabel":"string"}},"title":"ExternalRef names one object in an external provider's account that a\n","type":"object","uniqueKey":"workstream.external_refs.items.[INDEX]","typeLabel":"ExternalRef names one object in an external provider's account that a\n · object"},"title":"ExternalRefs are the provider-owned objects this workstream governs — the\n","type":"array","uniqueKey":"workstream.external_refs","typeLabel":"ExternalRef names one object in an external provider's account that a\n · object[]"},"id":{"format":"uuid","type":"string","uniqueKey":"workstream.id","typeLabel":"string\u003cuuid>"},"organization_id":{"format":"uuid","type":"string","uniqueKey":"workstream.organization_id","typeLabel":"string\u003cuuid>"},"primary_thread_id":{"format":"uuid","type":"string","uniqueKey":"workstream.primary_thread_id","typeLabel":"string\u003cuuid>"},"project_id":{"format":"uuid","type":"string","uniqueKey":"workstream.project_id","typeLabel":"string\u003cuuid>"},"revision":{"description":"title, description, budgets, autonomy, external refs and phases that say what it IS. Spend accrual and the reconciliation pass counters write the same row and deliberately do not move it, so a coordinator's read is not invalidated by a worker's cost landing mid-pass.\n\nIt rides on every read because it is what a writer writes against: a coordinator reads the position, spends minutes deciding, and passes this number back on the write. If a human steered or a worker's result landed in between, the write is refused and the pass re-reads rather than committing a decision about a world that has moved.\n","format":"int64","title":"Revision counts the authoritative mutations of this workstream — the state,\n","type":"integer","uniqueKey":"workstream.revision","typeLabel":"integer\u003cint64>"},"slug":{"type":"string","uniqueKey":"workstream.slug","typeLabel":"string"},"source_template_id":{"format":"uuid","type":"string","uniqueKey":"workstream.source_template_id","typeLabel":"string\u003cuuid>"},"spent_millicents":{"format":"int64","type":"integer","uniqueKey":"workstream.spent_millicents","typeLabel":"integer\u003cint64>"},"started_at":{"format":"date-time","type":"string","uniqueKey":"workstream.started_at","typeLabel":"string\u003cdate-time>"},"status":{"type":"string","uniqueKey":"workstream.status","typeLabel":"string"},"title":{"type":"string","uniqueKey":"workstream.title","typeLabel":"string"},"token_budget_millicents":{"description":"ceiling (nil = unlimited); SpentMillicents is the running total accrued from completed engine work; EscalationBudgetPerDay caps urgent items per rolling 24h (nil = org default). Millicents are thousandths of a cent: money.MillicentsPerDollar (100,000) per dollar, which is the unit provider.CostBreakdown.Millicents() writes spend in.\n","format":"int64","title":"Budget envelope (work-engine D6). TokenBudgetMillicents is the spend\n","type":"integer","uniqueKey":"workstream.token_budget_millicents","typeLabel":"integer\u003cint64>"},"updated_at":{"format":"date-time","type":"string","uniqueKey":"workstream.updated_at","typeLabel":"string\u003cdate-time>"}},"title":"Workstream represents a piece of business work in motion.\n","type":"object","uniqueKey":"workstream","typeLabel":"Workstream represents a piece of business work in motion.\n · object"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"allocator_recommendation":{"bets":[{"action":"\u003cstring>","champion_judge":"\u003cstring>","cost_attributed":true,"cost_millicents":123,"experiment_slug":"\u003cstring>","has_reality":true,"judge_standing":123,"posterior_source":"\u003cstring>","rationale":"\u003cstring>","value_mean":123,"value_per_cost_mean":123,"value_per_cost_stddev":123,"value_stddev":123,"variant_key":"\u003cstring>"}],"budget_exhausted":true,"notes":["\u003cstring>"],"remaining_millicents":123},"assignments":[{"acceptance_criteria":"\u003cstring>","adoption_state":"\u003cstring>","assigned_agent_key":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","expected_result_kind":"\u003cstring>","id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","latest_attempt":{"affected_output":"\u003cstring>","agent_run_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","attempt_number":123,"ended_at":"2023-11-07T05:31:56Z","handles":[{"resource_id":"\u003cstring>","resource_type":"\u003cstring>","revision_ref":"\u003cstring>"}],"result_kind":"\u003cstring>","state":"\u003cstring>","summary":"\u003cstring>","terminal_cause":"\u003cstring>","terminal_reason":"\u003cstring>"},"objective":"\u003cstring>","reason":"\u003cstring>","slug":"\u003cstring>","work_state":"\u003cstring>","work_state_reason":"\u003cstring>"}],"calibration":[{"agreed_pairs":123,"by_artifact_kind":{},"by_grounding_source":{},"comparable_pairs":123,"direct_pairs":123,"effective_agreement":123,"effective_pairs":123,"judge_slug":"\u003cstring>","misordered_examples":[{"experiment_run_id":"\u003cstring>","judge_winner":"\u003cstring>","judge_winner_value":123,"metric":"\u003cstring>","reality_winner":"\u003cstring>","reality_winner_value":123}],"paired_predictions":123,"pairwise_agreement_rate":123,"platform_agreement":123,"platform_pairs":123,"random_arm_pairs":123,"total_comparisons":123,"total_predictions":123}],"child_portfolio":[{"experiment_count":123,"open_attention_count":123,"resources":[{"created_at":"2023-11-07T05:31:56Z","id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","phase_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","relationship_type":"\u003cstring>","resource_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","resource_type":"\u003cstring>","title":"\u003cstring>","workstream_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}],"running_experiment_count":123,"workstream":{"autonomy_mode":"\u003cstring>","completed_at":"2023-11-07T05:31:56Z","created_at":"2023-11-07T05:31:56Z","description":"\u003cstring>","escalation_budget_per_day":-1,"external_refs":[{"account_id":"\u003cstring>","external_id":"\u003cstring>","kind":"\u003cstring>","label":"\u003cstring>","provider":"\u003cstring>"}],"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","organization_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","primary_thread_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","project_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","revision":123,"slug":"\u003cstring>","source_template_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","spent_millicents":123,"started_at":"2023-11-07T05:31:56Z","status":"\u003cstring>","title":"\u003cstring>","token_budget_millicents":123,"updated_at":"2023-11-07T05:31:56Z"}}],"current_decisions":[{"age_seconds":123,"agent_run_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","alternatives_considered":"\u003cstring>","applicability":"\u003cstring>","approval_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","authorized_at":"2023-11-07T05:31:56Z","decided_by_name":"\u003cstring>","decided_by_user_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","decider_kind":"\u003cstring>","decider_rationale":"\u003cstring>","decision_class":"\u003cstring>","evidence_kind":"\u003cstring>","execution_status":"\u003cstring>","exit_condition":"\u003cstring>","has_pending_effects":true,"lapsed":true,"outcome_label":"\u003cstring>","outcome_status":"\u003cstring>","proposed_at":"2023-11-07T05:31:56Z","rejected_at":"2023-11-07T05:31:56Z","review_by":"2023-11-07T05:31:56Z","slug":"\u003cstring>","source":"\u003cstring>","status":"\u003cstring>","subject_kind":"\u003cstring>","subject_label":"\u003cstring>","superseded_by_decision_slug":"\u003cstring>","supersedes_decision_slug":"\u003cstring>","what":"\u003cstring>","why":"\u003cstring>","workstream_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}],"defects":[{"experiment_run_id":"\u003cstring>","judge_slug":"\u003cstring>","observed_at":"2023-11-07T05:31:56Z","reason":"\u003cstring>","variant_key":"\u003cstring>"}],"experiments":[{"experiment":{"created_at":"2023-11-07T05:31:56Z","decided_at":"2023-11-07T05:31:56Z","decision":"\u003cstring>","decision_rule_markdown":"\u003cstring>","guardrail_metrics":["\u003cstring>"],"hypothesis_markdown":"\u003cstring>","id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","organization_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","outcome_markdown":"\u003cstring>","primary_metric":"\u003cstring>","primary_thread_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","project_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","scope":"\u003cstring>","slug":"\u003cstring>","started_at":"2023-11-07T05:31:56Z","status":"\u003cstring>","title":"\u003cstring>","updated_at":"2023-11-07T05:31:56Z","workstream_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"},"recent_observations":[{"action_taken":"\u003cstring>","agent_run_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","created_at":"2023-11-07T05:31:56Z","details":{},"evidence_dataset_slug":"\u003cstring>","evidence_resource_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","experiment_run_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","job_execution_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","metric_name":"\u003cstring>","metric_value":123,"observation_type":"\u003cstring>","observed_at":"2023-11-07T05:31:56Z","organization_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","project_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","reason_code":"\u003cstring>","variant_key":"\u003cstring>","window_end":"2023-11-07T05:31:56Z","window_start":"2023-11-07T05:31:56Z"}],"variants":[{"allocation_percent":-1,"created_at":"2023-11-07T05:31:56Z","experiment_run_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","is_control":true,"key":"\u003cstring>","label":"\u003cstring>","treatment_class":"\u003cstring>","treatment_resource_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","treatment_resource_type":"\u003cstring>","treatment_url":"\u003cstring>"}]}],"judged_bets":123,"lapsed_decisions":[{"age_seconds":123,"agent_run_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","alternatives_considered":"\u003cstring>","applicability":"\u003cstring>","approval_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","authorized_at":"2023-11-07T05:31:56Z","decided_by_name":"\u003cstring>","decided_by_user_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","decider_kind":"\u003cstring>","decider_rationale":"\u003cstring>","decision_class":"\u003cstring>","evidence_kind":"\u003cstring>","execution_status":"\u003cstring>","exit_condition":"\u003cstring>","has_pending_effects":true,"lapsed":true,"outcome_label":"\u003cstring>","outcome_status":"\u003cstring>","proposed_at":"2023-11-07T05:31:56Z","rejected_at":"2023-11-07T05:31:56Z","review_by":"2023-11-07T05:31:56Z","slug":"\u003cstring>","source":"\u003cstring>","status":"\u003cstring>","subject_kind":"\u003cstring>","subject_label":"\u003cstring>","superseded_by_decision_slug":"\u003cstring>","supersedes_decision_slug":"\u003cstring>","what":"\u003cstring>","why":"\u003cstring>","workstream_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}],"monitor_findings":[{"answer":{},"answered_at":"2023-11-07T05:31:56Z","answered_by_user_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","ask":"\u003cstring>","body_markdown":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","cycle_started_at":"2023-11-07T05:31:56Z","expires_at":"2023-11-07T05:31:56Z","id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","kind":"\u003cstring>","last_confirmed_at":"2023-11-07T05:31:56Z","organization_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","payload":"\u003cunknown>","read_at":"2023-11-07T05:31:56Z","resolution_note":"\u003cstring>","resolved_at":"2023-11-07T05:31:56Z","severity":"\u003cstring>","slug":"\u003cstring>","status":"\u003cstring>","subjects":[{"id":"\u003cstring>","kind":"\u003cstring>","label":"\u003cstring>"}],"title":"\u003cstring>","workstream_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","workstream_slug":"\u003cstring>"}],"open_attention_items":[{"answer":{},"answered_at":"2023-11-07T05:31:56Z","answered_by_user_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","ask":"\u003cstring>","body_markdown":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","cycle_started_at":"2023-11-07T05:31:56Z","expires_at":"2023-11-07T05:31:56Z","id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","kind":"\u003cstring>","last_confirmed_at":"2023-11-07T05:31:56Z","organization_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","payload":"\u003cunknown>","read_at":"2023-11-07T05:31:56Z","resolution_note":"\u003cstring>","resolved_at":"2023-11-07T05:31:56Z","severity":"\u003cstring>","slug":"\u003cstring>","status":"\u003cstring>","subjects":[{"id":"\u003cstring>","kind":"\u003cstring>","label":"\u003cstring>"}],"title":"\u003cstring>","workstream_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","workstream_slug":"\u003cstring>"}],"organization_changes":[{"age_seconds":123,"agent_run_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","alternatives_considered":"\u003cstring>","applicability":"\u003cstring>","approval_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","authorized_at":"2023-11-07T05:31:56Z","decided_by_name":"\u003cstring>","decided_by_user_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","decider_kind":"\u003cstring>","decider_rationale":"\u003cstring>","decision_class":"\u003cstring>","evidence_kind":"\u003cstring>","execution_status":"\u003cstring>","exit_condition":"\u003cstring>","has_pending_effects":true,"lapsed":true,"outcome_label":"\u003cstring>","outcome_status":"\u003cstring>","proposed_at":"2023-11-07T05:31:56Z","rejected_at":"2023-11-07T05:31:56Z","review_by":"2023-11-07T05:31:56Z","slug":"\u003cstring>","source":"\u003cstring>","status":"\u003cstring>","subject_kind":"\u003cstring>","subject_label":"\u003cstring>","superseded_by_decision_slug":"\u003cstring>","supersedes_decision_slug":"\u003cstring>","what":"\u003cstring>","why":"\u003cstring>","workstream_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}],"organization_changes_truncated":true,"phases":[{"completed_at":"2023-11-07T05:31:56Z","created_at":"2023-11-07T05:31:56Z","id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","skill_slug":"\u003cstring>","slug":"\u003cstring>","sort_order":-1,"started_at":"2023-11-07T05:31:56Z","status":"\u003cstring>","thread_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","title":"\u003cstring>","updated_at":"2023-11-07T05:31:56Z","workstream_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}],"random_arm_bets":123,"recent_decisions":[{"age_seconds":123,"agent_run_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","alternatives_considered":"\u003cstring>","applicability":"\u003cstring>","approval_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","authorized_at":"2023-11-07T05:31:56Z","decided_by_name":"\u003cstring>","decided_by_user_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","decider_kind":"\u003cstring>","decider_rationale":"\u003cstring>","decision_class":"\u003cstring>","evidence_kind":"\u003cstring>","execution_status":"\u003cstring>","exit_condition":"\u003cstring>","has_pending_effects":true,"lapsed":true,"outcome_label":"\u003cstring>","outcome_status":"\u003cstring>","proposed_at":"2023-11-07T05:31:56Z","rejected_at":"2023-11-07T05:31:56Z","review_by":"2023-11-07T05:31:56Z","slug":"\u003cstring>","source":"\u003cstring>","status":"\u003cstring>","subject_kind":"\u003cstring>","subject_label":"\u003cstring>","superseded_by_decision_slug":"\u003cstring>","supersedes_decision_slug":"\u003cstring>","what":"\u003cstring>","why":"\u003cstring>","workstream_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}],"recent_events":[{"actor_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","actor_type":"\u003cstring>","body":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","organization_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","workstream_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}],"recently_resolved_attention_items":[{"answer":{},"answered_at":"2023-11-07T05:31:56Z","answered_by_user_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","ask":"\u003cstring>","body_markdown":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","cycle_started_at":"2023-11-07T05:31:56Z","expires_at":"2023-11-07T05:31:56Z","id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","kind":"\u003cstring>","last_confirmed_at":"2023-11-07T05:31:56Z","organization_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","payload":"\u003cunknown>","read_at":"2023-11-07T05:31:56Z","resolution_note":"\u003cstring>","resolved_at":"2023-11-07T05:31:56Z","severity":"\u003cstring>","slug":"\u003cstring>","status":"\u003cstring>","subjects":[{"id":"\u003cstring>","kind":"\u003cstring>","label":"\u003cstring>"}],"title":"\u003cstring>","workstream_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","workstream_slug":"\u003cstring>"}],"resources":[{"created_at":"2023-11-07T05:31:56Z","id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","phase_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","relationship_type":"\u003cstring>","resource_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","resource_type":"\u003cstring>","title":"\u003cstring>","workstream_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}],"workstream":{"autonomy_mode":"\u003cstring>","completed_at":"2023-11-07T05:31:56Z","created_at":"2023-11-07T05:31:56Z","description":"\u003cstring>","escalation_budget_per_day":-1,"external_refs":[{"account_id":"\u003cstring>","external_id":"\u003cstring>","kind":"\u003cstring>","label":"\u003cstring>","provider":"\u003cstring>"}],"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","organization_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","primary_thread_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","project_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","revision":123,"slug":"\u003cstring>","source_template_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","spent_millicents":123,"started_at":"2023-11-07T05:31:56Z","status":"\u003cstring>","title":"\u003cstring>","token_budget_millicents":123,"updated_at":"2023-11-07T05:31:56Z"}}}},"exampleType":"generated"}},"description":"Success response","exampleType":"generated"},"88199270-ddbb-4409-be6a-054e72ac5418":{"content":{"application/json":{"schema":{"externalDocs":{"url":"https://pkg.go.dev/encore.dev/beta/errs#Error"},"properties":{"code":{"description":"Error code","example":"not_found","externalDocs":{"url":"https://pkg.go.dev/encore.dev/beta/errs#ErrCode"},"type":"string","uniqueKey":"code","typeLabel":"string"},"details":{"description":"Error details","type":"object","uniqueKey":"details","typeLabel":"object"},"message":{"description":"Error message","type":"string","uniqueKey":"message","typeLabel":"string"}},"title":"APIError","type":"object","uniqueKey":"","typeLabel":"APIError · object"},"examples":{"Example":{"title":"Example","value":{"code":"not_found","details":{},"message":"\u003cstring>"}}},"exampleType":"generated"}},"description":"Error response","exampleType":"generated"}},"security":{"87ded638-1a4c-4e27-bc39-d45352300008":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"25229d51-4af5-48c1-9f4c-aa490e05e71b":{"url":"https://api.erdo.ai","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"api/openapi.json"},"subdomain":"erdoai","siteName":"Erdo Docs","title":"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator's\n - Erdo Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-23T11:46:42.518Z","originalFileLocation":"api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"single ledger read (budget, experiments + observations, calibration, steering notes, attention items, allocator recommendation).\">\u003cmeta data-mint-head name=\"application-name\" content=\"Erdo Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator\u0026#x27;s\n - Erdo Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"single ledger read (budget, experiments + observations, calibration, steering notes, attention items, allocator recommendation).\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Erdo Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.erdo.ai/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://erdoai.mintlify.app/_mintlify/api/og/v2?division=API+Reference\u0026amp;title=ReadWorkstreamLedgerAPI+mirrors+erdo_read_workstream_ledger%3A+the+allocator%27s%0A\u0026amp;description=single+ledger+read+%28budget%2C+experiments+%2B+observations%2C+calibration%2C+steering+notes%2C+attention+items%2C+allocator+recommendation%29.%0A\u0026amp;theme=19c963d80c676f95ec8599a1\u0026amp;signature=1378b170caeeed2556acf2e0f589073db3b62f6114ee1b65df44764181cdd681\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator\u0026#x27;s\n - Erdo Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"single ledger read (budget, experiments + observations, calibration, steering notes, attention items, allocator recommendation).\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://erdoai.mintlify.app/_mintlify/api/og/v2?division=API+Reference\u0026amp;title=ReadWorkstreamLedgerAPI+mirrors+erdo_read_workstream_ledger%3A+the+allocator%27s%0A\u0026amp;description=single+ledger+read+%28budget%2C+experiments+%2B+observations%2C+calibration%2C+steering+notes%2C+attention+items%2C+allocator+recommendation%29.%0A\u0026amp;theme=19c963d80c676f95ec8599a1\u0026amp;signature=1378b170caeeed2556acf2e0f589073db3b62f6114ee1b65df44764181cdd681\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/erdoai/bTYd8fHnLhJ4GdqC/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Erdo Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#008b1d\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.erdo.ai/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger%3A-the-allocators.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.erdo.ai/#organization\",\"name\":\"Erdo Docs\",\"url\":\"https://docs.erdo.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/erdoai/a0Yf-u_wE-IxMDL6/logo/light.png?fit=max\u0026auto=format\u0026n=a0Yf-u_wE-IxMDL6\u0026q=85\u0026s=87480ed4521e74bd7996b5c35e23c346\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.erdo.ai#website\",\"name\":\"Erdo Docs\",\"url\":\"https://docs.erdo.ai\",\"publisher\":{\"@id\":\"https://docs.erdo.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.erdo.ai/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators#webpage\",\"url\":\"https://docs.erdo.ai/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators\",\"name\":\"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator's\\n\",\"description\":\"single ledger read (budget, experiments + observations, calibration, steering notes, attention items, allocator recommendation).\",\"dateModified\":\"2026-10-23T11:46:42.518Z\",\"isPartOf\":{\"@id\":\"https://docs.erdo.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.erdo.ai/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.erdo.ai/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.erdo.ai/api-reference/listactivityfeedapi-mirrors-erdo_list_activity_feed:-the-unified-ranked\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API Reference\",\"item\":\"https://docs.erdo.ai/api-reference/listactivityfeedapi-mirrors-erdo_list_activity_feed:-the-unified-ranked\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator's\\n\",\"item\":\"https://docs.erdo.ai/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.erdo.ai/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators#apireference\",\"headline\":\"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator's\\n\",\"name\":\"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator's\\n\",\"description\":\"single ledger read (budget, experiments + observations, calibration, steering notes, attention items, allocator recommendation).\",\"url\":\"https://docs.erdo.ai/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators\",\"mainEntityOfPage\":{\"@id\":\"https://docs.erdo.ai/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators#webpage\"},\"dateModified\":\"2026-10-23T11:46:42.518Z\",\"publisher\":{\"@id\":\"https://docs.erdo.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.erdo.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Erdo Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Erdo Docs","nav":{"global":null,"tabs":[{"tab":"Product","pages":[{"title":"Product","href":"/introduction"}]},{"tab":"Developers","groups":[{"group":"Platform API","pages":[{"title":"REST API","href":"/api/overview"},{"title":"Realtime updates","href":"/api/realtime"},{"title":"Scoped API Keys","href":"/api/scoped-keys"},{"title":"Manager accounts","href":"/manager-accounts"},{"title":"Email a Maurice proposal and Order","href":"/maurice-order-email"},{"title":"Custom domains","href":"/custom-domains"},{"title":"Email sending domains","href":"/sending-domains"},{"title":"Integration connect links","href":"/connect-links"},{"title":"Which account a connection uses","href":"/connection-accounts"},{"title":"Approvals","href":"/approvals"},{"title":"Ad accounts","href":"/ad-accounts"},{"title":"Paid-media campaign lifecycle","href":"/paid-media"},{"title":"Search campaign setup","href":"/search-campaign-setup"},{"title":"How Erdo bids","href":"/bidding"},{"title":"Org history","href":"/history"},{"title":"The review queue","href":"/review-queue"},{"title":"Page analytics","href":"/page-analytics"},{"title":"Page tracking","href":"/page-tracking"},{"title":"Evals","href":"/evals"},{"title":"Event pipelines","href":"/event-pipelines"},{"title":"Lead identity","href":"/lead-identity"},{"title":"Delete a lead","href":"/delete-a-lead"},{"title":"Resolve refused submissions","href":"/capture-resolution"},{"title":"Lead details","href":"/lead-details"},{"title":"Lead next action","href":"/lead-next-action"},{"title":"Strategies","href":"/strategies"},{"title":"Workstreams","href":"/workstreams"},{"title":"Growth reviews","href":"/growth-reviews"},{"title":"Decisions","href":"/decisions"},{"title":"Experiments","href":"/experiments"},{"title":"Your attention feed","href":"/attention"},{"title":"Page feedback","href":"/page-feedback"},{"title":"Engine autonomy","href":"/autonomy"},{"title":"Persona panel — the wind tunnel","href":"/persona-panel"},{"title":"Page reviews — the critic on any URL","href":"/page-reviews"},{"title":"Bounded outreach","href":"/outreach"},{"title":"Cross-customer priors","href":"/cross-customer-priors"},{"title":"The wind tunnel","href":"/wind-tunnel"},{"title":"Judges and calibration","href":"/judges"}]},{"group":"API Reference","pages":[{"group":"API Reference","pages":[{"title":"ListActivityFeedAPI mirrors erdo_list_activity_feed: the unified, ranked,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/activity/feed","href":"/api-reference/listactivityfeedapi-mirrors-erdo_list_activity_feed:-the-unified-ranked"},{"title":"ListActivityHistoryAPI mirrors erdo_list_activity_history: the org's durable,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/activity/history","href":"/api-reference/listactivityhistoryapi-mirrors-erdo_list_activity_history:-the-orgs-durable"},{"title":"Lists the advertising accounts this organization's connected integrations can\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/ad-accounts","href":"/api-reference/lists-the-advertising-accounts-this-organizations-connected-integrations-can"},{"title":"ListApprovalPoliciesAPI lists standing policies for the active organization.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/approval-policies","href":"/api-reference/listapprovalpoliciesapi-lists-standing-policies-for-the-active-organization"},{"title":"CreateApprovalPolicyAPI creates a standing policy without executing the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/approval-policies","href":"/api-reference/createapprovalpolicyapi-creates-a-standing-policy-without-executing-the"},{"title":"DeleteApprovalPolicyAPI removes one standing policy in the active organization.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/approval-policies/{id}","href":"/api-reference/deleteapprovalpolicyapi-removes-one-standing-policy-in-the-active-organization"},{"title":"GetApprovalSettingsAPI mirrors erdo_get_approval_settings: read the caller's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/approval-settings","href":"/api-reference/getapprovalsettingsapi-mirrors-erdo_get_approval_settings:-read-the-callers"},{"title":"SetApprovalSettingsAPI mirrors erdo_set_approval_settings: replace the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/approval-settings","href":"/api-reference/setapprovalsettingsapi-mirrors-erdo_set_approval_settings:-replace-the"},{"title":"ListApprovalsAPI mirrors erdo_list_approvals.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/approvals","href":"/api-reference/listapprovalsapi-mirrors-erdo_list_approvals"},{"title":"GetApprovalAPI mirrors erdo_get_approval: one request in full, the read a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/approvals/{id}","href":"/api-reference/getapprovalapi-mirrors-erdo_get_approval:-one-request-in-full-the-read-a"},{"title":"DecideApprovalAPI mirrors erdo_decide_approval.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/approvals/{id}/decide","href":"/api-reference/decideapprovalapi-mirrors-erdo_decide_approval"},{"title":"ListArtifactsAPI mirrors the erdo_list_artifacts MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/artifacts","href":"/api-reference/listartifactsapi-mirrors-the-erdo_list_artifacts-mcp-tool"},{"title":"GetArtifactAPI mirrors the erdo_get_artifact MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/artifacts/{artifactID}","href":"/api-reference/getartifactapi-mirrors-the-erdo_get_artifact-mcp-tool"},{"title":"AskDataQuestionAPI mirrors the erdo_ask_data_question MCP tool as a REST\nendpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/ask","href":"/api-reference/askdataquestionapi-mirrors-the-erdo_ask_data_question-mcp-tool-as-a-restendpoint"},{"title":"ListAttentionItemsAPI mirrors erdo_list_attention_items.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/attention","href":"/api-reference/listattentionitemsapi-mirrors-erdo_list_attention_items"},{"title":"RespondAttentionItemAPI mirrors erdo_respond_attention_item: answer a choice\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/attention/{itemID}/respond","href":"/api-reference/respondattentionitemapi-mirrors-erdo_respond_attention_item:-answer-a-choice"},{"title":"GetAutonomyGatesAPI mirrors erdo_get_autonomy_gates: read which risk classes\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/autonomy-gates","href":"/api-reference/getautonomygatesapi-mirrors-erdo_get_autonomy_gates:-read-which-risk-classes"},{"title":"SetAutonomyGatesAPI mirrors erdo_set_autonomy_gates: replace the org's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/autonomy-gates","href":"/api-reference/setautonomygatesapi-mirrors-erdo_set_autonomy_gates:-replace-the-orgs"},{"title":"GetAutonomyModeAPI mirrors erdo_get_autonomy_mode: read the org's engine\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/autonomy-mode","href":"/api-reference/getautonomymodeapi-mirrors-erdo_get_autonomy_mode:-read-the-orgs-engine"},{"title":"SetAutonomyModeAPI mirrors erdo_set_autonomy_mode: set the org's engine\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/autonomy-mode","href":"/api-reference/setautonomymodeapi-mirrors-erdo_set_autonomy_mode:-set-the-orgs-engine"},{"title":"ListCrossCustomerPriorsAPI mirrors erdo_list_cross_customer_priors.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/cross-customer-priors","href":"/api-reference/listcrosscustomerpriorsapi-mirrors-erdo_list_cross_customer_priors"},{"title":"ListCustomDomainsAPI lists the caller org's custom page domains with live\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/custom-domains","href":"/api-reference/listcustomdomainsapi-lists-the-caller-orgs-custom-page-domains-with-live"},{"title":"CreateCustomDomainAPI registers a custom domain for the caller's org and\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/custom-domains","href":"/api-reference/createcustomdomainapi-registers-a-custom-domain-for-the-callers-org-and"},{"title":"DeleteCustomDomainAPI removes a custom domain registration (and its CDN\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/custom-domains/{domain}","href":"/api-reference/deletecustomdomainapi-removes-a-custom-domain-registration-and-its-cdn"},{"title":"SetCustomDomainManagerDefaultAPI marks a registered domain as the one the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/custom-domains/{domain}/manager-default","href":"/api-reference/setcustomdomainmanagerdefaultapi-marks-a-registered-domain-as-the-one-the"},{"title":"TransferCustomDomainAPI moves a custom domain to another organization the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/custom-domains/{domain}/transfer","href":"/api-reference/transfercustomdomainapi-moves-a-custom-domain-to-another-organization-the"},{"title":"GatherDatasetContextAPI mirrors the erdo_gather_dataset_context MCP tool as a\nREST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/dataset-context","href":"/api-reference/gatherdatasetcontextapi-mirrors-the-erdo_gather_dataset_context-mcp-tool-as-arest-endpoint"},{"title":"GetDatasetNotificationAPI reports who is emailed when new rows land in a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/dataset-notifications","href":"/api-reference/getdatasetnotificationapi-reports-who-is-emailed-when-new-rows-land-in-a"},{"title":"SetDatasetNotificationAPI replaces the email recipients and optional durable\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/dataset-notifications","href":"/api-reference/setdatasetnotificationapi-replaces-the-email-recipients-and-optional-durable"},{"title":"Lists what already happens to new rows in a dataset: every declaration on it,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/dataset-row-actions","href":"/api-reference/lists-what-already-happens-to-new-rows-in-a-dataset:-every-declaration-on-it"},{"title":"Declares what happens when new rows land in a dataset: invoke an action on\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/dataset-row-actions","href":"/api-reference/declares-what-happens-when-new-rows-land-in-a-dataset:-invoke-an-action-on"},{"title":"Renders the email a declaration would produce for one sample row and delivers\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/dataset-row-actions/test-send","href":"/api-reference/renders-the-email-a-declaration-would-produce-for-one-sample-row-and-delivers"},{"title":"ListDatasetsAPI mirrors the erdo_list_datasets MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets","href":"/api-reference/listdatasetsapi-mirrors-the-erdo_list_datasets-mcp-tool-as-a-rest-endpoint"},{"title":"CreateDatasetAPI creates a new empty dataset.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets-create","href":"/api-reference/createdatasetapi-creates-a-new-empty-dataset"},{"title":"EnsureDatasetAPI creates, reuses, or explicitly adopts the one dataset for a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets-ensure","href":"/api-reference/ensuredatasetapi-creates-reuses-or-explicitly-adopts-the-one-dataset-for-a"},{"title":"ListDatasetPurposesAPI mirrors the erdo_list_dataset_purposes MCP tool as a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets-purposes","href":"/api-reference/listdatasetpurposesapi-mirrors-the-erdo_list_dataset_purposes-mcp-tool-as-a"},{"title":"SearchDatasetsAPI mirrors the erdo_search_datasets MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets-search","href":"/api-reference/searchdatasetsapi-mirrors-the-erdo_search_datasets-mcp-tool-as-a-rest-endpoint"},{"title":"UploadDatasetFileAPI mirrors the erdo_upload_dataset_file MCP tool as a REST\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets-upload","href":"/api-reference/uploaddatasetfileapi-mirrors-the-erdo_upload_dataset_file-mcp-tool-as-a-rest"},{"title":"GetDatasetSchemaAPI mirrors the erdo_get_dataset_schema MCP tool as a REST\nendpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetID}/schema","href":"/api-reference/getdatasetschemaapi-mirrors-the-erdo_get_dataset_schema-mcp-tool-as-a-restendpoint"},{"title":"DeleteDatasetAPI deletes a dataset by slug.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/datasets/{datasetSlug}","href":"/api-reference/deletedatasetapi-deletes-a-dataset-by-slug"},{"title":"FetchDatasetContentsAPI mirrors the erdo_fetch_dataset_contents MCP tool as a\nREST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/fetch","href":"/api-reference/fetchdatasetcontentsapi-mirrors-the-erdo_fetch_dataset_contents-mcp-tool-as-arest-endpoint"},{"title":"ListDatasetFiltersAPI mirrors the erdo_list_dataset_filters MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/filters","href":"/api-reference/listdatasetfiltersapi-mirrors-the-erdo_list_dataset_filters-mcp-tool"},{"title":"CreateDatasetFilterAPI mirrors the erdo_add_dataset_filter MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/filters","href":"/api-reference/createdatasetfilterapi-mirrors-the-erdo_add_dataset_filter-mcp-tool"},{"title":"DeleteDatasetFilterAPI mirrors the erdo_remove_dataset_filter MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/datasets/{datasetSlug}/filters/{filterID}","href":"/api-reference/deletedatasetfilterapi-mirrors-the-erdo_remove_dataset_filter-mcp-tool"},{"title":"ListLeadMergeCandidatesAPI mirrors the erdo_list_lead_merge_candidates MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/lead-candidates","href":"/api-reference/listleadmergecandidatesapi-mirrors-the-erdo_list_lead_merge_candidates-mcp-tool"},{"title":"ResolveLeadCaptureAPI previews or records an audited disposition of a refused\ncapture.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/lead-captures/{captureID}/resolve","href":"/api-reference/resolveleadcaptureapi-previews-or-records-an-audited-disposition-of-a-refusedcapture"},{"title":"MaintainLeadIdentityAPI is the REST surface for previewing and performing a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/lead-identity/maintain","href":"/api-reference/maintainleadidentityapi-is-the-rest-surface-for-previewing-and-performing-a"},{"title":"GetLeadAPI mirrors the erdo_get_lead MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/leads/{leadRef}","href":"/api-reference/getleadapi-mirrors-the-erdo_get_lead-mcp-tool"},{"title":"DeleteLeadAPI removes one lead from Erdo: its row and identity, its\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/datasets/{datasetSlug}/leads/{leadRef}","href":"/api-reference/deleteleadapi-removes-one-lead-from-erdo:-its-row-and-identity-its"},{"title":"MergeLeadsAPI makes two lead identities one lead: the absorbed identity points\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/leads/{leadRef}/merge","href":"/api-reference/mergeleadsapi-makes-two-lead-identities-one-lead:-the-absorbed-identity-points"},{"title":"GetLeadNextActionsAPI mirrors the erdo_get_lead_next_actions MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/leads/{leadRef}/next-actions","href":"/api-reference/getleadnextactionsapi-mirrors-the-erdo_get_lead_next_actions-mcp-tool"},{"title":"RecordLeadNextActionAPI records a person's hold, close or start on one lead.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/leads/{leadRef}/next-actions","href":"/api-reference/recordleadnextactionapi-records-a-persons-hold-close-or-start-on-one-lead"},{"title":"EvaluateLeadNextActionAPI mirrors the erdo_evaluate_lead_next_action MCP\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/leads/{leadRef}/next-actions/evaluate","href":"/api-reference/evaluateleadnextactionapi-mirrors-the-erdo_evaluate_lead_next_action-mcp"},{"title":"ResolveLeadHandoffAPI records the sales desk marking a handoff done or not\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/leads/{leadRef}/next-actions/handoff","href":"/api-reference/resolveleadhandoffapi-records-the-sales-desk-marking-a-handoff-done-or-not"},{"title":"ResumeLeadNextActionsAPI hands a lead the desk snoozed (held) or stopped\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/leads/{leadRef}/next-actions/resume","href":"/api-reference/resumeleadnextactionsapi-hands-a-lead-the-desk-snoozed-held-or-stopped"},{"title":"UndoLeadNextActionAPI takes back an approval that has not been carried out\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/leads/{leadRef}/next-actions/undo","href":"/api-reference/undoleadnextactionapi-takes-back-an-approval-that-has-not-been-carried-out"},{"title":"GetLeadTimelineAPI mirrors the erdo_get_lead_timeline MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/leads/{leadRef}/timeline","href":"/api-reference/getleadtimelineapi-mirrors-the-erdo_get_lead_timeline-mcp-tool"},{"title":"List explicit user grants on a dataset in the active organization.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/permissions/users","href":"/api-reference/list-explicit-user-grants-on-a-dataset-in-the-active-organization"},{"title":"Set an explicit user grant and return the persisted grant. Ownership is\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/datasets/{datasetSlug}/permissions/users/{userID}","href":"/api-reference/set-an-explicit-user-grant-and-return-the-persisted-grant-ownership-is"},{"title":"Remove an explicit user grant and verify its absence. Inherited access may\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/datasets/{datasetSlug}/permissions/users/{userID}","href":"/api-reference/remove-an-explicit-user-grant-and-verify-its-absence-inherited-access-may"},{"title":"RunQueryAPI mirrors the erdo_run_query MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/query","href":"/api-reference/runqueryapi-mirrors-the-erdo_run_query-mcp-tool-as-a-rest-endpoint"},{"title":"QueryDataNaturalLanguageAPI mirrors the erdo_query_data MCP tool as a REST\nendpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/query-nl","href":"/api-reference/querydatanaturallanguageapi-mirrors-the-erdo_query_data-mcp-tool-as-a-restendpoint"},{"title":"GetDatasetRefreshAPI mirrors the erdo_get_dataset_refresh MCP tool. A dataset\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/refresh","href":"/api-reference/getdatasetrefreshapi-mirrors-the-erdo_get_dataset_refresh-mcp-tool-a-dataset"},{"title":"ConfigureDatasetRefreshAPI mirrors the erdo_configure_dataset_refresh MCP\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/datasets/{datasetSlug}/refresh","href":"/api-reference/configuredatasetrefreshapi-mirrors-the-erdo_configure_dataset_refresh-mcp"},{"title":"RunDatasetRefreshAPI mirrors the erdo_run_dataset_refresh MCP tool: it runs\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/refresh/run","href":"/api-reference/rundatasetrefreshapi-mirrors-the-erdo_run_dataset_refresh-mcp-tool:-it-runs"},{"title":"ListDatasetRevisionsAPI mirrors the erdo_list_dataset_revisions MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/datasets/{datasetSlug}/revisions","href":"/api-reference/listdatasetrevisionsapi-mirrors-the-erdo_list_dataset_revisions-mcp-tool"},{"title":"WriteDatasetRowsAPI writes/upserts rows to a dataset.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/rows","href":"/api-reference/writedatasetrowsapi-writesupserts-rows-to-a-dataset"},{"title":"DeleteDatasetRowsAPI deletes rows from a dataset.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/datasets/{datasetSlug}/rows","href":"/api-reference/deletedatasetrowsapi-deletes-rows-from-a-dataset"},{"title":"UpdateDatasetSchemaAPI updates a dataset's schema (add/remove/rename columns,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/datasets/{datasetSlug}/schema","href":"/api-reference/updatedatasetschemaapi-updates-a-datasets-schema-addremoverename-columns"},{"title":"ListDecisionsAPI mirrors erdo_list_decisions.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/decisions","href":"/api-reference/listdecisionsapi-mirrors-erdo_list_decisions"},{"title":"DecisionScorecardAPI mirrors erdo_decision_scorecard: raw aggregates with their\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/decisions-scorecard","href":"/api-reference/decisionscorecardapi-mirrors-erdo_decision_scorecard:-raw-aggregates-with-their"},{"title":"GetDecisionAPI mirrors erdo_get_decision: one decision in full — the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/decisions/{decisionSlug}","href":"/api-reference/getdecisionapi-mirrors-erdo_get_decision:-one-decision-in-full-—-the"},{"title":"ListEmailsAPI mirrors erdo_list_emails. Filters ride the query string, except\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/emails","href":"/api-reference/listemailsapi-mirrors-erdo_list_emails-filters-ride-the-query-string-except"},{"title":"ListEmailsPostAPI is the POST body form of the list endpoint. It exists for\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/emails-query","href":"/api-reference/listemailspostapi-is-the-post-body-form-of-the-list-endpoint-it-exists-for"},{"title":"GetEmailAPI mirrors erdo_get_email, returning one message with both bodies as\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/emails/{emailID}","href":"/api-reference/getemailapi-mirrors-erdo_get_email-returning-one-message-with-both-bodies-as"},{"title":"GetEvalLeaderboardAPI mirrors erdo_get_eval_leaderboard.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/evals/leaderboard/{suiteSlug}","href":"/api-reference/getevalleaderboardapi-mirrors-erdo_get_eval_leaderboard"},{"title":"ListEvalRunsAPI mirrors erdo_list_eval_runs.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/evals/runs","href":"/api-reference/listevalrunsapi-mirrors-erdo_list_eval_runs"},{"title":"GetEvalRunAPI mirrors erdo_get_eval_run.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/evals/runs/{runID}","href":"/api-reference/getevalrunapi-mirrors-erdo_get_eval_run"},{"title":"ListEvalSuitesAPI mirrors erdo_list_eval_suites.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/evals/suites","href":"/api-reference/listevalsuitesapi-mirrors-erdo_list_eval_suites"},{"title":"CreateEvalSuiteAPI mirrors erdo_create_eval_suite.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/evals/suites","href":"/api-reference/createevalsuiteapi-mirrors-erdo_create_eval_suite"},{"title":"GetEvalSuiteAPI mirrors erdo_get_eval_suite.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/evals/suites/{suiteSlug}","href":"/api-reference/getevalsuiteapi-mirrors-erdo_get_eval_suite"},{"title":"UpdateEvalSuiteAPI mirrors erdo_update_eval_suite. Only provided fields change.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/evals/suites/{suiteSlug}","href":"/api-reference/updateevalsuiteapi-mirrors-erdo_update_eval_suite-only-provided-fields-change"},{"title":"AddEvalCaseAPI mirrors erdo_add_eval_case.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/evals/suites/{suiteSlug}/cases","href":"/api-reference/addevalcaseapi-mirrors-erdo_add_eval_case"},{"title":"UpdateEvalCaseAPI mirrors erdo_update_eval_case.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/evals/suites/{suiteSlug}/cases/{caseName}","href":"/api-reference/updateevalcaseapi-mirrors-erdo_update_eval_case"},{"title":"RemoveEvalCaseAPI mirrors erdo_remove_eval_case.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/evals/suites/{suiteSlug}/cases/{caseName}","href":"/api-reference/removeevalcaseapi-mirrors-erdo_remove_eval_case"},{"title":"RunEvalSuiteAPI mirrors erdo_run_eval_suite.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/evals/suites/{suiteSlug}/run","href":"/api-reference/runevalsuiteapi-mirrors-erdo_run_eval_suite"},{"title":"GetEvalWidgetCanaryAPI reads the deployed-experience widget canary for the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/evals/widget-canary","href":"/api-reference/getevalwidgetcanaryapi-reads-the-deployed-experience-widget-canary-for-the"},{"title":"ConfigureEvalWidgetCanaryAPI designates an existing widget in the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/evals/widget-canary","href":"/api-reference/configureevalwidgetcanaryapi-designates-an-existing-widget-in-the"},{"title":"ListEventPipelinesAPI mirrors erdo_list_event_pipelines.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/event-pipelines","href":"/api-reference/listeventpipelinesapi-mirrors-erdo_list_event_pipelines"},{"title":"CreateEventPipelineAPI mirrors erdo_create_event_pipeline. Creation is where\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/event-pipelines","href":"/api-reference/createeventpipelineapi-mirrors-erdo_create_event_pipeline-creation-is-where"},{"title":"GetEventPipelineAPI mirrors erdo_get_event_pipeline (slug or uuid).\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/event-pipelines/{pipelineSlug}","href":"/api-reference/geteventpipelineapi-mirrors-erdo_get_event_pipeline-slug-or-uuid"},{"title":"UpdateEventPipelineAPI mirrors erdo_update_event_pipeline. Fields merge over\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/event-pipelines/{pipelineSlug}","href":"/api-reference/updateeventpipelineapi-mirrors-erdo_update_event_pipeline-fields-merge-over"},{"title":"ListEventPipelineExecutionsAPI mirrors erdo_list_event_pipeline_executions.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/event-pipelines/{pipelineSlug}/executions","href":"/api-reference/listeventpipelineexecutionsapi-mirrors-erdo_list_event_pipeline_executions"},{"title":"MarkEventPipelineExecutionsHandledAPI records that pipeline failures have been\ndealt with.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/event-pipelines/{pipelineSlug}/executions/handled","href":"/api-reference/markeventpipelineexecutionshandledapi-records-that-pipeline-failures-have-beendealt-with"},{"title":"RotateEventPipelineSecretAPI mirrors erdo_rotate_event_pipeline_secret. The\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/event-pipelines/{pipelineSlug}/rotate-secret","href":"/api-reference/rotateeventpipelinesecretapi-mirrors-erdo_rotate_event_pipeline_secret-the"},{"title":"ListExperimentsAPI mirrors erdo_list_experiments.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/experiments","href":"/api-reference/listexperimentsapi-mirrors-erdo_list_experiments"},{"title":"CreateExperimentAPI mirrors erdo_create_experiment.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/experiments","href":"/api-reference/createexperimentapi-mirrors-erdo_create_experiment"},{"title":"GetExperimentAPI mirrors erdo_get_experiment (slug or uuid).\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/experiments/{experimentSlug}","href":"/api-reference/getexperimentapi-mirrors-erdo_get_experiment-slug-or-uuid"},{"title":"UpdateExperimentAPI mirrors erdo_update_experiment.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/experiments/{experimentSlug}","href":"/api-reference/updateexperimentapi-mirrors-erdo_update_experiment"},{"title":"RecordAllocationDecisionAPI mirrors erdo_record_allocation_decision: record\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/experiments/{experimentSlug}/allocation-decisions","href":"/api-reference/recordallocationdecisionapi-mirrors-erdo_record_allocation_decision:-record"},{"title":"DiagnoseExperimentAPI mirrors erdo_diagnose_experiment_personas: run\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/experiments/{experimentSlug}/diagnose","href":"/api-reference/diagnoseexperimentapi-mirrors-erdo_diagnose_experiment_personas:-run"},{"title":"ListExperimentObservationsAPI mirrors erdo_list_experiment_observations.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/experiments/{experimentSlug}/observations","href":"/api-reference/listexperimentobservationsapi-mirrors-erdo_list_experiment_observations"},{"title":"RunPersonaPanelAPI mirrors erdo_run_persona_panel: start a persona panel\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/experiments/{experimentSlug}/panel","href":"/api-reference/runpersonapanelapi-mirrors-erdo_run_persona_panel:-start-a-persona-panel"},{"title":"GetExperimentPolicyAPI mirrors erdo_get_experiment_policy — the decision\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/experiments/{experimentSlug}/policy","href":"/api-reference/getexperimentpolicyapi-mirrors-erdo_get_experiment_policy-—-the-decision"},{"title":"RunTournamentAPI mirrors erdo_run_pairwise_tournament: rank an experiment's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/experiments/{experimentSlug}/tournament","href":"/api-reference/runtournamentapi-mirrors-erdo_run_pairwise_tournament:-rank-an-experiments"},{"title":"ListHeartbeatsAPI mirrors the erdo_list_heartbeats MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/heartbeats","href":"/api-reference/listheartbeatsapi-mirrors-the-erdo_list_heartbeats-mcp-tool"},{"title":"CreateHeartbeatAPI mirrors the erdo_create_heartbeat MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/heartbeats","href":"/api-reference/createheartbeatapi-mirrors-the-erdo_create_heartbeat-mcp-tool"},{"title":"UpdateHeartbeatAPI mirrors the erdo_update_heartbeat MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/heartbeats/{heartbeatID}","href":"/api-reference/updateheartbeatapi-mirrors-the-erdo_update_heartbeat-mcp-tool"},{"title":"ListHeartbeatExecutionsAPI mirrors the erdo_list_heartbeat_executions MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/heartbeats/{heartbeatID}/executions","href":"/api-reference/listheartbeatexecutionsapi-mirrors-the-erdo_list_heartbeat_executions-mcp-tool"},{"title":"RunHeartbeatAPI mirrors the erdo_run_heartbeat MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/heartbeats/{heartbeatID}/run","href":"/api-reference/runheartbeatapi-mirrors-the-erdo_run_heartbeat-mcp-tool"},{"title":"SetHeartbeatStateAPI mirrors the erdo_set_heartbeat_state MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/heartbeats/{heartbeatID}/state","href":"/api-reference/setheartbeatstateapi-mirrors-the-erdo_set_heartbeat_state-mcp-tool"},{"title":"UploadImageAPI mirrors the erdo_upload_image MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/images/upload","href":"/api-reference/uploadimageapi-mirrors-the-erdo_upload_image-mcp-tool-as-a-rest-endpoint"},{"title":"SearchIntegrationAppsAPI mirrors the erdo_search_integration_apps MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/integration-apps","href":"/api-reference/searchintegrationappsapi-mirrors-the-erdo_search_integration_apps-mcp-tool"},{"title":"ListConnectLinksAPI mirrors erdo_list_integration_connect_links.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/integration-connect-links","href":"/api-reference/listconnectlinksapi-mirrors-erdo_list_integration_connect_links"},{"title":"CreateConnectLinkAPI mirrors erdo_create_integration_connect_link.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integration-connect-links","href":"/api-reference/createconnectlinkapi-mirrors-erdo_create_integration_connect_link"},{"title":"RevokeConnectLinkAPI mirrors erdo_revoke_integration_connect_link.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integration-connect-links/{id}/revoke","href":"/api-reference/revokeconnectlinkapi-mirrors-erdo_revoke_integration_connect_link"},{"title":"CreateIntegrationDatasetAPI mirrors erdo_create_integration_dataset.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integration-datasets","href":"/api-reference/createintegrationdatasetapi-mirrors-erdo_create_integration_dataset"},{"title":"ConfigureIntegrationDatasetAPI updates an existing integration dataset's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integration-datasets/{datasetID}/configure","href":"/api-reference/configureintegrationdatasetapi-updates-an-existing-integration-datasets"},{"title":"ListIntegrationsAPI mirrors the erdo_list_integrations MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/integrations","href":"/api-reference/listintegrationsapi-mirrors-the-erdo_list_integrations-mcp-tool"},{"title":"ConnectIntegrationAPI mirrors the erdo_connect_integration MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integrations-connect","href":"/api-reference/connectintegrationapi-mirrors-the-erdo_connect_integration-mcp-tool"},{"title":"CheckIntegrationConnectionAPI mirrors the erdo_check_integration_connection MCP\ntool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/integrations-connect/{app}","href":"/api-reference/checkintegrationconnectionapi-mirrors-the-erdo_check_integration_connection-mcptool"},{"title":"DeleteIntegrationAPI removes a connected integration: the credential row is\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/integrations/{integrationID}","href":"/api-reference/deleteintegrationapi-removes-a-connected-integration:-the-credential-row-is"},{"title":"GetConnectionScopeAPI mirrors the erdo_get_connection_scope MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/integrations/{integrationID}/connection-scope","href":"/api-reference/getconnectionscopeapi-mirrors-the-erdo_get_connection_scope-mcp-tool"},{"title":"SetConnectionScopeAPI mirrors the erdo_set_connection_scope MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integrations/{integrationID}/connection-scope","href":"/api-reference/setconnectionscopeapi-mirrors-the-erdo_set_connection_scope-mcp-tool"},{"title":"SetIntegrationIdentityAPI writes a connection's stored account identity\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integrations/{integrationID}/identity","href":"/api-reference/setintegrationidentityapi-writes-a-connections-stored-account-identity"},{"title":"SetIntegrationManagedAccessAPI starts or stops providing a connection to the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/integrations/{integrationID}/managed-access","href":"/api-reference/setintegrationmanagedaccessapi-starts-or-stops-providing-a-connection-to-the"},{"title":"DiscoverIntegrationTablesAPI mirrors erdo_discover_integration_tables.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/integrations/{integrationRef}/tables","href":"/api-reference/discoverintegrationtablesapi-mirrors-erdo_discover_integration_tables"},{"title":"BacktestJudgeAPI mirrors erdo_backtest_judge: run a judge over the org's live\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/judge-backtests","href":"/api-reference/backtestjudgeapi-mirrors-erdo_backtest_judge:-run-a-judge-over-the-orgs-live"},{"title":"JudgeCalibrationAPI mirrors erdo_judge_calibration.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/judge-calibration","href":"/api-reference/judgecalibrationapi-mirrors-erdo_judge_calibration"},{"title":"ListKnowledgeAPI mirrors the erdo_list_knowledge MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/knowledge","href":"/api-reference/listknowledgeapi-mirrors-the-erdo_list_knowledge-mcp-tool"},{"title":"CreateKnowledgeAPI mirrors the erdo_create_knowledge MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/knowledge","href":"/api-reference/createknowledgeapi-mirrors-the-erdo_create_knowledge-mcp-tool"},{"title":"SearchKnowledgeAPI mirrors the erdo_search_knowledge MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/knowledge-search","href":"/api-reference/searchknowledgeapi-mirrors-the-erdo_search_knowledge-mcp-tool"},{"title":"GetKnowledgeAPI mirrors the typed Knowledge read used by the app and MCP\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/knowledge/{knowledgeObjectID}","href":"/api-reference/getknowledgeapi-mirrors-the-typed-knowledge-read-used-by-the-app-and-mcp"},{"title":"DeleteKnowledgeAPI mirrors the erdo_delete_knowledge MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/knowledge/{knowledgeObjectID}","href":"/api-reference/deleteknowledgeapi-mirrors-the-erdo_delete_knowledge-mcp-tool"},{"title":"UpdateKnowledgeAPI mirrors the canonical typed Knowledge action. The action\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/knowledge/{knowledgeObjectID}/actions","href":"/api-reference/updateknowledgeapi-mirrors-the-canonical-typed-knowledge-action-the-action"},{"title":"SetKnowledgeVisibilityAPI mirrors the erdo_set_knowledge_visibility MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/knowledge/{knowledgeObjectID}/visibility","href":"/api-reference/setknowledgevisibilityapi-mirrors-the-erdo_set_knowledge_visibility-mcp-tool"},{"title":"ListKnowledgeAssetsAPI mirrors erdo_list_knowledge_assets.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/knowledge/{objectID}/attachments","href":"/api-reference/listknowledgeassetsapi-mirrors-erdo_list_knowledge_assets"},{"title":"AttachKnowledgeAssetAPI mirrors the erdo_attach_knowledge_asset MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/knowledge/{objectID}/attachments","href":"/api-reference/attachknowledgeassetapi-mirrors-the-erdo_attach_knowledge_asset-mcp-tool"},{"title":"ListKVStoresAPIv1 mirrors the erdo_list_kv_stores MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/kv","href":"/api-reference/listkvstoresapiv1-mirrors-the-erdo_list_kv_stores-mcp-tool"},{"title":"CreateKVStoreAPIv1 mirrors the erdo_create_kv_store MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/kv","href":"/api-reference/createkvstoreapiv1-mirrors-the-erdo_create_kv_store-mcp-tool"},{"title":"GetKVItemAPIv1 mirrors the erdo_get_kv_item MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/kv/{slug}/items/{key}","href":"/api-reference/getkvitemapiv1-mirrors-the-erdo_get_kv_item-mcp-tool"},{"title":"SetKVItemAPIv1 mirrors the erdo_set_kv_item MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/kv/{slug}/items/{key}","href":"/api-reference/setkvitemapiv1-mirrors-the-erdo_set_kv_item-mcp-tool"},{"title":"DeleteKVItemAPIv1 mirrors the erdo_delete_kv_item MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/kv/{slug}/items/{key}","href":"/api-reference/deletekvitemapiv1-mirrors-the-erdo_delete_kv_item-mcp-tool"},{"title":"ListLeadNextActionsAPI mirrors the erdo_list_lead_next_actions MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/lead-next-actions","href":"/api-reference/listleadnextactionsapi-mirrors-the-erdo_list_lead_next_actions-mcp-tool"},{"title":"GetLeadPlaybookAPI mirrors the erdo_get_lead_playbook MCP tool. An\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/lead-playbook","href":"/api-reference/getleadplaybookapi-mirrors-the-erdo_get_lead_playbook-mcp-tool-an"},{"title":"PutLeadPlaybookAPI saves the playbook text, reads it into the typed\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/lead-playbook","href":"/api-reference/putleadplaybookapi-saves-the-playbook-text-reads-it-into-the-typed"},{"title":"PutLeadPlaybookHandoffAlertAPI changes only who is emailed about a handoff\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/lead-playbook/handoff-alert","href":"/api-reference/putleadplaybookhandoffalertapi-changes-only-who-is-emailed-about-a-handoff"},{"title":"ReadLeadPlaybookAPI mirrors the erdo_read_lead_playbook MCP tool: the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/lead-playbook/read-back","href":"/api-reference/readleadplaybookapi-mirrors-the-erdo_read_lead_playbook-mcp-tool:-the"},{"title":"ListLeadPlaybookRevisionsAPI mirrors the erdo_list_lead_playbook_revisions\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/lead-playbook/revisions","href":"/api-reference/listleadplaybookrevisionsapi-mirrors-the-erdo_list_lead_playbook_revisions"},{"title":"GetLeadPlaybookRevisionAPI mirrors the erdo_get_lead_playbook_revision MCP\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/lead-playbook/revisions/{revision}","href":"/api-reference/getleadplaybookrevisionapi-mirrors-the-erdo_get_lead_playbook_revision-mcp"},{"title":"AdoptManagedOrganizationAPI brings an EXISTING org under the caller's manager\norg. Consent\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/managed-organization-adoptions","href":"/api-reference/adoptmanagedorganizationapi-brings-an-existing-org-under-the-callers-managerorg-consent"},{"title":"ManagerPerformanceAPI mirrors erdo_get_manager_performance.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/managed-organization-performance","href":"/api-reference/managerperformanceapi-mirrors-erdo_get_manager_performance"},{"title":"ListManagedOrganizationsAPI mirrors erdo_list_managed_organizations.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/managed-organizations","href":"/api-reference/listmanagedorganizationsapi-mirrors-erdo_list_managed_organizations"},{"title":"CreateManagedOrganizationAPI mirrors erdo_create_managed_organization.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/managed-organizations","href":"/api-reference/createmanagedorganizationapi-mirrors-erdo_create_managed_organization"},{"title":"RevokeManagedOrganizationAPI mirrors erdo_revoke_managed_organization (managed\norg named by slug).\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/managed-organizations/{orgSlug}","href":"/api-reference/revokemanagedorganizationapi-mirrors-erdo_revoke_managed_organization-managedorg-named-by-slug"},{"title":"GetManagedOrganizationAdsContainerAPI reports the Google Ads container a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/managed-organizations/{orgSlug}/ads-container","href":"/api-reference/getmanagedorganizationadscontainerapi-reports-the-google-ads-container-a"},{"title":"ProvisionManagedOrganizationAdsContainerAPI gives a managed org its own Google\nAds container in\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/managed-organizations/{orgSlug}/ads-container","href":"/api-reference/provisionmanagedorganizationadscontainerapi-gives-a-managed-org-its-own-googleads-container-in"},{"title":"CreateManagedOrganizationHandoffTokenAPI mints a one-time token that offers an\nOWNERLESS managed\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/managed-organizations/{orgSlug}/handoff-tokens","href":"/api-reference/createmanagedorganizationhandofftokenapi-mints-a-one-time-token-that-offers-anownerless-managed"},{"title":"AddManagedOrganizationMemberAPI adds a human member to a managed org by email\n(role member or\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/managed-organizations/{orgSlug}/members","href":"/api-reference/addmanagedorganizationmemberapi-adds-a-human-member-to-a-managed-org-by-emailrole-member-or"},{"title":"CreateManagerKeyAPI creates or rotates the manager credential. The raw key is\nreturned exactly once.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/manager-key","href":"/api-reference/createmanagerkeyapi-creates-or-rotates-the-manager-credential-the-raw-key-isreturned-exactly-once"},{"title":"SendMauriceOrderEmailAPI sends Maurice's fixed billing-order message. The\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/maurice-order-emails","href":"/api-reference/sendmauriceorderemailapi-sends-maurices-fixed-billing-order-message-the"},{"title":"MeAPI returns the authenticated user and their currently-active org (the one\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/me","href":"/api-reference/meapi-returns-the-authenticated-user-and-their-currently-active-org-the-one"},{"title":"GetBusinessProfileAPI mirrors erdo_get_business_profile. The tax id is never\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/org/business-profile","href":"/api-reference/getbusinessprofileapi-mirrors-erdo_get_business_profile-the-tax-id-is-never"},{"title":"SetBusinessProfileAPI mirrors erdo_set_business_profile. PUT rather than\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/org/business-profile","href":"/api-reference/setbusinessprofileapi-mirrors-erdo_set_business_profile-put-rather-than"},{"title":"ListOrganizationsAPI lists the orgs the caller can enter, for `erdo org list`\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/organizations","href":"/api-reference/listorganizationsapi-lists-the-orgs-the-caller-can-enter-for-`erdo-org-list`"},{"title":"CreateOrganizationAPI creates a new top-level organization owned by the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/organizations","href":"/api-reference/createorganizationapi-creates-a-new-top-level-organization-owned-by-the"},{"title":"Get v1outreach batches","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/outreach-batches","href":"/api-reference/get-v1outreach-batches"},{"title":"Get v1outreach batches 1","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/outreach-batches/{batch}","href":"/api-reference/get-v1outreach-batches-1"},{"title":"Put v1outreach batches","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/outreach-batches/{batch}","href":"/api-reference/put-v1outreach-batches"},{"title":"Post v1outreach batches actions","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/outreach-batches/{batch}/actions","href":"/api-reference/post-v1outreach-batches-actions"},{"title":"Get v1outreach batches recipients","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/outreach-batches/{batch}/recipients","href":"/api-reference/get-v1outreach-batches-recipients"},{"title":"Get v1outreach consents","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/outreach-consents","href":"/api-reference/get-v1outreach-consents"},{"title":"Put v1outreach consents","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/outreach-consents","href":"/api-reference/put-v1outreach-consents"},{"title":"QueryPageAnalyticsAPI mirrors the erdo_page_analytics_query MCP tool: run a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/page-analytics/query","href":"/api-reference/querypageanalyticsapi-mirrors-the-erdo_page_analytics_query-mcp-tool:-run-a"},{"title":"RecordPageFeedbackAPI mirrors erdo_record_page_feedback: ingest one or more\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/page-feedback","href":"/api-reference/recordpagefeedbackapi-mirrors-erdo_record_page_feedback:-ingest-one-or-more"},{"title":"ListPageReviewsAPI mirrors erdo_list_page_reviews: past reviews newest first\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/page-reviews","href":"/api-reference/listpagereviewsapi-mirrors-erdo_list_page_reviews:-past-reviews-newest-first"},{"title":"CreatePageReviewAPI mirrors erdo_review_pages: start a review of one or more\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/page-reviews","href":"/api-reference/createpagereviewapi-mirrors-erdo_review_pages:-start-a-review-of-one-or-more"},{"title":"GetPageReviewAPI mirrors erdo_get_page_review: read a review's status and,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/page-reviews/{reviewID}","href":"/api-reference/getpagereviewapi-mirrors-erdo_get_page_review:-read-a-reviews-status-and"},{"title":"GetPageTrackingAPI mirrors the erdo_get_page_tracking MCP tool: read which\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/page-tracking","href":"/api-reference/getpagetrackingapi-mirrors-the-erdo_get_page_tracking-mcp-tool:-read-which"},{"title":"ListPagesAPI mirrors the erdo_list_pages MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/pages","href":"/api-reference/listpagesapi-mirrors-the-erdo_list_pages-mcp-tool"},{"title":"DeployPageAPI mirrors the erdo_deploy_page MCP tool. clone_from_page_id in\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/pages","href":"/api-reference/deploypageapi-mirrors-the-erdo_deploy_page-mcp-tool-clone_from_page_id-in"},{"title":"GetPageMonitoringAPI mirrors the erdo_get_page_monitoring MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/pages/monitoring/{pageID}","href":"/api-reference/getpagemonitoringapi-mirrors-the-erdo_get_page_monitoring-mcp-tool"},{"title":"SetPageMonitoringAPI mirrors the erdo_set_page_monitoring MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/pages/monitoring/{pageID}","href":"/api-reference/setpagemonitoringapi-mirrors-the-erdo_set_page_monitoring-mcp-tool"},{"title":"RestorePageAPI mirrors the erdo_restore_page MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/pages/restore/{pageID}","href":"/api-reference/restorepageapi-mirrors-the-erdo_restore_page-mcp-tool"},{"title":"ValidatePageAPI mirrors the erdo_validate_page MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/pages/validate","href":"/api-reference/validatepageapi-mirrors-the-erdo_validate_page-mcp-tool"},{"title":"UpdatePageAPI mirrors the erdo_update_page MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/pages/{pageID}","href":"/api-reference/updatepageapi-mirrors-the-erdo_update_page-mcp-tool"},{"title":"DeletePageAPI mirrors the erdo_delete_page MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/pages/{pageID}","href":"/api-reference/deletepageapi-mirrors-the-erdo_delete_page-mcp-tool"},{"title":"ListPaidMediaCampaignsAPI lists the organization's owned Google Ads\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/paid-media/campaigns","href":"/api-reference/listpaidmediacampaignsapi-lists-the-organizations-owned-google-ads"},{"title":"SetPaidMediaCampaignBudgetAPI mirrors erdo_set_paid_media_campaign_budget:\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/paid-media/campaigns/{externalID}/budget","href":"/api-reference/setpaidmediacampaignbudgetapi-mirrors-erdo_set_paid_media_campaign_budget:"},{"title":"SetPaidMediaCampaignConversionGoalsAPI mirrors\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/paid-media/campaigns/{externalID}/conversion-goals","href":"/api-reference/setpaidmediacampaignconversiongoalsapi-mirrors"},{"title":"SetPaidMediaCampaignStatusAPI mirrors erdo_set_paid_media_campaign_status:\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/paid-media/campaigns/{externalID}/status","href":"/api-reference/setpaidmediacampaignstatusapi-mirrors-erdo_set_paid_media_campaign_status:"},{"title":"EnsurePaidMediaConversionActionAPI finds or approval-gates creation of a lead\nconversion action.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/paid-media/conversion-actions","href":"/api-reference/ensurepaidmediaconversionactionapi-finds-or-approval-gates-creation-of-a-leadconversion-action"},{"title":"GroundPersonasAPI mirrors erdo_ground_personas: ground the org's persona\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/persona-grounding","href":"/api-reference/groundpersonasapi-mirrors-erdo_ground_personas:-ground-the-orgs-persona"},{"title":"ListPersonasAPI mirrors erdo_list_personas for selecting named agents.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/personas","href":"/api-reference/listpersonasapi-mirrors-erdo_list_personas-for-selecting-named-agents"},{"title":"ListProjectsAPI mirrors erdo_list_projects.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/projects","href":"/api-reference/listprojectsapi-mirrors-erdo_list_projects"},{"title":"CreateProjectAPI mirrors erdo_create_project.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/projects","href":"/api-reference/createprojectapi-mirrors-erdo_create_project"},{"title":"CreateRealtimeTicketAPI creates a browser-origin-bound ticket for the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/realtime/tickets","href":"/api-reference/createrealtimeticketapi-creates-a-browser-origin-bound-ticket-for-the"},{"title":"ListReceivedEmailsAPI mirrors erdo_list_received_emails: the messages people\nhave sent back to\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/received-emails","href":"/api-reference/listreceivedemailsapi-mirrors-erdo_list_received_emails:-the-messages-peoplehave-sent-back-to"},{"title":"RenderChartAPI mirrors the erdo_render_chart MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/render/chart","href":"/api-reference/renderchartapi-mirrors-the-erdo_render_chart-mcp-tool-as-a-rest-endpoint"},{"title":"RenderTableAPI mirrors the erdo_render_table MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/render/table","href":"/api-reference/rendertableapi-mirrors-the-erdo_render_table-mcp-tool-as-a-rest-endpoint"},{"title":"ListReviewItemsAPI mirrors erdo_list_review_items.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/review-items","href":"/api-reference/listreviewitemsapi-mirrors-erdo_list_review_items"},{"title":"GetReviewItemAPI mirrors erdo_get_review_item.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/review-items/{id}","href":"/api-reference/getreviewitemapi-mirrors-erdo_get_review_item"},{"title":"DecideReviewItemAPI mirrors erdo_decide_review_item.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/review-items/{id}/decide","href":"/api-reference/decidereviewitemapi-mirrors-erdo_decide_review_item"},{"title":"ListAgentRunsAPI mirrors erdo_list_agent_runs.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/runs","href":"/api-reference/listagentrunsapi-mirrors-erdo_list_agent_runs"},{"title":"GetAgentRunAPIv1 mirrors erdo_get_agent_run.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/runs/{runID}","href":"/api-reference/getagentrunapiv1-mirrors-erdo_get_agent_run"},{"title":"Lists what an organization has declared to run on a schedule: each\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/scheduled-actions","href":"/api-reference/lists-what-an-organization-has-declared-to-run-on-a-schedule:-each"},{"title":"Declares work to run on a schedule: an ordered list of named steps, each an\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/scheduled-actions","href":"/api-reference/declares-work-to-run-on-a-schedule:-an-ordered-list-of-named-steps-each-an"},{"title":"ScreenshotAPI mirrors the erdo_screenshot MCP tool as a REST endpoint: capture\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/screenshot","href":"/api-reference/screenshotapi-mirrors-the-erdo_screenshot-mcp-tool-as-a-rest-endpoint:-capture"},{"title":"IOSScreenshotAPI mirrors the erdo_ios_screenshot MCP tool: capture a page on a\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/screenshot/ios","href":"/api-reference/iosscreenshotapi-mirrors-the-erdo_ios_screenshot-mcp-tool:-capture-a-page-on-a"},{"title":"ScreenshotResultAPI polls an instructed capture started by ScreenshotAPI,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/screenshot/result","href":"/api-reference/screenshotresultapi-polls-an-instructed-capture-started-by-screenshotapi"},{"title":"ListSendingDomainsAPI lists the domains the caller org's outbound agent email\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/sending-domains","href":"/api-reference/listsendingdomainsapi-lists-the-domains-the-caller-orgs-outbound-agent-email"},{"title":"CreateSendingDomainAPI registers a sending domain for the caller's org and\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/sending-domains","href":"/api-reference/createsendingdomainapi-registers-a-sending-domain-for-the-callers-org-and"},{"title":"GetSendingDomainAPI reads one sending domain, named by the domain itself.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/sending-domains/{domain}","href":"/api-reference/getsendingdomainapi-reads-one-sending-domain-named-by-the-domain-itself"},{"title":"DeleteSendingDomainAPI removes a sending-domain registration, named by the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/sending-domains/{domain}","href":"/api-reference/deletesendingdomainapi-removes-a-sending-domain-registration-named-by-the"},{"title":"UpdateSendingDomainAPI edits a sending domain's identity settings — from\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/sending-domains/{domain}","href":"/api-reference/updatesendingdomainapi-edits-a-sending-domains-identity-settings-—-from"},{"title":"GetSendingThemeAPI reads the look the caller org's outbound mail renders in\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/sending-theme","href":"/api-reference/getsendingthemeapi-reads-the-look-the-caller-orgs-outbound-mail-renders-in"},{"title":"RefreshSendingThemeAPI derives the theme from the Brand Style record now and\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/sending-theme/refresh","href":"/api-reference/refreshsendingthemeapi-derives-the-theme-from-the-brand-style-record-now-and"},{"title":"ListThreadsAPI mirrors the erdo_list_threads MCP tool as a REST endpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/threads","href":"/api-reference/listthreadsapi-mirrors-the-erdo_list_threads-mcp-tool-as-a-rest-endpoint"},{"title":"CreateThreadAPI mirrors the erdo_create_thread MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/threads-create","href":"/api-reference/createthreadapi-mirrors-the-erdo_create_thread-mcp-tool"},{"title":"OpenDirectConversationAPI returns or creates the caller's direct conversation\nwith a persona.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/threads-direct","href":"/api-reference/opendirectconversationapi-returns-or-creates-the-callers-direct-conversationwith-a-persona"},{"title":"GetSeenThreadsAPI mirrors the authenticated thread seen-state read.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/threads-seen","href":"/api-reference/getseenthreadsapi-mirrors-the-authenticated-thread-seen-state-read"},{"title":"GetThreadAPI returns a thread and its participants.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/threads/{threadID}","href":"/api-reference/getthreadapi-returns-a-thread-and-its-participants"},{"title":"DeleteThreadAPI mirrors the erdo_delete_thread MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/threads/{threadID}","href":"/api-reference/deletethreadapi-mirrors-the-erdo_delete_thread-mcp-tool"},{"title":"CancelInvocationAPI requests cancellation of one invocation on a thread.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/threads/{threadID}/cancel-invocation","href":"/api-reference/cancelinvocationapi-requests-cancellation-of-one-invocation-on-a-thread"},{"title":"GetThreadCompletionStatusAPI returns the thread owner's latest durable\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/threads/{threadID}/completion-status","href":"/api-reference/getthreadcompletionstatusapi-returns-the-thread-owners-latest-durable"},{"title":"GetThreadMessagesAPI mirrors the erdo_get_thread_messages MCP tool as a REST\nendpoint.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/threads/{threadID}/messages","href":"/api-reference/getthreadmessagesapi-mirrors-the-erdo_get_thread_messages-mcp-tool-as-a-restendpoint"},{"title":"AddThreadParticipantAPI adds an org-enabled persona, or follows as the caller.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/threads/{threadID}/participants","href":"/api-reference/addthreadparticipantapi-adds-an-org-enabled-persona-or-follows-as-the-caller"},{"title":"RemoveThreadParticipantAPI removes a persona, or unfollows when the id is the\ncaller.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/threads/{threadID}/participants/{personaID}","href":"/api-reference/removethreadparticipantapi-removes-a-persona-or-unfollows-when-the-id-is-thecaller"},{"title":"MarkThreadSeenAPI marks a thread as seen by the current caller.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/threads/{threadID}/seen","href":"/api-reference/markthreadseenapi-marks-a-thread-as-seen-by-the-current-caller"},{"title":"SendMessageAPI mirrors the erdo_send_message MCP tool.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/threads/{threadID}/send","href":"/api-reference/sendmessageapi-mirrors-the-erdo_send_message-mcp-tool"},{"title":"ListTokensAPI lists the caller's API tokens. It never returns the token hash or\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/tokens","href":"/api-reference/listtokensapi-lists-the-callers-api-tokens-it-never-returns-the-token-hash-or"},{"title":"CreateTokenAPI mints a new API token for the caller. The raw token is returned\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/tokens","href":"/api-reference/createtokenapi-mints-a-new-api-token-for-the-caller-the-raw-token-is-returned"},{"title":"Revoke an API token, immediately and permanently.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/tokens/{tokenID}","href":"/api-reference/revoke-an-api-token-immediately-and-permanently"},{"title":"Replace an active API token atomically, without changing its grants.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/tokens/{tokenID}/rotate","href":"/api-reference/replace-an-active-api-token-atomically-without-changing-its-grants"},{"title":"ListVoiceAgentsAPI lists the organization's concierges — the managed voice\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/agents","href":"/api-reference/listvoiceagentsapi-lists-the-organizations-concierges-—-the-managed-voice"},{"title":"SetVoiceAgentSMSRepliesAPI turns a voice agent's answering of texts on or off.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/agents/{slug}/sms-replies","href":"/api-reference/setvoiceagentsmsrepliesapi-turns-a-voice-agents-answering-of-texts-on-or-off"},{"title":"SetVoiceAgentWhatsAppRepliesAPI turns a voice agent's answering on WhatsApp on\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/agents/{slug}/whatsapp-replies","href":"/api-reference/setvoiceagentwhatsapprepliesapi-turns-a-voice-agents-answering-on-whatsapp-on"},{"title":"GetVoiceBrandedCallingAPI mirrors erdo_voice_branded_calling_get: the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/branded-calling","href":"/api-reference/getvoicebrandedcallingapi-mirrors-erdo_voice_branded_calling_get:-the"},{"title":"SetVoiceBrandedCallingAPI mirrors erdo_voice_branded_calling_set: store the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/voice/branded-calling","href":"/api-reference/setvoicebrandedcallingapi-mirrors-erdo_voice_branded_calling_set:-store-the"},{"title":"GetVoiceBrandedCallingLOAAPI mirrors erdo_voice_branded_calling_loa: the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/branded-calling/loa","href":"/api-reference/getvoicebrandedcallingloaapi-mirrors-erdo_voice_branded_calling_loa:-the"},{"title":"ProvisionVoiceBrandedCallingAPI mirrors erdo_voice_branded_calling_provision:\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/branded-calling/provision","href":"/api-reference/provisionvoicebrandedcallingapi-mirrors-erdo_voice_branded_calling_provision:"},{"title":"GetVoiceCallerNameAPI mirrors erdo_voice_caller_name_get: the organization's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/caller-name","href":"/api-reference/getvoicecallernameapi-mirrors-erdo_voice_caller_name_get:-the-organizations"},{"title":"ProvisionVoiceCallerNameAPI mirrors erdo_voice_caller_name_provision: it files\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/caller-name","href":"/api-reference/provisionvoicecallernameapi-mirrors-erdo_voice_caller_name_provision:-it-files"},{"title":"CheckVoiceCallerNameAPI mirrors erdo_voice_caller_name_check: a live lookup\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/caller-name/lookup","href":"/api-reference/checkvoicecallernameapi-mirrors-erdo_voice_caller_name_check:-a-live-lookup"},{"title":"ListVoiceCallsAPI mirrors erdo_voice_call_list. The filters, the since/until\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/calls","href":"/api-reference/listvoicecallsapi-mirrors-erdo_voice_call_list-the-filters-the-sinceuntil"},{"title":"ListVoiceCallsPostAPI is the POST body form of the list endpoint, for callers\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/calls","href":"/api-reference/listvoicecallspostapi-is-the-post-body-form-of-the-list-endpoint-for-callers"},{"title":"GetVoiceCallAPI mirrors erdo_voice_call_get, returning the displayable\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/calls/{callID}","href":"/api-reference/getvoicecallapi-mirrors-erdo_voice_call_get-returning-the-displayable"},{"title":"StartPersonCallAPI connects a person to a lead: Erdo rings the person's own\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/person-calls","href":"/api-reference/startpersoncallapi-connects-a-person-to-a-lead:-erdo-rings-the-persons-own"},{"title":"ListVoicePhoneNumbersAPI mirrors erdo_voice_phone_number_list: every number\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/phone-numbers","href":"/api-reference/listvoicephonenumbersapi-mirrors-erdo_voice_phone_number_list:-every-number"},{"title":"GetVoicePhoneNumberSMSAPI mirrors the single-number half of\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/phone-numbers/{number}/sms","href":"/api-reference/getvoicephonenumbersmsapi-mirrors-the-single-number-half-of"},{"title":"ProvisionVoicePhoneNumberSMSAPI mirrors erdo_voice_phone_number_sms_provision:\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/phone-numbers/{number}/sms","href":"/api-reference/provisionvoicephonenumbersmsapi-mirrors-erdo_voice_phone_number_sms_provision:"},{"title":"ProvisionVoicePhoneNumberWhatsAppAPI mirrors\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/phone-numbers/{number}/whatsapp","href":"/api-reference/provisionvoicephonenumberwhatsappapi-mirrors"},{"title":"ListVoiceSMSConversationsAPI mirrors erdo_voice_sms_conversation_list. The\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/sms-conversations","href":"/api-reference/listvoicesmsconversationsapi-mirrors-erdo_voice_sms_conversation_list-the"},{"title":"ListVoiceSMSConversationsPostAPI is the POST body form of the list endpoint,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/sms-conversations","href":"/api-reference/listvoicesmsconversationspostapi-is-the-post-body-form-of-the-list-endpoint"},{"title":"GetVoiceSMSConversationAPI mirrors erdo_voice_sms_conversation_get, returning\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/sms-conversations/{sessionID}","href":"/api-reference/getvoicesmsconversationapi-mirrors-erdo_voice_sms_conversation_get-returning"},{"title":"ListVoiceWhatsAppConversationsAPI mirrors erdo_voice_whatsapp_conversation_list.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/whatsapp-conversations","href":"/api-reference/listvoicewhatsappconversationsapi-mirrors-erdo_voice_whatsapp_conversation_list"},{"title":"ListVoiceWhatsAppConversationsPostAPI is the POST body form of the list\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/whatsapp-conversations","href":"/api-reference/listvoicewhatsappconversationspostapi-is-the-post-body-form-of-the-list"},{"title":"GetVoiceWhatsAppConversationAPI mirrors erdo_voice_whatsapp_conversation_get,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/whatsapp-conversations/{sessionID}","href":"/api-reference/getvoicewhatsappconversationapi-mirrors-erdo_voice_whatsapp_conversation_get"},{"title":"ListVoiceWidgetConversationsAPI mirrors erdo_voice_widget_conversation_list.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/voice/widget-conversations","href":"/api-reference/listvoicewidgetconversationsapi-mirrors-erdo_voice_widget_conversation_list"},{"title":"ListVoiceWidgetConversationsPostAPI is the POST body form of the list endpoint,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/widget-conversations","href":"/api-reference/listvoicewidgetconversationspostapi-is-the-post-body-form-of-the-list-endpoint"},{"title":"GetVoiceWidgetConversationAPI mirrors erdo_voice_widget_conversation_get,\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/widget-conversations/get","href":"/api-reference/getvoicewidgetconversationapi-mirrors-erdo_voice_widget_conversation_get"},{"title":"SetVoiceWidgetStatusAPI turns a website concierge widget on or off. It is the\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/voice/widgets/{widget}/status","href":"/api-reference/setvoicewidgetstatusapi-turns-a-website-concierge-widget-on-or-off-it-is-the"},{"title":"ListWorkstreamsAPI mirrors erdo_list_workstreams.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/workstreams","href":"/api-reference/listworkstreamsapi-mirrors-erdo_list_workstreams"},{"title":"CreateWorkstreamAPI mirrors erdo_create_workstream.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/workstreams","href":"/api-reference/createworkstreamapi-mirrors-erdo_create_workstream"},{"title":"GetWorkstreamAPI mirrors erdo_get_workstream (slug or uuid).\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/workstreams/{workstreamSlug}","href":"/api-reference/getworkstreamapi-mirrors-erdo_get_workstream-slug-or-uuid"},{"title":"ArmWorkstreamLoopAPI mirrors erdo_arm_workstream_loop: schedule the recurring\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/workstreams/{workstreamSlug}/arm","href":"/api-reference/armworkstreamloopapi-mirrors-erdo_arm_workstream_loop:-schedule-the-recurring"},{"title":"ListWorkstreamEventsAPI mirrors erdo_list_workstream_events.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/workstreams/{workstreamSlug}/events","href":"/api-reference/listworkstreameventsapi-mirrors-erdo_list_workstream_events"},{"title":"AppendWorkstreamEventAPI mirrors erdo_append_workstream_event.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/workstreams/{workstreamSlug}/events","href":"/api-reference/appendworkstreameventapi-mirrors-erdo_append_workstream_event"},{"title":"SetWorkstreamExternalRefsAPI declares which provider-owned objects a\n","description":"workstream governs — the machine-readable replacement for a campaign allowlist hand-typed into a knowledge record.\n\nREST only, with no MCP mirror, and the asymmetry is the point: an agent must be able to READ the set of live campaigns it may act on, and must not be able to widen it. The consumer holding the mapping declares scope here; agents read it back on every workstream and ledger read.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json put /v1/workstreams/{workstreamSlug}/external-refs","href":"/api-reference/setworkstreamexternalrefsapi-declares-which-provider-owned-objects-a"},{"title":"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json get /v1/workstreams/{workstreamSlug}/ledger","href":"/api-reference/readworkstreamledgerapi-mirrors-erdo_read_workstream_ledger:-the-allocators"},{"title":"AddWorkstreamPhaseAPI mirrors erdo_add_workstream_phase.\n","description":null,"deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/workstreams/{workstreamSlug}/phases","href":"/api-reference/addworkstreamphaseapi-mirrors-erdo_add_workstream_phase"},{"title":"AttachWorkstreamResourceAPI mirrors erdo_attach_workstream_resource.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json post /v1/workstreams/{workstreamSlug}/resources","href":"/api-reference/attachworkstreamresourceapi-mirrors-erdo_attach_workstream_resource"},{"title":"DetachWorkstreamResourceAPI mirrors erdo_attach_workstream_resource's\n","deprecated":null,"version":null,"openapi":"/api/openapi.json delete /v1/workstreams/{workstreamSlug}/resources","href":"/api-reference/detachworkstreamresourceapi-mirrors-erdo_attach_workstream_resources"},{"title":"UpdateWorkStateAPI mirrors erdo_update_work_state.\n","deprecated":null,"version":null,"openapi":"/api/openapi.json patch /v1/workstreams/{workstreamSlug}/state","href":"/api-reference/updateworkstateapi-mirrors-erdo_update_work_state"}]}]},{"group":"Build apps","pages":[{"title":"Build Apps on Erdo","href":"/apps/build-apps"}]},{"group":"Python SDK","pages":[{"title":"Python SDK — Invoke","href":"/sdk/invoke"}]},{"group":"TypeScript SDK","pages":[{"title":"TypeScript SDK Overview","href":"/ts-sdk/overview"},{"title":"Client Reference","href":"/ts-sdk/client"},{"title":"UI Components","href":"/ts-sdk/ui-components"},{"title":"Integration Patterns","href":"/ts-sdk/integration"},{"title":"Vercel AI SDK Integration","href":"/ts-sdk/vercel-ai-sdk"}]}]}]},"title":"ReadWorkstreamLedgerAPI mirrors erdo_read_workstream_ledger: the allocator's\n - Erdo Docs","buildId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","deploymentId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-BRm_l__d.js","utils-f1l1Oc-G.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BlhqDhJO.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DHCB7rsC.js","snippetPresets-CYXLx6Hv.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-B78P2dEq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C4YLPVAh.js","shallow-vlLnTDkQ.js","getApiPlaygroundDisplay-D_98hhvf.js","CodeSnippet-DtnZHGqq.js","CodeSnippets-CLFb8KJt.js","Page-kQh739Uz.js","getPastedJson-Cq-zlbnU.js","icon-sN3t983t.js","MethodPill-P_YQ2s09.js","DuplicateIcon-BVzyNsGJ.js","createIcon-B3jqgqC6.js","DynamicMarkdown-Crwq6WG_.js","SectionHeading-C7pGS2Bb.js","axios-vUo_bRtp.js","Markdown-BuPH8yuW.js","clsx-CCOYKgaU.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BnkC_6oA.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BM4S31-f.js"]}