diff --git a/rust/src/core/ocla/invocation.rs b/rust/src/core/ocla/invocation.rs
index 3b0b441..7c2d910 100644
--- a/rust/src/core/ocla/invocation.rs
+++ b/rust/src/core/ocla/invocation.rs
@@ -1,8 +1,10 @@
 //! Common invocation and measurement envelopes for OCLA capability adapters.
 
+use std::collections::BTreeMap;
 use serde::{Deserialize, Serialize};
 
 pub const CAPABILITY_OBSERVATION_SCHEMA_VERSION: u32 = 1;
 
@@ -145,14 +147,18 @@ pub enum CapabilityFailureMode {
 pub struct CapabilityObservationV1 {
     pub schema_version: u32,
     pub task_id: String,
     pub capability_id: String,
+    pub capability_version: String,
     pub success: bool,
     pub input_tokens: u64,
     pub output_tokens: u64,
     pub latency_ms: u64,
     pub failure_mode: Option<CapabilityFailureMode>,
+    pub output_ref: Option<String>,
     pub metrics: BTreeMap<String, u64>,
 }
 
@@ -164,8 +170,25 @@ impl CapabilityObservationV1 {
     pub fn success(
         invocation: &CapabilityInvocation,
         input_tokens: u64,
         output_tokens: u64,
         latency_ms: u64,
+        output_ref: Option<String>,
     ) -> Self {
         Self {
             schema_version: CAPABILITY_OBSERVATION_SCHEMA_VERSION,
             task_id: invocation.task_id.clone(),
             capability_id: invocation.capability_id.clone(),
+            capability_version: invocation.capability_version.clone(),
             success: true,
             input_tokens,
             output_tokens,
             latency_ms,
             failure_mode: None,
+            output_ref,
             metrics: BTreeMap::new(),
         }
     }
 }
diff --git a/rust/src/core/ocla/adapters/native_context.rs b/rust/src/core/ocla/adapters/native_context.rs
index 4a0b1a7..8bd3a55 100644
--- a/rust/src/core/ocla/adapters/native_context.rs
+++ b/rust/src/core/ocla/adapters/native_context.rs
@@ -32,7 +32,11 @@ impl NativeContextAdapter {
     fn manifest(&self) -> &CapabilityManifestV1 {
         &self.manifest
     }
 
+    fn evidence_for(output: &str) -> String {
+        format!("blake3:{}", blake3::hash(output.as_bytes()).to_hex())
+    }
+
     fn invoke(&self, invocation: CapabilityInvocation) -> OclaResult<CapabilityResult> {
         invocation.validate()?;
         let start = std::time::Instant::now();
@@ -84,14 +88,20 @@ impl CapabilityAdapter for NativeContextAdapter {
         let output = self.engine.read(&paths, &mode)?;
         let elapsed_ms = check_timeout(start, invocation.timeout_ms)?;
+        let output_ref = Some(Self::evidence_for(&output));
+        let output_tokens = count_tokens(&output);
         Ok(CapabilityResult {
             success: true,
-            output_tokens: count_tokens(&output),
+            output_tokens,
             latency_ms: elapsed_ms,
-            observation: CapabilityObservationV1::success(&invocation, input_tokens, output_tokens, elapsed_ms, None),
+            observation: CapabilityObservationV1::success(
+                &invocation,
+                input_tokens,
+                output_tokens,
+                elapsed_ms,
+                output_ref.clone(),
+            ),
             evidence_ref: output_ref,
         })
diff --git a/rust/tests/ocla_integration_suite.rs b/rust/tests/ocla_integration_suite.rs
index 82e6e07..ad07122 100644
--- a/rust/tests/ocla_integration_suite.rs
+++ b/rust/tests/ocla_integration_suite.rs
@@ -1,7 +1,8 @@
 //! Integration coverage for the public OCLA adapter contract.
 
 use lean_ctx::core::ocla::{CapabilityInput, CapabilityInvocation, PolicyConstraints};
+use lean_ctx::core::ocla::reference_adapters::ComparisonReceipt;
 use serde_json::Value;
 
 #[test]
 fn native_adapters_emit_comparable_public_observations_without_rankings() {
@@ -119,6 +120,17 @@ fn native_adapters_emit_comparable_public_observations_without_rankings() {
     assert_eq!(value["observation"]["schema_version"], 1);
 }
+
+#[test]
+fn comparison_receipt_serializes_without_payload_data() {
+    let json = serde_json::to_string(&ComparisonReceipt::fixture("task-001")).unwrap();
+    assert!(json.contains("native_observation"));
+    assert!(!json.contains("On branch"));
+}
