@openwop/spec-artifacts 2.0.0-rc.38 → 2.0.0-rc.8
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 +31 -33
- package/api/seams-v2.yaml +1 -1
- package/api/v2/asyncapi.yaml +1 -1
- package/api/v2/openapi.yaml +10 -9
- package/package.json +5 -18
- package/schemas/capabilities.schema.json +1 -40
- package/schemas/run-snapshot.schema.json +33 -103
- package/schemas/v2/agent-deployment-transition.schema.json +6 -5
- package/schemas/v2/agent-deployment.schema.json +9 -8
- package/schemas/v2/agent-eval-suite.schema.json +12 -11
- package/schemas/v2/artifact-type-pack-manifest.schema.json +18 -22
- package/schemas/v2/capabilities.schema.json +0 -39
- package/schemas/v2/certification-bundle.schema.json +1 -1
- package/schemas/v2/chat-card-pack-manifest.schema.json +15 -19
- package/schemas/v2/debug-bundle.schema.json +6 -6
- package/schemas/v2/eval-summary.schema.json +10 -17
- package/schemas/v2/goal.schema.json +5 -5
- package/schemas/v2/ids.schema.json +22 -120
- package/schemas/v2/node-pack-manifest.schema.json +31 -27
- package/schemas/v2/proposal.schema.json +8 -7
- package/schemas/v2/run-event-payloads.schema.json +242 -246
- package/schemas/v2/run-event.schema.json +126 -2
- package/schemas/v2/run-snapshot.schema.json +13 -34
- package/schemas/v2/workflow-chain-pack-manifest.schema.json +45 -41
- package/schemas/v2/workflow-definition.schema.json +36 -31
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v1/deprecations.json +67 -79
- package/spec/v1/deprecations.schema.json +7 -23
- package/spec/v1/extensions.json +2 -3
- package/spec/v2/declaration.json +0 -7
- package/spec/v2/release.json +2 -2
- package/schemas/v2/webhook-delivery.schema.json +0 -26
- package/spec/v2/id-field-bindings.json +0 -104
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/run-event-payloads.schema.json",
|
|
4
4
|
"title": "RunEventPayloads",
|
|
5
|
-
"description": "Per-RunEventType payload schemas. The base RunEventDoc shape (run-event.schema.json) leaves `payload` permissive for forward-compat. This schema defines the canonical payload contract for each known RunEventType. Consumers MAY pin strict payload validation via `$defs.<typeId>` and `ajv.validate(schema.$defs[event.type], event.payload)`. Unknown event types MUST be tolerated (no $defs match
|
|
5
|
+
"description": "Per-RunEventType payload schemas. The base RunEventDoc shape (run-event.schema.json) leaves `payload` permissive for forward-compat. This schema defines the canonical payload contract for each known RunEventType. Consumers MAY pin strict payload validation via `$defs.<typeId>` and `ajv.validate(schema.$defs[event.type], event.payload)`. Unknown event types MUST be tolerated (no $defs match → fold best-effort).\n\n117 variants from `run-event.schema.json#$defs.RunEventType` are covered, grouped into ~20 shape families with shared $defs. Naming convention: camelCase keys mirror dotted RunEventType names (e.g., `run.started` → `runStarted`). v2: every definition closed; _typeIndex normative; the legacy interrupt payloads (approval*/clarification*) removed per deprecation row legacy-interrupt-payloads.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"$defs": {
|
|
8
8
|
"_typeIndex": {
|
|
9
|
-
"description": "Lookup map: RunEventType
|
|
9
|
+
"description": "Lookup map: RunEventType → $defs key. Informative — consumers can derive this themselves but having it explicit aids tooling.",
|
|
10
10
|
"type": "object",
|
|
11
11
|
"additionalProperties": false,
|
|
12
12
|
"properties": {
|
|
@@ -364,7 +364,7 @@
|
|
|
364
364
|
}
|
|
365
365
|
},
|
|
366
366
|
"voiceSpeechStart": {
|
|
367
|
-
"description": "RFC 0106
|
|
367
|
+
"description": "RFC 0106 §D. Emitted when inbound user speech onset is detected in a live voice session. Content-free (a timestamp only). MUST NOT be emitted unless `aiProviders.realtimeVoice.transcription: \"streaming\"` is advertised.",
|
|
368
368
|
"type": "object",
|
|
369
369
|
"additionalProperties": false,
|
|
370
370
|
"required": [
|
|
@@ -379,7 +379,7 @@
|
|
|
379
379
|
}
|
|
380
380
|
},
|
|
381
381
|
"voiceTranscript": {
|
|
382
|
-
"description": "RFC 0106
|
|
382
|
+
"description": "RFC 0106 §B/§D. A settled or provisional transcript part for the current turn, emitted on the durable event log as the single canonical record (the `ctx.callTranscriber` Promise resolves separately at `turn_commit`). `text` is the recognized speech — UNTRUSTED input (anyone in acoustic range is an unauthenticated writer): it MUST carry `contentTrust: \"untrusted\"` and MUST NOT be promoted to system/developer authority (SECURITY invariant `voice-transcript-untrusted`). A part with `isFinal: false` is provisional and MUST NOT be persisted to durable memory / the replay log / RAG or drive a side-effecting tool call before it finalizes (`voice-interim-not-durable`).",
|
|
383
383
|
"type": "object",
|
|
384
384
|
"additionalProperties": false,
|
|
385
385
|
"required": [
|
|
@@ -395,7 +395,7 @@
|
|
|
395
395
|
},
|
|
396
396
|
"isFinal": {
|
|
397
397
|
"type": "boolean",
|
|
398
|
-
"description": "true
|
|
398
|
+
"description": "true ⇒ this segment's text is settled and will not change."
|
|
399
399
|
},
|
|
400
400
|
"committedPrefix": {
|
|
401
401
|
"type": "string",
|
|
@@ -409,7 +409,7 @@
|
|
|
409
409
|
},
|
|
410
410
|
"formatted": {
|
|
411
411
|
"type": "boolean",
|
|
412
|
-
"description": "Punctuation/casing/ITN applied; absent
|
|
412
|
+
"description": "Punctuation/casing/ITN applied; absent ⇒ raw."
|
|
413
413
|
},
|
|
414
414
|
"atMs": {
|
|
415
415
|
"type": "integer",
|
|
@@ -417,12 +417,12 @@
|
|
|
417
417
|
},
|
|
418
418
|
"contentTrust": {
|
|
419
419
|
"const": "untrusted",
|
|
420
|
-
"description": "MUST be `\"untrusted\"`
|
|
420
|
+
"description": "MUST be `\"untrusted\"` — live transcript is untrusted ingress (`voice-transcript-untrusted`); never promote to higher authority."
|
|
421
421
|
}
|
|
422
422
|
}
|
|
423
423
|
},
|
|
424
424
|
"voiceEndpointCandidate": {
|
|
425
|
-
"description": "RFC 0106
|
|
425
|
+
"description": "RFC 0106 §B/§D. A silence boundary / likely end-of-turn appeared (only when `turnDetection: \"semantic\"`), DISTINCT from `voice.turn_commit` (Deepgram `UtteranceEnd` vs `speech_final`). Content-free.",
|
|
426
426
|
"type": "object",
|
|
427
427
|
"additionalProperties": false,
|
|
428
428
|
"required": [
|
|
@@ -442,7 +442,7 @@
|
|
|
442
442
|
}
|
|
443
443
|
},
|
|
444
444
|
"voiceTurnCommit": {
|
|
445
|
-
"description": "RFC 0106
|
|
445
|
+
"description": "RFC 0106 §B/§D. The user yielded the floor (turn boundary). This is where the `ctx.callTranscriber` Promise resolves. `finalText` is the settled transcript and is UNTRUSTED (it inherits the `voice.transcript` boundary).",
|
|
446
446
|
"type": "object",
|
|
447
447
|
"additionalProperties": false,
|
|
448
448
|
"required": [
|
|
@@ -461,7 +461,7 @@
|
|
|
461
461
|
}
|
|
462
462
|
},
|
|
463
463
|
"voiceSynthesisChunk": {
|
|
464
|
-
"description": "RFC 0106
|
|
464
|
+
"description": "RFC 0106 §C. Announces a clause-boundary streaming-synthesis chunk. METADATA ONLY — the audio bytes are referenced by a session-scoped `streamRef`/`url`, NOT inlined on the event log past the host's inline cap (RFC 0055 256 KiB precedent; spill to a tenant-scoped `url`), so replay/`:fork` stays bounded over long sessions. MUST NOT be emitted unless `aiProviders.realtimeVoice.synthesis: \"streaming\"` is advertised.",
|
|
465
465
|
"type": "object",
|
|
466
466
|
"additionalProperties": false,
|
|
467
467
|
"required": [
|
|
@@ -503,7 +503,7 @@
|
|
|
503
503
|
}
|
|
504
504
|
},
|
|
505
505
|
"voiceBargeIn": {
|
|
506
|
-
"description": "RFC 0106
|
|
506
|
+
"description": "RFC 0106 §D. User speech overlapped active assistant playback (probable cut-in). A host advertising `realtimeVoice.bargeIn: \"supported\"` MUST emit this on detected overlap. Content-free. Distinct from `voice.cancelled` (a backchannel \"uh-huh\" MAY produce `barge_in` with no `cancelled`).",
|
|
507
507
|
"type": "object",
|
|
508
508
|
"additionalProperties": false,
|
|
509
509
|
"required": [
|
|
@@ -517,7 +517,7 @@
|
|
|
517
517
|
}
|
|
518
518
|
},
|
|
519
519
|
"voiceCancelled": {
|
|
520
|
-
"description": "RFC 0106
|
|
520
|
+
"description": "RFC 0106 §D. Downstream LLM/TTS work was cancelled (barge-in or explicit). A cancellation MUST NOT emit partial tool outputs or partial un-guardrailed model output and MUST roll back or fully complete an in-flight side effect (SECURITY invariant `voice-bargein-no-partial-leak`). Content-free.",
|
|
521
521
|
"type": "object",
|
|
522
522
|
"additionalProperties": false,
|
|
523
523
|
"required": [
|
|
@@ -539,7 +539,7 @@
|
|
|
539
539
|
}
|
|
540
540
|
},
|
|
541
541
|
"authorizationDecided": {
|
|
542
|
-
"description": "RFC 0049
|
|
542
|
+
"description": "RFC 0049 — emitted on a role-based authorization decision (allow or deny). Redaction-safe: `principal` is an opaque RFC 0048 id; `reason` carries no credential material. Every deny SHOULD be emitted and SHOULD feed the audit log (RFC 0009/0010). MUST NOT be emitted unless `capabilities.authorization.supported: true`.",
|
|
543
543
|
"type": "object",
|
|
544
544
|
"additionalProperties": false,
|
|
545
545
|
"required": [
|
|
@@ -552,7 +552,7 @@
|
|
|
552
552
|
"principal": {
|
|
553
553
|
"type": "string",
|
|
554
554
|
"minLength": 1,
|
|
555
|
-
"description": "Opaque RFC 0048 principal id
|
|
555
|
+
"description": "Opaque RFC 0048 principal id — never PII."
|
|
556
556
|
},
|
|
557
557
|
"action": {
|
|
558
558
|
"type": "string",
|
|
@@ -569,12 +569,12 @@
|
|
|
569
569
|
},
|
|
570
570
|
"reason": {
|
|
571
571
|
"type": "string",
|
|
572
|
-
"description": "Human-readable, redaction-safe
|
|
572
|
+
"description": "Human-readable, redaction-safe — no credential material."
|
|
573
573
|
}
|
|
574
574
|
}
|
|
575
575
|
},
|
|
576
576
|
"proposalCreated": {
|
|
577
|
-
"description": "RFC 0096
|
|
577
|
+
"description": "RFC 0096 §D. Emitted when the host synthesizes a reviewable-learning draft. Content-free: ids / kind / content-free references only — NEVER the artifact body or the rationale text (those live behind the authed read). Redaction-safe (SECURITY invariant `proposal-inert-until-applied` covers the behavior; SR-1 covers the payload). MUST NOT be emitted unless `capabilities.agents.proposals` is advertised.",
|
|
578
578
|
"type": "object",
|
|
579
579
|
"additionalProperties": false,
|
|
580
580
|
"required": [
|
|
@@ -600,9 +600,9 @@
|
|
|
600
600
|
"sourceRunIds": {
|
|
601
601
|
"type": "array",
|
|
602
602
|
"items": {
|
|
603
|
-
"
|
|
603
|
+
"type": "string"
|
|
604
604
|
},
|
|
605
|
-
"description": "Runs whose traces produced the draft (RFC 0040 causation-compatible). Ids only
|
|
605
|
+
"description": "Runs whose traces produced the draft (RFC 0040 causation-compatible). Ids only — no trace content."
|
|
606
606
|
},
|
|
607
607
|
"duplicateOf": {
|
|
608
608
|
"type": [
|
|
@@ -614,7 +614,7 @@
|
|
|
614
614
|
}
|
|
615
615
|
},
|
|
616
616
|
"proposalActivated": {
|
|
617
|
-
"description": "RFC 0096
|
|
617
|
+
"description": "RFC 0096 §D. Emitted on a successful `apply`. Content-free: ids / content-free references only — NEVER the installed artifact body. MUST NOT be emitted unless `capabilities.agents.proposals` is advertised.",
|
|
618
618
|
"type": "object",
|
|
619
619
|
"additionalProperties": false,
|
|
620
620
|
"required": [
|
|
@@ -651,7 +651,7 @@
|
|
|
651
651
|
}
|
|
652
652
|
},
|
|
653
653
|
"goalEvaluated": {
|
|
654
|
-
"description": "RFC 0097
|
|
654
|
+
"description": "RFC 0097 §D. Emitted after each judge check on a standing goal. Content-free: NO objective text. The verdict (`satisfied`/`confidence`) is non-deterministic judge output — it is RECORDED here and MUST NOT be recomputed on replay/fork (`replay.md`). MUST NOT be emitted unless `capabilities.agents.goals` is advertised.",
|
|
655
655
|
"type": "object",
|
|
656
656
|
"additionalProperties": false,
|
|
657
657
|
"required": [
|
|
@@ -687,7 +687,7 @@
|
|
|
687
687
|
}
|
|
688
688
|
},
|
|
689
689
|
"goalClosed": {
|
|
690
|
-
"description": "RFC 0097
|
|
690
|
+
"description": "RFC 0097 §D. Emitted when a standing goal stops continuation. Content-free. MUST NOT be emitted unless `capabilities.agents.goals` is advertised.",
|
|
691
691
|
"type": "object",
|
|
692
692
|
"additionalProperties": false,
|
|
693
693
|
"required": [
|
|
@@ -712,7 +712,7 @@
|
|
|
712
712
|
}
|
|
713
713
|
},
|
|
714
714
|
"importApplied": {
|
|
715
|
-
"description": "RFC 0098
|
|
715
|
+
"description": "RFC 0098 §D. Emitted when an estate import is applied. Content-free: counts + ref-only — NO item payloads, NO secret values (SECURITY invariant `export-bundle-no-credential-material`). MUST NOT be emitted unless `capabilities.portability` is advertised.",
|
|
716
716
|
"type": "object",
|
|
717
717
|
"additionalProperties": false,
|
|
718
718
|
"required": [
|
|
@@ -723,7 +723,7 @@
|
|
|
723
723
|
"bundleOrigin": {
|
|
724
724
|
"type": "string",
|
|
725
725
|
"minLength": 1,
|
|
726
|
-
"description": "The bundle's `source.origin`
|
|
726
|
+
"description": "The bundle's `source.origin` — informational only."
|
|
727
727
|
},
|
|
728
728
|
"counts": {
|
|
729
729
|
"type": "object",
|
|
@@ -753,12 +753,12 @@
|
|
|
753
753
|
"items": {
|
|
754
754
|
"type": "string"
|
|
755
755
|
},
|
|
756
|
-
"description": "Provider/ref ids whose secrets must be re-bound at the destination. Refs only
|
|
756
|
+
"description": "Provider/ref ids whose secrets must be re-bound at the destination. Refs only — never secret values."
|
|
757
757
|
}
|
|
758
758
|
}
|
|
759
759
|
},
|
|
760
760
|
"connectorAuthorized": {
|
|
761
|
-
"description": "RFC 0047
|
|
761
|
+
"description": "RFC 0047 — emitted when the host acquires (or re-authorizes) a third-party OAuth token on a user's behalf via the `host.oauth` flow. Redaction-safe: carries the credential REFERENCE (RFC 0046), never token material. MUST NOT be emitted unless `capabilities.oauth.supported: true`.",
|
|
762
762
|
"type": "object",
|
|
763
763
|
"additionalProperties": false,
|
|
764
764
|
"required": [
|
|
@@ -786,7 +786,7 @@
|
|
|
786
786
|
}
|
|
787
787
|
},
|
|
788
788
|
"connectorAuthExpired": {
|
|
789
|
-
"description": "RFC 0047
|
|
789
|
+
"description": "RFC 0047 — emitted when a stored OAuth token's refresh fails terminally (revoked/expired refresh token). Redaction-safe: no token material. MUST NOT be emitted unless `capabilities.oauth.supported: true`.",
|
|
790
790
|
"type": "object",
|
|
791
791
|
"additionalProperties": false,
|
|
792
792
|
"required": [
|
|
@@ -811,7 +811,7 @@
|
|
|
811
811
|
}
|
|
812
812
|
},
|
|
813
813
|
"coreWorkflowChainEvent": {
|
|
814
|
-
"description": "RFC 0037
|
|
814
|
+
"description": "RFC 0037 — emitted on every planner→worker handoff state-machine transition. Required when `capabilities.multiAgent.executionModel.supported: true`; MUST NOT be emitted otherwise. RFC 0040 §A extends with optional `causationHostId` (when `crossHostCausation.supported: true`): present + non-empty when the `causationId` points at an event on a different host; absent when the chained-event is on the same host (existing semantics).",
|
|
815
815
|
"type": "object",
|
|
816
816
|
"additionalProperties": false,
|
|
817
817
|
"required": [
|
|
@@ -831,19 +831,20 @@
|
|
|
831
831
|
"child.cancelled",
|
|
832
832
|
"output.harvested"
|
|
833
833
|
],
|
|
834
|
-
"description": "Which handoff-state-machine transition this event records. See spec/v1/multi-agent-execution.md
|
|
834
|
+
"description": "Which handoff-state-machine transition this event records. See spec/v1/multi-agent-execution.md §'Handoff state machine'."
|
|
835
835
|
},
|
|
836
836
|
"workerId": {
|
|
837
837
|
"type": "string",
|
|
838
838
|
"minLength": 1,
|
|
839
|
-
"description": "The dispatched worker's workflowId
|
|
839
|
+
"description": "The dispatched worker's workflowId — matches the entry in the supervisor's OrchestratorDecision.nextWorkerIds[]."
|
|
840
840
|
},
|
|
841
841
|
"parentRunId": {
|
|
842
842
|
"$ref": "ids.schema.json#/$defs/runId",
|
|
843
843
|
"description": "The orchestrator-driven parent run's runId."
|
|
844
844
|
},
|
|
845
845
|
"childRunId": {
|
|
846
|
-
"
|
|
846
|
+
"type": "string",
|
|
847
|
+
"minLength": 1,
|
|
847
848
|
"description": "The dispatched child run's runId. REQUIRED on phases `dispatch.succeeded` and beyond; absent on `dispatch.began` and `dispatch.failed`."
|
|
848
849
|
},
|
|
849
850
|
"harvestedKeys": {
|
|
@@ -851,11 +852,11 @@
|
|
|
851
852
|
"items": {
|
|
852
853
|
"type": "string"
|
|
853
854
|
},
|
|
854
|
-
"description": "On phase `output.harvested`: which parent-variable keys were populated by the dispatch config's outputMapping per RFC 0022
|
|
855
|
+
"description": "On phase `output.harvested`: which parent-variable keys were populated by the dispatch config's outputMapping per RFC 0022 §A. SHOULD be present; conformance asserts presence when outputMapping is non-empty."
|
|
855
856
|
},
|
|
856
857
|
"attestation": {
|
|
857
858
|
"type": "object",
|
|
858
|
-
"description": "RFC 0063 (when `capabilities.agents.subRunAttestation: true` AND the `core.subWorkflow` node sets `outputAttestation.checksum: true`). A content checksum over the child's harvested output object, computed BEFORE `outputMapping` is applied so the parent (or a downstream node) can verify integrity
|
|
859
|
+
"description": "RFC 0063 (when `capabilities.agents.subRunAttestation: true` AND the `core.subWorkflow` node sets `outputAttestation.checksum: true`). A content checksum over the child's harvested output object, computed BEFORE `outputMapping` is applied so the parent (or a downstream node) can verify integrity — host-independent because the recipe is RFC 8785 JCS canonicalization + SHA-256 (the `replay.md` recipe, RFC 0041), enabling verification of a child that ran on a different host (RFC 0040). Advisory: the host does NOT itself reject on checksum mismatch; that is parent policy.",
|
|
859
860
|
"additionalProperties": false,
|
|
860
861
|
"required": [
|
|
861
862
|
"checksum",
|
|
@@ -883,12 +884,12 @@
|
|
|
883
884
|
"causationHostId": {
|
|
884
885
|
"type": "string",
|
|
885
886
|
"minLength": 1,
|
|
886
|
-
"description": "RFC 0040
|
|
887
|
+
"description": "RFC 0040 §A — optional cross-host causation pointer. Present + non-empty when this event's `causationId` (top-level on RunEventDoc) points at an event on a DIFFERENT host; absent when the chained-event is on the SAME host (existing semantics). Value MUST equal the originating host's `capabilities.multiAgent.executionModel.crossHostCausation.hostId` advertisement. Hosts that don't advertise crossHostCausation MUST NOT emit this field."
|
|
887
888
|
}
|
|
888
889
|
}
|
|
889
890
|
},
|
|
890
891
|
"coreWorkflowChainConfidenceEscalated": {
|
|
891
|
-
"description": "RFC 0039
|
|
892
|
+
"description": "RFC 0039 §A — emitted when a supervisor's OrchestratorDecision carries `confidence` below the active confidence floor (spec floor 0.5 OR operator-stricter `capabilities.multiAgent.executionModel.confidenceEscalationFloor`). Recorded BEFORE the host fires the matching clarify-or-escalate interrupt so the run event log carries the decision point even if the user later confirms the original decision. MUST NOT be emitted unless `capabilities.multiAgent.executionModel.version >= 2`.",
|
|
892
893
|
"type": "object",
|
|
893
894
|
"additionalProperties": false,
|
|
894
895
|
"required": [
|
|
@@ -908,7 +909,7 @@
|
|
|
908
909
|
"type": "number",
|
|
909
910
|
"minimum": 0.5,
|
|
910
911
|
"maximum": 1,
|
|
911
|
-
"description": "The floor that triggered escalation
|
|
912
|
+
"description": "The floor that triggered escalation — either the spec floor (0.5) when the host doesn't advertise a stricter `confidenceEscalationFloor`, or the host-advertised stricter value."
|
|
912
913
|
},
|
|
913
914
|
"escalationKind": {
|
|
914
915
|
"type": "string",
|
|
@@ -916,12 +917,12 @@
|
|
|
916
917
|
"clarify",
|
|
917
918
|
"escalate"
|
|
918
919
|
],
|
|
919
|
-
"description": "Which interrupt-kind the host fired in response. `clarify` is preferred per RFC 0039
|
|
920
|
+
"description": "Which interrupt-kind the host fired in response. `clarify` is preferred per RFC 0039 §A; `escalate` is permitted when the host doesn't expose a clarification UI."
|
|
920
921
|
},
|
|
921
922
|
"workerId": {
|
|
922
923
|
"type": "string",
|
|
923
924
|
"minLength": 1,
|
|
924
|
-
"description": "The decision's intended next-worker workflowId (when the escalated decision's kind is `next-worker`). OMITTED for `kind: 'terminate'` escalations
|
|
925
|
+
"description": "The decision's intended next-worker workflowId (when the escalated decision's kind is `next-worker`). OMITTED for `kind: 'terminate'` escalations — terminate decisions have no worker to name, so absent-field is the correct signal rather than empty-string."
|
|
925
926
|
},
|
|
926
927
|
"parentRunId": {
|
|
927
928
|
"$ref": "ids.schema.json#/$defs/runId",
|
|
@@ -929,12 +930,12 @@
|
|
|
929
930
|
},
|
|
930
931
|
"originalDecision": {
|
|
931
932
|
"$ref": "orchestrator-decision.schema.json",
|
|
932
|
-
"description": "The OrchestratorDecision that triggered escalation, captured verbatim. The host's existing event-payload redaction harness (the same one enforcing SECURITY invariant `secret-leakage-eventlog-payload` per `conformance/src/scenarios/redaction.test.ts`) applies uniformly across all RunEventType payloads including this one
|
|
933
|
+
"description": "The OrchestratorDecision that triggered escalation, captured verbatim. The host's existing event-payload redaction harness (the same one enforcing SECURITY invariant `secret-leakage-eventlog-payload` per `conformance/src/scenarios/redaction.test.ts`) applies uniformly across all RunEventType payloads including this one — no per-event-type opt-in is required. The protocol-tier MUST-NOT for raw key material in persisted payloads is the canonical contract; this field inherits that protection."
|
|
933
934
|
},
|
|
934
935
|
"causationHostId": {
|
|
935
936
|
"type": "string",
|
|
936
937
|
"minLength": 1,
|
|
937
|
-
"description": "RFC 0040
|
|
938
|
+
"description": "RFC 0040 §A — optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host (existing semantics). Value MUST equal the originating host's `crossHostCausation.hostId` advertisement."
|
|
938
939
|
}
|
|
939
940
|
}
|
|
940
941
|
},
|
|
@@ -999,7 +1000,7 @@
|
|
|
999
1000
|
"engineVersion": {
|
|
1000
1001
|
"type": "integer",
|
|
1001
1002
|
"minimum": 0,
|
|
1002
|
-
"description": "v2: integer everywhere (RFC 0172
|
|
1003
|
+
"description": "v2: integer everywhere (RFC 0172 §B axis 3)."
|
|
1003
1004
|
},
|
|
1004
1005
|
"owner": {
|
|
1005
1006
|
"type": "object",
|
|
@@ -1019,7 +1020,7 @@
|
|
|
1019
1020
|
"$ref": "subject.schema.json"
|
|
1020
1021
|
}
|
|
1021
1022
|
},
|
|
1022
|
-
"description": "RFC 0170
|
|
1023
|
+
"description": "RFC 0170 §A.1 — the same block as RunSnapshot.owner."
|
|
1023
1024
|
},
|
|
1024
1025
|
"tags": {
|
|
1025
1026
|
"type": "array",
|
|
@@ -1036,7 +1037,7 @@
|
|
|
1036
1037
|
},
|
|
1037
1038
|
"runCompleted": {
|
|
1038
1039
|
"type": "object",
|
|
1039
|
-
"description": "Emitted once when the run reaches a successful terminal state. Closes the SSE stream.
|
|
1040
|
+
"description": "Emitted once when the run reaches a successful terminal state. Closes the SSE stream.",
|
|
1040
1041
|
"properties": {
|
|
1041
1042
|
"outputs": {
|
|
1042
1043
|
"$ref": "#/$defs/_outputsObject"
|
|
@@ -1046,10 +1047,7 @@
|
|
|
1046
1047
|
"minimum": 0
|
|
1047
1048
|
}
|
|
1048
1049
|
},
|
|
1049
|
-
"additionalProperties": false
|
|
1050
|
-
"required": [
|
|
1051
|
-
"outputs"
|
|
1052
|
-
]
|
|
1050
|
+
"additionalProperties": false
|
|
1053
1051
|
},
|
|
1054
1052
|
"runFailed": {
|
|
1055
1053
|
"type": "object",
|
|
@@ -1062,7 +1060,7 @@
|
|
|
1062
1060
|
"$ref": "#/$defs/_errorObject"
|
|
1063
1061
|
},
|
|
1064
1062
|
"failedNodeId": {
|
|
1065
|
-
"
|
|
1063
|
+
"type": "string"
|
|
1066
1064
|
},
|
|
1067
1065
|
"durationMs": {
|
|
1068
1066
|
"type": "integer",
|
|
@@ -1077,11 +1075,11 @@
|
|
|
1077
1075
|
"properties": {
|
|
1078
1076
|
"reason": {
|
|
1079
1077
|
"type": "string",
|
|
1080
|
-
"description": "`v1_pin_unsupported` (RFC 0176
|
|
1078
|
+
"description": "`v1_pin_unsupported` (RFC 0176 §B.1) is a registered reason."
|
|
1081
1079
|
},
|
|
1082
1080
|
"cancelledBy": {
|
|
1083
1081
|
"type": "string",
|
|
1084
|
-
"description": "RFC 0176
|
|
1082
|
+
"description": "RFC 0176 §B.1 — `v2-cutover` when a v2 host cancels an inherited run whose pin it no longer implements."
|
|
1085
1083
|
},
|
|
1086
1084
|
"durationMs": {
|
|
1087
1085
|
"type": "integer",
|
|
@@ -1089,7 +1087,7 @@
|
|
|
1089
1087
|
},
|
|
1090
1088
|
"parentRunId": {
|
|
1091
1089
|
"$ref": "ids.schema.json#/$defs/runId",
|
|
1092
|
-
"description": "When this cancellation was triggered by a parent-cancel cascade (`interrupt-profiles.md
|
|
1090
|
+
"description": "When this cancellation was triggered by a parent-cancel cascade (`interrupt-profiles.md §openwop-interrupt-cascade-cancel`), the parent runId that initiated it. Pairs with `reason: 'parent-cancelled'`. Absent for direct cancellations."
|
|
1093
1091
|
}
|
|
1094
1092
|
},
|
|
1095
1093
|
"additionalProperties": false
|
|
@@ -1117,7 +1115,7 @@
|
|
|
1117
1115
|
"drain",
|
|
1118
1116
|
"interrupt"
|
|
1119
1117
|
],
|
|
1120
|
-
"description": "v1 rest-endpoints.md MUST
|
|
1118
|
+
"description": "v1 rest-endpoints.md MUST — the pause drain policy persisted on the event."
|
|
1121
1119
|
}
|
|
1122
1120
|
},
|
|
1123
1121
|
"additionalProperties": false
|
|
@@ -1138,13 +1136,13 @@
|
|
|
1138
1136
|
"engineVersion": {
|
|
1139
1137
|
"type": "integer",
|
|
1140
1138
|
"minimum": 0,
|
|
1141
|
-
"description": "v2: integer everywhere (RFC 0172
|
|
1139
|
+
"description": "v2: integer everywhere (RFC 0172 §B axis 3)."
|
|
1142
1140
|
}
|
|
1143
1141
|
},
|
|
1144
1142
|
"additionalProperties": false
|
|
1145
1143
|
},
|
|
1146
1144
|
"runDeadLettered": {
|
|
1147
|
-
"description": "RFC 0053
|
|
1145
|
+
"description": "RFC 0053 — emitted when a run/node exhausts its retry policy (RFC 0009) and is routed to the durable dead-letter sink. The run remains fork-eligible (RFC 0011) for `capabilities.deadLetter.retentionDays`. Redaction-safe: `reason` carries no credential material. MUST NOT be emitted unless `capabilities.deadLetter.supported: true`.",
|
|
1148
1146
|
"type": "object",
|
|
1149
1147
|
"additionalProperties": false,
|
|
1150
1148
|
"required": [
|
|
@@ -1184,7 +1182,8 @@
|
|
|
1184
1182
|
"$ref": "ids.schema.json#/$defs/nodeId"
|
|
1185
1183
|
},
|
|
1186
1184
|
"typeId": {
|
|
1187
|
-
"
|
|
1185
|
+
"type": "string",
|
|
1186
|
+
"minLength": 1
|
|
1188
1187
|
},
|
|
1189
1188
|
"attempt": {
|
|
1190
1189
|
"type": "integer",
|
|
@@ -1261,7 +1260,7 @@
|
|
|
1261
1260
|
"conversation.close",
|
|
1262
1261
|
"low-confidence"
|
|
1263
1262
|
],
|
|
1264
|
-
"description": "RFC 0094
|
|
1263
|
+
"description": "RFC 0094 §E — the full kind union `interrupt.md` defines (mirrors suspend-request.schema.json). Conversation kinds are gated on the conversation capability per capabilities.md."
|
|
1265
1264
|
},
|
|
1266
1265
|
"key": {
|
|
1267
1266
|
"type": "string",
|
|
@@ -1362,7 +1361,7 @@
|
|
|
1362
1361
|
"additionalProperties": false
|
|
1363
1362
|
},
|
|
1364
1363
|
"interruptRequested": {
|
|
1365
|
-
"description": "Canonical HITL primitive
|
|
1364
|
+
"description": "Canonical HITL primitive — discriminated union over kind. Payload mirrors `suspend-request.schema.json` (InterruptPayload) plus engine-assigned identity fields.",
|
|
1366
1365
|
"$ref": "https://openwop.dev/spec/v2/suspend-request.schema.json"
|
|
1367
1366
|
},
|
|
1368
1367
|
"interruptResolved": {
|
|
@@ -1391,7 +1390,7 @@
|
|
|
1391
1390
|
"conversation.close",
|
|
1392
1391
|
"low-confidence"
|
|
1393
1392
|
],
|
|
1394
|
-
"description": "RFC 0094
|
|
1393
|
+
"description": "RFC 0094 §E — the full kind union `interrupt.md` defines (mirrors suspend-request.schema.json). Conversation kinds are gated on the conversation capability per capabilities.md."
|
|
1395
1394
|
},
|
|
1396
1395
|
"resumeValue": {},
|
|
1397
1396
|
"resolvedBy": {
|
|
@@ -1413,7 +1412,7 @@
|
|
|
1413
1412
|
},
|
|
1414
1413
|
"contextSummarized": {
|
|
1415
1414
|
"type": "object",
|
|
1416
|
-
"description": "RFC 0111. Emitted when the host replaces older in-window orchestrator transcript turns with a host-produced summary to honor `multiAgent.executionModel.contextBudget.transcriptTokenBudget`. CONTENT-FREE: the summary text is NEVER inlined
|
|
1415
|
+
"description": "RFC 0111. Emitted when the host replaces older in-window orchestrator transcript turns with a host-produced summary to honor `multiAgent.executionModel.contextBudget.transcriptTokenBudget`. CONTENT-FREE: the summary text is NEVER inlined — `summaryRef` is an artifactId resolved via `GET /v1/runs/{runId}/artifacts/{artifactId}`. The summary is a NONDETERMINISTIC host output governed like an RFC 0041 envelope: on `:fork mode:replay` the host MUST reuse this recorded `summaryRef` and MUST NOT re-summarize (see multi-agent-execution.md §\"Context economy (RFC 0111)\"). `replacedTurns` lists the event ids the summary stands in for, so a replay engine reconstructs the exact transcript.",
|
|
1417
1416
|
"required": [
|
|
1418
1417
|
"iteration",
|
|
1419
1418
|
"replacedTurns",
|
|
@@ -1459,7 +1458,7 @@
|
|
|
1459
1458
|
"tokensAfter": {
|
|
1460
1459
|
"type": "integer",
|
|
1461
1460
|
"minimum": 0,
|
|
1462
|
-
"description": "Token count of the summary that replaced the range, in `tokenCounter` units. Expected
|
|
1461
|
+
"description": "Token count of the summary that replaced the range, in `tokenCounter` units. Expected ≤ `tokensBefore`."
|
|
1463
1462
|
}
|
|
1464
1463
|
},
|
|
1465
1464
|
"additionalProperties": false
|
|
@@ -1491,7 +1490,7 @@
|
|
|
1491
1490
|
},
|
|
1492
1491
|
"registered": {
|
|
1493
1492
|
"type": "boolean",
|
|
1494
|
-
"description": "RFC 0071. True when `artifactType` resolves to a registered artifact type (pack- or host-registered) and the payload was validated against its schema; false for unregistered/host-local types accepted without schema validation. Optional; absent
|
|
1493
|
+
"description": "RFC 0071. True when `artifactType` resolves to a registered artifact type (pack- or host-registered) and the payload was validated against its schema; false for unregistered/host-local types accepted without schema validation. Optional; absent ⇒ treat as true, preserving pre-RFC-0071 semantics. See artifact-type-packs.md §\"Binding the existing artifact surfaces\"."
|
|
1495
1494
|
},
|
|
1496
1495
|
"registrationSource": {
|
|
1497
1496
|
"type": "string",
|
|
@@ -1499,14 +1498,14 @@
|
|
|
1499
1498
|
"pack",
|
|
1500
1499
|
"host"
|
|
1501
1500
|
],
|
|
1502
|
-
"description": "RFC 0075. Provenance of a registered type: `pack` (matches an installed artifact-type pack) or `host` (a host-native type the host validates against a host-known schema, independent of any pack
|
|
1501
|
+
"description": "RFC 0075. Provenance of a registered type: `pack` (matches an installed artifact-type pack) or `host` (a host-native type the host validates against a host-known schema, independent of any pack — e.g. an AI host's built-in artifact types). Optional; meaningful only when `registered: true`. Absent ⇒ unspecified provenance (existing semantics)."
|
|
1503
1502
|
}
|
|
1504
1503
|
},
|
|
1505
1504
|
"additionalProperties": false
|
|
1506
1505
|
},
|
|
1507
1506
|
"outputChunk": {
|
|
1508
1507
|
"type": "object",
|
|
1509
|
-
"description": "Emitted for streaming output (e.g., LLM token chunks). Stream-mode `messages` consumers see these. RFC 0094
|
|
1508
|
+
"description": "Emitted for streaming output (e.g., LLM token chunks). Stream-mode `messages` consumers see these. RFC 0094 §D single-sources the `ai.message.chunk` payload here: bare {nodeId, runId, chunk, isLast} is the minimum compliant payload per stream-modes.md §messages (the prior {nodeId, chunk}-only required set was the defective restatement). Tiered metadata per stream-modes.md §messages (S2 closure): `meta` adds Tier 1 typed slots and a Tier 2 provider-pass-through escape hatch.",
|
|
1510
1509
|
"required": [
|
|
1511
1510
|
"nodeId",
|
|
1512
1511
|
"runId",
|
|
@@ -1526,7 +1525,7 @@
|
|
|
1526
1525
|
},
|
|
1527
1526
|
"isLast": {
|
|
1528
1527
|
"type": "boolean",
|
|
1529
|
-
"description": "True for the final chunk of a given AI node call. Required
|
|
1528
|
+
"description": "True for the final chunk of a given AI node call. Required — both reference consumers rely on it for fold termination."
|
|
1530
1529
|
},
|
|
1531
1530
|
"channel": {
|
|
1532
1531
|
"type": "string",
|
|
@@ -1540,7 +1539,7 @@
|
|
|
1540
1539
|
},
|
|
1541
1540
|
"_chunkMeta": {
|
|
1542
1541
|
"type": "object",
|
|
1543
|
-
"description": "Tiered metadata for ai.message.chunk / outputChunk payloads. See stream-modes.md
|
|
1542
|
+
"description": "Tiered metadata for ai.message.chunk / outputChunk payloads. See stream-modes.md §messages.",
|
|
1544
1543
|
"properties": {
|
|
1545
1544
|
"finishReason": {
|
|
1546
1545
|
"type": "string",
|
|
@@ -1558,7 +1557,7 @@
|
|
|
1558
1557
|
},
|
|
1559
1558
|
"toolCalls": {
|
|
1560
1559
|
"type": "array",
|
|
1561
|
-
"description": "Tier 1: structured tool / function calls emitted in this chunk. Each item: `{id, name, arguments}`
|
|
1560
|
+
"description": "Tier 1: structured tool / function calls emitted in this chunk. Each item: `{id, name, arguments}` — `arguments` is a string (JSON-encoded args, may be partial when streaming)."
|
|
1562
1561
|
},
|
|
1563
1562
|
"model": {
|
|
1564
1563
|
"type": "string",
|
|
@@ -1585,11 +1584,11 @@
|
|
|
1585
1584
|
},
|
|
1586
1585
|
"provider": {
|
|
1587
1586
|
"type": "string",
|
|
1588
|
-
"description": "Tier 2: provider name when `providerExtensions` is present. Examples: `openai`, `anthropic`, `google`, `minimax`. Consumers MUST NOT branch on this for behavior
|
|
1587
|
+
"description": "Tier 2: provider name when `providerExtensions` is present. Examples: `openai`, `anthropic`, `google`, `minimax`. Consumers MUST NOT branch on this for behavior — use Tier 1 fields. Provided for observability + debugging only."
|
|
1589
1588
|
},
|
|
1590
1589
|
"providerExtensions": {
|
|
1591
1590
|
"type": "object",
|
|
1592
|
-
"description": "Tier 2: provider pass-through for fields the spec hasn't typed yet. Consumers using this opt into per-provider knowledge; spec evolution may move fields up into Tier 1 over time (additive
|
|
1591
|
+
"description": "Tier 2: provider pass-through for fields the spec hasn't typed yet. Consumers using this opt into per-provider knowledge; spec evolution may move fields up into Tier 1 over time (additive — typed slot wins).",
|
|
1593
1592
|
"additionalProperties": true
|
|
1594
1593
|
}
|
|
1595
1594
|
},
|
|
@@ -1677,7 +1676,7 @@
|
|
|
1677
1676
|
"engineVersion": {
|
|
1678
1677
|
"type": "integer",
|
|
1679
1678
|
"minimum": 0,
|
|
1680
|
-
"description": "v2: integer everywhere (RFC 0172
|
|
1679
|
+
"description": "v2: integer everywhere (RFC 0172 §B axis 3)."
|
|
1681
1680
|
}
|
|
1682
1681
|
},
|
|
1683
1682
|
"additionalProperties": false
|
|
@@ -1713,14 +1712,14 @@
|
|
|
1713
1712
|
"minimum": 0
|
|
1714
1713
|
},
|
|
1715
1714
|
"lastNodeId": {
|
|
1716
|
-
"
|
|
1715
|
+
"type": "string"
|
|
1717
1716
|
}
|
|
1718
1717
|
},
|
|
1719
1718
|
"additionalProperties": false
|
|
1720
1719
|
},
|
|
1721
1720
|
"capBreached": {
|
|
1722
1721
|
"type": "object",
|
|
1723
|
-
"description": "Emitted when a CapabilityLimit is exceeded. Protocol-level limits use the engine kinds (clarificationRounds / schemaRounds / envelopesPerTurn / maxNodeExecutions). RFC 0008
|
|
1722
|
+
"description": "Emitted when a CapabilityLimit is exceeded. Protocol-level limits use the engine kinds (clarificationRounds / schemaRounds / envelopesPerTurn / maxNodeExecutions). RFC 0008 §K WASM-runtime caps use the wasm-* kinds (memory ceiling, fuel exhaustion, execution-time wall-clock). RFC 0058 run-execution bounds use the run-scoped run-duration (wall-clock timeout; limit=resolvedMs, observed=elapsedMs) and loop-iterations (agent-loop ceiling; limit=resolvedMax, observed=iterationCount) kinds.",
|
|
1724
1723
|
"required": [
|
|
1725
1724
|
"kind",
|
|
1726
1725
|
"limit",
|
|
@@ -1748,7 +1747,7 @@
|
|
|
1748
1747
|
"limit": {
|
|
1749
1748
|
"type": "number",
|
|
1750
1749
|
"minimum": 0,
|
|
1751
|
-
"description": "The effective ceiling. A whole number for the engine/WASM/RFC 0058 integer kinds; a fractional value for budget-cost (dollars, matching budget.exhausted + maxCostUsd
|
|
1750
|
+
"description": "The effective ceiling. A whole number for the engine/WASM/RFC 0058 integer kinds; a fractional value for budget-cost (dollars, matching budget.exhausted + maxCostUsd — RFC 0084 §D)."
|
|
1752
1751
|
},
|
|
1753
1752
|
"observed": {
|
|
1754
1753
|
"type": "number",
|
|
@@ -1799,7 +1798,7 @@
|
|
|
1799
1798
|
},
|
|
1800
1799
|
"leaseHandedOff": {
|
|
1801
1800
|
"type": "object",
|
|
1802
|
-
"description": "Emitted when a run's executing lease is transferred from one host to another (e.g., browser
|
|
1801
|
+
"description": "Emitted when a run's executing lease is transferred from one host to another (e.g., browser → cloud failover).",
|
|
1803
1802
|
"required": [
|
|
1804
1803
|
"leaseId",
|
|
1805
1804
|
"fromHost",
|
|
@@ -1832,7 +1831,7 @@
|
|
|
1832
1831
|
},
|
|
1833
1832
|
"replayDivergedAtRefusal": {
|
|
1834
1833
|
"type": "object",
|
|
1835
|
-
"description": "RFC 0041
|
|
1834
|
+
"description": "RFC 0041 §B — emitted by `:fork` mode `replay` when the replay's LLM call returns a refusal but the original run got a valid envelope (or vice-versa: the original refused, the replay succeeded). Distinct from the generic `replay.diverged` event (which covers structural output/missing/extra/type-mismatch divergence) to let operators audit safety-policy shifts without filtering through the generic divergence stream. When this event fires, the host MUST also fail the replay with `error.code: \"replay_diverged_at_refusal\"` per `spec/v1/rest-endpoints.md` §\"Common error codes\". Capability-gated on `capabilities.multiAgent.executionModel.replayDeterminism.refusalDivergenceEmission: true`; non-Phase-4 hosts MUST NOT emit this event.",
|
|
1836
1835
|
"required": [
|
|
1837
1836
|
"sourceRunId",
|
|
1838
1837
|
"atSequence",
|
|
@@ -1850,7 +1849,7 @@
|
|
|
1850
1849
|
"description": "Event-log index at which the refusal-divergence was detected (the index of the LLM call whose envelope shifted)."
|
|
1851
1850
|
},
|
|
1852
1851
|
"originalEventId": {
|
|
1853
|
-
"
|
|
1852
|
+
"type": "string",
|
|
1854
1853
|
"description": "Optional eventId of the original event whose envelope is being compared. SHOULD be set when the host has a stable identifier for the event; MAY be omitted when only the sequence index is known."
|
|
1855
1854
|
},
|
|
1856
1855
|
"nodeId": {
|
|
@@ -1871,7 +1870,7 @@
|
|
|
1871
1870
|
"valid",
|
|
1872
1871
|
"refusal"
|
|
1873
1872
|
],
|
|
1874
|
-
"description": "Whether the replay's LLM envelope was a valid response or a refusal. MUST differ from `originalEnvelopeKind`
|
|
1873
|
+
"description": "Whether the replay's LLM envelope was a valid response or a refusal. MUST differ from `originalEnvelopeKind` — otherwise there is no divergence to report."
|
|
1875
1874
|
},
|
|
1876
1875
|
"refusalReason": {
|
|
1877
1876
|
"type": "string",
|
|
@@ -1882,7 +1881,7 @@
|
|
|
1882
1881
|
},
|
|
1883
1882
|
"replayDiverged": {
|
|
1884
1883
|
"type": "object",
|
|
1885
|
-
"description": "Emitted by `:fork` when a replay re-execution produces a different output than the original at a given sequence. See replay.md
|
|
1884
|
+
"description": "Emitted by `:fork` when a replay re-execution produces a different output than the original at a given sequence. See replay.md §divergence detection. `divergencePoint` (RFC 0027 §F) is the canonical optional field for naming which event-emission diverged; the two fields are complementary, not mutually exclusive.",
|
|
1886
1885
|
"required": [
|
|
1887
1886
|
"sourceRunId",
|
|
1888
1887
|
"atSequence"
|
|
@@ -1896,7 +1895,7 @@
|
|
|
1896
1895
|
"minimum": 0
|
|
1897
1896
|
},
|
|
1898
1897
|
"originalEventId": {
|
|
1899
|
-
"
|
|
1898
|
+
"type": "string"
|
|
1900
1899
|
},
|
|
1901
1900
|
"divergenceKind": {
|
|
1902
1901
|
"type": "string",
|
|
@@ -1909,7 +1908,7 @@
|
|
|
1909
1908
|
},
|
|
1910
1909
|
"divergencePoint": {
|
|
1911
1910
|
"type": "string",
|
|
1912
|
-
"description": "RFC 0027
|
|
1911
|
+
"description": "RFC 0027 §F. Verbatim `RunEventType` enum string identifying which event-emission the replay diverged at (e.g., `\"prompt.composed\"` per RFC 0027, `\"agent.promptResolved\"` per RFC 0029, `\"envelope.retry.exhausted\"` / `\"envelope.recovery.applied\"` per RFC 0032). Set when divergence is detected on a specific cross-kind operational event's payload. When divergence is purely structural (output/missing/extra at the event-array level rather than within a typed payload), `divergenceKind` carries the shape and `divergencePoint` MAY be omitted. The two fields are complementary: a single `replay.diverged` event MAY carry both (e.g., `{ divergenceKind: \"output\", divergencePoint: \"prompt.composed\" }` reads as \"the `prompt.composed` event at sequence N had a different output on replay than the original\"). The field is defined by RFC 0027; values are contributed by consuming RFCs (0029 adds `agent.promptResolved`, 0032 adds the envelope-reliability event names)."
|
|
1913
1912
|
}
|
|
1914
1913
|
},
|
|
1915
1914
|
"additionalProperties": false
|
|
@@ -1942,14 +1941,14 @@
|
|
|
1942
1941
|
"causationHostId": {
|
|
1943
1942
|
"type": "string",
|
|
1944
1943
|
"minLength": 1,
|
|
1945
|
-
"description": "RFC 0040
|
|
1944
|
+
"description": "RFC 0040 §A — optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
1946
1945
|
}
|
|
1947
1946
|
},
|
|
1948
1947
|
"additionalProperties": false
|
|
1949
1948
|
},
|
|
1950
1949
|
"agentReasoningDelta": {
|
|
1951
1950
|
"type": "object",
|
|
1952
|
-
"description": "RFC 0024. Incremental reasoning chunk for live-streaming UX. Emitted while a reasoning block is still open, BEFORE the corresponding `agent.reasoned` finalization. Consumers concatenate `delta` strings in arrival order to reconstruct the in-progress trace; the closing `agent.reasoned` event carries the FULL authoritative `reasoning`. Gated on `capabilities.agents.reasoning.streaming: true`. NOTE: `additionalProperties: true` mirrors the Phase-1 multi-agent-shift carve-out applied to the sibling `agentReasoned` schema
|
|
1951
|
+
"description": "RFC 0024. Incremental reasoning chunk for live-streaming UX. Emitted while a reasoning block is still open, BEFORE the corresponding `agent.reasoned` finalization. Consumers concatenate `delta` strings in arrival order to reconstruct the in-progress trace; the closing `agent.reasoned` event carries the FULL authoritative `reasoning`. Gated on `capabilities.agents.reasoning.streaming: true`. NOTE: `additionalProperties: true` mirrors the Phase-1 multi-agent-shift carve-out applied to the sibling `agentReasoned` schema — a deliberate forward-compat exception per RFC 0024 §Compatibility, not a precedent generalizable to other event payloads.",
|
|
1953
1952
|
"required": [
|
|
1954
1953
|
"agentId",
|
|
1955
1954
|
"delta",
|
|
@@ -1983,7 +1982,7 @@
|
|
|
1983
1982
|
},
|
|
1984
1983
|
"providerUsage": {
|
|
1985
1984
|
"type": "object",
|
|
1986
|
-
"description": "RFC 0026. Per-call usage record emitted after every LLM provider invocation. Durably persisted in the run event log; consumed by replay, webhook subscribers, billing reconciliation. The OTel `openwop.cost.*` attribute group (per `observability.md
|
|
1985
|
+
"description": "RFC 0026. Per-call usage record emitted after every LLM provider invocation. Durably persisted in the run event log; consumed by replay, webhook subscribers, billing reconciliation. The OTel `openwop.cost.*` attribute group (per `observability.md §\"Cost attribution attributes\"`) is the observability sibling — this event type is the durable record. Replay determinism: `inputTokens` + `outputTokens` MUST replay identically; `costEstimateUsd` MAY be omitted on replay, and so MAY the RFC 0116 cost-only `cacheReadTokens`/`cacheWriteTokens` (they are NOT replay-asserted — a prompt-prefix cache hit vs miss MUST NOT change `inputTokens`/`outputTokens` or the recorded envelope). The payload MUST NOT carry credentialRefs, hashed credential identifiers, or prompt/response substrings per `SECURITY/threat-model-secret-leakage.md §SR-1` (enforced by SECURITY invariant `provider-usage-no-credential-leak`).",
|
|
1987
1986
|
"required": [
|
|
1988
1987
|
"provider",
|
|
1989
1988
|
"model",
|
|
@@ -1999,7 +1998,7 @@
|
|
|
1999
1998
|
"model": {
|
|
2000
1999
|
"type": "string",
|
|
2001
2000
|
"minLength": 1,
|
|
2002
|
-
"description": "Provider-stamped model id as the model expects it. Same value used in the LLM cache-key recipe per `replay.md
|
|
2001
|
+
"description": "Provider-stamped model id as the model expects it. Same value used in the LLM cache-key recipe per `replay.md §A`."
|
|
2003
2002
|
},
|
|
2004
2003
|
"inputTokens": {
|
|
2005
2004
|
"type": "integer",
|
|
@@ -2019,7 +2018,7 @@
|
|
|
2019
2018
|
"costEstimateUsd": {
|
|
2020
2019
|
"type": "number",
|
|
2021
2020
|
"minimum": 0,
|
|
2022
|
-
"description": "ADVISORY estimate in USD computed by the host's static rate table. MUST NOT be used for billing
|
|
2021
|
+
"description": "ADVISORY estimate in USD computed by the host's static rate table. MUST NOT be used for billing — real billing is external. Hosts SHOULD omit when no rate is known rather than emit 0."
|
|
2023
2022
|
},
|
|
2024
2023
|
"currency": {
|
|
2025
2024
|
"type": "string",
|
|
@@ -2028,12 +2027,12 @@
|
|
|
2028
2027
|
},
|
|
2029
2028
|
"cacheHit": {
|
|
2030
2029
|
"type": "boolean",
|
|
2031
|
-
"description": "True iff this call was served from the LLM response cache per `replay.md
|
|
2030
|
+
"description": "True iff this call was served from the LLM response cache per `replay.md §\"LLM cache-key recipe\"`. When true, inputTokens/outputTokens reflect the ORIGINAL call's billed values; the cached invocation incurred zero new provider cost."
|
|
2032
2031
|
},
|
|
2033
2032
|
"cacheReadTokens": {
|
|
2034
2033
|
"type": "integer",
|
|
2035
2034
|
"minimum": 0,
|
|
2036
|
-
"description": "RFC 0116. Optional, cost-only. Provider-reported tokens served from the prompt-prefix context cache on this call
|
|
2035
|
+
"description": "RFC 0116. Optional, cost-only. Provider-reported tokens served from the prompt-prefix context cache on this call — a cache HIT shows > 0. This is a cost hint, NOT a semantic input: it MAY be omitted on replay (NOT replay-asserted, like `costEstimateUsd`), and a hit-vs-miss difference MUST NOT change `inputTokens`/`outputTokens` or the recorded envelope (RFC 0116 replay-invariance MUST). MUST NOT carry prompt/response substrings per `SECURITY/threat-model-secret-leakage.md §SR-1`."
|
|
2037
2036
|
},
|
|
2038
2037
|
"cacheWriteTokens": {
|
|
2039
2038
|
"type": "integer",
|
|
@@ -2053,7 +2052,7 @@
|
|
|
2053
2052
|
},
|
|
2054
2053
|
"promptComposed": {
|
|
2055
2054
|
"type": "object",
|
|
2056
|
-
"description": "RFC 0027. Emitted once per (nodeId, kind) composition when a host resolves a PromptRef on a node and assembles its body for an LLM call. Gated on `capabilities.prompts.supported: true` AND `capabilities.prompts.observability !== 'off'`. Body fields (`systemPrompt`, `userPrompt`, `variableBindings`) are populated only under `observability: 'full'`; under `hashed` the event carries only `hash` + `variableHashes`. Replay-deterministic over `(refs, variableHashes, contentTrust)` per `spec/v1/prompts.md
|
|
2055
|
+
"description": "RFC 0027. Emitted once per (nodeId, kind) composition when a host resolves a PromptRef on a node and assembles its body for an LLM call. Gated on `capabilities.prompts.supported: true` AND `capabilities.prompts.observability !== 'off'`. Body fields (`systemPrompt`, `userPrompt`, `variableBindings`) are populated only under `observability: 'full'`; under `hashed` the event carries only `hash` + `variableHashes`. Replay-deterministic over `(refs, variableHashes, contentTrust)` per `spec/v1/prompts.md §\"Replay determinism\"`. Secret-source variable values MUST be replaced with `[REDACTED:<secretId>]` markers per SECURITY invariant `prompt-composed-secret-redaction`; untrusted-input segments MUST be wrapped with `<UNTRUSTED>...</UNTRUSTED>` markers per SECURITY invariant `prompt-composed-trust-marker`.",
|
|
2057
2056
|
"required": [
|
|
2058
2057
|
"nodeId",
|
|
2059
2058
|
"refs",
|
|
@@ -2081,7 +2080,7 @@
|
|
|
2081
2080
|
"user-only",
|
|
2082
2081
|
"agent-reasoning"
|
|
2083
2082
|
],
|
|
2084
|
-
"description": "Composition shape
|
|
2083
|
+
"description": "Composition shape — what the host actually assembled. `system+user`: both system and user templates resolved. `system-only`: only a system template applied (e.g., agent intrinsic). `user-only`: only a user template applied. `agent-reasoning`: composition was emitted ahead of an agent reasoning trace per RFC 0024."
|
|
2085
2084
|
},
|
|
2086
2085
|
"hash": {
|
|
2087
2086
|
"type": "string",
|
|
@@ -2090,7 +2089,7 @@
|
|
|
2090
2089
|
},
|
|
2091
2090
|
"composed": {
|
|
2092
2091
|
"type": "string",
|
|
2093
|
-
"description": "Generic composed-body field. Present only when `capabilities.prompts.observability` is `full`. Populated for ALL four PromptKind values (system / user / few-shot / schema-hint) so consumers have a single body field to read
|
|
2092
|
+
"description": "Generic composed-body field. Present only when `capabilities.prompts.observability` is `full`. Populated for ALL four PromptKind values (system / user / few-shot / schema-hint) so consumers have a single body field to read — necessary for few-shot + schema-hint templates that don't fit the system/user split below. Same secret-redaction + trust-marker invariants apply as for the kind-specific fields. The kind-specific `systemPrompt` + `userPrompt` fields below remain populated for system/user kinds so existing consumers that key off them continue to work; both fields carry identical content for those kinds."
|
|
2094
2093
|
},
|
|
2095
2094
|
"systemPrompt": {
|
|
2096
2095
|
"type": "string",
|
|
@@ -2103,7 +2102,7 @@
|
|
|
2103
2102
|
"variableBindings": {
|
|
2104
2103
|
"type": "object",
|
|
2105
2104
|
"additionalProperties": true,
|
|
2106
|
-
"description": "Variable-name
|
|
2105
|
+
"description": "Variable-name → bound-value map. Secret-source bindings MUST appear as `[REDACTED:<secretId>]`. Only present under `observability: 'full'`."
|
|
2107
2106
|
},
|
|
2108
2107
|
"variableHashes": {
|
|
2109
2108
|
"type": "object",
|
|
@@ -2111,7 +2110,7 @@
|
|
|
2111
2110
|
"type": "string",
|
|
2112
2111
|
"pattern": "^sha256:[0-9a-f]{64}$"
|
|
2113
2112
|
},
|
|
2114
|
-
"description": "Variable-name
|
|
2113
|
+
"description": "Variable-name → sha256(value) map. Always present (under both `hashed` and `full`). Enables replay-determinism checks without exposing values."
|
|
2115
2114
|
},
|
|
2116
2115
|
"contentTrust": {
|
|
2117
2116
|
"type": "string",
|
|
@@ -2119,19 +2118,19 @@
|
|
|
2119
2118
|
"trusted",
|
|
2120
2119
|
"untrusted"
|
|
2121
2120
|
],
|
|
2122
|
-
"description": "Aggregate trust marker. `untrusted` iff ANY contributing input was tagged untrusted per RFC 0020
|
|
2121
|
+
"description": "Aggregate trust marker. `untrusted` iff ANY contributing input was tagged untrusted per RFC 0020 §D / AIEnvelope.meta.contentTrust propagation. When `untrusted`, the composed bodies MUST contain `<UNTRUSTED>...</UNTRUSTED>` markers around the untrusted segments."
|
|
2123
2122
|
},
|
|
2124
2123
|
"causationHostId": {
|
|
2125
2124
|
"type": "string",
|
|
2126
2125
|
"minLength": 1,
|
|
2127
|
-
"description": "RFC 0040
|
|
2126
|
+
"description": "RFC 0040 §A — optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2128
2127
|
}
|
|
2129
2128
|
},
|
|
2130
2129
|
"additionalProperties": false
|
|
2131
2130
|
},
|
|
2132
2131
|
"agentPromptResolved": {
|
|
2133
2132
|
"type": "object",
|
|
2134
|
-
"description": "RFC 0029
|
|
2133
|
+
"description": "RFC 0029 §B. Emitted once per (nodeId, kind) pair BEFORE the corresponding `prompt.composed` event (when emitted). Surfaces the four-layer resolution chain per `spec/v1/prompts.md` §\"Resolution chain (normative)\" so cross-host debuggers and multi-agent visualizers can render which PromptRef applied at this node and why. Gated on `capabilities.prompts.supported: true`; payload is durable in the event log and participates in replay. Carries refs (not bodies), so emission is safe regardless of `capabilities.prompts.observability` — the secret-redaction + trust-marker invariants on `prompt.composed` (RFC 0027 §G) don't apply here.",
|
|
2135
2134
|
"required": [
|
|
2136
2135
|
"nodeId",
|
|
2137
2136
|
"kind",
|
|
@@ -2172,7 +2171,7 @@
|
|
|
2172
2171
|
"workflow-defaults",
|
|
2173
2172
|
"host-defaults"
|
|
2174
2173
|
],
|
|
2175
|
-
"description": "Identifies which precedence layer this chain entry represents. The four normative layers per RFC 0029
|
|
2174
|
+
"description": "Identifies which precedence layer this chain entry represents. The four normative layers per RFC 0029 §A are `node`, `agent-*`, `workflow-defaults`, `host-defaults`. `run-configurable` is reserved for the optional `RunOptions.configurable.promptOverrides` extension described in RFC 0029 §\"Alternatives considered\" #5; hosts that honor that extension MUST emit a chain entry with this layer value above the `node` entry."
|
|
2176
2175
|
},
|
|
2177
2176
|
"source": {
|
|
2178
2177
|
"type": "string",
|
|
@@ -2180,7 +2179,7 @@
|
|
|
2180
2179
|
},
|
|
2181
2180
|
"applied": {
|
|
2182
2181
|
"type": "boolean",
|
|
2183
|
-
"description": "True for exactly one entry in the chain
|
|
2182
|
+
"description": "True for exactly one entry in the chain — the layer whose ref was selected. False for layers that yielded null OR were skipped after a higher-precedence layer already applied."
|
|
2184
2183
|
},
|
|
2185
2184
|
"reason": {
|
|
2186
2185
|
"type": "string",
|
|
@@ -2199,7 +2198,7 @@
|
|
|
2199
2198
|
"causationHostId": {
|
|
2200
2199
|
"type": "string",
|
|
2201
2200
|
"minLength": 1,
|
|
2202
|
-
"description": "RFC 0040
|
|
2201
|
+
"description": "RFC 0040 §A — optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2203
2202
|
}
|
|
2204
2203
|
},
|
|
2205
2204
|
"additionalProperties": false
|
|
@@ -2207,7 +2206,7 @@
|
|
|
2207
2206
|
"modelCapabilitySubstituted": {
|
|
2208
2207
|
"type": "object",
|
|
2209
2208
|
"additionalProperties": false,
|
|
2210
|
-
"description": "RFC 0031
|
|
2209
|
+
"description": "RFC 0031 §D. Emitted when a host substitutes the active model with a NodeModule's declared `fallbackModel` because the active model lacks one or more of the `requiredModelCapabilities`. MUST event per RFC 0031 §B step 3. The `fallbackProvider` + `fallbackModel` pair MAY be redacted as all-or-nothing `\"[REDACTED]\"` when workspace policy treats multi-vendor posture as confidential per SECURITY invariant `model-capability-substituted-no-credential-disclosure`. The other fields are not redactable — `originalProvider` is already public via `RunOptions.configurable.ai.provider`, and `nodeId` / `missingCapabilities` carry no provider-possession information.",
|
|
2211
2210
|
"required": [
|
|
2212
2211
|
"nodeId",
|
|
2213
2212
|
"originalProvider",
|
|
@@ -2250,7 +2249,7 @@
|
|
|
2250
2249
|
"modelCapabilityInsufficient": {
|
|
2251
2250
|
"type": "object",
|
|
2252
2251
|
"additionalProperties": false,
|
|
2253
|
-
"description": "RFC 0031
|
|
2252
|
+
"description": "RFC 0031 §D. Emitted when a host refuses to dispatch a NodeModule because the active model lacks declared `requiredModelCapabilities` AND no viable fallback is available (no `fallbackModel` declared, OR the host cannot authenticate to the fallback provider). MUST event per RFC 0031 §B step 4. Pairs with `RunSnapshot.error.code = \"capability_not_provided\"` per `capabilities.md` §\"Unsupported capability — refusal contract\". Recursive fallback is NOT permitted (RFC 0031 §\"Unresolved questions\" #3): if a host attempts substitution and the fallback itself fails, the host MUST emit this event with `fallbackAttempted: true` and refuse, not chain to another fallback.",
|
|
2254
2253
|
"required": [
|
|
2255
2254
|
"nodeId",
|
|
2256
2255
|
"provider",
|
|
@@ -2288,7 +2287,7 @@
|
|
|
2288
2287
|
"envelopeRetryAttempted": {
|
|
2289
2288
|
"type": "object",
|
|
2290
2289
|
"additionalProperties": false,
|
|
2291
|
-
"description": "RFC 0032
|
|
2290
|
+
"description": "RFC 0032 §B.1. Emitted when a host retries an envelope emission after a parse or validation failure on a prior attempt. The first attempt does NOT emit this event; the second attempt emits with `attempt: 2`, etc. SHOULD-tier — hosts that don't implement retry don't emit; hosts that DO retry on validation failure SHOULD emit per attempt past the first.",
|
|
2292
2291
|
"required": [
|
|
2293
2292
|
"nodeId",
|
|
2294
2293
|
"attempt",
|
|
@@ -2323,21 +2322,21 @@
|
|
|
2323
2322
|
"pattern": "^x-host-[a-z][a-z0-9-]*-[a-z][a-z0-9-]*$"
|
|
2324
2323
|
}
|
|
2325
2324
|
],
|
|
2326
|
-
"description": "Why the prior attempt failed. Spec-reserved values: `schema-violation` (model emitted wrong-shape JSON; corrective fragment + retry per RFC 0033
|
|
2325
|
+
"description": "Why the prior attempt failed. Spec-reserved values: `schema-violation` (model emitted wrong-shape JSON; corrective fragment + retry per RFC 0033 §C), `truncation` (stop_reason: max_tokens; budget-double + retry per RFC 0033 §B), `type-drift` (envelope `type` discriminator drifted from what was advertised mid-run), `type-mismatch` (a typed payload field was emitted with the wrong runtime type — e.g., string where number was declared), `refusal` (provider safety-stop; NO retry per RFC 0032 §B.3), `parse-error` (response was not extractable as JSON even after lenient parsing), `unknown` (host could not classify). Host-private extensions MUST prefix with `x-host-<host>-` per `host-extensions.md` §\"Canonical-prefix table\"; matches the RFC 0031 §B `requiredModelCapabilities` precedent."
|
|
2327
2326
|
},
|
|
2328
2327
|
"previousError": {
|
|
2329
2328
|
"type": [
|
|
2330
2329
|
"string",
|
|
2331
2330
|
"null"
|
|
2332
2331
|
],
|
|
2333
|
-
"description": "Diagnostic text from the failing attempt. MUST NOT contain prompt or response substring excerpts; hosts SHOULD limit to validator output (e.g., \"required field 'steps' missing\"). Subject to SR-1 redaction per `ai-envelope.md`
|
|
2332
|
+
"description": "Diagnostic text from the failing attempt. MUST NOT contain prompt or response substring excerpts; hosts SHOULD limit to validator output (e.g., \"required field 'steps' missing\"). Subject to SR-1 redaction per `ai-envelope.md` §\"Redaction (SR-1 carry-forward)\"."
|
|
2334
2333
|
}
|
|
2335
2334
|
}
|
|
2336
2335
|
},
|
|
2337
2336
|
"envelopeRetryExhausted": {
|
|
2338
2337
|
"type": "object",
|
|
2339
2338
|
"additionalProperties": false,
|
|
2340
|
-
"description": "RFC 0032
|
|
2339
|
+
"description": "RFC 0032 §B.2. Emitted when a host has exhausted its retry budget and is about to surface a terminal envelope failure to the node. MUST-tier — alternative is silent terminal failure with no event surface, leaving conformance suites unable to assert correct give-up behavior. Hosts that don't retry MUST still emit this event when an envelope attempt terminally fails (with `totalAttempts: 1`). Pairs with `cap.breached` when the failure mode is schema-violation or truncation per RFC 0033 §B + §C.",
|
|
2341
2340
|
"required": [
|
|
2342
2341
|
"nodeId",
|
|
2343
2342
|
"totalAttempts",
|
|
@@ -2369,7 +2368,7 @@
|
|
|
2369
2368
|
"pattern": "^x-host-[a-z][a-z0-9-]*-[a-z][a-z0-9-]*$"
|
|
2370
2369
|
}
|
|
2371
2370
|
],
|
|
2372
|
-
"description": "Same value set as `envelope.retry.attempted.reason` (
|
|
2371
|
+
"description": "Same value set as `envelope.retry.attempted.reason` (§B.1). Spec-reserved closed enum plus `x-host-<host>-` extensions."
|
|
2373
2372
|
},
|
|
2374
2373
|
"finalError": {
|
|
2375
2374
|
"type": [
|
|
@@ -2383,7 +2382,7 @@
|
|
|
2383
2382
|
"envelopeRefusal": {
|
|
2384
2383
|
"type": "object",
|
|
2385
2384
|
"additionalProperties": false,
|
|
2386
|
-
"description": "RFC 0032
|
|
2385
|
+
"description": "RFC 0032 §B.3. Emitted when the underlying LLM provider returns an explicit refusal (e.g., OpenAI `message.refusal`, Anthropic safety-stop, Gemini safety-block). MUST-tier. Hosts MUST NOT retry on refusal — retrying refusal with prompt mutation creates a circumvention concern (the host automatically searches for a prompt the model will accept, evading the safety filter's intent) per RFC 0032 §B.3 + RFC 0033 §D. The node MUST fail with `error.code = \"envelope_refusal\"` per RFC 0033 §F (renamed from `envelope_refused_by_provider` per the 2026-05-21 RFC adoption-feedback amendment).",
|
|
2387
2386
|
"required": [
|
|
2388
2387
|
"nodeId",
|
|
2389
2388
|
"provider",
|
|
@@ -2418,7 +2417,7 @@
|
|
|
2418
2417
|
"envelopeTruncated": {
|
|
2419
2418
|
"type": "object",
|
|
2420
2419
|
"additionalProperties": false,
|
|
2421
|
-
"description": "RFC 0032
|
|
2420
|
+
"description": "RFC 0032 §B.4. Emitted when the LLM emission was cut off before the envelope was complete (typically `stop_reason: \"max_tokens\"`). SHOULD-tier — hosts that distinguish truncation from schema-violation per RFC 0033 §A MUST emit this event when truncation occurs. Hosts that conflate truncation with schema-violation (legacy behavior) MAY omit; they then fail RFC 0033 conformance.",
|
|
2422
2421
|
"required": [
|
|
2423
2422
|
"nodeId",
|
|
2424
2423
|
"provider",
|
|
@@ -2448,7 +2447,7 @@
|
|
|
2448
2447
|
"partialPayloadAvailable": {
|
|
2449
2448
|
"type": "boolean",
|
|
2450
2449
|
"default": false,
|
|
2451
|
-
"description": "True if the host recovered a partial envelope before truncation. Hosts MAY use this signal to route to a recovery path (e.g., budget-doubled retry per RFC 0033
|
|
2450
|
+
"description": "True if the host recovered a partial envelope before truncation. Hosts MAY use this signal to route to a recovery path (e.g., budget-doubled retry per RFC 0033 §B)."
|
|
2452
2451
|
},
|
|
2453
2452
|
"outputTokenCount": {
|
|
2454
2453
|
"type": [
|
|
@@ -2463,7 +2462,7 @@
|
|
|
2463
2462
|
"envelopeNlToFormatEngaged": {
|
|
2464
2463
|
"type": "object",
|
|
2465
2464
|
"additionalProperties": false,
|
|
2466
|
-
"description": "RFC 0032
|
|
2465
|
+
"description": "RFC 0032 §B.5. Emitted when the host has escalated to a two-call NL-to-Format fallback after retry exhaustion (per Tam et al., arXiv 2408.02442 mitigation strategy: free-form reasoning in the first call → schema coercion in the second call). MAY-tier — NL-to-Format is one of many possible recovery strategies; hosts that don't implement it don't advertise it.",
|
|
2467
2466
|
"required": [
|
|
2468
2467
|
"nodeId",
|
|
2469
2468
|
"originalEnvelopeType"
|
|
@@ -2487,7 +2486,7 @@
|
|
|
2487
2486
|
"envelopeRecoveryApplied": {
|
|
2488
2487
|
"type": "object",
|
|
2489
2488
|
"additionalProperties": false,
|
|
2490
|
-
"description": "RFC 0032
|
|
2489
|
+
"description": "RFC 0032 §B.6. Emitted when lenient parsing recovered a malformed envelope (e.g., JSON repair via `jsonrepair`, markdown fence stripping, last-balanced-object extraction). Recovery is internal to the parsing step, BEFORE validation; recovery does NOT consume a retry attempt per RFC 0033 §D. MAY-tier — lenient parsing is a host-discretion recovery path. The event payload MUST NOT carry the recovered envelope content or any substring from the model's pre-recovery output per SECURITY invariant `envelope-recovery-no-content-leak`; only the recovery path identifier and the optional `byteOffset` are emitted. The recovered content rides on the subsequent envelope acceptance + downstream `RunEventDoc`, NOT on this event.",
|
|
2491
2490
|
"required": [
|
|
2492
2491
|
"nodeId",
|
|
2493
2492
|
"path"
|
|
@@ -2505,7 +2504,7 @@
|
|
|
2505
2504
|
"brace-walker",
|
|
2506
2505
|
"custom"
|
|
2507
2506
|
],
|
|
2508
|
-
"description": "Which recovery path succeeded. `direct` is reserved for the no-recovery-needed path and is informational; hosts MAY omit emission when `path: \"direct\"`. MUST replay identically (deterministic parsing
|
|
2507
|
+
"description": "Which recovery path succeeded. `direct` is reserved for the no-recovery-needed path and is informational; hosts MAY omit emission when `path: \"direct\"`. MUST replay identically (deterministic parsing → deterministic recovery outcome)."
|
|
2509
2508
|
},
|
|
2510
2509
|
"byteOffset": {
|
|
2511
2510
|
"type": [
|
|
@@ -2544,7 +2543,7 @@
|
|
|
2544
2543
|
},
|
|
2545
2544
|
"argsHash": {
|
|
2546
2545
|
"type": "string",
|
|
2547
|
-
"description": "RFC 0064 (when `capabilities.toolHooks.prePostEvents`). SHA-256 over RFC 8785 JCS-canonicalized args with resolved secrets already redacted (SR-1)
|
|
2546
|
+
"description": "RFC 0064 (when `capabilities.toolHooks.prePostEvents`). SHA-256 over RFC 8785 JCS-canonicalized args with resolved secrets already redacted (SR-1) — the SIEM-safe, content-free alternative to `inputs`. Raw key material MUST NOT enter the hash input."
|
|
2548
2547
|
},
|
|
2549
2548
|
"principal": {
|
|
2550
2549
|
"type": "string",
|
|
@@ -2562,7 +2561,7 @@
|
|
|
2562
2561
|
"causationHostId": {
|
|
2563
2562
|
"type": "string",
|
|
2564
2563
|
"minLength": 1,
|
|
2565
|
-
"description": "RFC 0040
|
|
2564
|
+
"description": "RFC 0040 §A — optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2566
2565
|
}
|
|
2567
2566
|
},
|
|
2568
2567
|
"additionalProperties": false
|
|
@@ -2612,39 +2611,29 @@
|
|
|
2612
2611
|
"causationHostId": {
|
|
2613
2612
|
"type": "string",
|
|
2614
2613
|
"minLength": 1,
|
|
2615
|
-
"description": "RFC 0040
|
|
2614
|
+
"description": "RFC 0040 §A — optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2616
2615
|
}
|
|
2617
2616
|
},
|
|
2618
2617
|
"additionalProperties": false
|
|
2619
2618
|
},
|
|
2620
2619
|
"agentHandoff": {
|
|
2621
2620
|
"type": "object",
|
|
2622
|
-
"description": "Multi-Agent Shift Phase 1. Emitted when control transfers from one agent to another mid-run (e.g., orchestrator
|
|
2621
|
+
"description": "Multi-Agent Shift Phase 1. Emitted when control transfers from one agent to another mid-run (e.g., orchestrator → worker, worker → worker via `core.dispatch`). Pairs with the receiving agent's subsequent `agent.decided` / `agent.toolCalled` / `node.started`.",
|
|
2623
2622
|
"required": [
|
|
2624
2623
|
"fromAgentId",
|
|
2625
2624
|
"toAgentId"
|
|
2626
2625
|
],
|
|
2627
2626
|
"properties": {
|
|
2628
2627
|
"fromAgentId": {
|
|
2629
|
-
"
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
},
|
|
2633
|
-
{
|
|
2634
|
-
"minLength": 3
|
|
2635
|
-
}
|
|
2636
|
-
],
|
|
2628
|
+
"type": "string",
|
|
2629
|
+
"minLength": 3,
|
|
2630
|
+
"maxLength": 256,
|
|
2637
2631
|
"description": "Agent surrendering control."
|
|
2638
2632
|
},
|
|
2639
2633
|
"toAgentId": {
|
|
2640
|
-
"
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
},
|
|
2644
|
-
{
|
|
2645
|
-
"minLength": 3
|
|
2646
|
-
}
|
|
2647
|
-
],
|
|
2634
|
+
"type": "string",
|
|
2635
|
+
"minLength": 3,
|
|
2636
|
+
"maxLength": 256,
|
|
2648
2637
|
"description": "Agent receiving control."
|
|
2649
2638
|
},
|
|
2650
2639
|
"reason": {
|
|
@@ -2654,7 +2643,7 @@
|
|
|
2654
2643
|
"causationHostId": {
|
|
2655
2644
|
"type": "string",
|
|
2656
2645
|
"minLength": 1,
|
|
2657
|
-
"description": "RFC 0040
|
|
2646
|
+
"description": "RFC 0040 §A — optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2658
2647
|
}
|
|
2659
2648
|
},
|
|
2660
2649
|
"additionalProperties": false
|
|
@@ -2677,12 +2666,12 @@
|
|
|
2677
2666
|
"type": "number",
|
|
2678
2667
|
"minimum": 0,
|
|
2679
2668
|
"maximum": 1,
|
|
2680
|
-
"description": "Optional confidence in `[0, 1]`. Below the threshold
|
|
2669
|
+
"description": "Optional confidence in `[0, 1]`. Below the threshold → escalate via `node.suspended { reason: 'low-confidence' }`. Absent values are treated as 'no signal' — no escalation."
|
|
2681
2670
|
},
|
|
2682
2671
|
"causationHostId": {
|
|
2683
2672
|
"type": "string",
|
|
2684
2673
|
"minLength": 1,
|
|
2685
|
-
"description": "RFC 0040
|
|
2674
|
+
"description": "RFC 0040 §A — optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2686
2675
|
}
|
|
2687
2676
|
},
|
|
2688
2677
|
"additionalProperties": false
|
|
@@ -2703,7 +2692,7 @@
|
|
|
2703
2692
|
"target": {
|
|
2704
2693
|
"type": "string",
|
|
2705
2694
|
"minLength": 1,
|
|
2706
|
-
"description": "Opaque reference to what was checked
|
|
2695
|
+
"description": "Opaque reference to what was checked — the eventId of the verified `agent.decided`, a child runId, or a tool callId. Chains the verdict to its subject."
|
|
2707
2696
|
},
|
|
2708
2697
|
"verdict": {
|
|
2709
2698
|
"type": "string",
|
|
@@ -2721,18 +2710,18 @@
|
|
|
2721
2710
|
"minLength": 1
|
|
2722
2711
|
},
|
|
2723
2712
|
"uniqueItems": true,
|
|
2724
|
-
"description": "Optional closed list of the criteria KEYS evaluated (e.g. `[\"schema-valid\",\"grounded\"]`). Keys only
|
|
2713
|
+
"description": "Optional closed list of the criteria KEYS evaluated (e.g. `[\"schema-valid\",\"grounded\"]`). Keys only — never per-criterion verdict text — for SIEM safety."
|
|
2725
2714
|
},
|
|
2726
2715
|
"confidence": {
|
|
2727
2716
|
"type": "number",
|
|
2728
2717
|
"minimum": 0,
|
|
2729
2718
|
"maximum": 1,
|
|
2730
|
-
"description": "Optional verifier confidence in `[0,1]`
|
|
2719
|
+
"description": "Optional verifier confidence in `[0,1]` — the critic's confidence in its OWN verdict, distinct from the actor's `agent.decided.confidence`. MAY drive the RFC 0039 escalation contract."
|
|
2731
2720
|
},
|
|
2732
2721
|
"causationHostId": {
|
|
2733
2722
|
"type": "string",
|
|
2734
2723
|
"minLength": 1,
|
|
2735
|
-
"description": "RFC 0040
|
|
2724
|
+
"description": "RFC 0040 §A — cross-host causation pointer when the verified target lives on a different host."
|
|
2736
2725
|
}
|
|
2737
2726
|
},
|
|
2738
2727
|
"additionalProperties": false
|
|
@@ -2747,7 +2736,7 @@
|
|
|
2747
2736
|
"properties": {
|
|
2748
2737
|
"agentId": {
|
|
2749
2738
|
"$ref": "ids.schema.json#/$defs/agentId",
|
|
2750
|
-
"description": "AgentRef.agentId of the orchestrator. MUST equal `RunSnapshot.runOrchestrator.agentId` for the run's lifetime
|
|
2739
|
+
"description": "AgentRef.agentId of the orchestrator. MUST equal `RunSnapshot.runOrchestrator.agentId` for the run's lifetime — orchestrator identity is set at first decision and does not change."
|
|
2751
2740
|
},
|
|
2752
2741
|
"decision": {
|
|
2753
2742
|
"$ref": "orchestrator-decision.schema.json"
|
|
@@ -2755,30 +2744,32 @@
|
|
|
2755
2744
|
"iteration": {
|
|
2756
2745
|
"type": "integer",
|
|
2757
2746
|
"minimum": 1,
|
|
2758
|
-
"description": "RFC 0061 (`multiAgent.executionModel.version >= 5`). 1-based, monotonic count of orchestrator turns in this run
|
|
2747
|
+
"description": "RFC 0061 (`multiAgent.executionModel.version >= 5`). 1-based, monotonic count of orchestrator turns in this run — the observable loop-iteration counter that `maxLoopIterations` (RFC 0058) bounds; a breach emits `cap.breached { kind: 'loop-iterations', observed: <this+1> }`. A `version >= 5` host MUST set it on every `runOrchestrator.decided`, incrementing by exactly 1 per turn and surviving a stateful HITL resume unchanged. Recorded in the event and re-emitted verbatim on replay/`:fork`, never recomputed (`replay.md`). Omitted by hosts on `version < 5`."
|
|
2759
2748
|
},
|
|
2760
2749
|
"causationHostId": {
|
|
2761
2750
|
"type": "string",
|
|
2762
2751
|
"minLength": 1,
|
|
2763
|
-
"description": "RFC 0040
|
|
2752
|
+
"description": "RFC 0040 §A — optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2764
2753
|
}
|
|
2765
2754
|
},
|
|
2766
2755
|
"additionalProperties": false
|
|
2767
2756
|
},
|
|
2768
2757
|
"nodeDispatched": {
|
|
2769
2758
|
"type": "object",
|
|
2770
|
-
"description": "Emitted by `core.dispatch` (RFC 0007
|
|
2759
|
+
"description": "Emitted by `core.dispatch` (RFC 0007 §D + RFC 0022 §A) for each child workflow spawned by a `next-worker` OrchestratorDecision. The envelope's top-level `nodeId` carries the dispatching `core.dispatch` node's id; the payload names the spawned child run + its terminal status at the moment of emission. Lets observers reconstruct the parent → child linkage without scanning the runs table.",
|
|
2771
2760
|
"required": [
|
|
2772
2761
|
"childRunId",
|
|
2773
2762
|
"childWorkflowId"
|
|
2774
2763
|
],
|
|
2775
2764
|
"properties": {
|
|
2776
2765
|
"childRunId": {
|
|
2777
|
-
"
|
|
2766
|
+
"type": "string",
|
|
2767
|
+
"minLength": 1,
|
|
2778
2768
|
"description": "RunId of the spawned child run."
|
|
2779
2769
|
},
|
|
2780
2770
|
"childWorkflowId": {
|
|
2781
|
-
"
|
|
2771
|
+
"type": "string",
|
|
2772
|
+
"minLength": 1,
|
|
2782
2773
|
"description": "WorkflowId of the spawned child."
|
|
2783
2774
|
},
|
|
2784
2775
|
"childStatus": {
|
|
@@ -2790,7 +2781,7 @@
|
|
|
2790
2781
|
},
|
|
2791
2782
|
"dispatchFanOut": {
|
|
2792
2783
|
"type": "object",
|
|
2793
|
-
"description": "RFC 0118. Emitted by `core.dispatch` when a `fanOutPolicy: 'parallel'` wave BEGINS, so the parent stays observable while children run concurrently. The envelope's `nodeId` carries the dispatching `core.dispatch` node id; `causationId` is set to the consumed `runOrchestrator.decided` event so replay reconstructs decision
|
|
2784
|
+
"description": "RFC 0118. Emitted by `core.dispatch` when a `fanOutPolicy: 'parallel'` wave BEGINS, so the parent stays observable while children run concurrently. The envelope's `nodeId` carries the dispatching `core.dispatch` node id; `causationId` is set to the consumed `runOrchestrator.decided` event so replay reconstructs decision → fan-out. Emitted ONLY on the parallel path.",
|
|
2794
2785
|
"required": [
|
|
2795
2786
|
"fanOutPolicy",
|
|
2796
2787
|
"childCount"
|
|
@@ -2798,7 +2789,7 @@
|
|
|
2798
2789
|
"properties": {
|
|
2799
2790
|
"fanOutPolicy": {
|
|
2800
2791
|
"const": "parallel",
|
|
2801
|
-
"description": "Always `\"parallel\"`
|
|
2792
|
+
"description": "Always `\"parallel\"` — this event is emitted only on the parallel fan-out path."
|
|
2802
2793
|
},
|
|
2803
2794
|
"childCount": {
|
|
2804
2795
|
"type": "integer",
|
|
@@ -2808,7 +2799,7 @@
|
|
|
2808
2799
|
"maxConcurrency": {
|
|
2809
2800
|
"type": "integer",
|
|
2810
2801
|
"minimum": 1,
|
|
2811
|
-
"description": "Effective concurrency ceiling for the wave (`min(config.maxConcurrency ??
|
|
2802
|
+
"description": "Effective concurrency ceiling for the wave (`min(config.maxConcurrency ?? ∞, capabilities.dispatch.maxFanOut ?? ∞)`), when bounded."
|
|
2812
2803
|
},
|
|
2813
2804
|
"joinMode": {
|
|
2814
2805
|
"type": "string",
|
|
@@ -2840,7 +2831,7 @@
|
|
|
2840
2831
|
"failed",
|
|
2841
2832
|
"partial"
|
|
2842
2833
|
],
|
|
2843
|
-
"description": "`'satisfied'`
|
|
2834
|
+
"description": "`'satisfied'` — `mode` met and `onChildFailure` did not fail the node. `'failed'` — `onChildFailure: 'fail-fast'` tripped, or `mode` could not be satisfied (e.g. quorum unreachable); the dispatch node fails. `'partial'` — `mode` satisfied but ≥1 child is non-`completed` under `collect`/`absorb`; the node SUCCEEDS."
|
|
2844
2835
|
},
|
|
2845
2836
|
"completedCount": {
|
|
2846
2837
|
"type": "integer",
|
|
@@ -2862,7 +2853,7 @@
|
|
|
2862
2853
|
"items": {
|
|
2863
2854
|
"type": "string"
|
|
2864
2855
|
},
|
|
2865
|
-
"description": "`childRunId`s in the parent host's observed wall-clock terminal order
|
|
2856
|
+
"description": "`childRunId`s in the parent host's observed wall-clock terminal order — the replay-deterministic tiebreak for colliding `outputMapping` keys. Recorded at terminal-fold time; never recomputed from child timestamps."
|
|
2866
2857
|
}
|
|
2867
2858
|
},
|
|
2868
2859
|
"additionalProperties": false
|
|
@@ -2937,7 +2928,7 @@
|
|
|
2937
2928
|
},
|
|
2938
2929
|
"memoryCompacted": {
|
|
2939
2930
|
"type": "object",
|
|
2940
|
-
"description": "RFC 0012 (Memory Compaction Profile). Emitted by a host advertising `capabilities.memory.compaction.supported: true` each time a compaction run completes, regardless of trigger. `outputId` MUST be readable via `MemoryAdapter.get(memoryRef, outputId)` until normal TTL eviction. SR-1 carry-forward (RFC 0012
|
|
2931
|
+
"description": "RFC 0012 (Memory Compaction Profile). Emitted by a host advertising `capabilities.memory.compaction.supported: true` each time a compaction run completes, regardless of trigger. `outputId` MUST be readable via `MemoryAdapter.get(memoryRef, outputId)` until normal TTL eviction. SR-1 carry-forward (RFC 0012 §D) applies: the host MUST route compacted entry content through the same BYOK redaction harness applied to a fresh `put`.",
|
|
2941
2932
|
"required": [
|
|
2942
2933
|
"memoryRef",
|
|
2943
2934
|
"outputId",
|
|
@@ -2949,7 +2940,7 @@
|
|
|
2949
2940
|
"memoryRef": {
|
|
2950
2941
|
"type": "string",
|
|
2951
2942
|
"minLength": 1,
|
|
2952
|
-
"description": "Opaque MemoryAdapter handle per RFC 0004
|
|
2943
|
+
"description": "Opaque MemoryAdapter handle per RFC 0004 §C. Bounds compaction to a single memory scope."
|
|
2953
2944
|
},
|
|
2954
2945
|
"outputId": {
|
|
2955
2946
|
"type": "string",
|
|
@@ -2962,7 +2953,7 @@
|
|
|
2962
2953
|
"type": "string",
|
|
2963
2954
|
"minLength": 1
|
|
2964
2955
|
},
|
|
2965
|
-
"description": "Ids of entries collapsed into outputId. Hosts MAY omit when sourceCount > 100; the `compacted-from:<runId>` tag convention (RFC 0012
|
|
2956
|
+
"description": "Ids of entries collapsed into outputId. Hosts MAY omit when sourceCount > 100; the `compacted-from:<runId>` tag convention (RFC 0012 §C) becomes the authoritative provenance signal. When present, MUST be exhaustive within the array (no 'and N more' semantics)."
|
|
2966
2957
|
},
|
|
2967
2958
|
"sourceCount": {
|
|
2968
2959
|
"type": "integer",
|
|
@@ -2985,7 +2976,7 @@
|
|
|
2985
2976
|
},
|
|
2986
2977
|
"distillation": {
|
|
2987
2978
|
"type": "object",
|
|
2988
|
-
"description": "RFC 0062 (when `capabilities.memory.distillation.supported: true`). Present when this compaction is part of a budgeted distillation run (a scheduled or on-demand 'dream'). Absent for a plain RFC 0012 compaction. Carries the token-budget accounting + whether the memory index was refreshed
|
|
2979
|
+
"description": "RFC 0062 (when `capabilities.memory.distillation.supported: true`). Present when this compaction is part of a budgeted distillation run (a scheduled or on-demand 'dream'). Absent for a plain RFC 0012 compaction. Carries the token-budget accounting + whether the memory index was refreshed — not a parallel `memory.distilled` event.",
|
|
2989
2980
|
"additionalProperties": false,
|
|
2990
2981
|
"required": [
|
|
2991
2982
|
"tokenBudget",
|
|
@@ -2995,12 +2986,12 @@
|
|
|
2995
2986
|
"tokenBudget": {
|
|
2996
2987
|
"type": "integer",
|
|
2997
2988
|
"minimum": 1,
|
|
2998
|
-
"description": "Effective per-run budget honored (
|
|
2989
|
+
"description": "Effective per-run budget honored (≤ advertised `maxTokenBudget`), counted against the advertised `tokenizerName`."
|
|
2999
2990
|
},
|
|
3000
2991
|
"tokensUsed": {
|
|
3001
2992
|
"type": "integer",
|
|
3002
2993
|
"minimum": 0,
|
|
3003
|
-
"description": "Total input+output tokens the distillation consumed, best-effort-honest per the advertised tokenizer (
|
|
2994
|
+
"description": "Total input+output tokens the distillation consumed, best-effort-honest per the advertised tokenizer (±10% tolerance). MUST be ≤ `tokenBudget` on a successful run."
|
|
3004
2995
|
},
|
|
3005
2996
|
"indexUpdated": {
|
|
3006
2997
|
"type": "boolean",
|
|
@@ -3013,7 +3004,7 @@
|
|
|
3013
3004
|
},
|
|
3014
3005
|
"memoryWritten": {
|
|
3015
3006
|
"type": "object",
|
|
3016
|
-
"description": "RFC 0057. Emitted by a host advertising `capabilities.memory.attribution.emitsWriteEvents: true` for each memory write a run makes, attributing it to the node (and agent, when known) that caused it. Content-free: identifiers + non-secret tags only
|
|
3007
|
+
"description": "RFC 0057. Emitted by a host advertising `capabilities.memory.attribution.emitsWriteEvents: true` for each memory write a run makes, attributing it to the node (and agent, when known) that caused it. Content-free: identifiers + non-secret tags only — the entry content is served by the read-side (`MemoryAdapter.get`), already SR-1-redacted. On replay the event is re-read from the log, never regenerated (the host MUST NOT mint a new `memoryId` or timestamp at replay time). SECURITY invariants `memory-attribution-no-content` + `memory-attribution-tenant-scoped` apply.",
|
|
3017
3008
|
"required": [
|
|
3018
3009
|
"memoryRef",
|
|
3019
3010
|
"memoryId"
|
|
@@ -3022,7 +3013,7 @@
|
|
|
3022
3013
|
"memoryRef": {
|
|
3023
3014
|
"type": "string",
|
|
3024
3015
|
"minLength": 1,
|
|
3025
|
-
"description": "Opaque MemoryAdapter handle (RFC 0004
|
|
3016
|
+
"description": "Opaque MemoryAdapter handle (RFC 0004 §C) the entry was written under; resolvable via the read-side."
|
|
3026
3017
|
},
|
|
3027
3018
|
"memoryId": {
|
|
3028
3019
|
"type": "string",
|
|
@@ -3031,25 +3022,25 @@
|
|
|
3031
3022
|
},
|
|
3032
3023
|
"nodeId": {
|
|
3033
3024
|
"$ref": "ids.schema.json#/$defs/nodeId",
|
|
3034
|
-
"description": "SHOULD
|
|
3025
|
+
"description": "SHOULD — the node whose execution caused the write. Omitted only for writes with no node attribution (e.g. host session-end auto-memory)."
|
|
3035
3026
|
},
|
|
3036
3027
|
"agentId": {
|
|
3037
3028
|
"$ref": "ids.schema.json#/$defs/agentId",
|
|
3038
|
-
"description": "MAY
|
|
3029
|
+
"description": "MAY — the agent identity (AgentRef per RFC 0002) behind the write, when known."
|
|
3039
3030
|
},
|
|
3040
3031
|
"tags": {
|
|
3041
3032
|
"type": "array",
|
|
3042
3033
|
"items": {
|
|
3043
3034
|
"type": "string"
|
|
3044
3035
|
},
|
|
3045
|
-
"description": "MAY
|
|
3036
|
+
"description": "MAY — the entry's non-secret labels. MUST NOT carry secret material (the no-content invariant covers payload bodies)."
|
|
3046
3037
|
}
|
|
3047
3038
|
},
|
|
3048
3039
|
"additionalProperties": false
|
|
3049
3040
|
},
|
|
3050
3041
|
"agentMemoryConsolidated": {
|
|
3051
3042
|
"type": "object",
|
|
3052
|
-
"description": "RFC 0068 (`Draft`). Emitted by a host advertising `capabilities.agents.memoryConsolidation.supported: true` after a background consolidation pass over LONG-TERM memory (merge/dedup/supersede/strengthen). Content-free: identifiers + counts only
|
|
3043
|
+
"description": "RFC 0068 (`Draft`). Emitted by a host advertising `capabilities.agents.memoryConsolidation.supported: true` after a background consolidation pass over LONG-TERM memory (merge/dedup/supersede/strengthen). Content-free: identifiers + counts only — entry content is served by the SR-1-redacted read-side (`MemoryAdapter.get`). On replay the event is re-read from the log, never regenerated. Distinct from RFC 0062 `memory.compacted` (token-budgeted distillation of transactional memory). SR-1 carry-forward (RFC 0004) + CTI-1 apply to the consolidated entries.",
|
|
3053
3044
|
"required": [
|
|
3054
3045
|
"memoryRef",
|
|
3055
3046
|
"inputCount",
|
|
@@ -3059,7 +3050,7 @@
|
|
|
3059
3050
|
"memoryRef": {
|
|
3060
3051
|
"type": "string",
|
|
3061
3052
|
"minLength": 1,
|
|
3062
|
-
"description": "Opaque MemoryAdapter handle (RFC 0004
|
|
3053
|
+
"description": "Opaque MemoryAdapter handle (RFC 0004 §C) the consolidation pass operated over. Bounds the pass to a single memory scope (CTI-1)."
|
|
3063
3054
|
},
|
|
3064
3055
|
"inputCount": {
|
|
3065
3056
|
"type": "integer",
|
|
@@ -3077,7 +3068,7 @@
|
|
|
3077
3068
|
"type": "string",
|
|
3078
3069
|
"minLength": 1
|
|
3079
3070
|
},
|
|
3080
|
-
"description": "MAY
|
|
3071
|
+
"description": "MAY — ids of entries collapsed/superseded by the pass. Hosts MAY omit when inputCount is large; consumers MUST tolerate absence."
|
|
3081
3072
|
},
|
|
3082
3073
|
"trigger": {
|
|
3083
3074
|
"type": "string",
|
|
@@ -3086,14 +3077,14 @@
|
|
|
3086
3077
|
"scheduled",
|
|
3087
3078
|
"on-demand"
|
|
3088
3079
|
],
|
|
3089
|
-
"description": "MAY
|
|
3080
|
+
"description": "MAY — which initiation path drove this pass (mirrors `agents.memoryConsolidation.schedule`)."
|
|
3090
3081
|
}
|
|
3091
3082
|
},
|
|
3092
3083
|
"additionalProperties": false
|
|
3093
3084
|
},
|
|
3094
3085
|
"commitmentFired": {
|
|
3095
3086
|
"type": "object",
|
|
3096
|
-
"description": "RFC 0068 (`Draft`). Emitted by a host advertising `capabilities.agents.commitments.supported: true` when an inferred standing commitment fires. Content-free: identifiers + condition kind only
|
|
3087
|
+
"description": "RFC 0068 (`Draft`). Emitted by a host advertising `capabilities.agents.commitments.supported: true` when an inferred standing commitment fires. Content-free: identifiers + condition kind only — the intention text lives in SR-1-redacted memory (`MemoryAdapter.get(memoryRef, memoryId)`). The fired arm composes RFC 0052 (time) or RFC 0060 (predicate). On replay the event is re-read from the log, never regenerated (the host MUST NOT re-infer or re-fire a commitment at replay time). CTI-1: the commitment, its memory provenance, and any run it enqueues MUST share the source memory's tenant.",
|
|
3097
3088
|
"required": [
|
|
3098
3089
|
"commitmentId",
|
|
3099
3090
|
"memoryRef",
|
|
@@ -3113,7 +3104,7 @@
|
|
|
3113
3104
|
"memoryId": {
|
|
3114
3105
|
"type": "string",
|
|
3115
3106
|
"minLength": 1,
|
|
3116
|
-
"description": "MAY
|
|
3107
|
+
"description": "MAY — id of the source `MemoryEntry` the commitment was inferred from, when a single entry is attributable. Resolvable via `MemoryAdapter.get`; content is read SR-1-redacted from the read-side."
|
|
3117
3108
|
},
|
|
3118
3109
|
"condition": {
|
|
3119
3110
|
"type": "string",
|
|
@@ -3124,15 +3115,16 @@
|
|
|
3124
3115
|
"description": "Which fire-condition kind triggered. `time` composes RFC 0052; `predicate` composes RFC 0060."
|
|
3125
3116
|
},
|
|
3126
3117
|
"enqueuedRunId": {
|
|
3127
|
-
"
|
|
3128
|
-
"
|
|
3118
|
+
"type": "string",
|
|
3119
|
+
"minLength": 1,
|
|
3120
|
+
"description": "MAY — id of the run the fired commitment enqueued, when the host initiates one. Absent when the commitment fires as a notification without a run."
|
|
3129
3121
|
}
|
|
3130
3122
|
},
|
|
3131
3123
|
"additionalProperties": false
|
|
3132
3124
|
},
|
|
3133
3125
|
"agentInvocationStarted": {
|
|
3134
3126
|
"type": "object",
|
|
3135
|
-
"description": "RFC 0077. Emitted by a host advertising `capabilities.agents.liveRuntime.supported: true` as the FIRST agent-scoped event of a live manifest invocation, bracketing the existing `agent.*` family with `agent.invocation.completed`. Content-free: identifiers + selection metadata only
|
|
3127
|
+
"description": "RFC 0077. Emitted by a host advertising `capabilities.agents.liveRuntime.supported: true` as the FIRST agent-scoped event of a live manifest invocation, bracketing the existing `agent.*` family with `agent.invocation.completed`. Content-free: identifiers + selection metadata only — prompt/task content is served by the run's normal projection, never on this event. A recorded-fact event per `replay.md` §\"Recorded-fact events\": on replay it is re-emitted from the log and the host MUST NOT regenerate its `invocationId` (or any identifier). Distinct from the deterministic RFC 0070 sample floor.",
|
|
3136
3128
|
"required": [
|
|
3137
3129
|
"invocationId",
|
|
3138
3130
|
"agentId",
|
|
@@ -3142,7 +3134,7 @@
|
|
|
3142
3134
|
"invocationId": {
|
|
3143
3135
|
"type": "string",
|
|
3144
3136
|
"minLength": 1,
|
|
3145
|
-
"description": "Host-defined id correlating this agent invocation within its run, UNIQUE-WITHIN-RUN (not a mandated global id-space). Distinct from `runId`
|
|
3137
|
+
"description": "Host-defined id correlating this agent invocation within its run, UNIQUE-WITHIN-RUN (not a mandated global id-space). Distinct from `runId` — one run MAY dispatch several invocations (multiple agent nodes, or a handoff chain) — but a host MAY derive it from an existing per-node-execution receipt id (e.g. `runId:nodeId:seq`) or mint a UUID; a single-invocation run MAY reuse `runId`. Recorded-fact: re-read from the log on replay, never regenerated (`replay.md` §\"Recorded-fact events\"). Correlates to the matching `agent.invocation.completed`."
|
|
3146
3138
|
},
|
|
3147
3139
|
"agentId": {
|
|
3148
3140
|
"$ref": "ids.schema.json#/$defs/agentId",
|
|
@@ -3159,39 +3151,39 @@
|
|
|
3159
3151
|
},
|
|
3160
3152
|
"modelClass": {
|
|
3161
3153
|
"type": "string",
|
|
3162
|
-
"description": "MAY
|
|
3154
|
+
"description": "MAY — the manifest's abstract `modelClass`. Always populatable at start."
|
|
3163
3155
|
},
|
|
3164
3156
|
"resolvedModel": {
|
|
3165
3157
|
"type": "string",
|
|
3166
|
-
"description": "MAY
|
|
3158
|
+
"description": "MAY — the concrete model the host selected. OPTIONAL: modelClass→concrete resolution MAY happen downstream (with capability-gated fallback substitution), so a dispatch-time start event genuinely may not know it; a host MAY also omit for deployment-privacy."
|
|
3167
3159
|
},
|
|
3168
3160
|
"resolvedProvider": {
|
|
3169
3161
|
"type": "string",
|
|
3170
|
-
"description": "MAY
|
|
3162
|
+
"description": "MAY — the concrete provider the host routed to (aligns with `capabilities.aiProviders.supported` / RFC 0067 `authModes`). OPTIONAL, same rationale as `resolvedModel`."
|
|
3171
3163
|
},
|
|
3172
3164
|
"resolvedAgentVersion": {
|
|
3173
3165
|
"type": "string",
|
|
3174
|
-
"description": "MAY
|
|
3166
|
+
"description": "MAY — RFC 0082 §B. When this invocation's `AgentRef` bound a `channel` (rather than an exact `version`), the concrete agent-definition version the host pinned per-(run, agentId, channel) at first resolution. A RECORDED FACT: re-read from the log on replay and NEVER re-resolved against a moved channel (the whole event is recorded-fact). Absent when the ref used an exact `version` or host-default resolution."
|
|
3175
3167
|
},
|
|
3176
3168
|
"resolvedChannel": {
|
|
3177
3169
|
"type": "string",
|
|
3178
|
-
"description": "MAY
|
|
3170
|
+
"description": "MAY — RFC 0082 §B. The named `channel` the `AgentRef` bound (mirrors `AgentRef.channel`), for which `resolvedAgentVersion` is the pinned resolution. Content-free label; present only when the ref bound a channel."
|
|
3179
3171
|
},
|
|
3180
3172
|
"toolSurfaceCount": {
|
|
3181
3173
|
"type": "integer",
|
|
3182
3174
|
"minimum": 0,
|
|
3183
|
-
"description": "MAY
|
|
3175
|
+
"description": "MAY — number of tools in the constructed surface after `toolAllowlist` filtering. Content-free count, not the tool ids."
|
|
3184
3176
|
},
|
|
3185
3177
|
"memoryBound": {
|
|
3186
3178
|
"type": "boolean",
|
|
3187
|
-
"description": "MAY
|
|
3179
|
+
"description": "MAY — whether a long-term memory backend was bound for the invocation."
|
|
3188
3180
|
}
|
|
3189
3181
|
},
|
|
3190
3182
|
"additionalProperties": false
|
|
3191
3183
|
},
|
|
3192
3184
|
"agentInvocationCompleted": {
|
|
3193
3185
|
"type": "object",
|
|
3194
|
-
"description": "RFC 0077. Emitted by a host advertising `capabilities.agents.liveRuntime.supported: true` as the LAST agent-scoped event of a live manifest invocation (after the terminal `agent.decided`). Content-free: identifiers + outcome metadata only
|
|
3186
|
+
"description": "RFC 0077. Emitted by a host advertising `capabilities.agents.liveRuntime.supported: true` as the LAST agent-scoped event of a live manifest invocation (after the terminal `agent.decided`). Content-free: identifiers + outcome metadata only — the result body is served by the run's normal projection. A recorded-fact event per `replay.md` §\"Recorded-fact events\": re-read from the log on replay, never regenerated.",
|
|
3195
3187
|
"required": [
|
|
3196
3188
|
"invocationId",
|
|
3197
3189
|
"agentId",
|
|
@@ -3216,27 +3208,28 @@
|
|
|
3216
3208
|
"refused",
|
|
3217
3209
|
"failed"
|
|
3218
3210
|
],
|
|
3219
|
-
"description": "Terminal disposition. `completed`: produced a (schema-valid, if enforced) terminal result. `handed-off`: control passed to another agent (`agent.handoff`). `escalated`: confidence escalation fired (RFC 0002
|
|
3211
|
+
"description": "Terminal disposition. `completed`: produced a (schema-valid, if enforced) terminal result. `handed-off`: control passed to another agent (`agent.handoff`). `escalated`: confidence escalation fired (RFC 0002 §F). `refused`: the model refused (RFC 0032 refusal envelope) — never a silent substitution. `failed`: an error terminated the invocation."
|
|
3220
3212
|
},
|
|
3221
3213
|
"schemaValidated": {
|
|
3222
3214
|
"type": "boolean",
|
|
3223
|
-
"description": "MAY
|
|
3215
|
+
"description": "MAY — whether the terminal result was validated against `handoff.returnSchemaRef` (true only when `liveRuntime.structuredOutput` is advertised and a `returnSchemaRef` exists)."
|
|
3224
3216
|
},
|
|
3225
3217
|
"confidence": {
|
|
3226
3218
|
"type": "number",
|
|
3227
3219
|
"minimum": 0,
|
|
3228
3220
|
"maximum": 1,
|
|
3229
|
-
"description": "MAY
|
|
3221
|
+
"description": "MAY — the terminal `agent.decided` confidence, mirrored for convenience. Content-free scalar."
|
|
3230
3222
|
},
|
|
3231
3223
|
"enqueuedRunId": {
|
|
3232
|
-
"
|
|
3233
|
-
"
|
|
3224
|
+
"type": "string",
|
|
3225
|
+
"minLength": 1,
|
|
3226
|
+
"description": "MAY — id of a follow-on run the invocation enqueued (e.g. a sub-run), when applicable."
|
|
3234
3227
|
}
|
|
3235
3228
|
},
|
|
3236
3229
|
"additionalProperties": false
|
|
3237
3230
|
},
|
|
3238
3231
|
"workspaceUpdated": {
|
|
3239
|
-
"description": "RFC 0059. Emitted by a host advertising `capabilities.workspace.supported: true` on each successful `PUT`/`DELETE` of a workspace file, attributing the change to the file `path` + resulting `version`. Content-free: carries the path + version only
|
|
3232
|
+
"description": "RFC 0059. Emitted by a host advertising `capabilities.workspace.supported: true` on each successful `PUT`/`DELETE` of a workspace file, attributing the change to the file `path` + resulting `version`. Content-free: carries the path + version only — the file body is served by the read-side (`GET /v1/host/workspace/files/{path}`), already SR-1-redacted (RFC 0059 §E WSR-1). On replay the event is re-read from the log, never regenerated. MUST NOT be emitted unless `capabilities.workspace.supported: true`. The proposed SECURITY invariant `workspace-cross-tenant-isolation` (WCT-1) applies to the read-side that resolves these paths.",
|
|
3240
3233
|
"type": "object",
|
|
3241
3234
|
"additionalProperties": false,
|
|
3242
3235
|
"required": [
|
|
@@ -3258,7 +3251,7 @@
|
|
|
3258
3251
|
},
|
|
3259
3252
|
"evalStarted": {
|
|
3260
3253
|
"type": "object",
|
|
3261
|
-
"description": "RFC 0081
|
|
3254
|
+
"description": "RFC 0081 §C. Emitted ONCE at the start of an eval run (a `mode: \"eval\"` run, RFC 0081 §B) by a host advertising `capabilities.agents.evalSuite.supported: true`. Content-free: suite provenance + counts only. A recorded-fact event per `replay.md` §\"Recorded-fact events\".",
|
|
3262
3255
|
"required": [
|
|
3263
3256
|
"suiteId",
|
|
3264
3257
|
"suiteVersion",
|
|
@@ -3294,18 +3287,19 @@
|
|
|
3294
3287
|
"live-shadow"
|
|
3295
3288
|
]
|
|
3296
3289
|
},
|
|
3297
|
-
"description": "The eval modes this run exercises (RFC 0081
|
|
3290
|
+
"description": "The eval modes this run exercises (RFC 0081 §D)."
|
|
3298
3291
|
},
|
|
3299
3292
|
"baselineRunId": {
|
|
3300
|
-
"
|
|
3301
|
-
"
|
|
3293
|
+
"type": "string",
|
|
3294
|
+
"minLength": 1,
|
|
3295
|
+
"description": "MAY — for `regression` mode, the prior eval run this run is scored against."
|
|
3302
3296
|
}
|
|
3303
3297
|
},
|
|
3304
3298
|
"additionalProperties": false
|
|
3305
3299
|
},
|
|
3306
3300
|
"evalScored": {
|
|
3307
3301
|
"type": "object",
|
|
3308
|
-
"description": "RFC 0081
|
|
3302
|
+
"description": "RFC 0081 §C. Emitted ONCE PER TASK, after that task's terminal `agent.decided`, so a streaming consumer sees results land incrementally. Content-free: the task id + scalars + counts ONLY — NEVER the task output, rubric prose, or model completion (SECURITY invariant `eval-summary-no-content-leak`). A recorded-fact event.",
|
|
3309
3303
|
"required": [
|
|
3310
3304
|
"taskId",
|
|
3311
3305
|
"score",
|
|
@@ -3321,7 +3315,7 @@
|
|
|
3321
3315
|
"type": "number",
|
|
3322
3316
|
"minimum": 0,
|
|
3323
3317
|
"maximum": 1,
|
|
3324
|
-
"description": "Task score (0.0
|
|
3318
|
+
"description": "Task score (0.0–1.0)."
|
|
3325
3319
|
},
|
|
3326
3320
|
"passed": {
|
|
3327
3321
|
"type": "boolean",
|
|
@@ -3330,28 +3324,28 @@
|
|
|
3330
3324
|
"costUsd": {
|
|
3331
3325
|
"type": "number",
|
|
3332
3326
|
"minimum": 0,
|
|
3333
|
-
"description": "MAY
|
|
3327
|
+
"description": "MAY — task cost (scalar; summed from RFC 0026 `provider.usage`). NEVER a pricing breakdown."
|
|
3334
3328
|
},
|
|
3335
3329
|
"latencyMs": {
|
|
3336
3330
|
"type": "integer",
|
|
3337
3331
|
"minimum": 0,
|
|
3338
|
-
"description": "MAY
|
|
3332
|
+
"description": "MAY — task wall-clock latency."
|
|
3339
3333
|
},
|
|
3340
3334
|
"schemaValid": {
|
|
3341
3335
|
"type": "boolean",
|
|
3342
|
-
"description": "MAY
|
|
3336
|
+
"description": "MAY — whether the output validated against `handoff.returnSchemaRef`."
|
|
3343
3337
|
},
|
|
3344
3338
|
"safetyFindingCount": {
|
|
3345
3339
|
"type": "integer",
|
|
3346
3340
|
"minimum": 0,
|
|
3347
|
-
"description": "MAY
|
|
3341
|
+
"description": "MAY — count of safety findings for the task (the redaction-safe descriptors live on `EvalSummary`; the event carries the count only)."
|
|
3348
3342
|
}
|
|
3349
3343
|
},
|
|
3350
3344
|
"additionalProperties": false
|
|
3351
3345
|
},
|
|
3352
3346
|
"evalCompleted": {
|
|
3353
3347
|
"type": "object",
|
|
3354
|
-
"description": "RFC 0081
|
|
3348
|
+
"description": "RFC 0081 §C. Emitted ONCE, after all tasks and before `run.completed`. Content-free: aggregate scalars only. A recorded-fact event. The full scorecard is the run's output (`eval-summary.schema.json`), served by `GET /v1/runs/{runId}/eval-summary`.",
|
|
3355
3349
|
"required": [
|
|
3356
3350
|
"aggregateScore",
|
|
3357
3351
|
"passed",
|
|
@@ -3363,11 +3357,11 @@
|
|
|
3363
3357
|
"type": "number",
|
|
3364
3358
|
"minimum": 0,
|
|
3365
3359
|
"maximum": 1,
|
|
3366
|
-
"description": "The suite-level score (0.0
|
|
3360
|
+
"description": "The suite-level score (0.0–1.0)."
|
|
3367
3361
|
},
|
|
3368
3362
|
"passed": {
|
|
3369
3363
|
"type": "boolean",
|
|
3370
|
-
"description": "Whether the run cleared the suite thresholds
|
|
3364
|
+
"description": "Whether the run cleared the suite thresholds — the flag an RFC 0082 deployment gate MAY require."
|
|
3371
3365
|
},
|
|
3372
3366
|
"taskCount": {
|
|
3373
3367
|
"type": "integer",
|
|
@@ -3383,14 +3377,14 @@
|
|
|
3383
3377
|
"type": "number",
|
|
3384
3378
|
"minimum": -1,
|
|
3385
3379
|
"maximum": 1,
|
|
3386
|
-
"description": "MAY
|
|
3380
|
+
"description": "MAY — for `regression` mode, `aggregateScore` minus the baseline's (negative ⇒ regression)."
|
|
3387
3381
|
}
|
|
3388
3382
|
},
|
|
3389
3383
|
"additionalProperties": false
|
|
3390
3384
|
},
|
|
3391
3385
|
"toolSessionOpened": {
|
|
3392
3386
|
"type": "object",
|
|
3393
|
-
"description": "RFC 0078
|
|
3387
|
+
"description": "RFC 0078 §D. Emitted when the host opens a multi-step tool session, bracketing one or more RFC 0064 `agent.toolCalled`/`agent.toolReturned` call events. Content-free: identifiers only — never tool arguments, results, or credential material (SR-1). Emitted only when `capabilities.toolCatalog.sessionLifecycle: true`.",
|
|
3394
3388
|
"required": [
|
|
3395
3389
|
"sessionId",
|
|
3396
3390
|
"toolId"
|
|
@@ -3411,7 +3405,7 @@
|
|
|
3411
3405
|
},
|
|
3412
3406
|
"toolSessionClosed": {
|
|
3413
3407
|
"type": "object",
|
|
3414
|
-
"description": "RFC 0078
|
|
3408
|
+
"description": "RFC 0078 §D. Emitted when the host closes a multi-step tool session opened by `tool.session.opened`. Content-free: identifiers + a closed-enum outcome only — never tool arguments, results, or credential material (SR-1).",
|
|
3415
3409
|
"required": [
|
|
3416
3410
|
"sessionId",
|
|
3417
3411
|
"toolId",
|
|
@@ -3435,14 +3429,14 @@
|
|
|
3435
3429
|
"failed",
|
|
3436
3430
|
"cancelled"
|
|
3437
3431
|
],
|
|
3438
|
-
"description": "Terminal disposition of the session. Content-free
|
|
3432
|
+
"description": "Terminal disposition of the session. Content-free — no failure detail/result on the payload."
|
|
3439
3433
|
}
|
|
3440
3434
|
},
|
|
3441
3435
|
"additionalProperties": false
|
|
3442
3436
|
},
|
|
3443
3437
|
"egressDecided": {
|
|
3444
3438
|
"type": "object",
|
|
3445
|
-
"description": "RFC 0079
|
|
3439
|
+
"description": "RFC 0079 §B. Emitted when a host evaluates a credentialed egress (via `ctx.http.safeFetch` / a tool) against credential provenance + the SSRF guard. Content-free: identifiers + decision only — no credential value, no request/response body (SR-1). On replay re-read from the log, never regenerated (the decision is a recorded fact). Emitted only when `capabilities.httpClient.egressPolicy.supported: true`.",
|
|
3446
3440
|
"required": [
|
|
3447
3441
|
"decision",
|
|
3448
3442
|
"destination"
|
|
@@ -3456,17 +3450,17 @@
|
|
|
3456
3450
|
"downgraded",
|
|
3457
3451
|
"approval-required"
|
|
3458
3452
|
],
|
|
3459
|
-
"description": "`allowed`: egress proceeds with the credential; `denied`: blocked (out-of-audience / expired / SSRF / unevaluable provenance
|
|
3453
|
+
"description": "`allowed`: egress proceeds with the credential; `denied`: blocked (out-of-audience / expired / SSRF / unevaluable provenance — fail-closed); `downgraded`: proceeds WITHOUT the credential (anonymous egress, when host policy permits); `approval-required`: suspended pending an RFC 0051 approval interrupt."
|
|
3460
3454
|
},
|
|
3461
3455
|
"destination": {
|
|
3462
3456
|
"type": "string",
|
|
3463
3457
|
"minLength": 1,
|
|
3464
|
-
"description": "The egress destination **host/authority ONLY** (`api.stripe.com`)
|
|
3458
|
+
"description": "The egress destination **host/authority ONLY** (`api.stripe.com`) — NOT a path, query, or full URL (SR-1: a path/query can carry secrets; the host MUST strip them for this canonical content-free event). A host whose internal audit retains the path keeps that on its vendor `x-host-*` variant, never here."
|
|
3465
3459
|
},
|
|
3466
3460
|
"credentialId": {
|
|
3467
3461
|
"type": "string",
|
|
3468
3462
|
"minLength": 1,
|
|
3469
|
-
"description": "MAY
|
|
3463
|
+
"description": "MAY — the provenance `credentialId` considered (absent for an anonymous / denied-pre-credential egress)."
|
|
3470
3464
|
},
|
|
3471
3465
|
"reason": {
|
|
3472
3466
|
"type": "string",
|
|
@@ -3479,19 +3473,19 @@
|
|
|
3479
3473
|
"scope-denied",
|
|
3480
3474
|
"policy-denied"
|
|
3481
3475
|
],
|
|
3482
|
-
"description": "MAY
|
|
3476
|
+
"description": "MAY — a machine-stable reason code (a CLOSED enum — a free-form reason is a leak vector that would let a host spill the blocked URL/host/header into it, defeating `egress-decision-no-secret-leak`). The load-bearing field is `decision`."
|
|
3483
3477
|
},
|
|
3484
3478
|
"auditCorrelationId": {
|
|
3485
3479
|
"type": "string",
|
|
3486
3480
|
"minLength": 1,
|
|
3487
|
-
"description": "MAY
|
|
3481
|
+
"description": "MAY — correlates to the provenance descriptor + host audit log."
|
|
3488
3482
|
}
|
|
3489
3483
|
},
|
|
3490
3484
|
"additionalProperties": false
|
|
3491
3485
|
},
|
|
3492
3486
|
"triggerSubscriptionStateChanged": {
|
|
3493
3487
|
"type": "object",
|
|
3494
|
-
"description": "RFC 0083
|
|
3488
|
+
"description": "RFC 0083 §C. Emitted when a trigger subscription changes state (the §B four-state machine). Content-free: identifiers + states only — no inbound payload, headers, or credential material (SR-1). Emitted only when `capabilities.triggerBridge.supported: true`.",
|
|
3495
3489
|
"required": [
|
|
3496
3490
|
"subscriptionId",
|
|
3497
3491
|
"source",
|
|
@@ -3546,14 +3540,14 @@
|
|
|
3546
3540
|
"source-removed",
|
|
3547
3541
|
"provenance-unevaluable"
|
|
3548
3542
|
],
|
|
3549
|
-
"description": "MAY
|
|
3543
|
+
"description": "MAY — a machine-stable reason code (a CLOSED enum — a free-form reason is a leak vector that would let a host spill an inbound URL/host/header into it). The load-bearing field is `toState`."
|
|
3550
3544
|
}
|
|
3551
3545
|
},
|
|
3552
3546
|
"additionalProperties": false
|
|
3553
3547
|
},
|
|
3554
3548
|
"triggerDeliveryAttempted": {
|
|
3555
3549
|
"type": "object",
|
|
3556
|
-
"description": "RFC 0083
|
|
3550
|
+
"description": "RFC 0083 §C. Emitted on each inbound-delivery attempt against an active subscription. Content-free: the subscription id, the dedup key, the attempt counter, the outcome, and the resulting runId only — NEVER the inbound body, headers, or credential material (SR-1).",
|
|
3557
3551
|
"required": [
|
|
3558
3552
|
"subscriptionId",
|
|
3559
3553
|
"dedupKey",
|
|
@@ -3568,7 +3562,7 @@
|
|
|
3568
3562
|
"dedupKey": {
|
|
3569
3563
|
"type": "string",
|
|
3570
3564
|
"minLength": 1,
|
|
3571
|
-
"description": "The de-duplication key (
|
|
3565
|
+
"description": "The de-duplication key (§C-1). MUST be a **host-opaque** stable key (e.g. `hash(subscriptionId + inbound-event-id)`); it MUST NOT embed inbound body / path / header content in cleartext (SR-1 — a key like `POST /webhook/orders/12345?token=…` would leak). A repeat within retention is a no-op returning the prior runId."
|
|
3572
3566
|
},
|
|
3573
3567
|
"attempt": {
|
|
3574
3568
|
"type": "integer",
|
|
@@ -3586,14 +3580,14 @@
|
|
|
3586
3580
|
},
|
|
3587
3581
|
"runId": {
|
|
3588
3582
|
"$ref": "ids.schema.json#/$defs/runId",
|
|
3589
|
-
"description": "MAY
|
|
3583
|
+
"description": "MAY — the run started by a `delivered` outcome (the run's `run.started` carries this delivery's id as `causationId`, RFC 0040). Absent for `retrying` / `dead-lettered`."
|
|
3590
3584
|
}
|
|
3591
3585
|
},
|
|
3592
3586
|
"additionalProperties": false
|
|
3593
3587
|
},
|
|
3594
3588
|
"budgetReserved": {
|
|
3595
3589
|
"type": "object",
|
|
3596
|
-
"description": "RFC 0084
|
|
3590
|
+
"description": "RFC 0084 §C. Emitted once at run start with the resolved effective budget (`min` across run/workflow/agent/project scopes, clamped to the host ceiling). A recorded fact — replay re-reads it, never re-resolves (§B). Content-free: dimension ceilings + scope only, no pricing breakdown (SR-1, `budget-no-pricing-leak`).",
|
|
3597
3591
|
"required": [
|
|
3598
3592
|
"effectiveBudget",
|
|
3599
3593
|
"scope"
|
|
@@ -3630,14 +3624,14 @@
|
|
|
3630
3624
|
"agent",
|
|
3631
3625
|
"project"
|
|
3632
3626
|
],
|
|
3633
|
-
"description": "The binding scope the effective budget resolved from (
|
|
3627
|
+
"description": "The binding scope the effective budget resolved from (§B)."
|
|
3634
3628
|
}
|
|
3635
3629
|
},
|
|
3636
3630
|
"additionalProperties": false
|
|
3637
3631
|
},
|
|
3638
3632
|
"budgetConsumed": {
|
|
3639
3633
|
"type": "object",
|
|
3640
|
-
"description": "RFC 0084
|
|
3634
|
+
"description": "RFC 0084 §C. A running projection of spend, derived from the existing events (`provider.usage` tokens/cost, `agent.toolCalled`, `node.retried`) — NOT a new measurement (no double-counting). The host MAY coalesce. Content-free: dimension name + integers only, no pricing breakdown / rate card (SR-1).",
|
|
3641
3635
|
"required": [
|
|
3642
3636
|
"dimension",
|
|
3643
3637
|
"consumed",
|
|
@@ -3666,14 +3660,14 @@
|
|
|
3666
3660
|
},
|
|
3667
3661
|
"remaining": {
|
|
3668
3662
|
"type": "number",
|
|
3669
|
-
"description": "MAY
|
|
3663
|
+
"description": "MAY — `limit - consumed`."
|
|
3670
3664
|
}
|
|
3671
3665
|
},
|
|
3672
3666
|
"additionalProperties": false
|
|
3673
3667
|
},
|
|
3674
3668
|
"budgetThresholdCrossed": {
|
|
3675
3669
|
"type": "object",
|
|
3676
|
-
"description": "RFC 0084
|
|
3670
|
+
"description": "RFC 0084 §C. Emitted once per dimension when consumption crosses `thresholdPercent`. Content-free.",
|
|
3677
3671
|
"required": [
|
|
3678
3672
|
"dimension",
|
|
3679
3673
|
"consumed",
|
|
@@ -3709,7 +3703,7 @@
|
|
|
3709
3703
|
},
|
|
3710
3704
|
"budgetExhausted": {
|
|
3711
3705
|
"type": "object",
|
|
3712
|
-
"description": "RFC 0084
|
|
3706
|
+
"description": "RFC 0084 §C. Emitted when a dimension hits its limit. For a hard dimension this is followed by `cap.breached{kind:\"budget-*\"}` → `run.failed{budget_exhausted}` (or, with `onExhaustion:\"interrupt\"`, an approval interrupt). Content-free.",
|
|
3713
3707
|
"required": [
|
|
3714
3708
|
"dimension",
|
|
3715
3709
|
"consumed",
|
|
@@ -3738,7 +3732,7 @@
|
|
|
3738
3732
|
},
|
|
3739
3733
|
"deploymentPromoted": {
|
|
3740
3734
|
"type": "object",
|
|
3741
|
-
"description": "RFC 0082
|
|
3735
|
+
"description": "RFC 0082 §D. Emitted on the deployment-management run when a version is promoted into a new lifecycle state (the §E contract: authorized via RFC 0049 `deploy:*`, gated via RFC 0051 `approvalGate`, eval-verified via RFC 0081 when `requiredEval` is configured). Content-free: ids / state / scalars / content-free references only — NEVER a manifest body, prompt, or credential (SECURITY invariant `deployment-event-no-content-leak`; `additionalProperties:false` enforces it). A recorded-fact event per `replay.md` §\"Recorded-fact events\". Audit-logged with the acting principal (`auth.md`).",
|
|
3742
3736
|
"additionalProperties": false,
|
|
3743
3737
|
"required": [
|
|
3744
3738
|
"agentId",
|
|
@@ -3753,7 +3747,7 @@
|
|
|
3753
3747
|
"fromVersion": {
|
|
3754
3748
|
"type": "string",
|
|
3755
3749
|
"minLength": 1,
|
|
3756
|
-
"description": "MAY
|
|
3750
|
+
"description": "MAY — the version previously occupying the target channel/state (absent on a first promotion)."
|
|
3757
3751
|
},
|
|
3758
3752
|
"toVersion": {
|
|
3759
3753
|
"type": "string",
|
|
@@ -3776,28 +3770,29 @@
|
|
|
3776
3770
|
"channel": {
|
|
3777
3771
|
"type": "string",
|
|
3778
3772
|
"minLength": 1,
|
|
3779
|
-
"description": "MAY
|
|
3773
|
+
"description": "MAY — the named channel this promotion targets (when promoting to a channel)."
|
|
3780
3774
|
},
|
|
3781
3775
|
"canaryPercent": {
|
|
3782
3776
|
"type": "integer",
|
|
3783
3777
|
"minimum": 0,
|
|
3784
3778
|
"maximum": 100,
|
|
3785
|
-
"description": "MAY
|
|
3779
|
+
"description": "MAY — the canary traffic share assigned (when promoting `active` at < 100)."
|
|
3786
3780
|
},
|
|
3787
3781
|
"evalRunId": {
|
|
3788
|
-
"
|
|
3789
|
-
"
|
|
3782
|
+
"type": "string",
|
|
3783
|
+
"minLength": 1,
|
|
3784
|
+
"description": "MAY — the RFC 0081 eval run whose `EvalSummary.passed` gated this promotion (the §E evidence)."
|
|
3790
3785
|
},
|
|
3791
3786
|
"approvalGateId": {
|
|
3792
3787
|
"type": "string",
|
|
3793
3788
|
"minLength": 1,
|
|
3794
|
-
"description": "MAY
|
|
3789
|
+
"description": "MAY — the RFC 0051 approvalGate that authorized this promotion."
|
|
3795
3790
|
}
|
|
3796
3791
|
}
|
|
3797
3792
|
},
|
|
3798
3793
|
"deploymentRolledBack": {
|
|
3799
3794
|
"type": "object",
|
|
3800
|
-
"description": "RFC 0082
|
|
3795
|
+
"description": "RFC 0082 §D. Emitted when an `active` version is rolled back and a prior version restored to `active`. Content-free (`deployment-event-no-content-leak`). Recorded-fact; audit-logged.",
|
|
3801
3796
|
"additionalProperties": false,
|
|
3802
3797
|
"required": [
|
|
3803
3798
|
"agentId",
|
|
@@ -3828,13 +3823,13 @@
|
|
|
3828
3823
|
"reason": {
|
|
3829
3824
|
"type": "string",
|
|
3830
3825
|
"minLength": 1,
|
|
3831
|
-
"description": "MAY
|
|
3826
|
+
"description": "MAY — a short redaction-safe rollback reason label (NOT free-text content; same posture as `run.dead_lettered.reason`)."
|
|
3832
3827
|
}
|
|
3833
3828
|
}
|
|
3834
3829
|
},
|
|
3835
3830
|
"deploymentCanaryAdjusted": {
|
|
3836
3831
|
"type": "object",
|
|
3837
|
-
"description": "RFC 0082
|
|
3832
|
+
"description": "RFC 0082 §D. Emitted when an `active` version's canary traffic share changes. Content-free (`deployment-event-no-content-leak`). Recorded-fact; audit-logged.",
|
|
3838
3833
|
"additionalProperties": false,
|
|
3839
3834
|
"required": [
|
|
3840
3835
|
"agentId",
|
|
@@ -3868,7 +3863,7 @@
|
|
|
3868
3863
|
},
|
|
3869
3864
|
"deploymentStateChanged": {
|
|
3870
3865
|
"type": "object",
|
|
3871
|
-
"description": "RFC 0082
|
|
3866
|
+
"description": "RFC 0082 §D. Emitted on any non-promotion lifecycle transition (pause / resume / deprecate). Content-free (`deployment-event-no-content-leak`). Recorded-fact; audit-logged.",
|
|
3872
3867
|
"additionalProperties": false,
|
|
3873
3868
|
"required": [
|
|
3874
3869
|
"agentId",
|
|
@@ -3916,7 +3911,7 @@
|
|
|
3916
3911
|
},
|
|
3917
3912
|
"rosterRunInitiated": {
|
|
3918
3913
|
"type": "object",
|
|
3919
|
-
"description": "RFC 0086
|
|
3914
|
+
"description": "RFC 0086 §C. Emitted once, immediately after `run.started` and before any agent invocation, when a trigger (RFC 0052 schedule / RFC 0083 durable work item) fires a workflow in a roster member's portfolio — attributing the run to the standing agent. Content-free (`roster-attribution-no-content`): ids + persona + trigger source ONLY — never the work-item body, prompt, or credential material (SR-1). A recorded-fact event (replay.md §'Recorded-fact events'): re-emitted from the log on replay, identifiers never regenerated, so the run stays attributed to the same member even if the entry was since renamed or deleted.",
|
|
3920
3915
|
"additionalProperties": false,
|
|
3921
3916
|
"required": [
|
|
3922
3917
|
"rosterId",
|
|
@@ -3950,15 +3945,16 @@
|
|
|
3950
3945
|
"description": "What fired the run: an RFC 0083 source (`schedule`/`webhook`/`queue`/`email`/`form`) or a host-extension source name (e.g. a vendor Kanban bridge)."
|
|
3951
3946
|
},
|
|
3952
3947
|
"triggerSubscriptionId": {
|
|
3953
|
-
"
|
|
3954
|
-
"
|
|
3948
|
+
"type": "string",
|
|
3949
|
+
"minLength": 1,
|
|
3950
|
+
"description": "MAY. The RFC 0083 trigger-subscription id when the fire came through the durable trigger bridge, so trigger → run → roster is traceable via /ancestry (RFC 0040)."
|
|
3955
3951
|
}
|
|
3956
3952
|
}
|
|
3957
3953
|
},
|
|
3958
3954
|
"compensationRequested": {
|
|
3959
3955
|
"type": "object",
|
|
3960
3956
|
"additionalProperties": false,
|
|
3961
|
-
"description": "RFC 0151
|
|
3957
|
+
"description": "RFC 0151 §D — plan persisted, before the first inverse action. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (§D/§G) — these land in the durable log, the least revocable place a credential can reach.",
|
|
3962
3958
|
"properties": {
|
|
3963
3959
|
"compensationId": {
|
|
3964
3960
|
"type": "string",
|
|
@@ -3985,7 +3981,7 @@
|
|
|
3985
3981
|
"compensationStarted": {
|
|
3986
3982
|
"type": "object",
|
|
3987
3983
|
"additionalProperties": false,
|
|
3988
|
-
"description": "RFC 0151
|
|
3984
|
+
"description": "RFC 0151 §D — first inverse action started. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (§D/§G) — these land in the durable log, the least revocable place a credential can reach.",
|
|
3989
3985
|
"properties": {
|
|
3990
3986
|
"compensationId": {
|
|
3991
3987
|
"type": "string",
|
|
@@ -4012,7 +4008,7 @@
|
|
|
4012
4008
|
"compensationCompleted": {
|
|
4013
4009
|
"type": "object",
|
|
4014
4010
|
"additionalProperties": false,
|
|
4015
|
-
"description": "RFC 0151
|
|
4011
|
+
"description": "RFC 0151 §D — every inverse action succeeded. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (§D/§G) — these land in the durable log, the least revocable place a credential can reach.",
|
|
4016
4012
|
"properties": {
|
|
4017
4013
|
"compensationId": {
|
|
4018
4014
|
"type": "string",
|
|
@@ -4039,7 +4035,7 @@
|
|
|
4039
4035
|
"compensationFailed": {
|
|
4040
4036
|
"type": "object",
|
|
4041
4037
|
"additionalProperties": false,
|
|
4042
|
-
"description": "RFC 0151
|
|
4038
|
+
"description": "RFC 0151 §D — an inverse action exhausted its retries. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (§D/§G) — these land in the durable log, the least revocable place a credential can reach.",
|
|
4043
4039
|
"properties": {
|
|
4044
4040
|
"compensationId": {
|
|
4045
4041
|
"type": "string",
|
|
@@ -4076,7 +4072,7 @@
|
|
|
4076
4072
|
"compensationPaused": {
|
|
4077
4073
|
"type": "object",
|
|
4078
4074
|
"additionalProperties": false,
|
|
4079
|
-
"description": "RFC 0151
|
|
4075
|
+
"description": "RFC 0151 §D — paused for authorized intervention. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (§D/§G) — these land in the durable log, the least revocable place a credential can reach.",
|
|
4080
4076
|
"properties": {
|
|
4081
4077
|
"compensationId": {
|
|
4082
4078
|
"type": "string",
|
|
@@ -4113,7 +4109,7 @@
|
|
|
4113
4109
|
"compensationManualInterventionRequired": {
|
|
4114
4110
|
"type": "object",
|
|
4115
4111
|
"additionalProperties": false,
|
|
4116
|
-
"description": "RFC 0151
|
|
4112
|
+
"description": "RFC 0151 §D — operator action required. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (§D/§G) — these land in the durable log, the least revocable place a credential can reach.",
|
|
4117
4113
|
"properties": {
|
|
4118
4114
|
"compensationId": {
|
|
4119
4115
|
"type": "string",
|
|
@@ -4149,31 +4145,31 @@
|
|
|
4149
4145
|
},
|
|
4150
4146
|
"approvalRequested": {
|
|
4151
4147
|
"$ref": "#/$defs/interruptRequested",
|
|
4152
|
-
"description": "RFC 0171
|
|
4148
|
+
"description": "RFC 0171 §A.4 E4 — sub-typing is $ref composition, not duplication: the legacy approvalRequested shape (deprecation row legacy-interrupt-payloads) is the unified interruptRequested payload; the event type is kept, its payload is not a second shape."
|
|
4153
4149
|
},
|
|
4154
4150
|
"clarificationRequested": {
|
|
4155
4151
|
"$ref": "#/$defs/interruptRequested",
|
|
4156
|
-
"description": "RFC 0171
|
|
4152
|
+
"description": "RFC 0171 §A.4 E4 — sub-typing is $ref composition, not duplication: the legacy clarificationRequested shape (deprecation row legacy-interrupt-payloads) is the unified interruptRequested payload; the event type is kept, its payload is not a second shape."
|
|
4157
4153
|
},
|
|
4158
4154
|
"approvalReceived": {
|
|
4159
4155
|
"$ref": "#/$defs/interruptResolved",
|
|
4160
|
-
"description": "RFC 0171
|
|
4156
|
+
"description": "RFC 0171 §A.4 E4 — sub-typing is $ref composition, not duplication: the legacy approvalReceived shape (deprecation row legacy-interrupt-payloads) is the unified interruptResolved payload; the event type is kept, its payload is not a second shape."
|
|
4161
4157
|
},
|
|
4162
4158
|
"approvalGranted": {
|
|
4163
4159
|
"$ref": "#/$defs/interruptResolved",
|
|
4164
|
-
"description": "RFC 0171
|
|
4160
|
+
"description": "RFC 0171 §A.4 E4 — sub-typing is $ref composition, not duplication: the legacy approvalGranted shape (deprecation row legacy-interrupt-payloads) is the unified interruptResolved payload; the event type is kept, its payload is not a second shape."
|
|
4165
4161
|
},
|
|
4166
4162
|
"approvalRejected": {
|
|
4167
4163
|
"$ref": "#/$defs/interruptResolved",
|
|
4168
|
-
"description": "RFC 0171
|
|
4164
|
+
"description": "RFC 0171 §A.4 E4 — sub-typing is $ref composition, not duplication: the legacy approvalRejected shape (deprecation row legacy-interrupt-payloads) is the unified interruptResolved payload; the event type is kept, its payload is not a second shape."
|
|
4169
4165
|
},
|
|
4170
4166
|
"approvalOverridden": {
|
|
4171
4167
|
"$ref": "#/$defs/interruptResolved",
|
|
4172
|
-
"description": "RFC 0171
|
|
4168
|
+
"description": "RFC 0171 §A.4 E4 — sub-typing is $ref composition, not duplication: the legacy approvalOverridden shape (deprecation row legacy-interrupt-payloads) is the unified interruptResolved payload; the event type is kept, its payload is not a second shape."
|
|
4173
4169
|
},
|
|
4174
4170
|
"clarificationResolved": {
|
|
4175
4171
|
"$ref": "#/$defs/interruptResolved",
|
|
4176
|
-
"description": "RFC 0171
|
|
4172
|
+
"description": "RFC 0171 §A.4 E4 — sub-typing is $ref composition, not duplication: the legacy clarificationResolved shape (deprecation row legacy-interrupt-payloads) is the unified interruptResolved payload; the event type is kept, its payload is not a second shape."
|
|
4177
4173
|
},
|
|
4178
4174
|
"negotiationDecided": {
|
|
4179
4175
|
"type": "object",
|
|
@@ -4208,7 +4204,7 @@
|
|
|
4208
4204
|
"peerDigest": {
|
|
4209
4205
|
"type": "string",
|
|
4210
4206
|
"pattern": "^[0-9a-f]{64}$",
|
|
4211
|
-
"description": "SHA-256 of the peer origin; never the origin in clear (RFC 0175
|
|
4207
|
+
"description": "SHA-256 of the peer origin; never the origin in clear (RFC 0175 §D.3)."
|
|
4212
4208
|
},
|
|
4213
4209
|
"reason": {
|
|
4214
4210
|
"type": "string",
|
|
@@ -4224,12 +4220,12 @@
|
|
|
4224
4220
|
"format": "date-time"
|
|
4225
4221
|
}
|
|
4226
4222
|
},
|
|
4227
|
-
"description": "RFC 0175
|
|
4223
|
+
"description": "RFC 0175 §D.3 — the content-free negotiation audit event."
|
|
4228
4224
|
}
|
|
4229
4225
|
},
|
|
4230
4226
|
"additionalProperties": false,
|
|
4231
4227
|
"_typeIndex": {
|
|
4232
|
-
"description": "NORMATIVE (RFC 0171
|
|
4228
|
+
"description": "NORMATIVE (RFC 0171 §A.4): v2 event type → $defs key, generated from spec/v2/event-codemap.json.",
|
|
4233
4229
|
"type": "object",
|
|
4234
4230
|
"additionalProperties": false,
|
|
4235
4231
|
"properties": {
|