DEV Community

Cover image for FullAgenticStack WhatsApp-first: RFC-WF-0006
suissAI
suissAI

Posted on

FullAgenticStack WhatsApp-first: RFC-WF-0006

RFC-WF-0006

Evidence Artifact Schema (EAS)

Status: Draft Standard
Version: 1.0.0
Date: 20 Nov 2025
Category: Standards Track
Author: FullAgenticStack Initiative
Dependencies: RFC-WF-0001 (WFCS), RFC-WF-0003 (CCP), RFC-WF-0004 (ACSM), RFC-WF-0005 (CRCD)
License: Open Specification (Public, Royalty-Free)


Abstract

This document specifies the Evidence Artifact Schema (EAS) for WhatsApp-first systems. EAS defines the official, canonical JSON Schema for evidence artifacts produced by conversational operations, including command envelopes, authorization decisions, confirmations, execution outcomes, compensations, and trace bindings to WhatsApp messages. The schema is designed for append-only audit, tamper-evident chaining, and cross-service correlation.

Index Terms— evidence artifacts, audit trail, JSON Schema, tamper-evident logs, command envelopes, traceability, WhatsApp-first compliance.


I. Introduction

WhatsApp-first systems require operational transparency and administrative sovereignty while remaining fully operable via conversation. To avoid “trust me bro” logs, systems need a standardized, machine-verifiable evidence format. EAS defines a canonical artifact that can be stored in an append-only store (or equivalent), queried conversationally, and verified across services.

EAS is intentionally implementation-agnostic: it does not mandate a database or cryptosystem, but it defines a structure that supports tamper-evidence and correlation.


II. Scope

EAS specifies:

  • A normative Evidence Artifact model and required fields
  • A canonical event lifecycle for command-driven systems
  • Trace binding to WhatsApp conversation identifiers
  • Authorization + step-up decision recording
  • Execution outcomes and compensation logging
  • Optional tamper-evident linkage (prev_hash, hash)
  • Official JSON Schema (draft 2020-12)

III. Normative Language

MUST, MUST NOT, SHOULD, SHOULD NOT, MAY are normative.


IV. Definitions

Evidence Artifact: A machine-readable record proving that an operation was requested, authorized, confirmed, executed (or rejected/failed), and what it affected.
Evidence Chain: A sequence of artifacts linked via hashes (optional but recommended).
Trace Binding: Linking evidence to conversation identifiers (conversation_id, message_ids).
Outcome: The terminal (or intermediate) result of executing a command.


V. Evidence Model Overview

An EAS-compliant implementation MUST emit evidence artifacts for:

  • command accepted / canonicalized (CCP)
  • confirmation requested / confirmation satisfied (CCP)
  • authorization decision (ACSM)
  • execution started / executed / failed
  • compensation started / compensated (if applicable)
  • rejection (policy / scope / ambiguity / validation)

Evidence artifacts MUST be immutable once written. Corrections MUST be represented as new artifacts.


VI. Official JSON Schema (EAS v1.0.0)

A. Conformance

  • Schema dialect: JSON Schema 2020-12
  • An evidence document MUST validate against this schema.
  • Producers MUST set eas_version to "1.0.0".

B. Schema

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://spec.fullagenticstack.dev/whatsapp-first/eas/1.0.0/schema.json",
  "title": "Evidence Artifact Schema (EAS) v1.0.0",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "eas_version",
    "artifact_id",
    "artifact_type",
    "emitted_at",
    "system",
    "tenant",
    "trace",
    "subject",
    "lifecycle",
    "security",
    "payload",
    "integrity"
  ],
  "properties": {
    "eas_version": {
      "type": "string",
      "const": "1.0.0"
    },

    "artifact_id": {
      "type": "string",
      "description": "Globally unique identifier for this evidence artifact (UUID recommended).",
      "minLength": 8
    },

    "artifact_type": {
      "type": "string",
      "description": "Evidence artifact category.",
      "enum": [
        "command.accepted",
        "command.confirmation.requested",
        "command.confirmation.satisfied",
        "authz.decided",
        "execution.started",
        "execution.executed",
        "execution.failed",
        "execution.rejected",
        "compensation.started",
        "compensation.compensated",
        "observation.emitted"
      ]
    },

    "emitted_at": {
      "type": "string",
      "format": "date-time"
    },

    "system": {
      "type": "object",
      "additionalProperties": false,
      "required": ["system_id", "service", "environment"],
      "properties": {
        "system_id": { "type": "string", "minLength": 2 },
        "service": { "type": "string", "minLength": 1 },
        "environment": {
          "type": "string",
          "enum": ["dev", "test", "staging", "prod"]
        },
        "region": { "type": "string" },
        "build": { "type": "string" },
        "commit": { "type": "string" }
      }
    },

    "tenant": {
      "type": "object",
      "additionalProperties": false,
      "required": ["tenant_id"],
      "properties": {
        "tenant_id": { "type": "string", "minLength": 1 },
        "org_id": { "type": "string" },
        "workspace_id": { "type": "string" }
      }
    },

    "trace": {
      "type": "object",
      "additionalProperties": false,
      "required": ["conversation_id", "message_ids"],
      "properties": {
        "conversation_id": { "type": "string", "minLength": 1 },
        "message_ids": {
          "type": "array",
          "items": { "type": "string", "minLength": 1 },
          "minItems": 1
        },
        "correlation_id": { "type": "string" },
        "causation_id": { "type": "string" },
        "span_id": { "type": "string" }
      }
    },

    "subject": {
      "type": "object",
      "additionalProperties": false,
      "required": ["actor", "channel"],
      "properties": {
        "channel": {
          "type": "string",
          "const": "whatsapp"
        },
        "actor": {
          "type": "object",
          "additionalProperties": false,
          "required": ["actor_id", "actor_type"],
          "properties": {
            "actor_id": { "type": "string", "minLength": 1 },
            "actor_type": {
              "type": "string",
              "enum": ["human", "agent", "service"]
            },
            "display_name": { "type": "string" }
          }
        },
        "acting_as": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "role": { "type": "string" },
            "delegation_id": { "type": "string" }
          }
        }
      }
    },

    "lifecycle": {
      "type": "object",
      "additionalProperties": false,
      "required": ["command_id", "stage"],
      "properties": {
        "command_id": { "type": "string", "minLength": 1 },
        "stage": {
          "type": "string",
          "enum": [
            "accepted",
            "confirmation_requested",
            "confirmed",
            "authz_decided",
            "started",
            "executed",
            "failed",
            "rejected",
            "compensated",
            "observed"
          ]
        },
        "attempt": {
          "type": "integer",
          "minimum": 1
        },
        "idempotency_key": { "type": "string" },
        "registry_ref": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "command_name": { "type": "string" },
            "capability_id": { "type": "string" },
            "registry_version": { "type": "string" }
          }
        }
      }
    },

    "security": {
      "type": "object",
      "additionalProperties": false,
      "required": ["authn", "authz"],
      "properties": {
        "authn": {
          "type": "object",
          "additionalProperties": false,
          "required": ["trust_level", "auth_context_id"],
          "properties": {
            "trust_level": {
              "type": "string",
              "enum": ["L1", "L2", "L3"]
            },
            "auth_context_id": { "type": "string" },
            "session_id": { "type": "string" },
            "device_id": { "type": "string" },
            "fresh_until": { "type": "string", "format": "date-time" }
          }
        },
        "authz": {
          "type": "object",
          "additionalProperties": false,
          "required": ["decision", "evaluated_scopes"],
          "properties": {
            "decision": {
              "type": "string",
              "enum": ["allow", "deny"]
            },
            "evaluated_scopes": {
              "type": "array",
              "items": { "type": "string" }
            },
            "required_scopes": {
              "type": "array",
              "items": { "type": "string" }
            },
            "policy_id": { "type": "string" },
            "reason_code": { "type": "string" },
            "reason_human": { "type": "string" }
          }
        },
        "step_up": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "required": { "type": "boolean" },
            "policy_id": { "type": "string" },
            "satisfied": { "type": "boolean" },
            "method": {
              "type": "string",
              "enum": ["token", "explicit_phrase", "oob_factor", "none"]
            },
            "verified_at": { "type": "string", "format": "date-time" }
          }
        },
        "confirmation": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "required": { "type": "boolean" },
            "method": {
              "type": "string",
              "enum": ["yes_no", "explicit_phrase", "token", "none"]
            },
            "token_id": { "type": "string" },
            "confirmed_at": { "type": "string", "format": "date-time" }
          }
        }
      }
    },

    "payload": {
      "type": "object",
      "additionalProperties": false,
      "required": ["intent", "args", "result"],
      "properties": {
        "intent": {
          "type": "object",
          "additionalProperties": false,
          "required": ["entity", "action"],
          "properties": {
            "entity": { "type": "string", "minLength": 1 },
            "action": { "type": "string", "minLength": 1 },
            "target": {
              "type": "object",
              "additionalProperties": true,
              "description": "Target locator; minimally SHOULD include id when applicable.",
              "properties": {
                "id": { "type": "string" }
              }
            }
          }
        },
        "args": {
          "type": "object",
          "additionalProperties": true,
          "description": "Normalized command arguments. May be empty object."
        },
        "result": {
          "type": "object",
          "additionalProperties": false,
          "required": ["status"],
          "properties": {
            "status": {
              "type": "string",
              "enum": ["accepted", "confirmed", "executed", "rejected", "failed", "compensated", "observed"]
            },
            "summary": { "type": "string" },
            "resource_effects": {
              "type": "array",
              "items": {
                "type": "object",
                "additionalProperties": false,
                "required": ["resource_type", "resource_id", "effect"],
                "properties": {
                  "resource_type": { "type": "string" },
                  "resource_id": { "type": "string" },
                  "effect": {
                    "type": "string",
                    "enum": ["created", "updated", "deleted", "canceled", "revoked", "configured", "none"]
                  }
                }
              }
            },
            "error": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "code": { "type": "string" },
                "message": { "type": "string" },
                "retryable": { "type": "boolean" }
              }
            }
          }
        },
        "raw_input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "text": { "type": "string" },
            "audio_transcript": { "type": "string" },
            "input_mode": {
              "type": "string",
              "enum": ["text", "audio", "menu", "document", "image"]
            }
          }
        }
      }
    },

    "integrity": {
      "type": "object",
      "additionalProperties": false,
      "required": ["hash_alg", "hash"],
      "properties": {
        "hash_alg": {
          "type": "string",
          "enum": ["sha256", "sha512"]
        },
        "hash": {
          "type": "string",
          "description": "Hash of canonicalized artifact payload (implementation-defined canonicalization).",
          "minLength": 16
        },
        "prev_hash": {
          "type": "string",
          "description": "Optional pointer to previous artifact hash for tamper-evident chaining."
        },
        "signature": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "sig_alg": { "type": "string" },
            "sig": { "type": "string" },
            "key_id": { "type": "string" }
          }
        }
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

VII. Canonicalization and Hashing Rules (Normative)

  1. Producers MUST define a stable canonicalization for hashing (e.g., JSON canonical form with deterministic key ordering).
  2. integrity.hash MUST be computed over the canonicalized artifact excluding integrity itself (to avoid recursion).
  3. If prev_hash is used, the chain MUST be append-only; modifications MUST emit a new artifact with a new hash.

VIII. Minimal Evidence Emission Requirements (Normative)

For any state-mutating command, the system MUST emit at least:

  • command.accepted (or equivalent stage)
  • authz.decided
  • execution.executed OR execution.failed OR execution.rejected

For destructive and admin high-impact commands, the system MUST also emit:

  • command.confirmation.requested
  • command.confirmation.satisfied (when confirmed)
  • step-up data under security.step_up (required / satisfied / method)

IX. Relationship to Other RFCs

  • WFCS (RFC-WF-0001): requires observability and recovery paths over WhatsApp.
  • CCP (RFC-WF-0003): provides envelope + confirmation + idempotency that EAS records.
  • ACSM (RFC-WF-0004): provides scope/step-up decisions recorded under security.
  • CRCD (RFC-WF-0005): provides registry_ref to bind evidence to declared commands/capabilities.

X. Security Considerations

  • Evidence artifacts MAY contain sensitive operational data. Producers SHOULD support redaction policies and privileged views.
  • Integrity fields support tamper-evidence, but operational security still depends on secure storage and access control.
  • Signature support is optional but recommended for cross-service verification.

XI. Conclusion

EAS standardizes evidence into a verifiable, machine-readable artifact that can be chained, audited, queried, and correlated across services—turning WhatsApp-first operations into provable operational reality rather than informal chat logs.


References

[1] RFC-WF-0001, WhatsApp-First Compliance Core (WFCS).
[2] RFC-WF-0003, Conversational Command Protocol (CCP).
[3] RFC-WF-0004, Administrative Command Security Model (ACSM).
[4] RFC-WF-0005, Command Registry & Capability Declaration (CRCD).


Concepts and Technologies

JSON Schema 2020-12, evidence artifacts, append-only audit, tamper-evident hashing chain, command lifecycle stages, trust context, scope evaluation recording, conversational trace binding.

Top comments (0)