Spun out of #5 at the author's request, where the transport mapping was in scope but these semantics were not.
Problem
SAFE's Evidence Preservation list requires members to retain human approval and intervention events. Preserving the event is not the same as preserving what it authorized.
Two of the RFC's reportable conditions depend on that difference: a system acting on a third-party system without authorization, and a system continuing to probe after detection. Both require a reader to distinguish four outcomes that today would be reported identically:
- No valid authority existed.
- Valid authority existed and execution stayed inside it.
- Valid authority existed and execution left its scope.
- Evidence is insufficient to determine which of the above occurred.
These are different control failures with different remediation. A member can satisfy every item on the Evidence Preservation list and still leave a reader unable to tell them apart.
Why this is not an upstream transport question
otel-genai#368 (draft) adds gen_ai.agent.governance.ref as a deliberately opaque, producer-scoped reference, with the referenced record's format, schema, lifecycle and validation explicitly out of scope. That looks like the right decision for a transport convention.
It also means the pointer exists and its contents are undefined. This issue proposes requirements for what a SAFE-conformant record behind that reference should establish. It does not ask OTel to parse it, and it does not propose a new transport.
otel-genai#159 (gen_ai.agent.paused / .resumed, with pause.reason: human_input) is the natural carrier for the approval moment itself.
Proposed requirements
Requirements, not a schema. Vocabularies can start small.
R1. Both operands preserved. What was approved, and what actually executed, must both be retained in a form that survives export to another party.
R2. Structured, not prose. The approved action should be expressed against a structured action vocabulary, for example a tool-call schema, rather than free text. The approved resource should use a stable identifier, for example the workload identifiers already proposed in the #5 mapping, rather than a human-readable name.
R3. Recomputable verdict. Any conformance result must be recomputable by an independent party. A recorded verdict must reference the comparison method and its version, alongside the normalized inputs and the evidence references used. A verdict without a stated method is an assertion, not evidence, and inherits exactly the problem this proposal exists to solve. This constraint was raised by @meshailabs in #5 and is adopted here.
R4. Authority validity is a separate question. Whether authority was valid, time-bound and not self-extended is the subject of #1. This issue assumes that question is answered elsewhere, and addresses only whether execution remained inside the scope that authority granted.
R5. Insufficient evidence is a reportable state. Absence of a determination must be distinguishable from a negative determination.
Relationship to existing work
Prior art, with its limits stated
I maintain Open Decision Receipt, Apache-2.0, vendor-neutral: https://github.com/lumirosh/open-decision-receipt
Cited as prior art and as a worked example of the failure above, not as a solved standard and not for adoption. It records both operands, approval_scope on the authority block and actual_action on the execution block, and both are free-text strings. It therefore cannot mechanically compare them, and neither can anyone reading its output. R2 and R3 are what that implementation is missing.
Runnable lifecycle example: https://github.com/lumirosh/open-decision-receipt/tree/main/examples/end-to-end-artifact-bundle
Spun out of #5 at the author's request, where the transport mapping was in scope but these semantics were not.
Problem
SAFE's Evidence Preservation list requires members to retain human approval and intervention events. Preserving the event is not the same as preserving what it authorized.
Two of the RFC's reportable conditions depend on that difference: a system acting on a third-party system without authorization, and a system continuing to probe after detection. Both require a reader to distinguish four outcomes that today would be reported identically:
These are different control failures with different remediation. A member can satisfy every item on the Evidence Preservation list and still leave a reader unable to tell them apart.
Why this is not an upstream transport question
otel-genai#368 (draft) adds
gen_ai.agent.governance.refas a deliberately opaque, producer-scoped reference, with the referenced record's format, schema, lifecycle and validation explicitly out of scope. That looks like the right decision for a transport convention.It also means the pointer exists and its contents are undefined. This issue proposes requirements for what a SAFE-conformant record behind that reference should establish. It does not ask OTel to parse it, and it does not propose a new transport.
otel-genai#159 (
gen_ai.agent.paused/.resumed, withpause.reason: human_input) is the natural carrier for the approval moment itself.Proposed requirements
Requirements, not a schema. Vocabularies can start small.
R1. Both operands preserved. What was approved, and what actually executed, must both be retained in a form that survives export to another party.
R2. Structured, not prose. The approved action should be expressed against a structured action vocabulary, for example a tool-call schema, rather than free text. The approved resource should use a stable identifier, for example the workload identifiers already proposed in the #5 mapping, rather than a human-readable name.
R3. Recomputable verdict. Any conformance result must be recomputable by an independent party. A recorded verdict must reference the comparison method and its version, alongside the normalized inputs and the evidence references used. A verdict without a stated method is an assertion, not evidence, and inherits exactly the problem this proposal exists to solve. This constraint was raised by @meshailabs in #5 and is adopted here.
R4. Authority validity is a separate question. Whether authority was valid, time-bound and not self-extended is the subject of #1. This issue assumes that question is answered elsewhere, and addresses only whether execution remained inside the scope that authority granted.
R5. Insufficient evidence is a reportable state. Absence of a determination must be distinguishable from a negative determination.
Relationship to existing work
Prior art, with its limits stated
I maintain Open Decision Receipt, Apache-2.0, vendor-neutral: https://github.com/lumirosh/open-decision-receipt
Cited as prior art and as a worked example of the failure above, not as a solved standard and not for adoption. It records both operands,
approval_scopeon the authority block andactual_actionon the execution block, and both are free-text strings. It therefore cannot mechanically compare them, and neither can anyone reading its output. R2 and R3 are what that implementation is missing.Runnable lifecycle example: https://github.com/lumirosh/open-decision-receipt/tree/main/examples/end-to-end-artifact-bundle