custom_attributes (or data) JSONB field. The schema engine enforces typing only for keys you’ve explicitly declared — unknown keys pass through.
The four cases
This means an agent can experiment freely with new fields, then formalize the ones that stick by calling
POST /schema/:object_type/attributes.
Supported data_type values
Defining an attribute
custom_attributes.tier must be one of the three enum values.
Modifying an attribute (PATCH)
You can change display_name, default_value, is_required, and append to enum_values. data_type is frozen after creation (changing it requires a data migration; not in v1). Enum removal isn’t allowed in v1 — only append.
Deprecating an attribute (DELETE)
DELETE is soft. The definition gets deprecated_at set; existing data is left intact; new writes of the key are rejected.
GET /schema/person shows the attribute with "deprecated": true.
Audit trail
Every schema mutation (POST / PATCH / DELETE / POST /custom-objects) appends a row to schema_migrations with the calling api_key_id, the action, and a JSON details blob.