Skip to content

Define machine-verifiable approval-to-execution scope binding for SAFE evidence #13

Description

@lumirosh

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:

  1. No valid authority existed.
  2. Valid authority existed and execution stayed inside it.
  3. Valid authority existed and execution left its scope.
  4. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions