[REMOVED] agent.lifecycle was removed in @objectstack/spec 17.7.0 (ADR-0049 enforce-or-remove) — no runtime ever read it: no agent moved through a declared state and no transition was ever refused. Delete the key. A phase of a conversation is a skill with its own instructions and tools, selected by its triggerConditions (ADR-0064); multi-step process orchestration is a Flow (ADR-0019); a record's status transitions are a state_machine validation rule on the object (ADR-0020). Run os migrate meta --from 17 to list the mechanical edits for existing sources; --write applies the ones it can prove, and you apply the rest by hand.
Skill names to attach (Agent→Skill→Tool architecture)
tools
never
optional
[REMOVED] agent.tools was removed in @objectstack/spec 17 — use skills. An agent reaches exactly the tools its surface-compatible skills declare (ADR-0064), so move each reference into a skill: a platform tool by its registered name, or action_<name> for one of your own AI-exposed Actions. This is NOT a rename — there is no key the value moves to: the migration DELETES the key and emits a notice naming each tool that was listed, and you re-declare each one in a skill by hand. ADR-0064 itself still reads Proposed and is cloud-owned — that scopes its RUNTIME half (tool resolution, which lives in cloud service-ai), not this rejection: the authoring invariant binds you here, and ADR-0109 (Accepted — implemented) is the in-repo record that carries it. Run os migrate meta --from 16 to list the mechanical edits for existing sources; --write applies the ones it can prove, and you apply the rest by hand.
knowledge
never
optional
[REMOVED] agent.knowledge was removed in @objectstack/spec 17.0.0 (audit close-out) — declaring knowledge sources/indexes on an agent never scoped retrieval: the search_knowledge tool takes sourceIds from the LLM's tool-call arguments, not from the agent record. Delete the block. Restrict retrieval at the knowledge-service / source level (per-source permissions), and describe intended grounding in instructions so the model asks for the right sources. Run os migrate meta --from 16 to list the mechanical edits for existing sources; --write applies the ones it can prove, and you apply the rest by hand.
Agent memory (long-term notes recalled before each conversation and written by periodic reflection), enforced by the cloud AI runtime; the open framework edition does not run agents.
Safety guardrails for the agent (token budget, time limit, blocked topics), enforced per user turn by the cloud AI runtime; the open framework edition does not run agents.
Structured output contract for the agent's final answer (JSON format, schema, retries, fallback format, transform steps), enforced on every final answer by the cloud AI runtime; the open framework edition does not run agents.
Long-term memory: distilled notes kept per user and agent and recalled before each conversation
reflectionInterval
integer
optional
Reflect every N delivered interactions: each reflection writes one distilled note to long-term memory. Required when longTerm.enabled is true, and refused without it
Forbidden topics or action names: each entry is an exact, case-sensitive match on the tool name, on action_ plus the action type, or on the tool category
JSON Schema definition for output. An untyped subschema that carries a type-scoped keyword (properties, items, pattern, minimum, …) is refused at its path, because the AI runtime's schema reader does not check it; declare its "type".
strict
boolean
optional (default: false)
Enforce exact schema compliance
retryOnValidationFailure
boolean
optional (default: true)
Retry generation when output fails validation
maxRetries
integer
optional (default: 3)
Maximum retries on validation failure
fallbackFormat
Enum<'json_object' | 'json_schema'>
optional
Fallback format: once the primary format's retries are spent, the last answer is checked against this format instead
JSON Schema definition for output. An untyped subschema that carries a type-scoped keyword (properties, items, pattern, minimum, …) is refused at its path, because the AI runtime's schema reader does not check it; declare its "type".
strict
boolean
optional (default: false)
Enforce exact schema compliance
retryOnValidationFailure
boolean
optional (default: true)
Retry generation when output fails validation
maxRetries
integer
optional (default: 3)
Maximum retries on validation failure
fallbackFormat
Enum<'json_object' | 'json_schema'>
optional
Fallback format: once the primary format's retries are spent, the last answer is checked against this format instead