metric. Erdo returns that meaning only when the declaration is confirmed.
PUT /v1/declarations upserts one declaration for the caller’s organization.
Sending the same namespace, kind, and key again updates that row.
scope names the only source and table this declaration covers. Omit it, or
set both source and table. One without the other is rejected. A declaration
does not apply to any other source or table, and a declaration with no scope
does not apply to a table read.
status: "confirmed" means the owning app committed this declaration and merged
it through a human-reviewed pull request. Erdo stores that status as
verification_status: approved. It does not infer it. Any other status is a
draft. A draft is kept and does not change a resolved value. A model proposal
is a draft.
Each connector ships templates for its standard metrics. A template is code
for one source and table. It is not a stored declaration and it is not
confirmed. A read uses a confirmed declaration for that source, table, and
key, then the template, then reports the measure as not set.
To adopt, send the same request with "adopt": true and the template’s scope.
Leave meaning empty to take the template expression, or set meaning to
override it. Send status: "confirmed" only after that adoption is merged
through a human-reviewed pull request in the app’s repository.
Two confirmed meanings for the same namespace, kind, key, source, and table
return conflicting definitions. A missing input stays null. It is not
reported as 0.
From the CLI and MCP
erdo declarations upsert sends the same request from a terminal or CI, and
the erdo_upsert_declaration MCP tool does the same for an agent. Both take
--namespace, --kind, --key, --meaning, --status, --source and
--table (together), and --adopt.
