Evidence reference
Machine-readable evidence references with entity IDs, routes, confidence, citations, and suggested pivots for AI agents and automated investigations.
When AI agents query the telemetry graph or when human SREs view automated alerts and analyses, obs-unified provides structured, machine-readable evidence packages. These packages let agents traverse the causal graph programmatically without parsing narrative prose.
The canonical schema is written in TypeScript and matches the published JSON Schema version obs-unified.evidence-reference.v1.
EvidenceReference schema
The EvidenceReference is a Zod schema defined in packages/obs-types/src/types/evidence.ts.
Fields
evidenceId(string): A unique identifier for this specific evidence entry.entityKind(EvidenceEntityKind): The type of entity being referenced. Must be one of:"analysis"(automated analysis results/notebooks)"alert"(firing system/business alert rules)"agent_run"(causal workflow run of an AI agent)"action"(specific step or LLM execution in the Agent Action Graph)"trace"(OpenTelemetry distributed trace)"span"(individual OpenTelemetry span)"tool_call"(MCP or GenAI tool execution record)"ai_call"(individual LLM/GenAI call record)"eval"(automated model evaluation run or case)"profile"(pprof CPU or off-CPU profile blob)"replay"(rrweb session replay stream)"service"(logical service/system node)"log"(individual log line record)"docs"(documentation page or reference file)"change"(deployment, rollback, feature-flag flip, config change, or prompt release inchange_events)"finding"(persistedInvestigationFindingin incident memory)"incident"(durableIncidentInvestigationcoordination record)
entityId(string): The stable database key or identifier of the referenced entity.route(string): The dashboard deep-link path for the entity (e.g."/dashboard/traces/trace-123").source(string): Description of the engine or rule that generated this evidence (e.g."collector.analyses.self_time").confidence(number): A float strictly bounded between0.0(no confidence) and1.0(absolute certainty/explicit propagation).relationshipCertainty(optional,"exact" | "inferred" | "heuristic"): How the graph link was constructed ("exact"for shared trace/span IDs or exact file-path match;"inferred"for statistical cohort isolation;"heuristic"for temporal window proximity).causalProofTier(optional,"counterfactual_verified" | "cohort_rate_isolated" | "corroborated_candidate" | "unverified_locus"): How strongly causality has been proven for root-cause attribution and remediation gating (see AutoSRE causal ontology).predicate(optional,"triggered_by_interaction" | "caused_by_action" | "executed_in_agent_run" | "mutated_external_state" | "originated_fault_in_span" | "failed_due_to_child_span" | "contended_on_shared_resource" | "induced_shared_resource_contention" | "blackout_on_dependency" | "sampled_hot_frame" | "uninstrumented_self_time_gap" | "exemplifies_metric_spike" | "degraded_after_change" | "isolated_to_version_cohort" | "touched_same_code_path" | "mitigated_by_change" | "violated_eval" | "verified_by_counterfactual" | "remediated_by_agent_run" | "matches_prior_finding"): Typed causal relation between the anchor entity and this evidence node (represented asevidencePredicateonConnectedLinkitems, whileEvidenceBundleandConnectedLinkalso carry the canonicalenvironmentscope).reason(string): Human-readable summary explaining why this evidence is relevant.citations(array of citations): Supporting files, traces, or documentation that support this evidence.suggestedNextPivots(array of pivots): Recommended exploration routes to help investigate from this anchor.
Citations structure
Each item in the citations array contains:
label(string): Text describing the cited reference.entityKind(EvidenceEntityKind): Kind of cited entity.entityId(string): Stable identifier.route(string, nullable/optional): Deep-link route.
Suggested next pivots structure
Each item in the suggestedNextPivots array contains:
label(string): Text describing the suggested action (e.g.,"Inspect CPU profile for checkout-service").entityKind(EvidenceEntityKind): Kind of target entity.entityId(string): Stable identifier.route(string): Deep-link target route.reason(string, optional): Context explaining why this pivot is suggested.
JSON schema definition
The JSON Schema definition is exported by @obsunified/types (EvidenceReferenceJsonSchema). Its $id is a stable identifier, not a hosted download URL:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://obs-unified.dev/schemas/obs-unified.evidence-reference.v1.json",
"title": "EvidenceReference",
"type": "object",
"additionalProperties": false,
"required": [
"evidenceId",
"entityKind",
"entityId",
"route",
"source",
"confidence",
"reason",
"citations",
"suggestedNextPivots"
],
"properties": {
"evidenceId": { "type": "string" },
"entityKind": {
"type": "string",
"enum": [
"analysis",
"alert",
"agent_run",
"action",
"trace",
"span",
"tool_call",
"ai_call",
"eval",
"profile",
"replay",
"service",
"log",
"docs",
"change",
"finding",
"incident"
]
},
"entityId": { "type": "string" },
"route": { "type": "string" },
"source": { "type": "string" },
"confidence": { "type": "number", "minimum": 0, "maximum": 1 },
"relationshipCertainty": {
"type": "string",
"enum": ["exact", "inferred", "heuristic"]
},
"causalProofTier": {
"type": "string",
"enum": [
"counterfactual_verified",
"cohort_rate_isolated",
"corroborated_candidate",
"unverified_locus"
]
},
"predicate": {
"type": "string",
"enum": [
"triggered_by_interaction",
"caused_by_action",
"executed_in_agent_run",
"mutated_external_state",
"originated_fault_in_span",
"failed_due_to_child_span",
"contended_on_shared_resource",
"induced_shared_resource_contention",
"blackout_on_dependency",
"sampled_hot_frame",
"uninstrumented_self_time_gap",
"exemplifies_metric_spike",
"degraded_after_change",
"isolated_to_version_cohort",
"touched_same_code_path",
"mitigated_by_change",
"violated_eval",
"verified_by_counterfactual",
"remediated_by_agent_run",
"matches_prior_finding"
]
},
"reason": { "type": "string" },
"citations": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["label", "entityKind", "entityId"],
"properties": {
"label": { "type": "string" },
"entityKind": {
"type": "string",
"enum": [
"analysis",
"alert",
"agent_run",
"action",
"trace",
"span",
"tool_call",
"ai_call",
"eval",
"profile",
"replay",
"service",
"log",
"docs",
"change",
"finding",
"incident"
]
},
"entityId": { "type": "string" },
"route": { "type": ["string", "null"] }
}
}
},
"suggestedNextPivots": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["label", "entityKind", "entityId", "route"],
"properties": {
"label": { "type": "string" },
"entityKind": {
"type": "string",
"enum": [
"analysis",
"alert",
"agent_run",
"action",
"trace",
"span",
"tool_call",
"ai_call",
"eval",
"profile",
"replay",
"service",
"log",
"docs",
"change",
"finding",
"incident"
]
},
"entityId": { "type": "string" },
"route": { "type": "string" },
"reason": { "type": "string" }
}
}
}
}
}Python Flask instrumentation
Send Flask traces and logs to obs-unified with OpenTelemetry and the interaction header.
Evidence retrieval (CCR)
Compact, token-budgeted evidence bundles and retrieval refs that let AI agents pull just the debugging signal from the telemetry graph instead of the raw firehose.