@openwop/spec-artifacts 2.0.0-rc.8 → 2.0.0
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 +41 -38
- package/api/seams-v2.yaml +1 -1
- package/api/v2/asyncapi.yaml +1 -1
- package/api/v2/openapi.yaml +17 -19
- package/package.json +18 -5
- package/schemas/capabilities.schema.json +40 -1
- package/schemas/run-snapshot.schema.json +103 -33
- package/schemas/v2/agent-deployment-transition.schema.json +5 -6
- package/schemas/v2/agent-deployment.schema.json +8 -9
- package/schemas/v2/agent-eval-suite.schema.json +11 -12
- package/schemas/v2/artifact-type-pack-manifest.schema.json +22 -18
- package/schemas/v2/capabilities.schema.json +39 -0
- package/schemas/v2/certification-bundle.schema.json +1 -1
- package/schemas/v2/chat-card-pack-manifest.schema.json +19 -15
- package/schemas/v2/debug-bundle.schema.json +6 -6
- package/schemas/v2/effect-ledger-projection.schema.json +4 -3
- package/schemas/v2/effect-seam-manifest.schema.json +30 -7
- package/schemas/v2/error-envelope.schema.json +185 -138
- package/schemas/v2/eval-summary.schema.json +17 -10
- package/schemas/v2/goal.schema.json +5 -5
- package/schemas/v2/ids.schema.json +120 -22
- package/schemas/v2/node-pack-manifest.schema.json +27 -31
- package/schemas/v2/proposal.schema.json +7 -8
- package/schemas/v2/run-event-payloads.schema.json +258 -245
- package/schemas/v2/run-event.schema.json +2 -126
- package/schemas/v2/run-options.schema.json +1 -1
- package/schemas/v2/run-snapshot.schema.json +34 -13
- package/schemas/v2/webhook-delivery.schema.json +26 -0
- package/schemas/v2/workflow-chain-pack-manifest.schema.json +41 -45
- package/schemas/v2/workflow-definition.schema.json +31 -36
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v1/deprecations.json +79 -67
- package/spec/v1/deprecations.schema.json +23 -7
- package/spec/v1/extensions.json +3 -2
- package/spec/v2/declaration.json +63 -32
- package/spec/v2/errors.json +421 -360
- package/spec/v2/id-field-bindings.json +105 -0
- package/spec/v2/profiles.json +31 -7
- package/spec/v2/release.json +4 -4
- package/spec/v2/retention-floors.json +35 -0
|
@@ -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 \u2192 fold best-effort).\n\n118 variants from the generated `type` branch of `run-event.schema.json` are covered (the v2 vocabulary is `spec/v2/event-codemap.json`; the old `$defs.RunEventType` twin is deleted \u2014 it held 36 retired v1 spellings and nothing referenced it), grouped into ~20 shape families with shared $defs. Naming convention: camelCase keys mirror dotted RunEventType names (e.g., `run.started` \u2192 `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 \u2192 $defs key. Informative \u2014 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 \u00a7D. 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 \u00a7B/\u00a7D. 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 \u2014 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 \u21d2 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 \u21d2 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\"` \u2014 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 \u00a7B/\u00a7D. 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 \u00a7B/\u00a7D. 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 \u00a7C. Announces a clause-boundary streaming-synthesis chunk. METADATA ONLY \u2014 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 \u00a7D. 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 \u00a7D. 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 \u2014 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 \u2014 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 \u2014 no credential material."
|
|
573
573
|
}
|
|
574
574
|
}
|
|
575
575
|
},
|
|
576
576
|
"proposalCreated": {
|
|
577
|
-
"description": "RFC 0096
|
|
577
|
+
"description": "RFC 0096 \u00a7D. Emitted when the host synthesizes a reviewable-learning draft. Content-free: ids / kind / content-free references only \u2014 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
|
+
"$ref": "ids.schema.json#/$defs/runId"
|
|
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 \u2014 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 \u00a7D. Emitted on a successful `apply`. Content-free: ids / content-free references only \u2014 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 \u00a7D. Emitted after each judge check on a standing goal. Content-free: NO objective text. The verdict (`satisfied`/`confidence`) is non-deterministic judge output \u2014 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 \u00a7D. 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 \u00a7D. Emitted when an estate import is applied. Content-free: counts + ref-only \u2014 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` \u2014 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 \u2014 never secret values."
|
|
757
757
|
}
|
|
758
758
|
}
|
|
759
759
|
},
|
|
760
760
|
"connectorAuthorized": {
|
|
761
|
-
"description": "RFC 0047
|
|
761
|
+
"description": "RFC 0047 \u2014 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 \u2014 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 \u2014 emitted on every planner\u2192worker handoff state-machine transition. Required when `capabilities.multiAgent.executionModel.supported: true`; MUST NOT be emitted otherwise. RFC 0040 \u00a7A 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,20 +831,19 @@
|
|
|
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 \u00a7'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 \u2014 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
|
-
"
|
|
847
|
-
"minLength": 1,
|
|
846
|
+
"$ref": "ids.schema.json#/$defs/runId",
|
|
848
847
|
"description": "The dispatched child run's runId. REQUIRED on phases `dispatch.succeeded` and beyond; absent on `dispatch.began` and `dispatch.failed`."
|
|
849
848
|
},
|
|
850
849
|
"harvestedKeys": {
|
|
@@ -852,11 +851,11 @@
|
|
|
852
851
|
"items": {
|
|
853
852
|
"type": "string"
|
|
854
853
|
},
|
|
855
|
-
"description": "On phase `output.harvested`: which parent-variable keys were populated by the dispatch config's outputMapping per RFC 0022
|
|
854
|
+
"description": "On phase `output.harvested`: which parent-variable keys were populated by the dispatch config's outputMapping per RFC 0022 \u00a7A. SHOULD be present; conformance asserts presence when outputMapping is non-empty."
|
|
856
855
|
},
|
|
857
856
|
"attestation": {
|
|
858
857
|
"type": "object",
|
|
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
|
|
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 \u2014 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.",
|
|
860
859
|
"additionalProperties": false,
|
|
861
860
|
"required": [
|
|
862
861
|
"checksum",
|
|
@@ -884,12 +883,12 @@
|
|
|
884
883
|
"causationHostId": {
|
|
885
884
|
"type": "string",
|
|
886
885
|
"minLength": 1,
|
|
887
|
-
"description": "RFC 0040
|
|
886
|
+
"description": "RFC 0040 \u00a7A \u2014 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."
|
|
888
887
|
}
|
|
889
888
|
}
|
|
890
889
|
},
|
|
891
890
|
"coreWorkflowChainConfidenceEscalated": {
|
|
892
|
-
"description": "RFC 0039
|
|
891
|
+
"description": "RFC 0039 \u00a7A \u2014 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`.",
|
|
893
892
|
"type": "object",
|
|
894
893
|
"additionalProperties": false,
|
|
895
894
|
"required": [
|
|
@@ -909,7 +908,7 @@
|
|
|
909
908
|
"type": "number",
|
|
910
909
|
"minimum": 0.5,
|
|
911
910
|
"maximum": 1,
|
|
912
|
-
"description": "The floor that triggered escalation
|
|
911
|
+
"description": "The floor that triggered escalation \u2014 either the spec floor (0.5) when the host doesn't advertise a stricter `confidenceEscalationFloor`, or the host-advertised stricter value."
|
|
913
912
|
},
|
|
914
913
|
"escalationKind": {
|
|
915
914
|
"type": "string",
|
|
@@ -917,12 +916,12 @@
|
|
|
917
916
|
"clarify",
|
|
918
917
|
"escalate"
|
|
919
918
|
],
|
|
920
|
-
"description": "Which interrupt-kind the host fired in response. `clarify` is preferred per RFC 0039
|
|
919
|
+
"description": "Which interrupt-kind the host fired in response. `clarify` is preferred per RFC 0039 \u00a7A; `escalate` is permitted when the host doesn't expose a clarification UI."
|
|
921
920
|
},
|
|
922
921
|
"workerId": {
|
|
923
922
|
"type": "string",
|
|
924
923
|
"minLength": 1,
|
|
925
|
-
"description": "The decision's intended next-worker workflowId (when the escalated decision's kind is `next-worker`). OMITTED for `kind: 'terminate'` escalations
|
|
924
|
+
"description": "The decision's intended next-worker workflowId (when the escalated decision's kind is `next-worker`). OMITTED for `kind: 'terminate'` escalations \u2014 terminate decisions have no worker to name, so absent-field is the correct signal rather than empty-string."
|
|
926
925
|
},
|
|
927
926
|
"parentRunId": {
|
|
928
927
|
"$ref": "ids.schema.json#/$defs/runId",
|
|
@@ -930,12 +929,12 @@
|
|
|
930
929
|
},
|
|
931
930
|
"originalDecision": {
|
|
932
931
|
"$ref": "orchestrator-decision.schema.json",
|
|
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
|
|
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 \u2014 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."
|
|
934
933
|
},
|
|
935
934
|
"causationHostId": {
|
|
936
935
|
"type": "string",
|
|
937
936
|
"minLength": 1,
|
|
938
|
-
"description": "RFC 0040
|
|
937
|
+
"description": "RFC 0040 \u00a7A \u2014 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."
|
|
939
938
|
}
|
|
940
939
|
}
|
|
941
940
|
},
|
|
@@ -1000,7 +999,7 @@
|
|
|
1000
999
|
"engineVersion": {
|
|
1001
1000
|
"type": "integer",
|
|
1002
1001
|
"minimum": 0,
|
|
1003
|
-
"description": "v2: integer everywhere (RFC 0172
|
|
1002
|
+
"description": "v2: integer everywhere (RFC 0172 \u00a7B axis 3)."
|
|
1004
1003
|
},
|
|
1005
1004
|
"owner": {
|
|
1006
1005
|
"type": "object",
|
|
@@ -1020,7 +1019,7 @@
|
|
|
1020
1019
|
"$ref": "subject.schema.json"
|
|
1021
1020
|
}
|
|
1022
1021
|
},
|
|
1023
|
-
"description": "RFC 0170
|
|
1022
|
+
"description": "RFC 0170 \u00a7A.1 \u2014 the same block as RunSnapshot.owner."
|
|
1024
1023
|
},
|
|
1025
1024
|
"tags": {
|
|
1026
1025
|
"type": "array",
|
|
@@ -1037,7 +1036,7 @@
|
|
|
1037
1036
|
},
|
|
1038
1037
|
"runCompleted": {
|
|
1039
1038
|
"type": "object",
|
|
1040
|
-
"description": "Emitted once when the run reaches a successful terminal state. Closes the SSE stream.",
|
|
1039
|
+
"description": "Emitted once when the run reaches a successful terminal state. Closes the SSE stream. `outputs` is REQUIRED (an empty object is a valid value): a completed run has outputs by definition, and a client cannot tell 'no outputs' from 'outputs not rendered' when the key is absent. Required as of 2026-09-04 because it had never been: v1 named the property, required nothing, and left the object open, so a tier-1 host emitted the singular `output` for its whole life and validated. v2 closing the object caught the EXTRA key; nothing in either major caught an ABSENT one, and seventeen scenarios mention run.completed without one asserting its payload. The witness is v2-run-completed-outputs.",
|
|
1041
1040
|
"properties": {
|
|
1042
1041
|
"outputs": {
|
|
1043
1042
|
"$ref": "#/$defs/_outputsObject"
|
|
@@ -1047,7 +1046,10 @@
|
|
|
1047
1046
|
"minimum": 0
|
|
1048
1047
|
}
|
|
1049
1048
|
},
|
|
1050
|
-
"additionalProperties": false
|
|
1049
|
+
"additionalProperties": false,
|
|
1050
|
+
"required": [
|
|
1051
|
+
"outputs"
|
|
1052
|
+
]
|
|
1051
1053
|
},
|
|
1052
1054
|
"runFailed": {
|
|
1053
1055
|
"type": "object",
|
|
@@ -1060,7 +1062,7 @@
|
|
|
1060
1062
|
"$ref": "#/$defs/_errorObject"
|
|
1061
1063
|
},
|
|
1062
1064
|
"failedNodeId": {
|
|
1063
|
-
"
|
|
1065
|
+
"$ref": "ids.schema.json#/$defs/nodeId"
|
|
1064
1066
|
},
|
|
1065
1067
|
"durationMs": {
|
|
1066
1068
|
"type": "integer",
|
|
@@ -1075,11 +1077,11 @@
|
|
|
1075
1077
|
"properties": {
|
|
1076
1078
|
"reason": {
|
|
1077
1079
|
"type": "string",
|
|
1078
|
-
"description": "`v1_pin_unsupported` (RFC 0176
|
|
1080
|
+
"description": "`v1_pin_unsupported` (RFC 0176 \u00a7B.1) is a registered reason."
|
|
1079
1081
|
},
|
|
1080
1082
|
"cancelledBy": {
|
|
1081
1083
|
"type": "string",
|
|
1082
|
-
"description": "RFC 0176
|
|
1084
|
+
"description": "RFC 0176 \u00a7B.1 \u2014 `v2-cutover` when a v2 host cancels an inherited run whose pin it no longer implements."
|
|
1083
1085
|
},
|
|
1084
1086
|
"durationMs": {
|
|
1085
1087
|
"type": "integer",
|
|
@@ -1087,7 +1089,7 @@
|
|
|
1087
1089
|
},
|
|
1088
1090
|
"parentRunId": {
|
|
1089
1091
|
"$ref": "ids.schema.json#/$defs/runId",
|
|
1090
|
-
"description": "When this cancellation was triggered by a parent-cancel cascade (`interrupt-profiles.md
|
|
1092
|
+
"description": "When this cancellation was triggered by a parent-cancel cascade (`interrupt-profiles.md \u00a7openwop-interrupt-cascade-cancel`), the parent runId that initiated it. Pairs with `reason: 'parent-cancelled'`. Absent for direct cancellations."
|
|
1091
1093
|
}
|
|
1092
1094
|
},
|
|
1093
1095
|
"additionalProperties": false
|
|
@@ -1104,7 +1106,7 @@
|
|
|
1104
1106
|
},
|
|
1105
1107
|
"runPaused": {
|
|
1106
1108
|
"type": "object",
|
|
1107
|
-
"description": "Emitted when the run is paused (manual pause / cap.breached pause-and-checkpoint).",
|
|
1109
|
+
"description": "Emitted when the run is paused (manual pause / cap.breached pause-and-checkpoint). runs.md \u00a7Pause and resume: with drainPolicy immediate the snapshot is taken between events \u2014 the interrupted attempt has no terminal node event and a host MUST NOT record node.failed for it; the resumed run's node.started is a fresh attempt. interruptedNodeId / interruptedAttempt name the attempt that was cut, for debug consumers.",
|
|
1108
1110
|
"properties": {
|
|
1109
1111
|
"reason": {
|
|
1110
1112
|
"type": "string"
|
|
@@ -1112,10 +1114,19 @@
|
|
|
1112
1114
|
"drainPolicy": {
|
|
1113
1115
|
"type": "string",
|
|
1114
1116
|
"enum": [
|
|
1115
|
-
"
|
|
1116
|
-
"
|
|
1117
|
+
"immediate",
|
|
1118
|
+
"drain-current-node"
|
|
1117
1119
|
],
|
|
1118
|
-
"description": "
|
|
1120
|
+
"description": "Echoes the pauseRun request's drainPolicy (runs.md \u00a7Pause and resume; api/v2/openapi.yaml). rc.52: the enum was seeded as drain | interrupt with a provenance note pointing at v1 text that never said it; v1's event carries no drainPolicy."
|
|
1121
|
+
},
|
|
1122
|
+
"interruptedNodeId": {
|
|
1123
|
+
"$ref": "ids.schema.json#/$defs/nodeId",
|
|
1124
|
+
"description": "With drainPolicy immediate: the node whose attempt was cut between events. Absent when nothing was executing."
|
|
1125
|
+
},
|
|
1126
|
+
"interruptedAttempt": {
|
|
1127
|
+
"type": "integer",
|
|
1128
|
+
"minimum": 1,
|
|
1129
|
+
"description": "The attempt number that was cut; the resumed run's node.started begins a fresh attempt."
|
|
1119
1130
|
}
|
|
1120
1131
|
},
|
|
1121
1132
|
"additionalProperties": false
|
|
@@ -1136,13 +1147,13 @@
|
|
|
1136
1147
|
"engineVersion": {
|
|
1137
1148
|
"type": "integer",
|
|
1138
1149
|
"minimum": 0,
|
|
1139
|
-
"description": "v2: integer everywhere (RFC 0172
|
|
1150
|
+
"description": "v2: integer everywhere (RFC 0172 \u00a7B axis 3)."
|
|
1140
1151
|
}
|
|
1141
1152
|
},
|
|
1142
1153
|
"additionalProperties": false
|
|
1143
1154
|
},
|
|
1144
1155
|
"runDeadLettered": {
|
|
1145
|
-
"description": "RFC 0053
|
|
1156
|
+
"description": "RFC 0053 \u2014 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`.",
|
|
1146
1157
|
"type": "object",
|
|
1147
1158
|
"additionalProperties": false,
|
|
1148
1159
|
"required": [
|
|
@@ -1182,8 +1193,7 @@
|
|
|
1182
1193
|
"$ref": "ids.schema.json#/$defs/nodeId"
|
|
1183
1194
|
},
|
|
1184
1195
|
"typeId": {
|
|
1185
|
-
"
|
|
1186
|
-
"minLength": 1
|
|
1196
|
+
"$ref": "ids.schema.json#/$defs/typeId"
|
|
1187
1197
|
},
|
|
1188
1198
|
"attempt": {
|
|
1189
1199
|
"type": "integer",
|
|
@@ -1260,7 +1270,7 @@
|
|
|
1260
1270
|
"conversation.close",
|
|
1261
1271
|
"low-confidence"
|
|
1262
1272
|
],
|
|
1263
|
-
"description": "RFC 0094
|
|
1273
|
+
"description": "RFC 0094 \u00a7E \u2014 the full kind union `interrupt.md` defines (mirrors suspend-request.schema.json). Conversation kinds are gated on the conversation capability per capabilities.md."
|
|
1264
1274
|
},
|
|
1265
1275
|
"key": {
|
|
1266
1276
|
"type": "string",
|
|
@@ -1361,7 +1371,7 @@
|
|
|
1361
1371
|
"additionalProperties": false
|
|
1362
1372
|
},
|
|
1363
1373
|
"interruptRequested": {
|
|
1364
|
-
"description": "Canonical HITL primitive
|
|
1374
|
+
"description": "Canonical HITL primitive \u2014 discriminated union over kind. Payload mirrors `suspend-request.schema.json` (InterruptPayload) plus engine-assigned identity fields.",
|
|
1365
1375
|
"$ref": "https://openwop.dev/spec/v2/suspend-request.schema.json"
|
|
1366
1376
|
},
|
|
1367
1377
|
"interruptResolved": {
|
|
@@ -1390,7 +1400,7 @@
|
|
|
1390
1400
|
"conversation.close",
|
|
1391
1401
|
"low-confidence"
|
|
1392
1402
|
],
|
|
1393
|
-
"description": "RFC 0094
|
|
1403
|
+
"description": "RFC 0094 \u00a7E \u2014 the full kind union `interrupt.md` defines (mirrors suspend-request.schema.json). Conversation kinds are gated on the conversation capability per capabilities.md."
|
|
1394
1404
|
},
|
|
1395
1405
|
"resumeValue": {},
|
|
1396
1406
|
"resolvedBy": {
|
|
@@ -1412,7 +1422,7 @@
|
|
|
1412
1422
|
},
|
|
1413
1423
|
"contextSummarized": {
|
|
1414
1424
|
"type": "object",
|
|
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
|
|
1425
|
+
"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 \u2014 `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 \u00a7\"Context economy (RFC 0111)\"). `replacedTurns` lists the event ids the summary stands in for, so a replay engine reconstructs the exact transcript.",
|
|
1416
1426
|
"required": [
|
|
1417
1427
|
"iteration",
|
|
1418
1428
|
"replacedTurns",
|
|
@@ -1458,7 +1468,7 @@
|
|
|
1458
1468
|
"tokensAfter": {
|
|
1459
1469
|
"type": "integer",
|
|
1460
1470
|
"minimum": 0,
|
|
1461
|
-
"description": "Token count of the summary that replaced the range, in `tokenCounter` units. Expected
|
|
1471
|
+
"description": "Token count of the summary that replaced the range, in `tokenCounter` units. Expected \u2264 `tokensBefore`."
|
|
1462
1472
|
}
|
|
1463
1473
|
},
|
|
1464
1474
|
"additionalProperties": false
|
|
@@ -1490,7 +1500,7 @@
|
|
|
1490
1500
|
},
|
|
1491
1501
|
"registered": {
|
|
1492
1502
|
"type": "boolean",
|
|
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
|
|
1503
|
+
"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 \u21d2 treat as true, preserving pre-RFC-0071 semantics. See artifact-type-packs.md \u00a7\"Binding the existing artifact surfaces\"."
|
|
1494
1504
|
},
|
|
1495
1505
|
"registrationSource": {
|
|
1496
1506
|
"type": "string",
|
|
@@ -1498,14 +1508,14 @@
|
|
|
1498
1508
|
"pack",
|
|
1499
1509
|
"host"
|
|
1500
1510
|
],
|
|
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
|
|
1511
|
+
"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 \u2014 e.g. an AI host's built-in artifact types). Optional; meaningful only when `registered: true`. Absent \u21d2 unspecified provenance (existing semantics)."
|
|
1502
1512
|
}
|
|
1503
1513
|
},
|
|
1504
1514
|
"additionalProperties": false
|
|
1505
1515
|
},
|
|
1506
1516
|
"outputChunk": {
|
|
1507
1517
|
"type": "object",
|
|
1508
|
-
"description": "Emitted for streaming output (e.g., LLM token chunks). Stream-mode `messages` consumers see these. RFC 0094
|
|
1518
|
+
"description": "Emitted for streaming output (e.g., LLM token chunks). Stream-mode `messages` consumers see these. RFC 0094 \u00a7D single-sources the `ai.message.chunk` payload here: bare {nodeId, runId, chunk, isLast} is the minimum compliant payload per stream-modes.md \u00a7messages (the prior {nodeId, chunk}-only required set was the defective restatement). Tiered metadata per stream-modes.md \u00a7messages (S2 closure): `meta` adds Tier 1 typed slots and a Tier 2 provider-pass-through escape hatch.",
|
|
1509
1519
|
"required": [
|
|
1510
1520
|
"nodeId",
|
|
1511
1521
|
"runId",
|
|
@@ -1525,7 +1535,7 @@
|
|
|
1525
1535
|
},
|
|
1526
1536
|
"isLast": {
|
|
1527
1537
|
"type": "boolean",
|
|
1528
|
-
"description": "True for the final chunk of a given AI node call. Required
|
|
1538
|
+
"description": "True for the final chunk of a given AI node call. Required \u2014 both reference consumers rely on it for fold termination."
|
|
1529
1539
|
},
|
|
1530
1540
|
"channel": {
|
|
1531
1541
|
"type": "string",
|
|
@@ -1539,7 +1549,7 @@
|
|
|
1539
1549
|
},
|
|
1540
1550
|
"_chunkMeta": {
|
|
1541
1551
|
"type": "object",
|
|
1542
|
-
"description": "Tiered metadata for ai.message.chunk / outputChunk payloads. See stream-modes.md
|
|
1552
|
+
"description": "Tiered metadata for ai.message.chunk / outputChunk payloads. See stream-modes.md \u00a7messages.",
|
|
1543
1553
|
"properties": {
|
|
1544
1554
|
"finishReason": {
|
|
1545
1555
|
"type": "string",
|
|
@@ -1557,7 +1567,7 @@
|
|
|
1557
1567
|
},
|
|
1558
1568
|
"toolCalls": {
|
|
1559
1569
|
"type": "array",
|
|
1560
|
-
"description": "Tier 1: structured tool / function calls emitted in this chunk. Each item: `{id, name, arguments}`
|
|
1570
|
+
"description": "Tier 1: structured tool / function calls emitted in this chunk. Each item: `{id, name, arguments}` \u2014 `arguments` is a string (JSON-encoded args, may be partial when streaming)."
|
|
1561
1571
|
},
|
|
1562
1572
|
"model": {
|
|
1563
1573
|
"type": "string",
|
|
@@ -1584,11 +1594,11 @@
|
|
|
1584
1594
|
},
|
|
1585
1595
|
"provider": {
|
|
1586
1596
|
"type": "string",
|
|
1587
|
-
"description": "Tier 2: provider name when `providerExtensions` is present. Examples: `openai`, `anthropic`, `google`, `minimax`. Consumers MUST NOT branch on this for behavior
|
|
1597
|
+
"description": "Tier 2: provider name when `providerExtensions` is present. Examples: `openai`, `anthropic`, `google`, `minimax`. Consumers MUST NOT branch on this for behavior \u2014 use Tier 1 fields. Provided for observability + debugging only."
|
|
1588
1598
|
},
|
|
1589
1599
|
"providerExtensions": {
|
|
1590
1600
|
"type": "object",
|
|
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
|
|
1601
|
+
"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 \u2014 typed slot wins).",
|
|
1592
1602
|
"additionalProperties": true
|
|
1593
1603
|
}
|
|
1594
1604
|
},
|
|
@@ -1676,7 +1686,7 @@
|
|
|
1676
1686
|
"engineVersion": {
|
|
1677
1687
|
"type": "integer",
|
|
1678
1688
|
"minimum": 0,
|
|
1679
|
-
"description": "v2: integer everywhere (RFC 0172
|
|
1689
|
+
"description": "v2: integer everywhere (RFC 0172 \u00a7B axis 3)."
|
|
1680
1690
|
}
|
|
1681
1691
|
},
|
|
1682
1692
|
"additionalProperties": false
|
|
@@ -1712,14 +1722,14 @@
|
|
|
1712
1722
|
"minimum": 0
|
|
1713
1723
|
},
|
|
1714
1724
|
"lastNodeId": {
|
|
1715
|
-
"
|
|
1725
|
+
"$ref": "ids.schema.json#/$defs/nodeId"
|
|
1716
1726
|
}
|
|
1717
1727
|
},
|
|
1718
1728
|
"additionalProperties": false
|
|
1719
1729
|
},
|
|
1720
1730
|
"capBreached": {
|
|
1721
1731
|
"type": "object",
|
|
1722
|
-
"description": "Emitted when a CapabilityLimit is exceeded. Protocol-level limits use the engine kinds (clarificationRounds / schemaRounds / envelopesPerTurn / maxNodeExecutions). RFC 0008
|
|
1732
|
+
"description": "Emitted when a CapabilityLimit is exceeded. Protocol-level limits use the engine kinds (clarificationRounds / schemaRounds / envelopesPerTurn / maxNodeExecutions). RFC 0008 \u00a7K 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.",
|
|
1723
1733
|
"required": [
|
|
1724
1734
|
"kind",
|
|
1725
1735
|
"limit",
|
|
@@ -1747,7 +1757,7 @@
|
|
|
1747
1757
|
"limit": {
|
|
1748
1758
|
"type": "number",
|
|
1749
1759
|
"minimum": 0,
|
|
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
|
|
1760
|
+
"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 \u2014 RFC 0084 \u00a7D)."
|
|
1751
1761
|
},
|
|
1752
1762
|
"observed": {
|
|
1753
1763
|
"type": "number",
|
|
@@ -1798,7 +1808,7 @@
|
|
|
1798
1808
|
},
|
|
1799
1809
|
"leaseHandedOff": {
|
|
1800
1810
|
"type": "object",
|
|
1801
|
-
"description": "Emitted when a run's executing lease is transferred from one host to another (e.g., browser
|
|
1811
|
+
"description": "Emitted when a run's executing lease is transferred from one host to another (e.g., browser \u2192 cloud failover).",
|
|
1802
1812
|
"required": [
|
|
1803
1813
|
"leaseId",
|
|
1804
1814
|
"fromHost",
|
|
@@ -1831,7 +1841,7 @@
|
|
|
1831
1841
|
},
|
|
1832
1842
|
"replayDivergedAtRefusal": {
|
|
1833
1843
|
"type": "object",
|
|
1834
|
-
"description": "RFC 0041
|
|
1844
|
+
"description": "RFC 0041 \u00a7B \u2014 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` \u00a7\"Common error codes\". Capability-gated on `capabilities.multiAgent.executionModel.replayDeterminism.refusalDivergenceEmission: true`; non-Phase-4 hosts MUST NOT emit this event.",
|
|
1835
1845
|
"required": [
|
|
1836
1846
|
"sourceRunId",
|
|
1837
1847
|
"atSequence",
|
|
@@ -1849,7 +1859,7 @@
|
|
|
1849
1859
|
"description": "Event-log index at which the refusal-divergence was detected (the index of the LLM call whose envelope shifted)."
|
|
1850
1860
|
},
|
|
1851
1861
|
"originalEventId": {
|
|
1852
|
-
"
|
|
1862
|
+
"$ref": "ids.schema.json#/$defs/eventId",
|
|
1853
1863
|
"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."
|
|
1854
1864
|
},
|
|
1855
1865
|
"nodeId": {
|
|
@@ -1870,7 +1880,7 @@
|
|
|
1870
1880
|
"valid",
|
|
1871
1881
|
"refusal"
|
|
1872
1882
|
],
|
|
1873
|
-
"description": "Whether the replay's LLM envelope was a valid response or a refusal. MUST differ from `originalEnvelopeKind`
|
|
1883
|
+
"description": "Whether the replay's LLM envelope was a valid response or a refusal. MUST differ from `originalEnvelopeKind` \u2014 otherwise there is no divergence to report."
|
|
1874
1884
|
},
|
|
1875
1885
|
"refusalReason": {
|
|
1876
1886
|
"type": "string",
|
|
@@ -1881,7 +1891,7 @@
|
|
|
1881
1891
|
},
|
|
1882
1892
|
"replayDiverged": {
|
|
1883
1893
|
"type": "object",
|
|
1884
|
-
"description": "Emitted by `:fork` when a replay re-execution produces a different output than the original at a given sequence. See replay.md
|
|
1894
|
+
"description": "Emitted by `:fork` when a replay re-execution produces a different output than the original at a given sequence. See replay.md \u00a7divergence detection. `divergencePoint` (RFC 0027 \u00a7F) is the canonical optional field for naming which event-emission diverged; the two fields are complementary, not mutually exclusive.",
|
|
1885
1895
|
"required": [
|
|
1886
1896
|
"sourceRunId",
|
|
1887
1897
|
"atSequence"
|
|
@@ -1895,7 +1905,7 @@
|
|
|
1895
1905
|
"minimum": 0
|
|
1896
1906
|
},
|
|
1897
1907
|
"originalEventId": {
|
|
1898
|
-
"
|
|
1908
|
+
"$ref": "ids.schema.json#/$defs/eventId"
|
|
1899
1909
|
},
|
|
1900
1910
|
"divergenceKind": {
|
|
1901
1911
|
"type": "string",
|
|
@@ -1908,7 +1918,7 @@
|
|
|
1908
1918
|
},
|
|
1909
1919
|
"divergencePoint": {
|
|
1910
1920
|
"type": "string",
|
|
1911
|
-
"description": "RFC 0027
|
|
1921
|
+
"description": "RFC 0027 \u00a7F. 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)."
|
|
1912
1922
|
}
|
|
1913
1923
|
},
|
|
1914
1924
|
"additionalProperties": false
|
|
@@ -1941,14 +1951,14 @@
|
|
|
1941
1951
|
"causationHostId": {
|
|
1942
1952
|
"type": "string",
|
|
1943
1953
|
"minLength": 1,
|
|
1944
|
-
"description": "RFC 0040
|
|
1954
|
+
"description": "RFC 0040 \u00a7A \u2014 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`."
|
|
1945
1955
|
}
|
|
1946
1956
|
},
|
|
1947
1957
|
"additionalProperties": false
|
|
1948
1958
|
},
|
|
1949
1959
|
"agentReasoningDelta": {
|
|
1950
1960
|
"type": "object",
|
|
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
|
|
1961
|
+
"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 \u2014 a deliberate forward-compat exception per RFC 0024 \u00a7Compatibility, not a precedent generalizable to other event payloads.",
|
|
1952
1962
|
"required": [
|
|
1953
1963
|
"agentId",
|
|
1954
1964
|
"delta",
|
|
@@ -1982,7 +1992,7 @@
|
|
|
1982
1992
|
},
|
|
1983
1993
|
"providerUsage": {
|
|
1984
1994
|
"type": "object",
|
|
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
|
|
1995
|
+
"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 \u00a7\"Cost attribution attributes\"`) is the observability sibling \u2014 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 \u2014 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 \u00a7SR-1` (enforced by SECURITY invariant `provider-usage-no-credential-leak`).",
|
|
1986
1996
|
"required": [
|
|
1987
1997
|
"provider",
|
|
1988
1998
|
"model",
|
|
@@ -1998,7 +2008,7 @@
|
|
|
1998
2008
|
"model": {
|
|
1999
2009
|
"type": "string",
|
|
2000
2010
|
"minLength": 1,
|
|
2001
|
-
"description": "Provider-stamped model id as the model expects it. Same value used in the LLM cache-key recipe per `replay.md
|
|
2011
|
+
"description": "Provider-stamped model id as the model expects it. Same value used in the LLM cache-key recipe per `replay.md \u00a7A`."
|
|
2002
2012
|
},
|
|
2003
2013
|
"inputTokens": {
|
|
2004
2014
|
"type": "integer",
|
|
@@ -2018,7 +2028,7 @@
|
|
|
2018
2028
|
"costEstimateUsd": {
|
|
2019
2029
|
"type": "number",
|
|
2020
2030
|
"minimum": 0,
|
|
2021
|
-
"description": "ADVISORY estimate in USD computed by the host's static rate table. MUST NOT be used for billing
|
|
2031
|
+
"description": "ADVISORY estimate in USD computed by the host's static rate table. MUST NOT be used for billing \u2014 real billing is external. Hosts SHOULD omit when no rate is known rather than emit 0."
|
|
2022
2032
|
},
|
|
2023
2033
|
"currency": {
|
|
2024
2034
|
"type": "string",
|
|
@@ -2027,12 +2037,12 @@
|
|
|
2027
2037
|
},
|
|
2028
2038
|
"cacheHit": {
|
|
2029
2039
|
"type": "boolean",
|
|
2030
|
-
"description": "True iff this call was served from the LLM response cache per `replay.md
|
|
2040
|
+
"description": "True iff this call was served from the LLM response cache per `replay.md \u00a7\"LLM cache-key recipe\"`. When true, inputTokens/outputTokens reflect the ORIGINAL call's billed values; the cached invocation incurred zero new provider cost."
|
|
2031
2041
|
},
|
|
2032
2042
|
"cacheReadTokens": {
|
|
2033
2043
|
"type": "integer",
|
|
2034
2044
|
"minimum": 0,
|
|
2035
|
-
"description": "RFC 0116. Optional, cost-only. Provider-reported tokens served from the prompt-prefix context cache on this call
|
|
2045
|
+
"description": "RFC 0116. Optional, cost-only. Provider-reported tokens served from the prompt-prefix context cache on this call \u2014 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 \u00a7SR-1`."
|
|
2036
2046
|
},
|
|
2037
2047
|
"cacheWriteTokens": {
|
|
2038
2048
|
"type": "integer",
|
|
@@ -2052,7 +2062,7 @@
|
|
|
2052
2062
|
},
|
|
2053
2063
|
"promptComposed": {
|
|
2054
2064
|
"type": "object",
|
|
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
|
|
2065
|
+
"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 \u00a7\"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`.",
|
|
2056
2066
|
"required": [
|
|
2057
2067
|
"nodeId",
|
|
2058
2068
|
"refs",
|
|
@@ -2080,7 +2090,7 @@
|
|
|
2080
2090
|
"user-only",
|
|
2081
2091
|
"agent-reasoning"
|
|
2082
2092
|
],
|
|
2083
|
-
"description": "Composition shape
|
|
2093
|
+
"description": "Composition shape \u2014 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."
|
|
2084
2094
|
},
|
|
2085
2095
|
"hash": {
|
|
2086
2096
|
"type": "string",
|
|
@@ -2089,7 +2099,7 @@
|
|
|
2089
2099
|
},
|
|
2090
2100
|
"composed": {
|
|
2091
2101
|
"type": "string",
|
|
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
|
|
2102
|
+
"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 \u2014 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."
|
|
2093
2103
|
},
|
|
2094
2104
|
"systemPrompt": {
|
|
2095
2105
|
"type": "string",
|
|
@@ -2102,7 +2112,7 @@
|
|
|
2102
2112
|
"variableBindings": {
|
|
2103
2113
|
"type": "object",
|
|
2104
2114
|
"additionalProperties": true,
|
|
2105
|
-
"description": "Variable-name
|
|
2115
|
+
"description": "Variable-name \u2192 bound-value map. Secret-source bindings MUST appear as `[REDACTED:<secretId>]`. Only present under `observability: 'full'`."
|
|
2106
2116
|
},
|
|
2107
2117
|
"variableHashes": {
|
|
2108
2118
|
"type": "object",
|
|
@@ -2110,7 +2120,7 @@
|
|
|
2110
2120
|
"type": "string",
|
|
2111
2121
|
"pattern": "^sha256:[0-9a-f]{64}$"
|
|
2112
2122
|
},
|
|
2113
|
-
"description": "Variable-name
|
|
2123
|
+
"description": "Variable-name \u2192 sha256(value) map. Always present (under both `hashed` and `full`). Enables replay-determinism checks without exposing values."
|
|
2114
2124
|
},
|
|
2115
2125
|
"contentTrust": {
|
|
2116
2126
|
"type": "string",
|
|
@@ -2118,19 +2128,19 @@
|
|
|
2118
2128
|
"trusted",
|
|
2119
2129
|
"untrusted"
|
|
2120
2130
|
],
|
|
2121
|
-
"description": "Aggregate trust marker. `untrusted` iff ANY contributing input was tagged untrusted per RFC 0020
|
|
2131
|
+
"description": "Aggregate trust marker. `untrusted` iff ANY contributing input was tagged untrusted per RFC 0020 \u00a7D / AIEnvelope.meta.contentTrust propagation. When `untrusted`, the composed bodies MUST contain `<UNTRUSTED>...</UNTRUSTED>` markers around the untrusted segments."
|
|
2122
2132
|
},
|
|
2123
2133
|
"causationHostId": {
|
|
2124
2134
|
"type": "string",
|
|
2125
2135
|
"minLength": 1,
|
|
2126
|
-
"description": "RFC 0040
|
|
2136
|
+
"description": "RFC 0040 \u00a7A \u2014 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`."
|
|
2127
2137
|
}
|
|
2128
2138
|
},
|
|
2129
2139
|
"additionalProperties": false
|
|
2130
2140
|
},
|
|
2131
2141
|
"agentPromptResolved": {
|
|
2132
2142
|
"type": "object",
|
|
2133
|
-
"description": "RFC 0029
|
|
2143
|
+
"description": "RFC 0029 \u00a7B. 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` \u00a7\"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` \u2014 the secret-redaction + trust-marker invariants on `prompt.composed` (RFC 0027 \u00a7G) don't apply here.",
|
|
2134
2144
|
"required": [
|
|
2135
2145
|
"nodeId",
|
|
2136
2146
|
"kind",
|
|
@@ -2171,7 +2181,7 @@
|
|
|
2171
2181
|
"workflow-defaults",
|
|
2172
2182
|
"host-defaults"
|
|
2173
2183
|
],
|
|
2174
|
-
"description": "Identifies which precedence layer this chain entry represents. The four normative layers per RFC 0029
|
|
2184
|
+
"description": "Identifies which precedence layer this chain entry represents. The four normative layers per RFC 0029 \u00a7A are `node`, `agent-*`, `workflow-defaults`, `host-defaults`. `run-configurable` is reserved for the optional `RunOptions.configurable.promptOverrides` extension described in RFC 0029 \u00a7\"Alternatives considered\" #5; hosts that honor that extension MUST emit a chain entry with this layer value above the `node` entry."
|
|
2175
2185
|
},
|
|
2176
2186
|
"source": {
|
|
2177
2187
|
"type": "string",
|
|
@@ -2179,7 +2189,7 @@
|
|
|
2179
2189
|
},
|
|
2180
2190
|
"applied": {
|
|
2181
2191
|
"type": "boolean",
|
|
2182
|
-
"description": "True for exactly one entry in the chain
|
|
2192
|
+
"description": "True for exactly one entry in the chain \u2014 the layer whose ref was selected. False for layers that yielded null OR were skipped after a higher-precedence layer already applied."
|
|
2183
2193
|
},
|
|
2184
2194
|
"reason": {
|
|
2185
2195
|
"type": "string",
|
|
@@ -2198,7 +2208,7 @@
|
|
|
2198
2208
|
"causationHostId": {
|
|
2199
2209
|
"type": "string",
|
|
2200
2210
|
"minLength": 1,
|
|
2201
|
-
"description": "RFC 0040
|
|
2211
|
+
"description": "RFC 0040 \u00a7A \u2014 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`."
|
|
2202
2212
|
}
|
|
2203
2213
|
},
|
|
2204
2214
|
"additionalProperties": false
|
|
@@ -2206,7 +2216,7 @@
|
|
|
2206
2216
|
"modelCapabilitySubstituted": {
|
|
2207
2217
|
"type": "object",
|
|
2208
2218
|
"additionalProperties": false,
|
|
2209
|
-
"description": "RFC 0031
|
|
2219
|
+
"description": "RFC 0031 \u00a7D. 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 \u00a7B 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 \u2014 `originalProvider` is already public via `RunOptions.configurable.ai.provider`, and `nodeId` / `missingCapabilities` carry no provider-possession information.",
|
|
2210
2220
|
"required": [
|
|
2211
2221
|
"nodeId",
|
|
2212
2222
|
"originalProvider",
|
|
@@ -2249,7 +2259,7 @@
|
|
|
2249
2259
|
"modelCapabilityInsufficient": {
|
|
2250
2260
|
"type": "object",
|
|
2251
2261
|
"additionalProperties": false,
|
|
2252
|
-
"description": "RFC 0031
|
|
2262
|
+
"description": "RFC 0031 \u00a7D. 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 \u00a7B step 4. Pairs with `RunSnapshot.error.code = \"capability_not_provided\"` per `capabilities.md` \u00a7\"Unsupported capability \u2014 refusal contract\". Recursive fallback is NOT permitted (RFC 0031 \u00a7\"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.",
|
|
2253
2263
|
"required": [
|
|
2254
2264
|
"nodeId",
|
|
2255
2265
|
"provider",
|
|
@@ -2287,7 +2297,7 @@
|
|
|
2287
2297
|
"envelopeRetryAttempted": {
|
|
2288
2298
|
"type": "object",
|
|
2289
2299
|
"additionalProperties": false,
|
|
2290
|
-
"description": "RFC 0032
|
|
2300
|
+
"description": "RFC 0032 \u00a7B.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 \u2014 hosts that don't implement retry don't emit; hosts that DO retry on validation failure SHOULD emit per attempt past the first.",
|
|
2291
2301
|
"required": [
|
|
2292
2302
|
"nodeId",
|
|
2293
2303
|
"attempt",
|
|
@@ -2322,21 +2332,21 @@
|
|
|
2322
2332
|
"pattern": "^x-host-[a-z][a-z0-9-]*-[a-z][a-z0-9-]*$"
|
|
2323
2333
|
}
|
|
2324
2334
|
],
|
|
2325
|
-
"description": "Why the prior attempt failed. Spec-reserved values: `schema-violation` (model emitted wrong-shape JSON; corrective fragment + retry per RFC 0033
|
|
2335
|
+
"description": "Why the prior attempt failed. Spec-reserved values: `schema-violation` (model emitted wrong-shape JSON; corrective fragment + retry per RFC 0033 \u00a7C), `truncation` (stop_reason: max_tokens; budget-double + retry per RFC 0033 \u00a7B), `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 \u2014 e.g., string where number was declared), `refusal` (provider safety-stop; NO retry per RFC 0032 \u00a7B.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` \u00a7\"Canonical-prefix table\"; matches the RFC 0031 \u00a7B `requiredModelCapabilities` precedent."
|
|
2326
2336
|
},
|
|
2327
2337
|
"previousError": {
|
|
2328
2338
|
"type": [
|
|
2329
2339
|
"string",
|
|
2330
2340
|
"null"
|
|
2331
2341
|
],
|
|
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`
|
|
2342
|
+
"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` \u00a7\"Redaction (SR-1 carry-forward)\"."
|
|
2333
2343
|
}
|
|
2334
2344
|
}
|
|
2335
2345
|
},
|
|
2336
2346
|
"envelopeRetryExhausted": {
|
|
2337
2347
|
"type": "object",
|
|
2338
2348
|
"additionalProperties": false,
|
|
2339
|
-
"description": "RFC 0032
|
|
2349
|
+
"description": "RFC 0032 \u00a7B.2. Emitted when a host has exhausted its retry budget and is about to surface a terminal envelope failure to the node. MUST-tier \u2014 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 \u00a7B + \u00a7C.",
|
|
2340
2350
|
"required": [
|
|
2341
2351
|
"nodeId",
|
|
2342
2352
|
"totalAttempts",
|
|
@@ -2368,7 +2378,7 @@
|
|
|
2368
2378
|
"pattern": "^x-host-[a-z][a-z0-9-]*-[a-z][a-z0-9-]*$"
|
|
2369
2379
|
}
|
|
2370
2380
|
],
|
|
2371
|
-
"description": "Same value set as `envelope.retry.attempted.reason` (
|
|
2381
|
+
"description": "Same value set as `envelope.retry.attempted.reason` (\u00a7B.1). Spec-reserved closed enum plus `x-host-<host>-` extensions."
|
|
2372
2382
|
},
|
|
2373
2383
|
"finalError": {
|
|
2374
2384
|
"type": [
|
|
@@ -2382,7 +2392,7 @@
|
|
|
2382
2392
|
"envelopeRefusal": {
|
|
2383
2393
|
"type": "object",
|
|
2384
2394
|
"additionalProperties": false,
|
|
2385
|
-
"description": "RFC 0032
|
|
2395
|
+
"description": "RFC 0032 \u00a7B.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 \u2014 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 \u00a7B.3 + RFC 0033 \u00a7D. The node MUST fail with `error.code = \"envelope_refusal\"` per RFC 0033 \u00a7F (renamed from `envelope_refused_by_provider` per the 2026-05-21 RFC adoption-feedback amendment).",
|
|
2386
2396
|
"required": [
|
|
2387
2397
|
"nodeId",
|
|
2388
2398
|
"provider",
|
|
@@ -2417,7 +2427,7 @@
|
|
|
2417
2427
|
"envelopeTruncated": {
|
|
2418
2428
|
"type": "object",
|
|
2419
2429
|
"additionalProperties": false,
|
|
2420
|
-
"description": "RFC 0032
|
|
2430
|
+
"description": "RFC 0032 \u00a7B.4. Emitted when the LLM emission was cut off before the envelope was complete (typically `stop_reason: \"max_tokens\"`). SHOULD-tier \u2014 hosts that distinguish truncation from schema-violation per RFC 0033 \u00a7A MUST emit this event when truncation occurs. Hosts that conflate truncation with schema-violation (legacy behavior) MAY omit; they then fail RFC 0033 conformance.",
|
|
2421
2431
|
"required": [
|
|
2422
2432
|
"nodeId",
|
|
2423
2433
|
"provider",
|
|
@@ -2447,7 +2457,7 @@
|
|
|
2447
2457
|
"partialPayloadAvailable": {
|
|
2448
2458
|
"type": "boolean",
|
|
2449
2459
|
"default": false,
|
|
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
|
|
2460
|
+
"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 \u00a7B)."
|
|
2451
2461
|
},
|
|
2452
2462
|
"outputTokenCount": {
|
|
2453
2463
|
"type": [
|
|
@@ -2462,7 +2472,7 @@
|
|
|
2462
2472
|
"envelopeNlToFormatEngaged": {
|
|
2463
2473
|
"type": "object",
|
|
2464
2474
|
"additionalProperties": false,
|
|
2465
|
-
"description": "RFC 0032
|
|
2475
|
+
"description": "RFC 0032 \u00a7B.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 \u2192 schema coercion in the second call). MAY-tier \u2014 NL-to-Format is one of many possible recovery strategies; hosts that don't implement it don't advertise it.",
|
|
2466
2476
|
"required": [
|
|
2467
2477
|
"nodeId",
|
|
2468
2478
|
"originalEnvelopeType"
|
|
@@ -2486,7 +2496,7 @@
|
|
|
2486
2496
|
"envelopeRecoveryApplied": {
|
|
2487
2497
|
"type": "object",
|
|
2488
2498
|
"additionalProperties": false,
|
|
2489
|
-
"description": "RFC 0032
|
|
2499
|
+
"description": "RFC 0032 \u00a7B.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 \u00a7D. MAY-tier \u2014 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.",
|
|
2490
2500
|
"required": [
|
|
2491
2501
|
"nodeId",
|
|
2492
2502
|
"path"
|
|
@@ -2504,7 +2514,7 @@
|
|
|
2504
2514
|
"brace-walker",
|
|
2505
2515
|
"custom"
|
|
2506
2516
|
],
|
|
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
|
|
2517
|
+
"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 \u2192 deterministic recovery outcome)."
|
|
2508
2518
|
},
|
|
2509
2519
|
"byteOffset": {
|
|
2510
2520
|
"type": [
|
|
@@ -2543,7 +2553,7 @@
|
|
|
2543
2553
|
},
|
|
2544
2554
|
"argsHash": {
|
|
2545
2555
|
"type": "string",
|
|
2546
|
-
"description": "RFC 0064 (when `capabilities.toolHooks.prePostEvents`). SHA-256 over RFC 8785 JCS-canonicalized args with resolved secrets already redacted (SR-1)
|
|
2556
|
+
"description": "RFC 0064 (when `capabilities.toolHooks.prePostEvents`). SHA-256 over RFC 8785 JCS-canonicalized args with resolved secrets already redacted (SR-1) \u2014 the SIEM-safe, content-free alternative to `inputs`. Raw key material MUST NOT enter the hash input."
|
|
2547
2557
|
},
|
|
2548
2558
|
"principal": {
|
|
2549
2559
|
"type": "string",
|
|
@@ -2561,7 +2571,7 @@
|
|
|
2561
2571
|
"causationHostId": {
|
|
2562
2572
|
"type": "string",
|
|
2563
2573
|
"minLength": 1,
|
|
2564
|
-
"description": "RFC 0040
|
|
2574
|
+
"description": "RFC 0040 \u00a7A \u2014 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`."
|
|
2565
2575
|
}
|
|
2566
2576
|
},
|
|
2567
2577
|
"additionalProperties": false
|
|
@@ -2611,29 +2621,39 @@
|
|
|
2611
2621
|
"causationHostId": {
|
|
2612
2622
|
"type": "string",
|
|
2613
2623
|
"minLength": 1,
|
|
2614
|
-
"description": "RFC 0040
|
|
2624
|
+
"description": "RFC 0040 \u00a7A \u2014 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`."
|
|
2615
2625
|
}
|
|
2616
2626
|
},
|
|
2617
2627
|
"additionalProperties": false
|
|
2618
2628
|
},
|
|
2619
2629
|
"agentHandoff": {
|
|
2620
2630
|
"type": "object",
|
|
2621
|
-
"description": "Multi-Agent Shift Phase 1. Emitted when control transfers from one agent to another mid-run (e.g., orchestrator
|
|
2631
|
+
"description": "Multi-Agent Shift Phase 1. Emitted when control transfers from one agent to another mid-run (e.g., orchestrator \u2192 worker, worker \u2192 worker via `core.dispatch`). Pairs with the receiving agent's subsequent `agent.decided` / `agent.toolCalled` / `node.started`.",
|
|
2622
2632
|
"required": [
|
|
2623
2633
|
"fromAgentId",
|
|
2624
2634
|
"toAgentId"
|
|
2625
2635
|
],
|
|
2626
2636
|
"properties": {
|
|
2627
2637
|
"fromAgentId": {
|
|
2628
|
-
"
|
|
2629
|
-
|
|
2630
|
-
|
|
2638
|
+
"allOf": [
|
|
2639
|
+
{
|
|
2640
|
+
"$ref": "ids.schema.json#/$defs/agentId"
|
|
2641
|
+
},
|
|
2642
|
+
{
|
|
2643
|
+
"minLength": 3
|
|
2644
|
+
}
|
|
2645
|
+
],
|
|
2631
2646
|
"description": "Agent surrendering control."
|
|
2632
2647
|
},
|
|
2633
2648
|
"toAgentId": {
|
|
2634
|
-
"
|
|
2635
|
-
|
|
2636
|
-
|
|
2649
|
+
"allOf": [
|
|
2650
|
+
{
|
|
2651
|
+
"$ref": "ids.schema.json#/$defs/agentId"
|
|
2652
|
+
},
|
|
2653
|
+
{
|
|
2654
|
+
"minLength": 3
|
|
2655
|
+
}
|
|
2656
|
+
],
|
|
2637
2657
|
"description": "Agent receiving control."
|
|
2638
2658
|
},
|
|
2639
2659
|
"reason": {
|
|
@@ -2643,7 +2663,7 @@
|
|
|
2643
2663
|
"causationHostId": {
|
|
2644
2664
|
"type": "string",
|
|
2645
2665
|
"minLength": 1,
|
|
2646
|
-
"description": "RFC 0040
|
|
2666
|
+
"description": "RFC 0040 \u00a7A \u2014 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`."
|
|
2647
2667
|
}
|
|
2648
2668
|
},
|
|
2649
2669
|
"additionalProperties": false
|
|
@@ -2666,12 +2686,12 @@
|
|
|
2666
2686
|
"type": "number",
|
|
2667
2687
|
"minimum": 0,
|
|
2668
2688
|
"maximum": 1,
|
|
2669
|
-
"description": "Optional confidence in `[0, 1]`. Below the threshold
|
|
2689
|
+
"description": "Optional confidence in `[0, 1]`. Below the threshold \u2192 escalate via `node.suspended { reason: 'low-confidence' }`. Absent values are treated as 'no signal' \u2014 no escalation."
|
|
2670
2690
|
},
|
|
2671
2691
|
"causationHostId": {
|
|
2672
2692
|
"type": "string",
|
|
2673
2693
|
"minLength": 1,
|
|
2674
|
-
"description": "RFC 0040
|
|
2694
|
+
"description": "RFC 0040 \u00a7A \u2014 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`."
|
|
2675
2695
|
}
|
|
2676
2696
|
},
|
|
2677
2697
|
"additionalProperties": false
|
|
@@ -2692,7 +2712,7 @@
|
|
|
2692
2712
|
"target": {
|
|
2693
2713
|
"type": "string",
|
|
2694
2714
|
"minLength": 1,
|
|
2695
|
-
"description": "Opaque reference to what was checked
|
|
2715
|
+
"description": "Opaque reference to what was checked \u2014 the eventId of the verified `agent.decided`, a child runId, or a tool callId. Chains the verdict to its subject."
|
|
2696
2716
|
},
|
|
2697
2717
|
"verdict": {
|
|
2698
2718
|
"type": "string",
|
|
@@ -2710,18 +2730,18 @@
|
|
|
2710
2730
|
"minLength": 1
|
|
2711
2731
|
},
|
|
2712
2732
|
"uniqueItems": true,
|
|
2713
|
-
"description": "Optional closed list of the criteria KEYS evaluated (e.g. `[\"schema-valid\",\"grounded\"]`). Keys only
|
|
2733
|
+
"description": "Optional closed list of the criteria KEYS evaluated (e.g. `[\"schema-valid\",\"grounded\"]`). Keys only \u2014 never per-criterion verdict text \u2014 for SIEM safety."
|
|
2714
2734
|
},
|
|
2715
2735
|
"confidence": {
|
|
2716
2736
|
"type": "number",
|
|
2717
2737
|
"minimum": 0,
|
|
2718
2738
|
"maximum": 1,
|
|
2719
|
-
"description": "Optional verifier confidence in `[0,1]`
|
|
2739
|
+
"description": "Optional verifier confidence in `[0,1]` \u2014 the critic's confidence in its OWN verdict, distinct from the actor's `agent.decided.confidence`. MAY drive the RFC 0039 escalation contract."
|
|
2720
2740
|
},
|
|
2721
2741
|
"causationHostId": {
|
|
2722
2742
|
"type": "string",
|
|
2723
2743
|
"minLength": 1,
|
|
2724
|
-
"description": "RFC 0040
|
|
2744
|
+
"description": "RFC 0040 \u00a7A \u2014 cross-host causation pointer when the verified target lives on a different host."
|
|
2725
2745
|
}
|
|
2726
2746
|
},
|
|
2727
2747
|
"additionalProperties": false
|
|
@@ -2736,7 +2756,7 @@
|
|
|
2736
2756
|
"properties": {
|
|
2737
2757
|
"agentId": {
|
|
2738
2758
|
"$ref": "ids.schema.json#/$defs/agentId",
|
|
2739
|
-
"description": "AgentRef.agentId of the orchestrator. MUST equal `RunSnapshot.runOrchestrator.agentId` for the run's lifetime
|
|
2759
|
+
"description": "AgentRef.agentId of the orchestrator. MUST equal `RunSnapshot.runOrchestrator.agentId` for the run's lifetime \u2014 orchestrator identity is set at first decision and does not change."
|
|
2740
2760
|
},
|
|
2741
2761
|
"decision": {
|
|
2742
2762
|
"$ref": "orchestrator-decision.schema.json"
|
|
@@ -2744,32 +2764,30 @@
|
|
|
2744
2764
|
"iteration": {
|
|
2745
2765
|
"type": "integer",
|
|
2746
2766
|
"minimum": 1,
|
|
2747
|
-
"description": "RFC 0061 (`multiAgent.executionModel.version >= 5`). 1-based, monotonic count of orchestrator turns in this run
|
|
2767
|
+
"description": "RFC 0061 (`multiAgent.executionModel.version >= 5`). 1-based, monotonic count of orchestrator turns in this run \u2014 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`."
|
|
2748
2768
|
},
|
|
2749
2769
|
"causationHostId": {
|
|
2750
2770
|
"type": "string",
|
|
2751
2771
|
"minLength": 1,
|
|
2752
|
-
"description": "RFC 0040
|
|
2772
|
+
"description": "RFC 0040 \u00a7A \u2014 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`."
|
|
2753
2773
|
}
|
|
2754
2774
|
},
|
|
2755
2775
|
"additionalProperties": false
|
|
2756
2776
|
},
|
|
2757
2777
|
"nodeDispatched": {
|
|
2758
2778
|
"type": "object",
|
|
2759
|
-
"description": "Emitted by `core.dispatch` (RFC 0007
|
|
2779
|
+
"description": "Emitted by `core.dispatch` (RFC 0007 \u00a7D + RFC 0022 \u00a7A) 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 \u2192 child linkage without scanning the runs table.",
|
|
2760
2780
|
"required": [
|
|
2761
2781
|
"childRunId",
|
|
2762
2782
|
"childWorkflowId"
|
|
2763
2783
|
],
|
|
2764
2784
|
"properties": {
|
|
2765
2785
|
"childRunId": {
|
|
2766
|
-
"
|
|
2767
|
-
"minLength": 1,
|
|
2786
|
+
"$ref": "ids.schema.json#/$defs/runId",
|
|
2768
2787
|
"description": "RunId of the spawned child run."
|
|
2769
2788
|
},
|
|
2770
2789
|
"childWorkflowId": {
|
|
2771
|
-
"
|
|
2772
|
-
"minLength": 1,
|
|
2790
|
+
"$ref": "ids.schema.json#/$defs/workflowId",
|
|
2773
2791
|
"description": "WorkflowId of the spawned child."
|
|
2774
2792
|
},
|
|
2775
2793
|
"childStatus": {
|
|
@@ -2781,7 +2799,7 @@
|
|
|
2781
2799
|
},
|
|
2782
2800
|
"dispatchFanOut": {
|
|
2783
2801
|
"type": "object",
|
|
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
|
|
2802
|
+
"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 \u2192 fan-out. Emitted ONLY on the parallel path.",
|
|
2785
2803
|
"required": [
|
|
2786
2804
|
"fanOutPolicy",
|
|
2787
2805
|
"childCount"
|
|
@@ -2789,7 +2807,7 @@
|
|
|
2789
2807
|
"properties": {
|
|
2790
2808
|
"fanOutPolicy": {
|
|
2791
2809
|
"const": "parallel",
|
|
2792
|
-
"description": "Always `\"parallel\"`
|
|
2810
|
+
"description": "Always `\"parallel\"` \u2014 this event is emitted only on the parallel fan-out path."
|
|
2793
2811
|
},
|
|
2794
2812
|
"childCount": {
|
|
2795
2813
|
"type": "integer",
|
|
@@ -2799,7 +2817,7 @@
|
|
|
2799
2817
|
"maxConcurrency": {
|
|
2800
2818
|
"type": "integer",
|
|
2801
2819
|
"minimum": 1,
|
|
2802
|
-
"description": "Effective concurrency ceiling for the wave (`min(config.maxConcurrency ??
|
|
2820
|
+
"description": "Effective concurrency ceiling for the wave (`min(config.maxConcurrency ?? \u221e, capabilities.dispatch.maxFanOut ?? \u221e)`), when bounded."
|
|
2803
2821
|
},
|
|
2804
2822
|
"joinMode": {
|
|
2805
2823
|
"type": "string",
|
|
@@ -2831,7 +2849,7 @@
|
|
|
2831
2849
|
"failed",
|
|
2832
2850
|
"partial"
|
|
2833
2851
|
],
|
|
2834
|
-
"description": "`'satisfied'`
|
|
2852
|
+
"description": "`'satisfied'` \u2014 `mode` met and `onChildFailure` did not fail the node. `'failed'` \u2014 `onChildFailure: 'fail-fast'` tripped, or `mode` could not be satisfied (e.g. quorum unreachable); the dispatch node fails. `'partial'` \u2014 `mode` satisfied but \u22651 child is non-`completed` under `collect`/`absorb`; the node SUCCEEDS."
|
|
2835
2853
|
},
|
|
2836
2854
|
"completedCount": {
|
|
2837
2855
|
"type": "integer",
|
|
@@ -2853,7 +2871,7 @@
|
|
|
2853
2871
|
"items": {
|
|
2854
2872
|
"type": "string"
|
|
2855
2873
|
},
|
|
2856
|
-
"description": "`childRunId`s in the parent host's observed wall-clock terminal order
|
|
2874
|
+
"description": "`childRunId`s in the parent host's observed wall-clock terminal order \u2014 the replay-deterministic tiebreak for colliding `outputMapping` keys. Recorded at terminal-fold time; never recomputed from child timestamps."
|
|
2857
2875
|
}
|
|
2858
2876
|
},
|
|
2859
2877
|
"additionalProperties": false
|
|
@@ -2928,7 +2946,7 @@
|
|
|
2928
2946
|
},
|
|
2929
2947
|
"memoryCompacted": {
|
|
2930
2948
|
"type": "object",
|
|
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
|
|
2949
|
+
"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 \u00a7D) applies: the host MUST route compacted entry content through the same BYOK redaction harness applied to a fresh `put`.",
|
|
2932
2950
|
"required": [
|
|
2933
2951
|
"memoryRef",
|
|
2934
2952
|
"outputId",
|
|
@@ -2940,7 +2958,7 @@
|
|
|
2940
2958
|
"memoryRef": {
|
|
2941
2959
|
"type": "string",
|
|
2942
2960
|
"minLength": 1,
|
|
2943
|
-
"description": "Opaque MemoryAdapter handle per RFC 0004
|
|
2961
|
+
"description": "Opaque MemoryAdapter handle per RFC 0004 \u00a7C. Bounds compaction to a single memory scope."
|
|
2944
2962
|
},
|
|
2945
2963
|
"outputId": {
|
|
2946
2964
|
"type": "string",
|
|
@@ -2953,7 +2971,7 @@
|
|
|
2953
2971
|
"type": "string",
|
|
2954
2972
|
"minLength": 1
|
|
2955
2973
|
},
|
|
2956
|
-
"description": "Ids of entries collapsed into outputId. Hosts MAY omit when sourceCount > 100; the `compacted-from:<runId>` tag convention (RFC 0012
|
|
2974
|
+
"description": "Ids of entries collapsed into outputId. Hosts MAY omit when sourceCount > 100; the `compacted-from:<runId>` tag convention (RFC 0012 \u00a7C) becomes the authoritative provenance signal. When present, MUST be exhaustive within the array (no 'and N more' semantics)."
|
|
2957
2975
|
},
|
|
2958
2976
|
"sourceCount": {
|
|
2959
2977
|
"type": "integer",
|
|
@@ -2976,7 +2994,7 @@
|
|
|
2976
2994
|
},
|
|
2977
2995
|
"distillation": {
|
|
2978
2996
|
"type": "object",
|
|
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
|
|
2997
|
+
"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 \u2014 not a parallel `memory.distilled` event.",
|
|
2980
2998
|
"additionalProperties": false,
|
|
2981
2999
|
"required": [
|
|
2982
3000
|
"tokenBudget",
|
|
@@ -2986,12 +3004,12 @@
|
|
|
2986
3004
|
"tokenBudget": {
|
|
2987
3005
|
"type": "integer",
|
|
2988
3006
|
"minimum": 1,
|
|
2989
|
-
"description": "Effective per-run budget honored (
|
|
3007
|
+
"description": "Effective per-run budget honored (\u2264 advertised `maxTokenBudget`), counted against the advertised `tokenizerName`."
|
|
2990
3008
|
},
|
|
2991
3009
|
"tokensUsed": {
|
|
2992
3010
|
"type": "integer",
|
|
2993
3011
|
"minimum": 0,
|
|
2994
|
-
"description": "Total input+output tokens the distillation consumed, best-effort-honest per the advertised tokenizer (
|
|
3012
|
+
"description": "Total input+output tokens the distillation consumed, best-effort-honest per the advertised tokenizer (\u00b110% tolerance). MUST be \u2264 `tokenBudget` on a successful run."
|
|
2995
3013
|
},
|
|
2996
3014
|
"indexUpdated": {
|
|
2997
3015
|
"type": "boolean",
|
|
@@ -3004,7 +3022,7 @@
|
|
|
3004
3022
|
},
|
|
3005
3023
|
"memoryWritten": {
|
|
3006
3024
|
"type": "object",
|
|
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
|
|
3025
|
+
"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 \u2014 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.",
|
|
3008
3026
|
"required": [
|
|
3009
3027
|
"memoryRef",
|
|
3010
3028
|
"memoryId"
|
|
@@ -3013,7 +3031,7 @@
|
|
|
3013
3031
|
"memoryRef": {
|
|
3014
3032
|
"type": "string",
|
|
3015
3033
|
"minLength": 1,
|
|
3016
|
-
"description": "Opaque MemoryAdapter handle (RFC 0004
|
|
3034
|
+
"description": "Opaque MemoryAdapter handle (RFC 0004 \u00a7C) the entry was written under; resolvable via the read-side."
|
|
3017
3035
|
},
|
|
3018
3036
|
"memoryId": {
|
|
3019
3037
|
"type": "string",
|
|
@@ -3022,25 +3040,25 @@
|
|
|
3022
3040
|
},
|
|
3023
3041
|
"nodeId": {
|
|
3024
3042
|
"$ref": "ids.schema.json#/$defs/nodeId",
|
|
3025
|
-
"description": "SHOULD
|
|
3043
|
+
"description": "SHOULD \u2014 the node whose execution caused the write. Omitted only for writes with no node attribution (e.g. host session-end auto-memory)."
|
|
3026
3044
|
},
|
|
3027
3045
|
"agentId": {
|
|
3028
3046
|
"$ref": "ids.schema.json#/$defs/agentId",
|
|
3029
|
-
"description": "MAY
|
|
3047
|
+
"description": "MAY \u2014 the agent identity (AgentRef per RFC 0002) behind the write, when known."
|
|
3030
3048
|
},
|
|
3031
3049
|
"tags": {
|
|
3032
3050
|
"type": "array",
|
|
3033
3051
|
"items": {
|
|
3034
3052
|
"type": "string"
|
|
3035
3053
|
},
|
|
3036
|
-
"description": "MAY
|
|
3054
|
+
"description": "MAY \u2014 the entry's non-secret labels. MUST NOT carry secret material (the no-content invariant covers payload bodies)."
|
|
3037
3055
|
}
|
|
3038
3056
|
},
|
|
3039
3057
|
"additionalProperties": false
|
|
3040
3058
|
},
|
|
3041
3059
|
"agentMemoryConsolidated": {
|
|
3042
3060
|
"type": "object",
|
|
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
|
|
3061
|
+
"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 \u2014 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.",
|
|
3044
3062
|
"required": [
|
|
3045
3063
|
"memoryRef",
|
|
3046
3064
|
"inputCount",
|
|
@@ -3050,7 +3068,7 @@
|
|
|
3050
3068
|
"memoryRef": {
|
|
3051
3069
|
"type": "string",
|
|
3052
3070
|
"minLength": 1,
|
|
3053
|
-
"description": "Opaque MemoryAdapter handle (RFC 0004
|
|
3071
|
+
"description": "Opaque MemoryAdapter handle (RFC 0004 \u00a7C) the consolidation pass operated over. Bounds the pass to a single memory scope (CTI-1)."
|
|
3054
3072
|
},
|
|
3055
3073
|
"inputCount": {
|
|
3056
3074
|
"type": "integer",
|
|
@@ -3068,7 +3086,7 @@
|
|
|
3068
3086
|
"type": "string",
|
|
3069
3087
|
"minLength": 1
|
|
3070
3088
|
},
|
|
3071
|
-
"description": "MAY
|
|
3089
|
+
"description": "MAY \u2014 ids of entries collapsed/superseded by the pass. Hosts MAY omit when inputCount is large; consumers MUST tolerate absence."
|
|
3072
3090
|
},
|
|
3073
3091
|
"trigger": {
|
|
3074
3092
|
"type": "string",
|
|
@@ -3077,14 +3095,14 @@
|
|
|
3077
3095
|
"scheduled",
|
|
3078
3096
|
"on-demand"
|
|
3079
3097
|
],
|
|
3080
|
-
"description": "MAY
|
|
3098
|
+
"description": "MAY \u2014 which initiation path drove this pass (mirrors `agents.memoryConsolidation.schedule`)."
|
|
3081
3099
|
}
|
|
3082
3100
|
},
|
|
3083
3101
|
"additionalProperties": false
|
|
3084
3102
|
},
|
|
3085
3103
|
"commitmentFired": {
|
|
3086
3104
|
"type": "object",
|
|
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
|
|
3105
|
+
"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 \u2014 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.",
|
|
3088
3106
|
"required": [
|
|
3089
3107
|
"commitmentId",
|
|
3090
3108
|
"memoryRef",
|
|
@@ -3104,7 +3122,7 @@
|
|
|
3104
3122
|
"memoryId": {
|
|
3105
3123
|
"type": "string",
|
|
3106
3124
|
"minLength": 1,
|
|
3107
|
-
"description": "MAY
|
|
3125
|
+
"description": "MAY \u2014 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."
|
|
3108
3126
|
},
|
|
3109
3127
|
"condition": {
|
|
3110
3128
|
"type": "string",
|
|
@@ -3115,16 +3133,15 @@
|
|
|
3115
3133
|
"description": "Which fire-condition kind triggered. `time` composes RFC 0052; `predicate` composes RFC 0060."
|
|
3116
3134
|
},
|
|
3117
3135
|
"enqueuedRunId": {
|
|
3118
|
-
"
|
|
3119
|
-
"
|
|
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."
|
|
3136
|
+
"$ref": "ids.schema.json#/$defs/runId",
|
|
3137
|
+
"description": "MAY \u2014 id of the run the fired commitment enqueued, when the host initiates one. Absent when the commitment fires as a notification without a run."
|
|
3121
3138
|
}
|
|
3122
3139
|
},
|
|
3123
3140
|
"additionalProperties": false
|
|
3124
3141
|
},
|
|
3125
3142
|
"agentInvocationStarted": {
|
|
3126
3143
|
"type": "object",
|
|
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
|
|
3144
|
+
"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 \u2014 prompt/task content is served by the run's normal projection, never on this event. A recorded-fact event per `replay.md` \u00a7\"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.",
|
|
3128
3145
|
"required": [
|
|
3129
3146
|
"invocationId",
|
|
3130
3147
|
"agentId",
|
|
@@ -3134,7 +3151,7 @@
|
|
|
3134
3151
|
"invocationId": {
|
|
3135
3152
|
"type": "string",
|
|
3136
3153
|
"minLength": 1,
|
|
3137
|
-
"description": "Host-defined id correlating this agent invocation within its run, UNIQUE-WITHIN-RUN (not a mandated global id-space). Distinct from `runId`
|
|
3154
|
+
"description": "Host-defined id correlating this agent invocation within its run, UNIQUE-WITHIN-RUN (not a mandated global id-space). Distinct from `runId` \u2014 one run MAY dispatch several invocations (multiple agent nodes, or a handoff chain) \u2014 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` \u00a7\"Recorded-fact events\"). Correlates to the matching `agent.invocation.completed`."
|
|
3138
3155
|
},
|
|
3139
3156
|
"agentId": {
|
|
3140
3157
|
"$ref": "ids.schema.json#/$defs/agentId",
|
|
@@ -3151,39 +3168,39 @@
|
|
|
3151
3168
|
},
|
|
3152
3169
|
"modelClass": {
|
|
3153
3170
|
"type": "string",
|
|
3154
|
-
"description": "MAY
|
|
3171
|
+
"description": "MAY \u2014 the manifest's abstract `modelClass`. Always populatable at start."
|
|
3155
3172
|
},
|
|
3156
3173
|
"resolvedModel": {
|
|
3157
3174
|
"type": "string",
|
|
3158
|
-
"description": "MAY
|
|
3175
|
+
"description": "MAY \u2014 the concrete model the host selected. OPTIONAL: modelClass\u2192concrete 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."
|
|
3159
3176
|
},
|
|
3160
3177
|
"resolvedProvider": {
|
|
3161
3178
|
"type": "string",
|
|
3162
|
-
"description": "MAY
|
|
3179
|
+
"description": "MAY \u2014 the concrete provider the host routed to (aligns with `capabilities.aiProviders.supported` / RFC 0067 `authModes`). OPTIONAL, same rationale as `resolvedModel`."
|
|
3163
3180
|
},
|
|
3164
3181
|
"resolvedAgentVersion": {
|
|
3165
3182
|
"type": "string",
|
|
3166
|
-
"description": "MAY
|
|
3183
|
+
"description": "MAY \u2014 RFC 0082 \u00a7B. 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."
|
|
3167
3184
|
},
|
|
3168
3185
|
"resolvedChannel": {
|
|
3169
3186
|
"type": "string",
|
|
3170
|
-
"description": "MAY
|
|
3187
|
+
"description": "MAY \u2014 RFC 0082 \u00a7B. 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."
|
|
3171
3188
|
},
|
|
3172
3189
|
"toolSurfaceCount": {
|
|
3173
3190
|
"type": "integer",
|
|
3174
3191
|
"minimum": 0,
|
|
3175
|
-
"description": "MAY
|
|
3192
|
+
"description": "MAY \u2014 number of tools in the constructed surface after `toolAllowlist` filtering. Content-free count, not the tool ids."
|
|
3176
3193
|
},
|
|
3177
3194
|
"memoryBound": {
|
|
3178
3195
|
"type": "boolean",
|
|
3179
|
-
"description": "MAY
|
|
3196
|
+
"description": "MAY \u2014 whether a long-term memory backend was bound for the invocation."
|
|
3180
3197
|
}
|
|
3181
3198
|
},
|
|
3182
3199
|
"additionalProperties": false
|
|
3183
3200
|
},
|
|
3184
3201
|
"agentInvocationCompleted": {
|
|
3185
3202
|
"type": "object",
|
|
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
|
|
3203
|
+
"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 \u2014 the result body is served by the run's normal projection. A recorded-fact event per `replay.md` \u00a7\"Recorded-fact events\": re-read from the log on replay, never regenerated.",
|
|
3187
3204
|
"required": [
|
|
3188
3205
|
"invocationId",
|
|
3189
3206
|
"agentId",
|
|
@@ -3208,28 +3225,27 @@
|
|
|
3208
3225
|
"refused",
|
|
3209
3226
|
"failed"
|
|
3210
3227
|
],
|
|
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
|
|
3228
|
+
"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 \u00a7F). `refused`: the model refused (RFC 0032 refusal envelope) \u2014 never a silent substitution. `failed`: an error terminated the invocation."
|
|
3212
3229
|
},
|
|
3213
3230
|
"schemaValidated": {
|
|
3214
3231
|
"type": "boolean",
|
|
3215
|
-
"description": "MAY
|
|
3232
|
+
"description": "MAY \u2014 whether the terminal result was validated against `handoff.returnSchemaRef` (true only when `liveRuntime.structuredOutput` is advertised and a `returnSchemaRef` exists)."
|
|
3216
3233
|
},
|
|
3217
3234
|
"confidence": {
|
|
3218
3235
|
"type": "number",
|
|
3219
3236
|
"minimum": 0,
|
|
3220
3237
|
"maximum": 1,
|
|
3221
|
-
"description": "MAY
|
|
3238
|
+
"description": "MAY \u2014 the terminal `agent.decided` confidence, mirrored for convenience. Content-free scalar."
|
|
3222
3239
|
},
|
|
3223
3240
|
"enqueuedRunId": {
|
|
3224
|
-
"
|
|
3225
|
-
"
|
|
3226
|
-
"description": "MAY — id of a follow-on run the invocation enqueued (e.g. a sub-run), when applicable."
|
|
3241
|
+
"$ref": "ids.schema.json#/$defs/runId",
|
|
3242
|
+
"description": "MAY \u2014 id of a follow-on run the invocation enqueued (e.g. a sub-run), when applicable."
|
|
3227
3243
|
}
|
|
3228
3244
|
},
|
|
3229
3245
|
"additionalProperties": false
|
|
3230
3246
|
},
|
|
3231
3247
|
"workspaceUpdated": {
|
|
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
|
|
3248
|
+
"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 \u2014 the file body is served by the read-side (`GET /v1/host/workspace/files/{path}`), already SR-1-redacted (RFC 0059 \u00a7E 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.",
|
|
3233
3249
|
"type": "object",
|
|
3234
3250
|
"additionalProperties": false,
|
|
3235
3251
|
"required": [
|
|
@@ -3251,7 +3267,7 @@
|
|
|
3251
3267
|
},
|
|
3252
3268
|
"evalStarted": {
|
|
3253
3269
|
"type": "object",
|
|
3254
|
-
"description": "RFC 0081
|
|
3270
|
+
"description": "RFC 0081 \u00a7C. Emitted ONCE at the start of an eval run (a `mode: \"eval\"` run, RFC 0081 \u00a7B) by a host advertising `capabilities.agents.evalSuite.supported: true`. Content-free: suite provenance + counts only. A recorded-fact event per `replay.md` \u00a7\"Recorded-fact events\".",
|
|
3255
3271
|
"required": [
|
|
3256
3272
|
"suiteId",
|
|
3257
3273
|
"suiteVersion",
|
|
@@ -3287,19 +3303,18 @@
|
|
|
3287
3303
|
"live-shadow"
|
|
3288
3304
|
]
|
|
3289
3305
|
},
|
|
3290
|
-
"description": "The eval modes this run exercises (RFC 0081
|
|
3306
|
+
"description": "The eval modes this run exercises (RFC 0081 \u00a7D)."
|
|
3291
3307
|
},
|
|
3292
3308
|
"baselineRunId": {
|
|
3293
|
-
"
|
|
3294
|
-
"
|
|
3295
|
-
"description": "MAY — for `regression` mode, the prior eval run this run is scored against."
|
|
3309
|
+
"$ref": "ids.schema.json#/$defs/runId",
|
|
3310
|
+
"description": "MAY \u2014 for `regression` mode, the prior eval run this run is scored against."
|
|
3296
3311
|
}
|
|
3297
3312
|
},
|
|
3298
3313
|
"additionalProperties": false
|
|
3299
3314
|
},
|
|
3300
3315
|
"evalScored": {
|
|
3301
3316
|
"type": "object",
|
|
3302
|
-
"description": "RFC 0081
|
|
3317
|
+
"description": "RFC 0081 \u00a7C. 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 \u2014 NEVER the task output, rubric prose, or model completion (SECURITY invariant `eval-summary-no-content-leak`). A recorded-fact event.",
|
|
3303
3318
|
"required": [
|
|
3304
3319
|
"taskId",
|
|
3305
3320
|
"score",
|
|
@@ -3315,7 +3330,7 @@
|
|
|
3315
3330
|
"type": "number",
|
|
3316
3331
|
"minimum": 0,
|
|
3317
3332
|
"maximum": 1,
|
|
3318
|
-
"description": "Task score (0.0
|
|
3333
|
+
"description": "Task score (0.0\u20131.0)."
|
|
3319
3334
|
},
|
|
3320
3335
|
"passed": {
|
|
3321
3336
|
"type": "boolean",
|
|
@@ -3324,28 +3339,28 @@
|
|
|
3324
3339
|
"costUsd": {
|
|
3325
3340
|
"type": "number",
|
|
3326
3341
|
"minimum": 0,
|
|
3327
|
-
"description": "MAY
|
|
3342
|
+
"description": "MAY \u2014 task cost (scalar; summed from RFC 0026 `provider.usage`). NEVER a pricing breakdown."
|
|
3328
3343
|
},
|
|
3329
3344
|
"latencyMs": {
|
|
3330
3345
|
"type": "integer",
|
|
3331
3346
|
"minimum": 0,
|
|
3332
|
-
"description": "MAY
|
|
3347
|
+
"description": "MAY \u2014 task wall-clock latency."
|
|
3333
3348
|
},
|
|
3334
3349
|
"schemaValid": {
|
|
3335
3350
|
"type": "boolean",
|
|
3336
|
-
"description": "MAY
|
|
3351
|
+
"description": "MAY \u2014 whether the output validated against `handoff.returnSchemaRef`."
|
|
3337
3352
|
},
|
|
3338
3353
|
"safetyFindingCount": {
|
|
3339
3354
|
"type": "integer",
|
|
3340
3355
|
"minimum": 0,
|
|
3341
|
-
"description": "MAY
|
|
3356
|
+
"description": "MAY \u2014 count of safety findings for the task (the redaction-safe descriptors live on `EvalSummary`; the event carries the count only)."
|
|
3342
3357
|
}
|
|
3343
3358
|
},
|
|
3344
3359
|
"additionalProperties": false
|
|
3345
3360
|
},
|
|
3346
3361
|
"evalCompleted": {
|
|
3347
3362
|
"type": "object",
|
|
3348
|
-
"description": "RFC 0081
|
|
3363
|
+
"description": "RFC 0081 \u00a7C. 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`.",
|
|
3349
3364
|
"required": [
|
|
3350
3365
|
"aggregateScore",
|
|
3351
3366
|
"passed",
|
|
@@ -3357,11 +3372,11 @@
|
|
|
3357
3372
|
"type": "number",
|
|
3358
3373
|
"minimum": 0,
|
|
3359
3374
|
"maximum": 1,
|
|
3360
|
-
"description": "The suite-level score (0.0
|
|
3375
|
+
"description": "The suite-level score (0.0\u20131.0)."
|
|
3361
3376
|
},
|
|
3362
3377
|
"passed": {
|
|
3363
3378
|
"type": "boolean",
|
|
3364
|
-
"description": "Whether the run cleared the suite thresholds
|
|
3379
|
+
"description": "Whether the run cleared the suite thresholds \u2014 the flag an RFC 0082 deployment gate MAY require."
|
|
3365
3380
|
},
|
|
3366
3381
|
"taskCount": {
|
|
3367
3382
|
"type": "integer",
|
|
@@ -3377,14 +3392,14 @@
|
|
|
3377
3392
|
"type": "number",
|
|
3378
3393
|
"minimum": -1,
|
|
3379
3394
|
"maximum": 1,
|
|
3380
|
-
"description": "MAY
|
|
3395
|
+
"description": "MAY \u2014 for `regression` mode, `aggregateScore` minus the baseline's (negative \u21d2 regression)."
|
|
3381
3396
|
}
|
|
3382
3397
|
},
|
|
3383
3398
|
"additionalProperties": false
|
|
3384
3399
|
},
|
|
3385
3400
|
"toolSessionOpened": {
|
|
3386
3401
|
"type": "object",
|
|
3387
|
-
"description": "RFC 0078
|
|
3402
|
+
"description": "RFC 0078 \u00a7D. 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 \u2014 never tool arguments, results, or credential material (SR-1). Emitted only when `capabilities.toolCatalog.sessionLifecycle: true`.",
|
|
3388
3403
|
"required": [
|
|
3389
3404
|
"sessionId",
|
|
3390
3405
|
"toolId"
|
|
@@ -3405,7 +3420,7 @@
|
|
|
3405
3420
|
},
|
|
3406
3421
|
"toolSessionClosed": {
|
|
3407
3422
|
"type": "object",
|
|
3408
|
-
"description": "RFC 0078
|
|
3423
|
+
"description": "RFC 0078 \u00a7D. Emitted when the host closes a multi-step tool session opened by `tool.session.opened`. Content-free: identifiers + a closed-enum outcome only \u2014 never tool arguments, results, or credential material (SR-1).",
|
|
3409
3424
|
"required": [
|
|
3410
3425
|
"sessionId",
|
|
3411
3426
|
"toolId",
|
|
@@ -3429,14 +3444,14 @@
|
|
|
3429
3444
|
"failed",
|
|
3430
3445
|
"cancelled"
|
|
3431
3446
|
],
|
|
3432
|
-
"description": "Terminal disposition of the session. Content-free
|
|
3447
|
+
"description": "Terminal disposition of the session. Content-free \u2014 no failure detail/result on the payload."
|
|
3433
3448
|
}
|
|
3434
3449
|
},
|
|
3435
3450
|
"additionalProperties": false
|
|
3436
3451
|
},
|
|
3437
3452
|
"egressDecided": {
|
|
3438
3453
|
"type": "object",
|
|
3439
|
-
"description": "RFC 0079
|
|
3454
|
+
"description": "RFC 0079 \u00a7B. 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 \u2014 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`.",
|
|
3440
3455
|
"required": [
|
|
3441
3456
|
"decision",
|
|
3442
3457
|
"destination"
|
|
@@ -3450,17 +3465,17 @@
|
|
|
3450
3465
|
"downgraded",
|
|
3451
3466
|
"approval-required"
|
|
3452
3467
|
],
|
|
3453
|
-
"description": "`allowed`: egress proceeds with the credential; `denied`: blocked (out-of-audience / expired / SSRF / unevaluable provenance
|
|
3468
|
+
"description": "`allowed`: egress proceeds with the credential; `denied`: blocked (out-of-audience / expired / SSRF / unevaluable provenance \u2014 fail-closed); `downgraded`: proceeds WITHOUT the credential (anonymous egress, when host policy permits); `approval-required`: suspended pending an RFC 0051 approval interrupt."
|
|
3454
3469
|
},
|
|
3455
3470
|
"destination": {
|
|
3456
3471
|
"type": "string",
|
|
3457
3472
|
"minLength": 1,
|
|
3458
|
-
"description": "The egress destination **host/authority ONLY** (`api.stripe.com`)
|
|
3473
|
+
"description": "The egress destination **host/authority ONLY** (`api.stripe.com`) \u2014 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."
|
|
3459
3474
|
},
|
|
3460
3475
|
"credentialId": {
|
|
3461
3476
|
"type": "string",
|
|
3462
3477
|
"minLength": 1,
|
|
3463
|
-
"description": "MAY
|
|
3478
|
+
"description": "MAY \u2014 the provenance `credentialId` considered (absent for an anonymous / denied-pre-credential egress)."
|
|
3464
3479
|
},
|
|
3465
3480
|
"reason": {
|
|
3466
3481
|
"type": "string",
|
|
@@ -3473,19 +3488,19 @@
|
|
|
3473
3488
|
"scope-denied",
|
|
3474
3489
|
"policy-denied"
|
|
3475
3490
|
],
|
|
3476
|
-
"description": "MAY
|
|
3491
|
+
"description": "MAY \u2014 a machine-stable reason code (a CLOSED enum \u2014 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`."
|
|
3477
3492
|
},
|
|
3478
3493
|
"auditCorrelationId": {
|
|
3479
3494
|
"type": "string",
|
|
3480
3495
|
"minLength": 1,
|
|
3481
|
-
"description": "MAY
|
|
3496
|
+
"description": "MAY \u2014 correlates to the provenance descriptor + host audit log."
|
|
3482
3497
|
}
|
|
3483
3498
|
},
|
|
3484
3499
|
"additionalProperties": false
|
|
3485
3500
|
},
|
|
3486
3501
|
"triggerSubscriptionStateChanged": {
|
|
3487
3502
|
"type": "object",
|
|
3488
|
-
"description": "RFC 0083
|
|
3503
|
+
"description": "RFC 0083 \u00a7C. Emitted when a trigger subscription changes state (the \u00a7B four-state machine). Content-free: identifiers + states only \u2014 no inbound payload, headers, or credential material (SR-1). Emitted only when `capabilities.triggerBridge.supported: true`.",
|
|
3489
3504
|
"required": [
|
|
3490
3505
|
"subscriptionId",
|
|
3491
3506
|
"source",
|
|
@@ -3540,14 +3555,14 @@
|
|
|
3540
3555
|
"source-removed",
|
|
3541
3556
|
"provenance-unevaluable"
|
|
3542
3557
|
],
|
|
3543
|
-
"description": "MAY
|
|
3558
|
+
"description": "MAY \u2014 a machine-stable reason code (a CLOSED enum \u2014 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`."
|
|
3544
3559
|
}
|
|
3545
3560
|
},
|
|
3546
3561
|
"additionalProperties": false
|
|
3547
3562
|
},
|
|
3548
3563
|
"triggerDeliveryAttempted": {
|
|
3549
3564
|
"type": "object",
|
|
3550
|
-
"description": "RFC 0083
|
|
3565
|
+
"description": "RFC 0083 \u00a7C. 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 \u2014 NEVER the inbound body, headers, or credential material (SR-1).",
|
|
3551
3566
|
"required": [
|
|
3552
3567
|
"subscriptionId",
|
|
3553
3568
|
"dedupKey",
|
|
@@ -3562,7 +3577,7 @@
|
|
|
3562
3577
|
"dedupKey": {
|
|
3563
3578
|
"type": "string",
|
|
3564
3579
|
"minLength": 1,
|
|
3565
|
-
"description": "The de-duplication key (
|
|
3580
|
+
"description": "The de-duplication key (\u00a7C-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 \u2014 a key like `POST /webhook/orders/12345?token=\u2026` would leak). A repeat within retention is a no-op returning the prior runId."
|
|
3566
3581
|
},
|
|
3567
3582
|
"attempt": {
|
|
3568
3583
|
"type": "integer",
|
|
@@ -3580,14 +3595,14 @@
|
|
|
3580
3595
|
},
|
|
3581
3596
|
"runId": {
|
|
3582
3597
|
"$ref": "ids.schema.json#/$defs/runId",
|
|
3583
|
-
"description": "MAY
|
|
3598
|
+
"description": "MAY \u2014 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`."
|
|
3584
3599
|
}
|
|
3585
3600
|
},
|
|
3586
3601
|
"additionalProperties": false
|
|
3587
3602
|
},
|
|
3588
3603
|
"budgetReserved": {
|
|
3589
3604
|
"type": "object",
|
|
3590
|
-
"description": "RFC 0084
|
|
3605
|
+
"description": "RFC 0084 \u00a7C. 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 \u2014 replay re-reads it, never re-resolves (\u00a7B). Content-free: dimension ceilings + scope only, no pricing breakdown (SR-1, `budget-no-pricing-leak`).",
|
|
3591
3606
|
"required": [
|
|
3592
3607
|
"effectiveBudget",
|
|
3593
3608
|
"scope"
|
|
@@ -3624,14 +3639,14 @@
|
|
|
3624
3639
|
"agent",
|
|
3625
3640
|
"project"
|
|
3626
3641
|
],
|
|
3627
|
-
"description": "The binding scope the effective budget resolved from (
|
|
3642
|
+
"description": "The binding scope the effective budget resolved from (\u00a7B)."
|
|
3628
3643
|
}
|
|
3629
3644
|
},
|
|
3630
3645
|
"additionalProperties": false
|
|
3631
3646
|
},
|
|
3632
3647
|
"budgetConsumed": {
|
|
3633
3648
|
"type": "object",
|
|
3634
|
-
"description": "RFC 0084
|
|
3649
|
+
"description": "RFC 0084 \u00a7C. A running projection of spend, derived from the existing events (`provider.usage` tokens/cost, `agent.toolCalled`, `node.retried`) \u2014 NOT a new measurement (no double-counting). The host MAY coalesce. Content-free: dimension name + integers only, no pricing breakdown / rate card (SR-1).",
|
|
3635
3650
|
"required": [
|
|
3636
3651
|
"dimension",
|
|
3637
3652
|
"consumed",
|
|
@@ -3660,14 +3675,14 @@
|
|
|
3660
3675
|
},
|
|
3661
3676
|
"remaining": {
|
|
3662
3677
|
"type": "number",
|
|
3663
|
-
"description": "MAY
|
|
3678
|
+
"description": "MAY \u2014 `limit - consumed`."
|
|
3664
3679
|
}
|
|
3665
3680
|
},
|
|
3666
3681
|
"additionalProperties": false
|
|
3667
3682
|
},
|
|
3668
3683
|
"budgetThresholdCrossed": {
|
|
3669
3684
|
"type": "object",
|
|
3670
|
-
"description": "RFC 0084
|
|
3685
|
+
"description": "RFC 0084 \u00a7C. Emitted once per dimension when consumption crosses `thresholdPercent`. Content-free.",
|
|
3671
3686
|
"required": [
|
|
3672
3687
|
"dimension",
|
|
3673
3688
|
"consumed",
|
|
@@ -3703,7 +3718,7 @@
|
|
|
3703
3718
|
},
|
|
3704
3719
|
"budgetExhausted": {
|
|
3705
3720
|
"type": "object",
|
|
3706
|
-
"description": "RFC 0084
|
|
3721
|
+
"description": "RFC 0084 \u00a7C. Emitted when a dimension hits its limit. For a hard dimension this is followed by `cap.breached{kind:\"budget-*\"}` \u2192 `run.failed{budget_exhausted}` (or, with `onExhaustion:\"interrupt\"`, an approval interrupt). Content-free.",
|
|
3707
3722
|
"required": [
|
|
3708
3723
|
"dimension",
|
|
3709
3724
|
"consumed",
|
|
@@ -3732,7 +3747,7 @@
|
|
|
3732
3747
|
},
|
|
3733
3748
|
"deploymentPromoted": {
|
|
3734
3749
|
"type": "object",
|
|
3735
|
-
"description": "RFC 0082
|
|
3750
|
+
"description": "RFC 0082 \u00a7D. Emitted on the deployment-management run when a version is promoted into a new lifecycle state (the \u00a7E 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 \u2014 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` \u00a7\"Recorded-fact events\". Audit-logged with the acting principal (`auth.md`).",
|
|
3736
3751
|
"additionalProperties": false,
|
|
3737
3752
|
"required": [
|
|
3738
3753
|
"agentId",
|
|
@@ -3747,7 +3762,7 @@
|
|
|
3747
3762
|
"fromVersion": {
|
|
3748
3763
|
"type": "string",
|
|
3749
3764
|
"minLength": 1,
|
|
3750
|
-
"description": "MAY
|
|
3765
|
+
"description": "MAY \u2014 the version previously occupying the target channel/state (absent on a first promotion)."
|
|
3751
3766
|
},
|
|
3752
3767
|
"toVersion": {
|
|
3753
3768
|
"type": "string",
|
|
@@ -3770,29 +3785,28 @@
|
|
|
3770
3785
|
"channel": {
|
|
3771
3786
|
"type": "string",
|
|
3772
3787
|
"minLength": 1,
|
|
3773
|
-
"description": "MAY
|
|
3788
|
+
"description": "MAY \u2014 the named channel this promotion targets (when promoting to a channel)."
|
|
3774
3789
|
},
|
|
3775
3790
|
"canaryPercent": {
|
|
3776
3791
|
"type": "integer",
|
|
3777
3792
|
"minimum": 0,
|
|
3778
3793
|
"maximum": 100,
|
|
3779
|
-
"description": "MAY
|
|
3794
|
+
"description": "MAY \u2014 the canary traffic share assigned (when promoting `active` at < 100)."
|
|
3780
3795
|
},
|
|
3781
3796
|
"evalRunId": {
|
|
3782
|
-
"
|
|
3783
|
-
"
|
|
3784
|
-
"description": "MAY — the RFC 0081 eval run whose `EvalSummary.passed` gated this promotion (the §E evidence)."
|
|
3797
|
+
"$ref": "ids.schema.json#/$defs/runId",
|
|
3798
|
+
"description": "MAY \u2014 the RFC 0081 eval run whose `EvalSummary.passed` gated this promotion (the \u00a7E evidence)."
|
|
3785
3799
|
},
|
|
3786
3800
|
"approvalGateId": {
|
|
3787
3801
|
"type": "string",
|
|
3788
3802
|
"minLength": 1,
|
|
3789
|
-
"description": "MAY
|
|
3803
|
+
"description": "MAY \u2014 the RFC 0051 approvalGate that authorized this promotion."
|
|
3790
3804
|
}
|
|
3791
3805
|
}
|
|
3792
3806
|
},
|
|
3793
3807
|
"deploymentRolledBack": {
|
|
3794
3808
|
"type": "object",
|
|
3795
|
-
"description": "RFC 0082
|
|
3809
|
+
"description": "RFC 0082 \u00a7D. 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.",
|
|
3796
3810
|
"additionalProperties": false,
|
|
3797
3811
|
"required": [
|
|
3798
3812
|
"agentId",
|
|
@@ -3823,13 +3837,13 @@
|
|
|
3823
3837
|
"reason": {
|
|
3824
3838
|
"type": "string",
|
|
3825
3839
|
"minLength": 1,
|
|
3826
|
-
"description": "MAY
|
|
3840
|
+
"description": "MAY \u2014 a short redaction-safe rollback reason label (NOT free-text content; same posture as `run.dead_lettered.reason`)."
|
|
3827
3841
|
}
|
|
3828
3842
|
}
|
|
3829
3843
|
},
|
|
3830
3844
|
"deploymentCanaryAdjusted": {
|
|
3831
3845
|
"type": "object",
|
|
3832
|
-
"description": "RFC 0082
|
|
3846
|
+
"description": "RFC 0082 \u00a7D. Emitted when an `active` version's canary traffic share changes. Content-free (`deployment-event-no-content-leak`). Recorded-fact; audit-logged.",
|
|
3833
3847
|
"additionalProperties": false,
|
|
3834
3848
|
"required": [
|
|
3835
3849
|
"agentId",
|
|
@@ -3863,7 +3877,7 @@
|
|
|
3863
3877
|
},
|
|
3864
3878
|
"deploymentStateChanged": {
|
|
3865
3879
|
"type": "object",
|
|
3866
|
-
"description": "RFC 0082
|
|
3880
|
+
"description": "RFC 0082 \u00a7D. Emitted on any non-promotion lifecycle transition (pause / resume / deprecate). Content-free (`deployment-event-no-content-leak`). Recorded-fact; audit-logged.",
|
|
3867
3881
|
"additionalProperties": false,
|
|
3868
3882
|
"required": [
|
|
3869
3883
|
"agentId",
|
|
@@ -3911,7 +3925,7 @@
|
|
|
3911
3925
|
},
|
|
3912
3926
|
"rosterRunInitiated": {
|
|
3913
3927
|
"type": "object",
|
|
3914
|
-
"description": "RFC 0086
|
|
3928
|
+
"description": "RFC 0086 \u00a7C. 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 \u2014 attributing the run to the standing agent. Content-free (`roster-attribution-no-content`): ids + persona + trigger source ONLY \u2014 never the work-item body, prompt, or credential material (SR-1). A recorded-fact event (replay.md \u00a7'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.",
|
|
3915
3929
|
"additionalProperties": false,
|
|
3916
3930
|
"required": [
|
|
3917
3931
|
"rosterId",
|
|
@@ -3945,16 +3959,15 @@
|
|
|
3945
3959
|
"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)."
|
|
3946
3960
|
},
|
|
3947
3961
|
"triggerSubscriptionId": {
|
|
3948
|
-
"
|
|
3949
|
-
"
|
|
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)."
|
|
3962
|
+
"$ref": "ids.schema.json#/$defs/subscriptionId",
|
|
3963
|
+
"description": "MAY. The RFC 0083 trigger-subscription id when the fire came through the durable trigger bridge, so trigger \u2192 run \u2192 roster is traceable via /ancestry (RFC 0040)."
|
|
3951
3964
|
}
|
|
3952
3965
|
}
|
|
3953
3966
|
},
|
|
3954
3967
|
"compensationRequested": {
|
|
3955
3968
|
"type": "object",
|
|
3956
3969
|
"additionalProperties": false,
|
|
3957
|
-
"description": "RFC 0151
|
|
3970
|
+
"description": "RFC 0151 \u00a7D \u2014 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 (\u00a7D/\u00a7G) \u2014 these land in the durable log, the least revocable place a credential can reach.",
|
|
3958
3971
|
"properties": {
|
|
3959
3972
|
"compensationId": {
|
|
3960
3973
|
"type": "string",
|
|
@@ -3981,7 +3994,7 @@
|
|
|
3981
3994
|
"compensationStarted": {
|
|
3982
3995
|
"type": "object",
|
|
3983
3996
|
"additionalProperties": false,
|
|
3984
|
-
"description": "RFC 0151
|
|
3997
|
+
"description": "RFC 0151 \u00a7D \u2014 first inverse action started. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (\u00a7D/\u00a7G) \u2014 these land in the durable log, the least revocable place a credential can reach.",
|
|
3985
3998
|
"properties": {
|
|
3986
3999
|
"compensationId": {
|
|
3987
4000
|
"type": "string",
|
|
@@ -4008,7 +4021,7 @@
|
|
|
4008
4021
|
"compensationCompleted": {
|
|
4009
4022
|
"type": "object",
|
|
4010
4023
|
"additionalProperties": false,
|
|
4011
|
-
"description": "RFC 0151
|
|
4024
|
+
"description": "RFC 0151 \u00a7D \u2014 every inverse action succeeded. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (\u00a7D/\u00a7G) \u2014 these land in the durable log, the least revocable place a credential can reach.",
|
|
4012
4025
|
"properties": {
|
|
4013
4026
|
"compensationId": {
|
|
4014
4027
|
"type": "string",
|
|
@@ -4035,7 +4048,7 @@
|
|
|
4035
4048
|
"compensationFailed": {
|
|
4036
4049
|
"type": "object",
|
|
4037
4050
|
"additionalProperties": false,
|
|
4038
|
-
"description": "RFC 0151
|
|
4051
|
+
"description": "RFC 0151 \u00a7D \u2014 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 (\u00a7D/\u00a7G) \u2014 these land in the durable log, the least revocable place a credential can reach.",
|
|
4039
4052
|
"properties": {
|
|
4040
4053
|
"compensationId": {
|
|
4041
4054
|
"type": "string",
|
|
@@ -4072,7 +4085,7 @@
|
|
|
4072
4085
|
"compensationPaused": {
|
|
4073
4086
|
"type": "object",
|
|
4074
4087
|
"additionalProperties": false,
|
|
4075
|
-
"description": "RFC 0151
|
|
4088
|
+
"description": "RFC 0151 \u00a7D \u2014 paused for authorized intervention. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (\u00a7D/\u00a7G) \u2014 these land in the durable log, the least revocable place a credential can reach.",
|
|
4076
4089
|
"properties": {
|
|
4077
4090
|
"compensationId": {
|
|
4078
4091
|
"type": "string",
|
|
@@ -4109,7 +4122,7 @@
|
|
|
4109
4122
|
"compensationManualInterventionRequired": {
|
|
4110
4123
|
"type": "object",
|
|
4111
4124
|
"additionalProperties": false,
|
|
4112
|
-
"description": "RFC 0151
|
|
4125
|
+
"description": "RFC 0151 \u00a7D \u2014 operator action required. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (\u00a7D/\u00a7G) \u2014 these land in the durable log, the least revocable place a credential can reach.",
|
|
4113
4126
|
"properties": {
|
|
4114
4127
|
"compensationId": {
|
|
4115
4128
|
"type": "string",
|
|
@@ -4145,31 +4158,31 @@
|
|
|
4145
4158
|
},
|
|
4146
4159
|
"approvalRequested": {
|
|
4147
4160
|
"$ref": "#/$defs/interruptRequested",
|
|
4148
|
-
"description": "RFC 0171
|
|
4161
|
+
"description": "RFC 0171 \u00a7A.4 E4 \u2014 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."
|
|
4149
4162
|
},
|
|
4150
4163
|
"clarificationRequested": {
|
|
4151
4164
|
"$ref": "#/$defs/interruptRequested",
|
|
4152
|
-
"description": "RFC 0171
|
|
4165
|
+
"description": "RFC 0171 \u00a7A.4 E4 \u2014 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."
|
|
4153
4166
|
},
|
|
4154
4167
|
"approvalReceived": {
|
|
4155
4168
|
"$ref": "#/$defs/interruptResolved",
|
|
4156
|
-
"description": "RFC 0171
|
|
4169
|
+
"description": "RFC 0171 \u00a7A.4 E4 \u2014 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."
|
|
4157
4170
|
},
|
|
4158
4171
|
"approvalGranted": {
|
|
4159
4172
|
"$ref": "#/$defs/interruptResolved",
|
|
4160
|
-
"description": "RFC 0171
|
|
4173
|
+
"description": "RFC 0171 \u00a7A.4 E4 \u2014 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."
|
|
4161
4174
|
},
|
|
4162
4175
|
"approvalRejected": {
|
|
4163
4176
|
"$ref": "#/$defs/interruptResolved",
|
|
4164
|
-
"description": "RFC 0171
|
|
4177
|
+
"description": "RFC 0171 \u00a7A.4 E4 \u2014 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."
|
|
4165
4178
|
},
|
|
4166
4179
|
"approvalOverridden": {
|
|
4167
4180
|
"$ref": "#/$defs/interruptResolved",
|
|
4168
|
-
"description": "RFC 0171
|
|
4181
|
+
"description": "RFC 0171 \u00a7A.4 E4 \u2014 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."
|
|
4169
4182
|
},
|
|
4170
4183
|
"clarificationResolved": {
|
|
4171
4184
|
"$ref": "#/$defs/interruptResolved",
|
|
4172
|
-
"description": "RFC 0171
|
|
4185
|
+
"description": "RFC 0171 \u00a7A.4 E4 \u2014 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."
|
|
4173
4186
|
},
|
|
4174
4187
|
"negotiationDecided": {
|
|
4175
4188
|
"type": "object",
|
|
@@ -4204,7 +4217,7 @@
|
|
|
4204
4217
|
"peerDigest": {
|
|
4205
4218
|
"type": "string",
|
|
4206
4219
|
"pattern": "^[0-9a-f]{64}$",
|
|
4207
|
-
"description": "SHA-256 of the peer origin; never the origin in clear (RFC 0175
|
|
4220
|
+
"description": "SHA-256 of the peer origin; never the origin in clear (RFC 0175 \u00a7D.3)."
|
|
4208
4221
|
},
|
|
4209
4222
|
"reason": {
|
|
4210
4223
|
"type": "string",
|
|
@@ -4220,12 +4233,12 @@
|
|
|
4220
4233
|
"format": "date-time"
|
|
4221
4234
|
}
|
|
4222
4235
|
},
|
|
4223
|
-
"description": "RFC 0175
|
|
4236
|
+
"description": "RFC 0175 \u00a7D.3 \u2014 the content-free negotiation audit event."
|
|
4224
4237
|
}
|
|
4225
4238
|
},
|
|
4226
4239
|
"additionalProperties": false,
|
|
4227
4240
|
"_typeIndex": {
|
|
4228
|
-
"description": "NORMATIVE (RFC 0171
|
|
4241
|
+
"description": "NORMATIVE (RFC 0171 \u00a7A.4): v2 event type \u2192 $defs key, generated from spec/v2/event-codemap.json.",
|
|
4229
4242
|
"type": "object",
|
|
4230
4243
|
"additionalProperties": false,
|
|
4231
4244
|
"properties": {
|