@openwop/spec-artifacts 2.44.4 → 2.44.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CORPUS-STAMP.json +49 -47
- package/api/seams-v2.yaml +1 -1
- package/api/v2/asyncapi.yaml +1 -1
- package/api/v2/openapi.yaml +31 -122
- package/package.json +1 -1
- package/schemas/v2/agent-ref.schema.json +2 -3
- package/schemas/v2/budget-policy.schema.json +2 -3
- package/schemas/v2/capabilities.schema.json +42 -38
- package/schemas/v2/debug-bundle.schema.json +2 -2
- package/schemas/v2/error-envelope.schema.json +282 -4
- package/schemas/v2/node-pack-manifest.schema.json +2 -2
- package/schemas/v2/prompt-ref.schema.json +2 -3
- package/schemas/v2/prompt-template.schema.json +3 -3
- package/schemas/v2/run-event-payloads.schema.json +5 -5
- package/spec/v1/alias-detectors.json +25 -1
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v1/deprecations.json +89 -1
- package/spec/v1/gaps.json +42 -8
- package/spec/v1/migrations.json +57 -1
- package/spec/v2/core/artifact-type-packs.md +5 -1
- package/spec/v2/core/capabilities.md +20 -22
- package/spec/v2/core/conformance.md +24 -7
- package/spec/v2/core/errors.md +17 -119
- package/spec/v2/core/events.md +7 -7
- package/spec/v2/core/execution.md +56 -16
- package/spec/v2/core/host-services.md +57 -58
- package/spec/v2/core/i18n.md +10 -10
- package/spec/v2/core/idempotency.md +3 -3
- package/spec/v2/core/identity.md +11 -9
- package/spec/v2/core/interop.md +6 -8
- package/spec/v2/core/interrupt.md +8 -8
- package/spec/v2/core/oauth.md +4 -4
- package/spec/v2/core/packs.md +11 -5
- package/spec/v2/core/persistence.md +11 -13
- package/spec/v2/core/portability.md +4 -4
- package/spec/v2/core/replay.md +11 -13
- package/spec/v2/core/runs.md +20 -7
- package/spec/v2/core/security-defaults.md +0 -2
- package/spec/v2/core/storage.md +18 -20
- package/spec/v2/core/versioning.md +4 -9
- package/spec/v2/core/webhooks.md +13 -8
- package/spec/v2/declaration.json +3 -3
- package/spec/v2/errors.json +206 -2
- package/spec/v2/facets/agents.schema.json +367 -0
- package/spec/v2/facets/aiProviders.schema.json +2 -2
- package/spec/v2/generated/error-codes.md +130 -0
- package/spec/v2/release.json +2 -2
- package/spec/v2/surface-baseline.json +38 -2
|
@@ -821,7 +821,7 @@
|
|
|
821
821
|
"reliability": {
|
|
822
822
|
"type": "object",
|
|
823
823
|
"additionalProperties": false,
|
|
824
|
-
"description": "RFC 0032 §C. Host emits the envelope-reliability event family on documented adverse paths. Hosts advertise the family by emitting the record AND explicitly list the events they emit via `events[]`. A host advertising this facet MUST include at least `envelope.retry
|
|
824
|
+
"description": "RFC 0032 §C. Host emits the envelope-reliability event family on documented adverse paths. Hosts advertise the family by emitting the record AND explicitly list the events they emit via `events[]`. A host advertising this facet MUST include at least `envelope.retry-exhausted` and `envelope.refusal` in `events[]` (the two MUST-tier events). The other four (`envelope.retry-attempted`, `envelope.truncated`, `envelope.nl-to-format-engaged`, `envelope.recovery-applied`) are SHOULD/MAY-tier per RFC 0032 §B and may be omitted.",
|
|
825
825
|
"properties": {
|
|
826
826
|
"events": {
|
|
827
827
|
"type": "array",
|
|
@@ -833,11 +833,15 @@
|
|
|
833
833
|
"envelope.refusal",
|
|
834
834
|
"envelope.truncated",
|
|
835
835
|
"envelope.nlToFormat.engaged",
|
|
836
|
-
"envelope.recovery.applied"
|
|
836
|
+
"envelope.recovery.applied",
|
|
837
|
+
"envelope.retry-attempted",
|
|
838
|
+
"envelope.retry-exhausted",
|
|
839
|
+
"envelope.nl-to-format-engaged",
|
|
840
|
+
"envelope.recovery-applied"
|
|
837
841
|
]
|
|
838
842
|
},
|
|
839
843
|
"uniqueItems": true,
|
|
840
|
-
"description": "Subset of the six reliability events the host actually emits. A host advertising this facet MUST include `envelope.retry
|
|
844
|
+
"description": "Subset of the six reliability events the host actually emits, by their v2 names. A host advertising this facet MUST include `envelope.retry-exhausted` and `envelope.refusal`. The four v1 dotted names (`envelope.retry.attempted`, `envelope.retry.exhausted`, `envelope.nlToFormat.engaged`, `envelope.recovery.applied`) are deprecated aliases, removed in 3.0; a consumer MUST treat each as its hyphenated equivalent (RFC 0228 §G). Conformance scenarios soft-skip for events absent from this list (the event-emission assertion is skipped; other host behavior assertions remain in force)."
|
|
841
845
|
},
|
|
842
846
|
"maxRetryAttempts": {
|
|
843
847
|
"type": "integer",
|
|
@@ -942,7 +946,7 @@
|
|
|
942
946
|
},
|
|
943
947
|
"endpointsSupported": {
|
|
944
948
|
"type": "boolean",
|
|
945
|
-
"description": "RFC 0028 §A. When `true`, the host serves the `/prompts*` REST surface — at minimum the read endpoints (`listPromptTemplates`, `getPromptTemplate`, `renderPromptTemplate`). The mutating endpoints additionally require `mutableLibrary: true`; the pack-install path additionally requires `packsSupported: true`. False or absent = every `/prompts*` request
|
|
949
|
+
"description": "RFC 0028 §A. When `true`, the host serves the `/prompts*` REST surface — at minimum the read endpoints (`listPromptTemplates`, `getPromptTemplate`, `renderPromptTemplate`). The mutating endpoints additionally require `mutableLibrary: true`; the pack-install path additionally requires `packsSupported: true`. False or absent = every `/prompts*` request answers `404 not_found`. Independent of the family record — a host MAY advertise the family with `endpointsSupported: false` (composition without library REST) or the family omitted and `endpointsSupported: true` (library REST against an external resolver, e.g., a façade host)."
|
|
946
950
|
},
|
|
947
951
|
"templateKinds": {
|
|
948
952
|
"type": "array",
|
|
@@ -987,7 +991,7 @@
|
|
|
987
991
|
},
|
|
988
992
|
"mutableLibrary": {
|
|
989
993
|
"type": "boolean",
|
|
990
|
-
"description": "RFC 0028 §C. When `true`, the host honors the mutating endpoints `POST /prompts`, `PUT /prompts/{templateId}`, `DELETE /prompts/{templateId}`. When `false` or absent, those endpoints
|
|
994
|
+
"description": "RFC 0028 §C. When `true`, the host honors the mutating endpoints `POST /prompts`, `PUT /prompts/{templateId}`, `DELETE /prompts/{templateId}`. When `false` or absent, those endpoints answer `404 not_found`. Pack-sourced and host-built-in templates remain read-only even under `mutableLibrary: true` — deletion of those returns 403 per RFC 0028 §A."
|
|
991
995
|
},
|
|
992
996
|
"library": {
|
|
993
997
|
"type": "object",
|
|
@@ -3002,7 +3006,7 @@
|
|
|
3002
3006
|
"errorCode": {
|
|
3003
3007
|
"type": "string",
|
|
3004
3008
|
"minLength": 1,
|
|
3005
|
-
"description": "Wire-format error code returned on denial. Defaults to `provider_policy_denied`.
|
|
3009
|
+
"description": "Wire-format error code returned on denial. Defaults to `provider_policy_denied`. Any other value MUST be a vendor code."
|
|
3006
3010
|
}
|
|
3007
3011
|
},
|
|
3008
3012
|
"additionalProperties": false
|
|
@@ -3024,7 +3028,7 @@
|
|
|
3024
3028
|
"document"
|
|
3025
3029
|
]
|
|
3026
3030
|
},
|
|
3027
|
-
"description": "Input modalities the host's `callAI` accepts as ContentParts. `text` is implicit even when omitted. A ContentPart whose `type` is not advertised here MUST be rejected with `
|
|
3031
|
+
"description": "Input modalities the host's `callAI` accepts as ContentParts. `text` is implicit even when omitted. A ContentPart whose `type` is not advertised here MUST be rejected with `capability_not_provided` (never silently dropped)."
|
|
3028
3032
|
},
|
|
3029
3033
|
"maxBytesPerPart": {
|
|
3030
3034
|
"type": "integer",
|
|
@@ -3108,7 +3112,7 @@
|
|
|
3108
3112
|
},
|
|
3109
3113
|
"profile": {
|
|
3110
3114
|
"type": "string",
|
|
3111
|
-
"description": "Optional named capability profile (e.g
|
|
3115
|
+
"description": "Optional named capability profile (e.g. `openwop-agents-phase-1-skeleton` for identity only, `openwop-agents-full` for orchestrator, dispatch, memory and conversation). Clients pattern-match on it to gate feature usage. Whatever the profile, a host advertising `agents` accepts run-level `RunSnapshot.agent` / `runOrchestrator`, emits `agent.reasoned`, `agent.tool-called`, `agent.tool-returned`, `agent.handoff` and `agent.decided`, and honors confidence escalation: an `agent.decided` whose `confidence` is below the run's resolved escalation threshold suspends with `node.suspended { reason: low-confidence }`."
|
|
3112
3116
|
},
|
|
3113
3117
|
"modelClasses": {
|
|
3114
3118
|
"type": "array",
|
|
@@ -3127,11 +3131,11 @@
|
|
|
3127
3131
|
]
|
|
3128
3132
|
},
|
|
3129
3133
|
"uniqueItems": true,
|
|
3130
|
-
"description": "Optional list of `AgentRef.modelClass` values this host supports for hosted agents
|
|
3134
|
+
"description": "Optional list of `AgentRef.modelClass` values this host supports for hosted agents. Pack manifests whose `modelClass` is not in this list MUST refuse install with `pack_runtime_requirement_unmet`."
|
|
3131
3135
|
},
|
|
3132
3136
|
"orchestratorPattern": {
|
|
3133
3137
|
"type": "string",
|
|
3134
|
-
"description": "Optional orchestration pattern
|
|
3138
|
+
"description": "Optional orchestration pattern: the host's supervisor strategy. Canonical: `single`, `delegate`, `delegate.smart`. Vendor extensions ship under `vendor.<host>.<pattern>`."
|
|
3135
3139
|
},
|
|
3136
3140
|
"memoryBackends": {
|
|
3137
3141
|
"type": "array",
|
|
@@ -3142,11 +3146,11 @@
|
|
|
3142
3146
|
]
|
|
3143
3147
|
},
|
|
3144
3148
|
"uniqueItems": true,
|
|
3145
|
-
"description": "Optional list of memory backends
|
|
3149
|
+
"description": "Optional list of memory backends. `long-term` means the host implements `ctx.memory` (host-services.md §memory) against a durable store with the SR-1 redaction invariant intact end to end: a value the run's vault resolved is replaced by `[REDACTED:<secretId>]` before any persisted write. Hosts that do not wire a memory adapter omit this field."
|
|
3146
3150
|
},
|
|
3147
3151
|
"memoryConsolidation": {
|
|
3148
3152
|
"type": "object",
|
|
3149
|
-
"description": "RFC 0068
|
|
3153
|
+
"description": "RFC 0068. Background reconciliation of LONG-TERM memory (merge, dedup, supersede, strengthen). Distinct from token-budgeted distillation of transactional memory, which emits `memory.compacted`; a host MAY implement both, independently. Requires `memoryBackends` to include `long-term`. A consolidation pass MUST (1) operate over a single `memoryRef`'s long-term entries and MUST NOT read or write another tenant's entries; (2) be idempotent over a stable corpus: a second pass over an unchanged corpus MUST NOT further reduce `outputCount`; (3) route every derived or merged entry's content through the same redaction as a fresh `put`; (4) emit the content-free `agent.memory-consolidated` (`inputCount`, `outputCount`, `memoryRef`) after the pass. Consolidation is a host-managed mutation outside the replay envelope: a run sees consolidated memory only through the read snapshot its event log records, and the event is re-read from the log on replay. A host MUST NOT re-run a pass at replay time, and a run MUST NOT trigger a pass that mutates its own read snapshot mid-run. Hosts that omit this block do not consolidate.",
|
|
3150
3154
|
"additionalProperties": false,
|
|
3151
3155
|
"properties": {
|
|
3152
3156
|
"schedule": {
|
|
@@ -3162,7 +3166,7 @@
|
|
|
3162
3166
|
},
|
|
3163
3167
|
"commitments": {
|
|
3164
3168
|
"type": "object",
|
|
3165
|
-
"description": "RFC 0068
|
|
3169
|
+
"description": "RFC 0068. Inferred STANDING commitments: durable, memory-derived intentions the host promotes into a time- or predicate-gated arm that fires later without a fresh user turn (time arms compose `scheduling`, predicate arms `heartbeat`). A host advertising this: MUST bind each commitment to the `memoryRef` it was inferred from, and the commitment, its `commitment.fired` event and any enqueued run MUST share that memory's tenant; MUST fire each commitment at most once per satisfied condition (once per scheduled instant for `time`, once per state transition for `predicate`) and MUST NOT re-fire one on replay; MUST emit the content-free `commitment.fired` when one fires, and MUST NOT place the inferred intention text or any secret-bearing payload on it (the redacted memory read serves the text); MAY enqueue a run when one fires, and that run inherits the source memory's tenant and is reported as `enqueuedRunId`. Hosts that omit this block do not infer commitments.",
|
|
3166
3170
|
"additionalProperties": false,
|
|
3167
3171
|
"properties": {
|
|
3168
3172
|
"fireConditions": {
|
|
@@ -3181,15 +3185,15 @@
|
|
|
3181
3185
|
},
|
|
3182
3186
|
"orchestrator": {
|
|
3183
3187
|
"type": "boolean",
|
|
3184
|
-
"description": "
|
|
3188
|
+
"description": "When `true`, the host implements the `core.orchestrator.supervisor` node typeId AND honors the conservative-path suspend semantics (CP-1: low-confidence suspend via `node.suspended { reason: low-confidence }`)."
|
|
3185
3189
|
},
|
|
3186
3190
|
"dispatch": {
|
|
3187
3191
|
"type": "boolean",
|
|
3188
|
-
"description": "
|
|
3192
|
+
"description": "When `true`, the host implements the `core.dispatch` Core typeId AND honors the conservative-path commitment CP-2 (`core.dispatch` MUST NOT mutate the run's DAG mid-run). Implies (but does NOT require) `agents.orchestrator: true`."
|
|
3189
3193
|
},
|
|
3190
3194
|
"manifestRuntime": {
|
|
3191
3195
|
"type": "object",
|
|
3192
|
-
"description": "RFC 0070. Agent-manifest runtime floor — the minimal tier that makes a published agent pack (RFC 0003) runnable. When this facet is present, the host implements RFC 0003 `installAgents`: it loads each installed pack's `agents[]` into an in-process AgentRegistry, resolves `systemPromptRef` + `handoff.*SchemaRef` from the tarball at install (RFC 0003 §C/§D), and can DISPATCH a manifest agent on the existing `core.dispatch`/orchestrator loop (RFC 0007/0037/0061). Does NOT imply swarm/consensus (`host.agentRuntime`), long-term memory (`agents.memoryBackends`), or crews beyond `agents.dispatch`. A host advertising `agentRuntime` is treated as also satisfying this
|
|
3196
|
+
"description": "RFC 0070. Agent-manifest runtime floor — the minimal tier that makes a published agent pack (RFC 0003) runnable. When this facet is present, the host implements RFC 0003 `installAgents`: it loads each installed pack's `agents[]` into an in-process AgentRegistry, resolves `systemPromptRef` + `handoff.*SchemaRef` from the tarball at install (RFC 0003 §C/§D), and can DISPATCH a manifest agent on the existing `core.dispatch`/orchestrator loop (RFC 0007/0037/0061). Does NOT imply swarm/consensus (`host.agentRuntime`), long-term memory (`agents.memoryBackends`), or crews beyond `agents.dispatch`. A host advertising `agentRuntime` is treated as also satisfying this facet (host-services.md §agentRuntime). Its inventory is `GET /agents` (`agent-inventory-response.schema.json`). Hosts that omit this block do not instantiate manifest agents (today's default).",
|
|
3193
3197
|
"additionalProperties": false,
|
|
3194
3198
|
"properties": {
|
|
3195
3199
|
"handoffValidation": {
|
|
@@ -3204,13 +3208,13 @@
|
|
|
3204
3208
|
"tenant"
|
|
3205
3209
|
],
|
|
3206
3210
|
"default": "host",
|
|
3207
|
-
"description": "RFC 0074. Scope at which manifest agents are installed/approved and therefore enumerated by GET /
|
|
3211
|
+
"description": "RFC 0074. Scope at which manifest agents are installed/approved and therefore enumerated by GET /agents. 'host' (default): a single host-global inventory; the endpoint returns the same set for every caller (RFC 0072's original behavior). 'tenant': agents are installed per tenant·workspace (RFC 0048 owner triple); GET /agents returns ONLY the agents available to the authenticated principal's workspace, and an unapproved/unknown agent 404s — the surface never discloses another tenant's inventory. Does not change dispatch (RFC 0072 §B, owner-triple-scoped POST /runs) or any floor safety guarantee (toolAllowlist/systemPromptRef/SR-1 stay mandatory regardless of scope)."
|
|
3208
3212
|
}
|
|
3209
3213
|
}
|
|
3210
3214
|
},
|
|
3211
3215
|
"liveRuntime": {
|
|
3212
3216
|
"type": "object",
|
|
3213
|
-
"description": "RFC 0077. The host executes manifest agents against LIVE models and tools (not the deterministic
|
|
3217
|
+
"description": "RFC 0077. The host executes manifest agents against LIVE models and tools (not the deterministic `manifestRuntime` floor) and emits the content-free `agent.invocation-started` / `agent.invocation-completed` bracket around the `agent.*` family. REQUIRES `manifestRuntime`, of which it is a strict superset. A live invocation MUST perform, in this order: (1) model selection: resolve the manifest's `modelClass` to a concrete model and provider, host-defined but stable within a run (it enters the replay invocation key); a run-time `configurable.ai` override MAY take precedence, and resolution MAY happen downstream, so `agent.invocation-started` MAY omit the resolved model; (2) prompt resolution: `systemPrompt` or `systemPromptRef` wins over `promptOverrides` / `promptLibraryRef` (host-services.md §prompts), and the host MUST emit `agent.prompt-resolved` naming the resolved prompt refs, content-free; (3) tool surface: filter against `toolAllowlist` — a tool outside it MUST NOT be callable; under `toolHooks`, per-tool authorization MUST fail closed (`forbidden`) and tool calls MUST emit `agent.tool-called` / `agent.tool-returned`; (4) memory binding: bind the `memoryShape` backends; under `memoryShape.longTerm` the host MUST redact writes as for any memory write, and MAY emit `memory.written` or consolidate; memory is tenant-scoped; (5) the reasoning and tool turn(s), emitting `agent.reasoned`, `agent.reasoning-delta`, `agent.tool-called` and `agent.tool-returned`. Single-shot is the floor: a host MAY run one turn, and the multi-turn loop (`multiAgent` level 5) composes above it, so loop infrastructure is not required to advertise `liveRuntime`; (6) handoff validation: under `handoff.taskSchemaRef` the host MUST validate the inbound task before step 5 and reject a non-conforming one (see `structuredOutput` for the result); a cross-agent handoff emits `agent.handoff`; (7) confidence escalation, under `confidenceEscalation`; (8) terminal projection onto the run's normal result surface — under `subRunAttestation` the attestation composes unchanged and follows the agent-scoped terminal — and the host MUST emit `agent.invocation-completed` as the final agent-scoped event. Live execution MUST NOT relax the floor. These hold unconditionally: `toolAllowlist` enforcement; inbound `taskSchemaRef` validation when present; tenant scoping of memory and of any enqueued run; treating live model output as untrusted per the envelope contract (a refusal terminates with `outcome: refused`, never a silent substitution); and fail-closed per-tool authorization under `toolHooks`. `structuredOutput` and `confidenceEscalation` are optional quality flags. Hosts that omit this block run the floor only.",
|
|
3214
3218
|
"additionalProperties": false,
|
|
3215
3219
|
"properties": {
|
|
3216
3220
|
"structuredOutput": {
|
|
@@ -3219,7 +3223,7 @@
|
|
|
3219
3223
|
},
|
|
3220
3224
|
"confidenceEscalation": {
|
|
3221
3225
|
"type": "boolean",
|
|
3222
|
-
"description": "When `true`, the host honors `AgentManifest.confidence.defaultThreshold` and triggers the RFC 0002 §F escalation contract when an `agent.decided` confidence falls below the effective threshold, rather than silently accepting the decision. Absent ⇒ `false`."
|
|
3226
|
+
"description": "When `true`, the host honors `AgentManifest.confidence.defaultThreshold` and triggers the RFC 0002 §F escalation contract when an `agent.decided` confidence falls below the effective threshold, rather than silently accepting the decision. Absent ⇒ `false`. The effective threshold is `confidence.defaultThreshold`, else the run-resolved threshold, default 0.7; such an `agent.decided` MUST trigger escalation rather than be silently accepted. It is distinct from, and not interchangeable with, the fixed 0.5 `OrchestratorDecision.confidence` floor of `multiAgent` level 2."
|
|
3223
3227
|
},
|
|
3224
3228
|
"sources": {
|
|
3225
3229
|
"type": "array",
|
|
@@ -3232,13 +3236,13 @@
|
|
|
3232
3236
|
"chat-mention"
|
|
3233
3237
|
]
|
|
3234
3238
|
},
|
|
3235
|
-
"description": "Which invocation entry points the host exposes for live manifest dispatch. `workflow-node`: an agent step inside a workflow run (RFC 0072 §B); `run-api`: an agent as the root of POST /runs; `chat-mention`: a chat @agent invocation mapped onto the run surface. Enum membership is NOT mandatory — a host with no chat surface simply omits `chat-mention`. Absent ⇒ `['workflow-node']` (the RFC 0072 §B normative path). All advertised sources MUST emit the identical `agent.invocation.*` + `agent.*` event family."
|
|
3239
|
+
"description": "Which invocation entry points the host exposes for live manifest dispatch. `workflow-node`: an agent step inside a workflow run (RFC 0072 §B); `run-api`: an agent as the root of POST /runs; `chat-mention`: a chat @agent invocation mapped onto the run surface. Enum membership is NOT mandatory — a host with no chat surface simply omits `chat-mention`. Absent ⇒ `['workflow-node']` (the RFC 0072 §B normative path). All advertised sources MUST emit the identical `agent.invocation.*` + `agent.*` event family. Every source MUST resolve to the same manifest-to-run mapping. A host advertising `run-api` MUST accept a run whose root references a manifest `agentId`; one advertising `chat-mention` MUST map it onto the same run surface. `workflow-node` invocations are node executions inheriting the run's replay, fork and observability envelope."
|
|
3236
3240
|
}
|
|
3237
3241
|
}
|
|
3238
3242
|
},
|
|
3239
3243
|
"evalSuite": {
|
|
3240
3244
|
"type": "object",
|
|
3241
|
-
"description": "RFC 0081. The host runs portable `agent-eval-suite.schema.json` suites as eval runs (
|
|
3245
|
+
"description": "RFC 0081. The host runs portable `agent-eval-suite.schema.json` suites as eval runs (`mode: eval` on `createRun`, runs.md) and terminates each with an `eval-summary.schema.json` scorecard as the run's output. Hosts that omit this block reject `mode: eval` (runs.md). A host advertising this MUST execute each task as a child agent invocation, reusing the `agent.invocation-*` bracket and the `agent.*` and `provider.usage` events, score it, and MUST emit exactly one `eval.started`, one `eval.scored` per task after that task's terminal `agent.decided`, and one `eval.completed` before `run.completed`. When a task carries `fixtures`, the host MUST inject `fixtures.toolResponses` in place of live tool calls and seed `fixtures.memorySeed` into the agent's read snapshot before the invocation; `live-shadow` alone ignores fixtures. Seeded memory is tenant-scoped and redacted like any memory write. The `eval.*` events and the summary are content-free (SECURITY invariant `eval-summary-no-content-leak`) and are recorded facts: a replay re-reads a score, never re-judges. An eval run, its suite, fixtures and summary are scoped to the caller's owner triple; a suite or summary MUST NOT be readable across tenants. A human MAY override an auto-score with an annotation on its `eval.scored` event. Composes per-task cost (`provider.usage`) and the regression baseline diff.",
|
|
3242
3246
|
"additionalProperties": false,
|
|
3243
3247
|
"properties": {
|
|
3244
3248
|
"modes": {
|
|
@@ -3254,7 +3258,7 @@
|
|
|
3254
3258
|
"live-shadow"
|
|
3255
3259
|
]
|
|
3256
3260
|
},
|
|
3257
|
-
"description": "Which eval modes the host actually implements (RFC 0081 §D closed vocabulary). Truthful advertisement (RFC 0031): a host advertises ONLY the modes it gates on; a suite requesting an unadvertised mode is rejected at run-create with `400 validation_error
|
|
3261
|
+
"description": "Which eval modes the host actually implements (RFC 0081 §D closed vocabulary). Truthful advertisement (RFC 0031): a host advertises ONLY the modes it gates on; a suite requesting an unadvertised mode is rejected at run-create with `400 validation_error`, as is one requesting a mode the suite does not declare. Absent ⇒ no modes (the host advertises the family but gates nothing — effectively shape-only)."
|
|
3258
3262
|
},
|
|
3259
3263
|
"maxTasksPerSuite": {
|
|
3260
3264
|
"type": "integer",
|
|
@@ -3270,7 +3274,7 @@
|
|
|
3270
3274
|
},
|
|
3271
3275
|
"deployment": {
|
|
3272
3276
|
"type": "object",
|
|
3273
|
-
"description": "RFC 0082. The host implements an agent deployment lifecycle: per-(agentId, version) deployment records with the seven-state machine (draft/test/staged/active/paused/deprecated/rolled-back), named-channel binding (`agentId@channel` / `@latest` resolved + pinned per-(run, agentId, channel) at first resolution per §B), optional canary traffic-split, a rollback pointer, the content-free `deployment.*` audit events, and the `POST /agents/{agentId}/deployments` promotion contract composing RFC 0049 (`deploy:*` fail-closed scopes) + RFC 0051 (approvalGate) + RFC 0081 (`requiredEval`). Hosts that omit this block reject a `channel`-bearing `AgentRef` with `validation_error
|
|
3277
|
+
"description": "RFC 0082. The host implements an agent deployment lifecycle: per-(agentId, version) deployment records with the seven-state machine (draft/test/staged/active/paused/deprecated/rolled-back), named-channel binding (`agentId@channel` / `@latest` resolved + pinned per-(run, agentId, channel) at first resolution per §B), optional canary traffic-split, a rollback pointer, the content-free `deployment.*` audit events, and the `POST /agents/{agentId}/deployments` promotion contract composing RFC 0049 (`deploy:*` fail-closed scopes) + RFC 0051 (approvalGate) + RFC 0081 (`requiredEval`). A ref binds by at most one of an exact `version`, a `channel`, or neither (host default); both is a `validation_error`. At the first resolution of an `(agentId, channel)` pair in a run the host MUST resolve it to a concrete version; every later resolution of that pair in the run MUST return the same version, and the host MUST NOT re-resolve a channel that moved mid-run. The version is recorded on `agent.invocation-started.resolvedAgentVersion` (with `resolvedChannel`); replay and fork MUST re-read it and MUST NOT re-resolve. With more than one `active` version on a channel, the canary draw is part of that first resolution and MUST NOT be re-rolled on replay. A channel with no `active` version fails closed, never falling back to an arbitrary version (`agent-ref.schema.json#/properties/channel`). A transition (`agent-deployment-transition.schema.json`) MUST be authorized fail-closed against a `deploy:*` scope, emitting `authorization.decided`; runs the approval gate when host policy gates it; and, when the gate carries `requiredEval: { evalRunId, requiredPassScore? }`, MUST verify that eval run is terminal and passed (or meets `requiredPassScore`) before emitting `deployment.promoted`, else denies with `eval_gate_unmet`. A host without `evalSuite` MAY promote without an eval gate. The `deployment.*` events appear on the deployment-management run, never on a consuming run. Channels are tenant-scoped as `manifestRuntime.installScope` scopes agents. Hosts that omit this block reject a `channel`-bearing `AgentRef` with `validation_error`, and the deployment endpoint answers `404 not_found`. The promotion endpoint + behavioral lifecycle scenario + reference-host store land at Active → Accepted.",
|
|
3274
3278
|
"additionalProperties": false,
|
|
3275
3279
|
"properties": {
|
|
3276
3280
|
"channels": {
|
|
@@ -3280,7 +3284,7 @@
|
|
|
3280
3284
|
"type": "string",
|
|
3281
3285
|
"minLength": 1
|
|
3282
3286
|
},
|
|
3283
|
-
"description": "The named channels the host resolves (e.g. `[\"stable\", \"canary\", \"latest\"]`). Truthful advertisement (RFC 0031): a `channel` not in this list resolves to no version and fails the run with `
|
|
3287
|
+
"description": "The named channels the host resolves (e.g. `[\"stable\", \"canary\", \"latest\"]`). Truthful advertisement (RFC 0031): a `channel` not in this list resolves to no version and fails the run with `not_found` (`details.service: agents`)."
|
|
3284
3288
|
},
|
|
3285
3289
|
"canary": {
|
|
3286
3290
|
"type": "boolean",
|
|
@@ -3305,13 +3309,13 @@
|
|
|
3305
3309
|
"rolled-back"
|
|
3306
3310
|
]
|
|
3307
3311
|
},
|
|
3308
|
-
"description": "The subset of the seven lifecycle states the host implements. Truthful advertisement (RFC 0031): the host MUST reject a transition into a state not advertised here."
|
|
3312
|
+
"description": "The subset of the seven lifecycle states the host implements. Truthful advertisement (RFC 0031): the host MUST reject a transition into a state not advertised here. A host implementing a subset MUST advertise exactly that subset."
|
|
3309
3313
|
}
|
|
3310
3314
|
}
|
|
3311
3315
|
},
|
|
3312
3316
|
"roster": {
|
|
3313
3317
|
"type": "object",
|
|
3314
|
-
"description": "RFC 0086. The host maintains a standing agent roster: named, tenant-scoped agent INSTANCES (the 'digital-twin employee') that reference a manifest/deployment and own a workflow portfolio, discoverable via GET /agents/roster, with trigger-fired portfolio runs attributed to the member via the content-free `roster.run.initiated` event. REQUIRES `agents.manifestRuntime` (a roster entry instantiates a manifest agent). Triggers compose RFC 0052 (schedule) + RFC 0083 (durable work-item bridge) — no new WorkflowTrigger.type; the concrete work surface (a Kanban board) stays a host/vendor extension (
|
|
3318
|
+
"description": "RFC 0086. The host maintains a standing agent roster: named, tenant-scoped agent INSTANCES (the 'digital-twin employee') that reference a manifest/deployment and own a workflow portfolio, discoverable via GET /agents/roster, with trigger-fired portfolio runs attributed to the member via the content-free `roster.run.initiated` event. `rosterId` MUST be a `host:<id>` form; dispatching it (a `WorkflowNode.agent` or a run against it) MUST resolve to the entry's bound `agentRef`, MUST project its `persona` onto the dispatch `AgentRef`, and MUST emit `roster.run-initiated`. An entry MUST NOT list a workflow outside its owner's tenant scope. `enabled: false` makes an entry's portfolio triggers inert without deleting it; a disabled entry SHOULD remain discoverable. `GET /agents/roster` and `GET /agents/roster/{rosterId}` MUST be tenant-scoped as `GET /agents` is: an entry outside the caller's owner triple MUST answer `404`. When a trigger fires a workflow in an entry's portfolio, the host MUST emit one `roster.run-initiated` immediately after `run.started` and before any agent invocation. REQUIRES `agents.manifestRuntime` (a roster entry instantiates a manifest agent). Triggers compose RFC 0052 (schedule) + RFC 0083 (durable work-item bridge) — no new WorkflowTrigger.type; the concrete work surface (a Kanban board) stays a host/vendor extension (it participates by bridging a work-item event into a trigger delivery). Hosts that omit this block do not maintain a roster (the roster read answers `404 not_found`). The roster-management endpoints + behavioral attribution scenario + reference-host store land at Active → Accepted.",
|
|
3315
3319
|
"additionalProperties": false,
|
|
3316
3320
|
"properties": {
|
|
3317
3321
|
"installScope": {
|
|
@@ -3335,7 +3339,7 @@
|
|
|
3335
3339
|
},
|
|
3336
3340
|
"orgChart": {
|
|
3337
3341
|
"type": "object",
|
|
3338
|
-
"description": "RFC 0087. The host maintains a tenant-scoped, DESCRIPTIVE org-chart over RFC 0086 roster members: departments + roles with acyclic `reportsTo` edges + a derived responsibility roll-up, discoverable via GET /agents/org-chart. The load-bearing guarantee (§B `org-position-no-authority-escalation`): an org edge confers NO authority — it MUST NOT widen `toolAllowlist` (RFC 0002 §A14), grant an RBAC scope (RFC 0049), or bypass an approval gate (RFC 0051); org position MUST NOT be an authorization input. The schema carries no authority-bearing field, and a conformant host MUST NOT derive authority from position out-of-band. REQUIRES `agents.roster` (the chart's members are roster entries). Hosts that omit this block have no org-chart surface (the read
|
|
3342
|
+
"description": "RFC 0087. The host maintains a tenant-scoped, DESCRIPTIVE org-chart over RFC 0086 roster members: departments + roles with acyclic `reportsTo` edges + a derived responsibility roll-up, discoverable via GET /agents/org-chart. The load-bearing guarantee (§B `org-position-no-authority-escalation`): an org edge confers NO authority — it MUST NOT widen `toolAllowlist` (RFC 0002 §A14), grant an RBAC scope (RFC 0049), or bypass an approval gate (RFC 0051); org position MUST NOT be an authorization input. The schema carries no authority-bearing field, and a conformant host MUST NOT derive authority from position out-of-band. `members[].rosterId` MUST reference a roster entry in the same owner triple (a cross-tenant member is a `validation_error`), and the `reportsTo` edges MUST be acyclic (a cycle is a `validation_error`). On a `tenant` host the chart reads return only the caller's chart, never disclosing an outside member, department or edge, and an unknown or cross-tenant `departmentId` answers `404`. Being a manager MUST NOT add a report's tools, nor may a report inherit a manager's; position MUST NOT cause an `authorization.decided { allowed: true }` the principal's scopes alone would not; being senior MUST NOT satisfy, bypass or override an approval gate. A host MAY use position for non-authority purposes (rendering, routing preference, notification, responsibility reporting). The non-authority rule holds at every `installScope` and is never opt-out. REQUIRES `agents.roster` (the chart's members are roster entries). Hosts that omit this block have no org-chart surface (the read answers `404 not_found`). The org-chart-management endpoints + behavioral non-authority scenario + reference-host store land at Active → Accepted.",
|
|
3339
3343
|
"additionalProperties": false,
|
|
3340
3344
|
"properties": {
|
|
3341
3345
|
"installScope": {
|
|
@@ -3352,18 +3356,18 @@
|
|
|
3352
3356
|
},
|
|
3353
3357
|
"responsibilityView": {
|
|
3354
3358
|
"type": "boolean",
|
|
3355
|
-
"description": "When `true`, the host computes the
|
|
3359
|
+
"description": "When `true`, the host computes the responsibility roll-up on `GET /agents/org-chart/{departmentId}`: the union of the department's members' `workflows[]` portfolios, recursively through sub-departments unless `recursive=false`. A view computed from roster entries: it grants nothing and stores nothing."
|
|
3356
3360
|
}
|
|
3357
3361
|
}
|
|
3358
3362
|
},
|
|
3359
3363
|
"dispatchMapping": {
|
|
3360
3364
|
"type": "boolean",
|
|
3361
3365
|
"default": false,
|
|
3362
|
-
"description": "
|
|
3366
|
+
"description": "RFC 0022. When `true`, the host honors `inputMapping` / `outputMapping` / `perWorkerInputMappings` / `perWorkerOutputMappings` on `DispatchConfig` — building child inputs from parent variables before dispatch and harvesting child variables into parent variables on completion. Implies (but does NOT require) `agents.dispatch: true`. Hosts that set `agents.dispatch: true` but omit / `false` this flag MUST refuse workflows that carry non-empty mapping fields at registration with `validation_error` + `details.requiredCapability: 'agents.dispatchMapping'`."
|
|
3363
3367
|
},
|
|
3364
3368
|
"reasoning": {
|
|
3365
3369
|
"type": "object",
|
|
3366
|
-
"description": "
|
|
3370
|
+
"description": "Reasoning-event verbosity configuration.",
|
|
3367
3371
|
"properties": {
|
|
3368
3372
|
"verbosity": {
|
|
3369
3373
|
"type": "string",
|
|
@@ -3372,7 +3376,7 @@
|
|
|
3372
3376
|
"full",
|
|
3373
3377
|
"off"
|
|
3374
3378
|
],
|
|
3375
|
-
"description": "Default reasoning verbosity for `agent.reasoned` events when the run does not override via `RunOptions.configurable.reasoningVerbosity`."
|
|
3379
|
+
"description": "Default reasoning verbosity for `agent.reasoned` events when the run does not override via `RunOptions.configurable.reasoningVerbosity`. `summary`: the host SHOULD bound each `agent.reasoned` `reasoning` to `tokenLimit` tokens. `full`: the host MAY emit complete model traces. `off`: the host suppresses `agent.reasoned`. A run MAY override the default."
|
|
3376
3380
|
},
|
|
3377
3381
|
"tokenLimit": {
|
|
3378
3382
|
"type": "integer",
|
|
@@ -3382,7 +3386,7 @@
|
|
|
3382
3386
|
"streaming": {
|
|
3383
3387
|
"type": "boolean",
|
|
3384
3388
|
"default": false,
|
|
3385
|
-
"description": "RFC 0024. When `true`, the host MAY emit `agent.reasoning
|
|
3389
|
+
"description": "RFC 0024. When `true`, the host MAY emit `agent.reasoning-delta` events while a reasoning block is still open, in addition to the final `agent.reasoned`. Hosts that omit / `false` this flag emit only the final `agent.reasoned`. Consumers MUST tolerate both modes. A streaming host emits zero or more deltas followed by exactly one closing `agent.reasoned`, which stays authoritative for the reasoning content."
|
|
3386
3390
|
}
|
|
3387
3391
|
},
|
|
3388
3392
|
"additionalProperties": false
|
|
@@ -3394,7 +3398,7 @@
|
|
|
3394
3398
|
},
|
|
3395
3399
|
"proposals": {
|
|
3396
3400
|
"type": "object",
|
|
3397
|
-
"description": "RFC 0096 (`Active`). Reviewable learning — the host synthesizes reusable artifacts (skills/packs/templates/automations) from run/tool traces as INERT, reviewable drafts that MUST NOT influence the resolution, planning, or execution of any run until an authorized principal activates them.
|
|
3401
|
+
"description": "RFC 0096 (`Active`). Reviewable learning — the host synthesizes reusable artifacts (skills/packs/templates/automations) from run/tool traces as INERT, reviewable drafts that MUST NOT influence the resolution, planning, or execution of any run until an authorized principal activates them. v2 defines no protocol path for the proposal surface. A host advertising this emits the content-free `proposal.created` / `proposal.activated` events. Activation is delegated to RFC 0051 approval-gate or RFC 0049 RBAC — no new authorization path. On `apply` the installed artifact MUST byte-match the last-persisted `artifact` (no silent re-synthesis). Hosts that omit this block do not synthesize proposals; the conformance scenarios skip cleanly. The redaction-safety of `rationale` and `provenance.sourceRunIds` and the lifecycle are in `proposal.schema.json`.",
|
|
3398
3402
|
"additionalProperties": false,
|
|
3399
3403
|
"required": [
|
|
3400
3404
|
"artifactKinds",
|
|
@@ -3426,13 +3430,13 @@
|
|
|
3426
3430
|
"approval-gate",
|
|
3427
3431
|
"direct-rbac"
|
|
3428
3432
|
],
|
|
3429
|
-
"description": "`approval-gate`: `apply` MUST drive an RFC 0051 gate (role/scope/quorum, audited override) and MUST NOT install unless granted/overridden. `direct-rbac`: `apply` requires only the RFC 0049 scope the host advertises for activation."
|
|
3433
|
+
"description": "`approval-gate`: `apply` MUST drive an RFC 0051 gate (role/scope/quorum, audited override) and MUST NOT install unless granted/overridden. `direct-rbac`: `apply` requires only the RFC 0049 scope the host advertises for activation. An `overridden` gate MUST be audited."
|
|
3430
3434
|
}
|
|
3431
3435
|
}
|
|
3432
3436
|
},
|
|
3433
3437
|
"goals": {
|
|
3434
3438
|
"type": "object",
|
|
3435
|
-
"description": "RFC 0097 (`Active`). Standing goals — a durable objective with explicit completion criteria, evaluated by a host-side judge (RFC 0090 verifier or host evaluator), that keeps an agent working across turns/runs until the judge is satisfied, a declared RFC 0058 bound is crossed, or the agent escalates (RFC 0044).
|
|
3439
|
+
"description": "RFC 0097 (`Active`). Standing goals — a durable objective with explicit completion criteria, evaluated by a host-side judge (RFC 0090 verifier or host evaluator), that keeps an agent working across turns/runs until the judge is satisfied, a declared RFC 0058 bound is crossed, or the agent escalates (RFC 0044). v2 defines no protocol path for the goal surface. A host advertising this emits the content-free `goal.evaluated` / `goal.closed` events. Completion MUST be the judge's verdict — a client MUST NOT set `state: satisfied` directly. Continuation MUST be bounded. When the agent raises a confidence-escalation interrupt against a goal, the host MUST set `state: escalated` and stop continuation until a human resolves it. Each judge evaluation MUST be attributable to the run it evaluated (`goal.evaluated.runId`); its verdict MUST be recorded on `goal.evaluated` and MUST NOT be recomputed on replay or fork. `objective` and any verdict payload MUST be redaction-safe. Hosts that omit this block do not run standing goals; the conformance scenarios skip cleanly.",
|
|
3436
3440
|
"additionalProperties": false,
|
|
3437
3441
|
"required": [
|
|
3438
3442
|
"judge",
|
|
@@ -3464,7 +3468,7 @@
|
|
|
3464
3468
|
"requiresBounds": {
|
|
3465
3469
|
"type": "boolean",
|
|
3466
3470
|
"default": true,
|
|
3467
|
-
"description": "When `true` (default), a goal MUST declare valid RFC 0058 `bounds` before it may activate; a
|
|
3471
|
+
"description": "When `true` (default), a goal MUST declare valid RFC 0058 `bounds` before it may activate; a goal create without bounds is refused with `422`. The host MUST stop continuation and set `state: bound-exceeded` when any declared bound (iteration count / accumulated cost / wall-clock deadline) is crossed, emitting `goal.closed`."
|
|
3468
3472
|
}
|
|
3469
3473
|
}
|
|
3470
3474
|
}
|
|
@@ -3505,7 +3509,7 @@
|
|
|
3505
3509
|
}
|
|
3506
3510
|
],
|
|
3507
3511
|
"description": "core/capabilities.md#agents — witness: witnessable-gated; maturity experimental/none; RFC 0002",
|
|
3508
|
-
"x-openwop-
|
|
3512
|
+
"x-openwop-facets-from": "spec/v2/facets/agents.schema.json"
|
|
3509
3513
|
},
|
|
3510
3514
|
"memory": {
|
|
3511
3515
|
"type": "object",
|
|
@@ -7428,7 +7432,7 @@
|
|
|
7428
7432
|
"type": "integer",
|
|
7429
7433
|
"minimum": 0,
|
|
7430
7434
|
"maximum": 86400,
|
|
7431
|
-
"description": "Optional advertised Retry-After value in seconds the host returns on 503. When present, MUST equal
|
|
7435
|
+
"description": "Optional advertised Retry-After value in seconds the host returns on 503. When present, MUST equal the `Retry-After` header the host sends with `503 service_unavailable`. Upper bound 86400 (24h) — values beyond that are operationally indistinguishable from 'permanently denied'. Hosts needing longer holds SHOULD omit `Retry-After` entirely (RFC 0009 Q#2)."
|
|
7432
7436
|
}
|
|
7433
7437
|
},
|
|
7434
7438
|
"additionalProperties": false
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/debug-bundle.schema.json",
|
|
4
4
|
"title": "RunDebugBundle",
|
|
5
|
-
"description": "Portable JSON export of a single run's diagnostic state. See spec/
|
|
5
|
+
"description": "Portable JSON export of a single run's diagnostic state. See spec/v2/core/conformance.md \u00a7Production profile. Additive over v1 per COMPATIBILITY.md \u00a72.1: optional endpoint; hosts MAY omit.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": [
|
|
8
8
|
"bundleVersion",
|
|
@@ -280,7 +280,7 @@
|
|
|
280
280
|
"eventCount": {
|
|
281
281
|
"type": "integer",
|
|
282
282
|
"minimum": 0,
|
|
283
|
-
"description": "MUST equal events.length
|
|
283
|
+
"description": "MUST equal events.length."
|
|
284
284
|
}
|
|
285
285
|
},
|
|
286
286
|
"additionalProperties": false
|